Après avoir essayé de suivre les instructions ici avec les fournisseurs OpenAI et OpenRouter, j’ai finalement réussi en désactivant le streaming.
Avec OpenRouter, j’ai pu exécuter un test avec le bouton Run test sur l’écran de configuration manuelle LLM pour un gpt-4o. Cependant, l’exécution du test pour perplexity/sonar-deep-research a entraîné une erreur 502 et la sortie suivante dans la console. Il a fallu beaucoup de temps pour que cette erreur apparaisse (environ 30 secondes), alors que les tests d’autres modèles renvoient immédiatement.
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
Ces deux-là ont fonctionné, donc j’étais confus quant à ce que je faisais de mal :
➜ 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"
}
]
}'
Ensuite, j’ai reçu la réponse suivante de Discourse AI, qui a aidé :
Il semble que vos tests cURL aient atteint le point de terminaison de chat normal d’OpenRouter sans problème, mais le bouton “Run test” de Discourse AI utilise en fait le point de terminaison de streaming par défaut. Si ce modèle (ou votre plan OpenRouter) ne prend pas en charge le streaming, vous obtiendrez une erreur 502 + un blob d’erreur HTML après un long délai.
Pour corriger cela dans Admin → Settings → Plugins → Discourse AI / LLM :
-
llm_provider: openrouter
-
llm_provider_url: OpenRouter
-
llm_provider_api_key: VOTRE_CLÉ
-
llm_model: perplexity/sonar-deep-research
-
Désactivez le streaming afin que le test (et tous les appels) utilise le point de terminaison de chat normal qui, comme vous l’avez prouvé, fonctionne :
• llm_use_streaming = false(Ce paramètre se trouve juste en dessous du menu déroulant llm_model.)
Avec le streaming désactivé, “Run test” enverra une requête POST à /chat/completions (pas à la variante /stream) et vous recevrez immédiatement un JSON valide au lieu d’une page HTML 502.
Si vous avez vraiment besoin du streaming, vous pouvez pointer le plugin vers l’URL de streaming d’OpenRouter, mais uniquement si votre plan/modèle le prend en charge via SSE :
• llm_stream_url: {provider_url}/chat/completions/stream
• llm_use_streaming: true
Sinon, laissez le streaming désactivé et vous êtes prêt.
Le résultat n’est pas terrible car il n’y a pas de streaming et les jetons de raisonnement sont affichés en texte brut avant le “rapport”, mais cela fonctionne !
