Come utilizzare gli endpoint AI interni?

Mi chiedo quale sia l’approccio giusto per utilizzare endpoint API AI interni (come LiteLLM) su istanze self-hosted di Discourse.

Ho provato ad abilitare il bridge Docker, gli IP dei container e endpoint SSL terminati correttamente (verso lo stesso IP pubblico su cui è ospitato Discourse), ma nulla funziona. Ho consentito gli host interni, ma ricevo un errore 500 quando provo a testare l’interfaccia LLM-AI all’interno di Discourse.

Probabilmente è legato alla mia configurazione e so di aver probabilmente commesso alcuni errori. Quindi spero di risolvere la questione con l’aiuto della comunità :slight_smile:

Il nostro caso d’uso principale è provare gli endpoint di Vertex AI (OpenAI) che non funzionavano “out of the box” su Discourse perché non supportati. Vogliamo anche mantenere il livello che LiteLLM aggiunge al nostro flusso di lavoro.

Log:

FinalDestination::SSRFDetector::DisallowedIpError (FinalDestination: tutti gli IP risolti sono stati considerati non consentiti)

Se lo esegui sullo stesso server, dovrai consentirlo tramite la variabile d’ambiente DISCOURSE_ALLOWED_INTERNAL_HOSTS.

L’ho fatto nell’interfaccia utente come ho visto in un post simile precedente. Ho anche provato con la variabile nel mio file app.yml, ma ricevo ancora l’errore.

Cosa potrebbe non funzionare se le mie credenziali sono corrette e posso utilizzare l’endpoint API sull’host? Posso eseguire ulteriori debug?

Come l’hai esattamente aggiunto all’app.yml? Si aspetta o un IP o un hostname.

Ho testato l’endpoint con SSL all’interno di Discourse (contenitore app) e funziona, ma non dal test dell’interfaccia utente di Discourse AI.

Sto utilizzando il provider ‘OpenAI’ con ‘https://llm.mydomain.tld/v1/chat/completions’ come URL. Le credenziali sono corrette:

/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' 

È strano e ci sto provando da settimane.


Ho già provato questo:

MODIFICA 1: DISCOURSE_ALLOWED_INTERNAL_HOSTS: 172.16.X.X (IP del contenitore LiteLLM, 127.0.0.1 e l’host del dominio LLM con terminazione SSL, che capisco non debba essere incluso qui)

MODIFICA 2: E vedo lo stesso errore 500 quando provo ad accedere per configurare il mio server MCP (configurazione della scheda discourse-ai di MCP).

Prova invece con DISCOURSE_ALLOWED_INTERNAL_HOSTS: llm.mydomain.tld.

L’ho già fatto come ho scritto prima, ma nulla funziona e chiedo gentilmente come eseguire un debug più approfondito, perché si tratta di qualcosa di strano.

Questo endpoint funziona all’interno dell’applicazione del container Discourse, ma non dall’interfaccia utente di Discourse così com’è.