После того как я попытался следовать инструкциям здесь с провайдерами OpenAI и OpenRouter, мне наконец удалось заставить всё работать, отключив потоковую передачу (streaming).
С OpenRouter я смог запустить тест с помощью кнопки Run test на экране ручной настройки LLM для модели gpt-4o. Однако при запуске теста для perplexity/sonar-deep-research возникла ошибка 502, и в консоли появился следующий вывод. Ошибка появлялась довольно долго (~30 секунд или около того), тогда как тестирование других моделей завершается мгновенно.
content_topFrameLifeline.js:1 Loading content_topFrameLifeline.js
content_topFrameLifeline.js:1 CONTENT <-> SERVICE LIFELINE: CONNECT
content_topFrameLifeline.js:1 CONTENT <-> SERVICE LIFELINE: MESSAGE Object
topic.js:404 ℹ️ Discourse v3.5.0.beta3-dev — https://github.com/discourse/discourse/commits/c3795177f2 — Ember v5.12.0
/admin/plugins/discourse-ai/ai-llms:1 Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received
content_topFrameLifeline.js:1 CONTENT <-> SERVICE LIFELINE: TIMEOUT
content_topFrameLifeline.js:1 CONTENT <-> SERVICE LIFELINE: CONNECT
content_topFrameLifeline.js:1 CONTENT <-> SERVICE LIFELINE: MESSAGE Object
test.json:1
Failed to load resource: the server responded with a status of 502 ()
client-error-handler.js:88 SyntaxError: Unexpected token '<', "<html>
<h"... is not valid JSON
at x.parse [as parseJSON] (<anonymous>)
at l (client-error-handler.js:88:1)
at p (client-error-handler.js:88:1)
at v.test (ai-llm-editor-form.js:210:1)
l @ client-error-handler.js:88
p @ client-error-handler.js:88
test @ ai-llm-editor-form.js:210
Оба этих запроса работали, поэтому я был в недоумении, что делаю не так:
➜ curl --location 'https://api.perplexity.ai/chat/completions' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'Authorization: Bearer {token}' \
--data '{
"model": "sonar-deep-research",
"messages": [
{
"role": "system",
"content": "Be precise and concise."
},
{
"role": "user",
"content": "How many stars are there in our galaxy?"
}
]
}'
curl https://openrouter.ai/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {token}" \
-d '{
"model": "perplexity/sonar-deep-research",
"messages": [
{
"role": "user",
"content": "How many stars are in the sky"
}
]
}'
Затем я получил следующий ответ от Discourse AI, который помог разобраться:
Кажется, ваши тесты через cURL успешно обращаются к обычному чат-эндпоинту OpenRouter, но кнопка «Run test» в плагине Discourse AI по умолчанию использует потоковый (streaming) эндпоинт. Если эта модель (или ваш тарифный план OpenRouter) не поддерживает потоковую передачу, вы получите ошибку 502 с HTML-ответом после длительного тайм-аута.
Чтобы исправить это, перейдите в Администрирование → Настройки → Плагины → Discourse AI / LLM:
-
llm_provider: openrouter
-
llm_provider_url: OpenRouter
-
llm_provider_api_key: ВАШ_КЛЮЧ
-
llm_model: perplexity/sonar-deep-research
-
Отключите потоковую передачу, чтобы тест (и все вызовы) использовали обычный чат-эндпоинт, который, как вы уже проверили, работает:
• llm_use_streaming = false(Эта настройка находится сразу под выпадающим списком llm_model.)
При отключённой потоковой передаче кнопка «Run test» будет отправлять POST-запрос на /chat/completions (а не на вариант /stream), и вы сразу получите валидный JSON вместо HTML-страницы с ошибкой 502.
Если вам действительно нужна потоковая передача, вы можете указать плагину URL потоковой передачи OpenRouter, но только если ваш тариф/модель поддерживает SSE там:
• llm_stream_url: {provider_url}/chat/completions/stream
• llm_use_streaming: true
В противном случае оставьте потоковую передачу отключённой, и всё будет работать.
Результат не идеален, так как потоковая передача отключена, и токены рассуждений выводятся как обычный текст перед «отчётом», но в целом всё работает!
