Проблемы с ручной настройкой Perplexity Sonar Deep Research

После того как я попытался следовать инструкциям здесь с провайдерами 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:

  1. llm_provider: openrouter

  2. llm_provider_url: OpenRouter

  3. llm_provider_api_key: ВАШ_КЛЮЧ

  4. llm_model: perplexity/sonar-deep-research

  5. Отключите потоковую передачу, чтобы тест (и все вызовы) использовали обычный чат-эндпоинт, который, как вы уже проверили, работает:
    • 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

В противном случае оставьте потоковую передачу отключённой, и всё будет работать.

Результат не идеален, так как потоковая передача отключена, и токены рассуждений выводятся как обычный текст перед «отчётом», но в целом всё работает!

API работает очень медленно, но, похоже, функционирует, см.:

Тем не менее, проблема здесь заключается в том, что это в основном бесполезно, пока мы не разберём ссылки на источники и URL-адреса цитат. Это выполнимо, но не тривиально:

Стоит отметить, что один ответ, на который была дана ссылка, обошёлся мне в 70 центов! Это отнюдь не дешёвая модель, поэтому я бы был с ней крайне осторожен.

Конечно! Я включил это только для своей команды на нашем частном внутреннем экземпляре.