Chiedo se qualcuno è riuscito a farlo funzionare con Ollama in locale?
Sto anche cercando di far funzionare questo con ollama, sembra che l’API utilizzata dal plugin Discourse AI non sia compatibile con Ollama e qualsiasi impostazione io modifichi non cambia la richiesta API.
Questo è ciò che funziona con ollama:
curl http://192.168.1.2:11434/api/generate -d '{"model": "llama3.2", "prompt": "Perché il cielo è blu?"}'
E sopra sembra essere l’unico tipo di richiesta che il plugin tenta. Ad esempio:
curl http://192.168.1.2:11434/ \
-X POST \
-H 'Content-Type: application/json' \
-d '{"inputs":"<s>[INST] Qual è il tuo condimento preferito? [/INST] Beh, sono piuttosto affezionato a una buona spruzzata di succo di limone fresco. Aggiunge la giusta quantità di sapore acidulo a tutto ciò che cucino in cucina!</s> [INST] Hai ricette di maionese? [/INST]","parameters":{"max_new_tokens":500, "temperature":0.5,"top_p": 0.9}}'
Il chatbot AI è presuntamente compatibile con ollama ma non riesco a ottenere una risposta nemmeno da quello.
Quindi, chiunque abbia ottenuto questo risultato con ollama, per favore posti le impostazioni che ha utilizzato!
Apparentemente ho parlato troppo presto, se non ho alcuna impostazione nel plugin Discourse AI impostata e seguo le istruzioni RAG in questo post ottengo risposte nella chat bot AI da Ollama!
Funziona abbastanza bene con Ollama, abbiamo più persone nel team che lo utilizzano.
Fantastico. Esiste una guida che possiamo seguire su come implementarlo?
Sono più interessato alla sintesi e ad altre funzioni che al chatbot.
ETA: Questa configurazione non funziona:
(Ho oscurato l’indirizzo IP del mio host qui).
Quello che succede è che ricevo un Internal Server Error quando clicco su “Run Test”.
Su /logs, vedo:
NameError (variabile locale o metodo `tokenizer' non definito per un'istanza di DiscourseAi::Completions::Dialects::ChatGpt)
app/controllers/application_controller.rb:427:in `block in with_resolved_locale'
app/controllers/application_controller.rb:427:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:35:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
lib/middleware/anonymous_cache.rb:409:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/processing_request.rb:12:in `call'
lib/middleware/request_tracker.rb:385:in `call'
Questo accade indipendentemente dal tokenizer che seleziono. Sto testando questo su 3.5.0beta1-dev (c1ee4e120e).
Imposta l’URL su http://localhost:11434/v1/chat/completions
Il test continua a fallire con un errore del server interno, stesso messaggio di log: un NameError che indica che ‘tokenizer’ è una variabile locale non definita.
Prova a salvare il modello così com’è, aggiornare la pagina e poi tornare tramite il pulsante di modifica LLM ed eseguire un nuovo test.
Stesso risultato: l’ho ripetuto alcune volte, ma ci ho riprovato adesso.
Ho eseguito l’installazione nel modo consueto: l’ho aggiunto al mio file app.yml e ho eseguito ./launcher rebuild app
La riga che ho aggiunto è stata:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- sudo -E -u discourse git clone https://github.com/discourse/discourse-ai.git
(Ho rimosso gli altri plugin dall’elenco, ma ho lasciato i componenti yml in modo che tu possa vedere dove si trova questo nel file yml.)
Domani ripristinerò la mia configurazione locale di ollama e segnalerò qui.
Ho fatto:
ollama serve
ollama run phi4
# test
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "phi4",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "How much is 1+1?"
}
]
}' -s | jq .choices[].message.content
"La somma di 1 + 1 è 2.
Nell'aritmetica di base, quando si aggiunge un'unità a un'altra singola unità, il numero totale diventa due unità. Questa operazione fa parte dei principi fondamentali di addizione utilizzati in matematica. C'è qualcos'altro in cui posso aiutarti riguardo alla matematica o a qualsiasi altro argomento?"
Testato su Helper
Grazie per aver testato questa funzionalità.
Ho notato che ho un’opzione in più (Disabilita completamenti in streaming) rispetto alla tua configurazione. È possibile che sia la selezione del modello a causare il problema? (Ho installato deepseek-r1:32b).
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1:32b",
"messages": [
{
"role": "system",
"content": "Sei un assistente utile."
},
{
"role": "user",
"content": "Quanto fa 1+1?"
}
]
}' -s | jq .choices[].message.content
"<think>\nVa bene, sto cercando di capire quanto fa 1 più 1. Ok, allora analizziamo il problema passo dopo passo, anche se sembra semplice.\n\nPrima di tutto, so che l'addizione consiste nel combinare due numeri per ottenere una somma totale. Quindi, quando diciamo 1 + 1, stiamo essenzialmente mettendo insieme un oggetto e un altro oggetto per vedere quanti ne abbiamo in totale.\n\nLasciate che lo visualizzi: immaginate di avere una mela nella mano sinistra e un'altra mela nella mano destra. Se le metto insieme, quante mele ho? Dovrebbero essere due mele, giusto?\n\nUn altro modo per pensarci è usare una linea dei numeri. Partendo dal numero 1, se avanzo di un altro passo, dove atterro? Esatto, sul numero 2.\n\nPosso anche usare le dita per contare. Alzo un dito sulla mano sinistra e un altro sulla destra. Ora, contiamoli tutti: uno, due. Quindi mi dà un totale di due dita, il che significa che 1 + 1 = 2.\n\nForse dovrei controllare se esiste un'altra prospettiva o metodo. Ad esempio, nel sistema binario, il sistema numerico utilizzato dai computer, 1 + 1 è uguale a 10 perché si verifica un riporto dopo aver raggiunto 2 (che è rappresentato come 10). Ma questo è un contesto diverso. Nell'aritmetica decimale standard, che usiamo quotidianamente, 1 + 1 rimane 2.\n\nConsideriamo anche il concetto di insiemi. Se ho un insieme contenente un elemento e un altro insieme con un elemento, combinarli risulterebbe in un insieme con due elementi. Questo rafforza il fatto che 1 + 1 è uguale a 2.\n\nPotrei chiedermi se esiste qualche scenario in cui 1 + 1 non sia uguale a 2. Ma nell'ambito dell'aritmetica di base e della matematica come la impariamo, la risposta è costantemente due.\n\nPer assicurarmi di non perdere nulla, forse dovrei approfondire alcune dimostrazioni o principi matematici che confermano questo. Ad esempio, negli assiomi di Peano, che formano la fondazione dell'aritmetica, l'idea di aggiungere 1 a 1 seguirebbe l'assioma che ogni numero naturale ha un successore, e 2 è definito come il successore di 1.\n\nQuindi, mettendo insieme tutti questi pensieri - visualizzare oggetti, usare una linea dei numeri, contare le dita, considerare gli insiemi e persino toccare gli assiomi matematici - tutto porta a 1 + 1 uguale a 2.\n</think>\n\nIl risultato dell'addizione di 1 e 1 è 2. Questo può essere visto nell'aritmetica semplice e in vari modi di visualizzare il problema.\n\n**Risposta:** \n$1 + 1 = \\boxed{2}$"
Risultato simile, anche se con questo modello specifico ottengo i tag <think>, quindi forse il modello non sarà adatto a questo caso d’uso.
Ho appena ricostruito (cioè ./launcher rebuild app) la mia installazione e mi sono assicurato che tutto fosse aggiornato - nella pagina Aggiornamenti vedo “tutto aggiornato”.
Selezionando sia deepseek-r1:32b che phi4 (che ho installato e testato anch’esso), continuo a ricevere la risposta di errore del server interno nel browser.
Ma nei miei log, vedo qualcosa di nuovo.
FinalDestination::SSRFDetector::DisallowedIpError (FinalDestination: tutti gli indirizzi IP risolti erano non consentiti) lib/final_destination/ssrf_detector.rb:105:in 'lookup_and_filter_ips' lib/final_destination/http'
lib/final_destination/ssrf_detector.rb:105:in `lookup_and_filter_ips`
lib/final_destination/http.rb:15:in `connect`
net-http (0.6.0) lib/net/http.rb:1642:in `do_start`
net-http (0.6.0) lib/net/http.rb:1631:in `start`
net-http (0.6.0) lib/net/http.rb:1070:in `start`
plugins/discourse-ai/lib/completions/endpoints/base.rb:105:in `perform_completion!`
plugins/discourse-ai/lib/completions/endpoints/open_ai.rb:44:in `perform_completion!`
plugins/discourse-ai/lib/completions/llm.rb:281:in `generate`
plugins/discourse-ai/lib/configuration/llm_validator.rb:36:in `run_test`
plugins/discourse-ai/app/controllers/discourse_ai/admin/ai_llms_controller.rb:128:in `test`
actionpack (7.2.2.1) lib/action_controller/metal/basic_implicit_render.rb:8:in `send_action`
actionpack (7.2.2.1) lib/abstract_controller/base.rb:226:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/rendering.rb:193:in `process_action`
actionpack (7.2.2.1) lib/abstract_controller/callbacks.rb:261:in `block in process_action`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:121:in `block in run_callbacks`
app/controllers/application_controller.rb:427:in `block in with_resolved_locale`
i18n (1.14.7) lib/i18n.rb:353:in `with_locale`
app/controllers/application_controller.rb:427:in `with_resolved_locale`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:130:in `block in run_callbacks`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:141:in `run_callbacks`
actionpack (7.2.2.1) lib/abstract_controller/callbacks.rb:260:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/rescue.rb:27:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/instrumentation.rb:77:in `block in process_action`
activesupport (7.2.2.1) lib/active_support/notifications.rb:210:in `block in instrument`
activesupport (7.2.2.1) lib/active_support/notifications/instrumenter.rb:58:in `instrument`
activesupport (7.2.2.1) lib/active_support/notifications.rb:210:in `instrument`
actionpack (7.2.2.1) lib/action_controller/metal/instrumentation.rb:76:in `process_action`
actionpack (7.2.2.1) lib/action_controller/metal/params_wrapper.rb:259:in `process_action`
activerecord (7.2.2.1) lib/active_record/railties/controller_runtime.rb:39:in `process_action`
actionpack (7.2.2.1) lib/abstract_controller/base.rb:163:in `process`
actionview (7.2.2.1) lib/action_view/rendering.rb:40:in `process`
rack-mini-profiler (3.3.1) lib/mini_profiler/profiling_methods.rb:115:in `block in profile_method`
actionpack (7.2.2.1) lib/action_controller/metal.rb:252:in `dispatch`
actionpack (7.2.2.1) lib/action_controller/metal.rb:335:in `dispatch`
actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:67:in `dispatch`
actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:50:in `serve`
actionpack (7.2.2.1) lib/action_dispatch/routing/mapper.rb:32:in `block in <class:Constraints>`
actionpack (7.2.2.1) lib/action_dispatch/routing/mapper.rb:62:in `serve`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:53:in `block in serve`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:133:in `block in find_routes`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:126:in `each`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:126:in `find_routes`
actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:34:in `serve`
actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:896:in `call`
lib/middleware/omniauth_bypass_middleware.rb:35:in `call`
rack (2.2.11) lib/rack/tempfile_reaper.rb:15:in `call`
rack (2.2.11) lib/rack/conditional_get.rb:27:in `call`
rack (2.2.11) lib/rack/head.rb:12:in `call`
actionpack (7.2.2.1) lib/action_dispatch/http/permissions_policy.rb:38:in `call`
lib/content_security_policy/middleware.rb:12:in `call`
lib/middleware/anonymous_cache.rb:409:in `call`
lib/middleware/csp_script_nonce_injector.rb:12:in `call`
config/initializers/008-rack-cors.rb:14:in `call`
rack (2.2.11) lib/rack/session/abstract/id.rb:266:in `context`
rack (2.2.11) lib/rack/session/abstract/id.rb:260:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/cookies.rb:704:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/callbacks.rb:31:in `block in call`
activesupport (7.2.2.1) lib/active_support/callbacks.rb:101:in `run_callbacks`
actionpack (7.2.2.1) lib/action_dispatch/middleware/callbacks.rb:30:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:31:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/show_exceptions.rb:32:in `call`
logster (2.20.1) lib/logster/middleware/reporter.rb:40:in `call`
railties (7.2.2.1) lib/rails/rack/logger.rb:41:in `call_app`
railties (7.2.2.1) lib/rails/rack/logger.rb:29:in `call`
config/initializers/100-quiet_logger.rb:20:in `call`
config/initializers/100-silence_logger.rb:29:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/request_id.rb:33:in `call`
lib/middleware/enforce_hostname.rb:24:in `call`
rack (2.2.11) lib/rack/method_override.rb:24:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/executor.rb:16:in `call`
rack (2.2.11) lib/rack/sendfile.rb:110:in `call`
rack-mini-profiler (3.3.1) lib/mini_profiler.rb:334:in `call`
lib/middleware/processing_request.rb:12:in `call`
message_bus (4.3.9) lib/message_bus/rack/middleware.rb:60:in `call`
lib/middleware/request_tracker.rb:385:in `call`
actionpack (7.2.2.1) lib/action_dispatch/middleware/remote_ip.rb:96:in `call`
railties (7.2.2.1) lib/rails/engine.rb:535:in `call`
railties (7.2.2.1) lib/rails/railtie.rb:226:in `public_send`
railties (7.2.2.1) lib/rails/railtie.rb:226:in `method_missing`
rack (2.2.11) lib/rack/urlmap.rb:74:in `block in call`
rack (2.2.11) lib/rack/urlmap.rb:58:in `each`
rack (2.2.11) lib/rack/urlmap.rb:58:in `call`
unicorn (6.1.0) lib/unicorn/http_server.rb:634:in `process_client`
unicorn (6.1.0) lib/unicorn/http_server.rb:739:in `worker_loop`
unicorn (6.1.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers`
unicorn (6.1.0) lib/unicorn/http_server.rb:143:in `start`
unicorn (6.1.0) bin/unicorn:128:in `<top (required)>`
vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `load`
vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `<main>`
Questa installazione di Discourse è relativamente recente e non ho configurato alcun blocco di indirizzi IP. Sono anche l’unico utente. Sto eseguendo ollama in un contenitore Docker, ma non dovrebbe essere un problema; uso open-webui (anche questo da un altro contenitore Docker) con l’istanza e funziona bene. Sto usando l’indirizzo IP locale invece di “localhost”, ma “localhost” non si comporta in modo diverso.
Apprezzo il tempo che stai dedicando per aiutarmi a capire cosa sta succedendo qui.
ETA: Ho installato jq nel contenitore Docker di Discourse ed eseguito il comando curl (sostituendo il mio indirizzo IP locale a localhost), ed è stato eseguito correttamente da lì - quindi c’è connettività tra i contenitori e l’URL è corretto.
Questa è la nostra protezione SSRF predefinita che entra in funzione. Puoi aggiungere eccezioni tramite la variabile d’ambiente DISCOURSE_ALLOWED_INTERNAL_HOSTS.
Si attiva quando Discourse tenta di raggiungere un IP considerato interno.
Fantastico, ha funzionato: l’ho fatto tramite le impostazioni invece che tramite la variabile ENV, ma il test ora è passato. Grazie ancora per tutto l’aiuto!


