Curieux de savoir si quelqu’un a réussi à faire fonctionner cela avec Ollama localement ?
J’essaie également de faire fonctionner cela avec ollama. Il semble que l’API utilisée par le plugin Discourse AI ne soit pas compatible avec Ollama et que tous les paramètres que je modifie ne changent pas la requête API.
Voici ce qui fonctionne avec ollama :
curl http://192.168.1.2:11434/api/generate -d '{\
\"model\": \"llama3.2\",\
\"prompt\": \"Pourquoi le ciel est-il bleu ?\"\
}'
Et ci-dessus semble être le seul type de requête que le plugin tente. Par exemple :
curl http://192.168.1.2:11434/ \
-X POST \
-H 'Content-Type: application/json' \
-d '{\"inputs\":\"\u003cs\u003e[INST] Quel est votre condiment préféré ? [/INST] Eh bien, j'aime beaucoup un bon filet de jus de citron frais. Il ajoute juste la bonne quantité de saveur acidulée à tout ce que je cuisine dans la cuisine ! \u003c/s\u003e [INST] Avez-vous des recettes de mayonnaise ? [/INST]\",\"parameters\":{\"max_new_tokens\":500, \"temperature\":0.5,\"top_p\": 0.9}}'
Le chatbot IA est censé prendre en charge ollama, mais je n’arrive pas non plus à obtenir de réponse.
Donc, oui, quiconque a réussi à faire fonctionner cela avec ollama, veuillez publier les paramètres que vous avez utilisés !
Apparemment, j’ai parlé trop vite, si je n’ai aucun paramètre défini dans le plugin Discourse AI et que je suis les instructions RAG dans ce post, j’obtiens des réponses dans le chatbot IA d’Ollama !
Ça fonctionne très bien avec Ollama, plusieurs personnes dans l’équipe l’utilisent.
Cool. Existe-t-il un guide que nous pouvons suivre sur la façon de l’implémenter ?
Je suis plus intéressé par la résumé et d’autres fonctions que par le chatbot.
ETA : Cette configuration ne fonctionne pas :
(J’ai masqué l’adresse IP de mon hôte ici).
Ce qui se passe, c’est que j’obtiens une erreur de serveur interne lorsque je clique sur « Run Test ».
Sur /logs, je vois :
NameError (variable ou méthode locale non définie `tokenizer' pour une instance de 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'
Cela se produit quel que soit le tokenizer que je sélectionne. Je teste ceci sur 3.5.0beta1-dev (c1ee4e120e).
Définissez l’URL sur http://localhost:11434/v1/chat/completions
Le test échoue toujours avec une erreur de serveur interne, le même message de journal également - une NameError indiquant que « tokenizer » est une variable locale indéfinie.
Essayez d’enregistrer le modèle tel quel, de rafraîchir la page, puis de revenir via le bouton d’édition LLM et d’exécuter un nouveau test.
Même résultat - J’ai parcouru cela plusieurs fois, mais je viens de réessayer.
J’ai fait l’installation de la manière habituelle - je l’ai ajouté à mon fichier app.yml et j’ai exécuté ./launcher rebuild app
La ligne que j’ai ajoutée était :
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- sudo -E -u discourse git clone https://github.com/discourse/discourse-ai.git
(J’ai supprimé les autres plugins de la liste mais j’ai laissé les composants yml pour que vous puissiez voir où cela se trouve dans le fichier yml.)
Je retrouverai ma configuration ollama locale demain et je ferai un rapport ici.
J’ai fait :
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 somme de 1 + 1 est 2.
En arithmétique de base, lorsque vous ajoutez une unité à une autre unité simple, le nombre total devient deux unités. Cette opération fait partie des principes fondamentaux d'addition utilisés en mathématiques. Y a-t-il autre chose pour lequel je peux vous aider concernant les mathématiques ou tout autre sujet ?"
Testé sur Helper
Merci d’avoir testé cela.
Je remarque que j’ai une option supplémentaire (Désactiver les complétions en flux) par rapport à votre configuration. Est-il possible que ce soit la sélection du modèle qui pose problème pour moi ? (J’ai installé deepseek-r1:32b).
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1:32b",
"messages": [
{
"role": "system",
"content": "Vous êtes un assistant utile."
},
{
"role": "user",
"content": "Combien font 1+1 ?"
}
]
}' -s | jq .choices[].message.content
"<think>\nBon, j'essaie de comprendre combien font 1 plus 1. D'accord, décomposons cela étape par étape, même si cela semble simple.\n\nPremièrement, je sais que l'addition consiste à combiner deux nombres pour obtenir une somme totale. Donc, quand nous disons 1 + 1, nous mettons essentiellement ensemble un objet et un autre objet pour voir combien nous avons au total.\n\nLaissez-moi visualiser cela : imaginez que j'ai une pomme dans ma main gauche et une autre pomme dans ma main droite. Si je les mets ensemble, combien de pommes ai-je ? Cela devrait être deux pommes, non ?\n\nUne autre façon de voir les choses est d'utiliser une droite numérique. En partant du nombre 1, si je fais un pas de plus vers l'avant, où atterris-je ? C'est exact, sur le nombre 2.\n\nJe peux aussi utiliser mes doigts pour compter. Levez un doigt de ma main gauche et un autre de ma main droite. Maintenant, comptez-les tous : un, deux. Cela me donne donc un total de deux doigts, ce qui signifie que 1 + 1 = 2.\n\nPeut-être devrais-je vérifier s'il existe une autre perspective ou méthode. Par exemple, en binaire, le système numérique utilisé par les ordinateurs, 1 + 1 égale 10 car il y a une retenue après avoir atteint 2 (qui est représenté par 10). Mais c'est un contexte différent. En arithmétique décimale standard, que nous utilisons quotidiennement, 1 + 1 reste égal à 2.\n\nLaissez-moi aussi considérer le concept d'ensembles. Si j'ai un ensemble contenant un élément et un autre ensemble avec un élément, les combiner donnerait un ensemble avec deux éléments. Cela renforce l'idée que 1 + 1 égale 2.\n\nJe pourrais me demander s'il existe un scénario où 1 + 1 ne serait pas égal à 2. Mais dans le domaine de l'arithmétique de base et des mathématiques telles que nous les apprenons, la réponse est constamment deux.\n\nPour m'assurer de ne rien manquer, peut-être devrais-je examiner certaines preuves ou principes mathématiques qui confirment cela. Par exemple, dans les axiomes de Peano, qui forment le fondement de l'arithmétique, l'idée d'ajouter 1 à 1 suivrait l'axiome selon lequel chaque nombre naturel a un successeur, et 2 est défini comme le successeur de 1.\n\nPar conséquent, en rassemblant toutes ces réflexions — visualiser des objets, utiliser une droite numérique, compter sur ses doigts, considérer des ensembles, et même toucher aux axiomes mathématiques — tout pointe vers le fait que 1 + 1 égale 2.\n</think>\n\nLe résultat de l'addition de 1 et 1 est 2. Cela peut être vu dans l'arithmétique simple et de diverses façons de visualiser le problème.\n\n**Réponse :** \n$1 + 1 = \\boxed{2}$"
Résultat similaire, bien que j’obtienne les balises <think> avec ce modèle particulier — donc peut-être que ce modèle ne conviendra pas à cet usage.
Je viens de reconstruire (c’est-à-dire ./launcher rebuild app) mon installation et de m’assurer que tout est à jour — je vois « tout à jour » dans ma page de mise à jour.
Que je sélectionne deepseek-r1:32b ou phi4 (que j’ai également installé et testé), je continue d’obtenir une réponse d’erreur interne du serveur dans le navigateur.
Mais dans mes journaux, je vois quelque chose de nouveau.
FinalDestination::SSRFDetector::DisallowedIpError (FinalDestination : toutes les adresses IP résolues étaient interdites) 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>'
Cette installation Discourse est relativement récente, et je n’ai configuré aucun blocage d’adresse IP. Je suis également le seul utilisateur. J’exécute ollama dans un conteneur Docker, mais cela ne devrait pas poser problème ; j’utilise open-webui (également depuis un autre conteneur Docker) avec l’instance et cela fonctionne bien. J’utilise l’adresse IP locale plutôt que « localhost », mais « localhost » ne se comporte pas différemment.
Je vous remercie du temps que vous consacrez à m’aider à comprendre ce qui se passe ici.
ETA : J’ai installé jq dans le conteneur Docker Discourse et exécuté la commande curl (en remplaçant mon adresse IP locale à la place de localhost), et cela a fonctionné depuis là — il y a donc une connectivité entre les conteneurs, et l’URL est correcte).
C’est notre protection SSRF par défaut qui s’active. Vous pouvez y ajouter des exceptions via la variable d’environnement DISCOURSE_ALLOWED_INTERNAL_HOSTS.
Elle se déclenche lorsque Discourse essaie d’atteindre une adresse IP considérée comme interne.
Génial, ça a fonctionné - je l’ai fait via les paramètres plutôt que via la variable d’environnement, mais le test a réussi maintenant. Merci encore pour toute votre aide !


