Как использовать внутренние AI-эндпоинты?

Хотелось бы узнать, какой подход является правильным для использования внутренних конечных точек ИИ-API (например, LiteLLM) на самостоятельно размещенных инстансах Discourse.

Я пытался включить docker bridge, IP-адреса контейнеров и корректные конечные точки с SSL-терминацией (на тот же публичный IP-адрес, где размещен Discourse), но ничего не работает. Я разрешил внутренние хосты, но при тестировании в интерфейсе LLM-AI в Discourse получаю ошибку 500.

Скорее всего, проблема связана с моей собственной конфигурацией, и я знаю, что, вероятно, допустил некоторые ошибки. Поэтому надеюсь решить эту проблему с помощью сообщества :slight_smile:

Наш основной сценарий использования — попробовать конечные точки Vertex AI (OpenAI), которые не заработали «из коробки» в Discourse, поскольку они не поддерживаются. Но мы также хотим использовать слой, который LiteLLM добавляет в наш рабочий процесс.

Логи:

FinalDestination::SSRFDetector::DisallowedIpError (FinalDestination: все разрешенные IP-адреса были запрещены)

Если вы запускаете его на том же сервере, вам нужно разрешить его через переменную окружения DISCOURSE_ALLOWED_INTERNAL_HOSTS.

Я сделал это через интерфейс, как видел в предыдущем похожем посте. Также пробовал добавить переменную в файл app.yml, но ошибка всё ещё появляется.

Что может быть не так, если мои учётные данные верны, и я могу использовать конечную точку API на хосте? Можно ли провести более глубокую отладку?

Как именно вы добавили это в app.yml? Он ожидает либо IP-адрес, либо имя хоста.

Что ж, я протестировал конечную точку с SSL внутри Discourse (в контейнере приложения), и она работает, но не проходит тест в интерфейсе Discourse AI.

Я использую провайдера ‘OpenAI’ с URL ‘https://llm.mydomain.tld/v1/chat/completions’. Учетные данные верны:

/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:182:in 'DiscourseAi::Completions::Endpoints::Base#perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai_shared.rb:28:in 'DiscourseAi::Completions::Endpoints::OpenAiShared#perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/llm.rb:214:in 'DiscourseAi::Completions::Llm#generate'

pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:46:in 'Pitchfork::SoftTimeout::Request#interrupt'
pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:94:in 'block (2 levels) in Pitchfork::SoftTimeout#create_timeout_thread'
pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:93:in 'Array#each'
pitchfork-0.18.2/lib/pitchfork/soft_timeout.rb:93:in 'block in Pitchfork::SoftTimeout#create_timeout_thread' 

Это странно, и я пытаюсь разобраться в этом уже несколько недель.


Уже пробовал следующее:

EDIT 1: DISCOURSE_ALLOWED_INTERNAL_HOSTS: 172.16.X.X (IP-адрес контейнера LiteLLM, 127.0.0.1 и хост домена LLM с завершением SSL, как я понимаю, здесь указывать не нужно)

EDIT 2: И я вижу ту же ошибку 500 при попытке перейти к настройке моего MCP-сервера (конфигурация вкладки discourse-ai MCP).

Попробуйте вместо этого указать DISCOURSE_ALLOWED_INTERNAL_HOSTS: llm.mydomain.tld.

Я уже делал это, как писал ранее, ничего не работает, и я вежливо спрашиваю, как отлаживать дальше, потому что что-то странное.

Этот эндпоинт работает внутри контейнера приложения Discourse, но не из интерфейса Discourse.