Ошибка задачи кастомных LLM: [deepseek-coder-v2:latest не поддерживает инструменты", "type": "api_error", "param": null, "code": null]

Мы включили пользовательскую LLM, но при попытке использовать чат-бот столкнулись с проблемой.

Журнал

Сообщение (сообщено 2 копии)

Исключение задачи: {"error":{"message":"registry.ollama.ai/library/deepseek-coder-v2:latest не поддерживает инструменты","type":"api_error","param":null,"code":null}}

Трассировка стека

/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:173:in `block (2 levels) in perform_completion!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2433:in `block in transport_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http/response.rb:320:in `reading_body'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2430:in `transport_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:2384:in `request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/patches/net_patches.rb:19:in `block in request_with_mini_profiler'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/mini_profiler/profiling_methods.rb:51:in `step'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/patches/net_patches.rb:18:in `request_with_mini_profiler'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:168:in `block in perform_completion!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:1632:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/net-http-0.6.0/lib/net/http.rb:1070:in `start'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/base.rb:139:in `perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/endpoints/open_ai.rb:53:in `perform_completion!'
/var/www/discourse/plugins/discourse-ai/lib/completions/llm.rb:415:in `generate'
/var/www/discourse/plugins/discourse-ai/lib/personas/bot.rb:89:in `reply'
/var/www/discourse/plugins/discourse-ai/lib/ai_bot/playground.rb:494:in `reply_to'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/create_ai_reply.rb:18:in `execute'
/var/www/discourse/app/jobs/base.rb:318:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in `with_connection'
/var/www/discourse/app/jobs/base.rb:305:in `block in perform'
/var/www/discourse/app/jobs/base.rb:301:in `each'
/var/www/discourse/app/jobs/base.rb:301:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:131:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'
curl -X POST http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" -d '{
  "model": "deepseek-coder-v2:latest",
  "messages": [
    {
      "role": "system",
      "content": "Вы — полезный помощник."
    },
    {
      "role": "user",
      "content": "Какая последняя версия Conan по состоянию на 2025 год?"
    }
  ],
  "temperature": 0.7,
  "max_tokens": 200
}'

{"id":"chatcmpl-940","object":"chat.completion","created":1757057197,"model":"deepseek-coder-v2:latest","system_fingerprint":"fp_ollama","choices":[{"index":0,"message":{"role":"assistant","content":" По состоянию на последнее обновление в начале 2023 года у меня нет конкретной информации о \"Conan\" после 2025 года, поскольку я не обладаю способностью предсказывать будущее или получать данные в реальном времени. Однако я могу дать несколько общих рекомендаций о том, как найти последнюю версию Conan — менеджера пакетов для управления зависимостями на C/C++:\n\n1. **Посетите официальный сайт:** Самый надёжный способ получить информацию о последней версии Conan — зайти на официальный сайт https://conan.io/. Там обычно публикуются последние примечания к выпуску и документация, относящаяся к актуальной версии.\n\n2. **Проверьте репозиторий на GitHub:** Исходный код Conan размещён на GitHub, поэтому вы также можете проверить репозиторий (https://github.com/conan-io/conan) на наличие релизов или тегов, соответствующих разным версиям. В репозитории часто содержатся примечания к выпуску в виде коммитов и запросов на слияние.\n\n3"},"finish_reason":"length"}],"usage":{"prompt_tokens":30,"completion_tokens":200,"total_tokens":230}}

Похоже, что это ключевая ошибка:

deepseek-coder-v2:latest не поддерживает инструменты

Посмотрев на список моделей здесь: deepseek-coder · Ollama

кажется, что deepseek-coder-v2 не поддерживает инструменты — вам либо нужно убрать инструменты из вашего персонажа, либо переключиться на модель с вызовом инструментов, например deepseek-coder-v2-tool-calling

При выполнении команды CURL с указанными входными данными результат формируется без ошибок. Мы не вносили никаких кастомизаций в персона и соответствующие настройки.

@awesomerobot

Могли бы вы предоставить дополнительные детали и примеры? Это поможет нам лучше понять ситуацию и провести более конструктивное обсуждение.

Похоже, что в команде curl нет вызовов инструментов, поэтому, возможно, в этом и причина? В настройках персонажа какие-либо инструменты указаны?

@awesomerobot

Мы пока не добавляли никаких пользовательских персонажей, поэтому все, что вы видите в приложении, — это только стандартные варианты. Кроме того, в данный момент мы их не используем!

Персонажи:

Инструменты

После повторного просмотра вашего предыдущего скриншота я вижу, что в вашем сообщении используется персонаж forum helper… этот персонаж включает встроенные инструменты, которые нельзя удалить и которые не будут работать с используемой вами моделью.

Попробуйте один из предварительно настроенных персонажей, не включающих инструменты (например, «creative»), или создайте новый персонаж без инструментов.

Не могли бы вы уточнить, является ли наличие персоны необходимым условием для эффективной работы больших языковых моделей (LLM)?

Да, наши функции ИИ используют LLM с заданным персонажем.

Если у вас включено более одного персонажа и вы создаёте новое сообщение, вы увидите выпадающее меню, позволяющее выбрать персонажа:

Для тестирования, если вы включите встроенный персонаж «Creative»:

а затем обновите страницу и начнёте новое сообщение с его использованием, я ожидаю, что это будет работать с вашим LLM, так как персонаж «Creative» не включает никаких инструментов.

Я вижу только эти варианты, не могли бы вы помочь мне с настройкой

Вам нужно перейти по адресу /admin/plugins/discourse-ai/ai-personas и либо создать новую персону, либо включить одну без инструментов. Если вы хотите протестировать существующую персону, «Creative» — хороший вариант, так как она не включает никаких инструментов.

Итак, вам нужно нажать «Изменить» здесь:

Внизу настроек персоны вам нужно включить её, нажать «Создать пользователя» и сохранить изменения.

После этого персона «Creative» должна появиться в списке (возможно, сначала потребуется обновить страницу).

Нужно ли нам также выбрать модальное окно по умолчанию?

Также, пожалуйста, помогите со следующими настройками:

Персона редактора-помощника ИИ
Персона предложений заголовков помощника ИИ
Персона объяснений помощника ИИ
Персона иллюстратора постов помощника ИИ
Персона умных дат помощника ИИ
Персона переводчика помощника ИИ
Персона таблиц Markdown помощника ИИ
Персона пользовательских промптов помощника ИИ
Персона подписей к изображениям помощника ИИ
Персона семантического поиска Hyde на основе эмбеддингов ИИ
Персона суммаризации ИИ
Персона кратких выжимок (gists) ИИ
Персона обнаружения ботов ИИ
Персона поиска в Discord ИИ
Персона определения локализации для перевода ИИ
Персона перевода сырых постов ИИ
Персона перевода заголовков тем ИИ
Персона перевода коротких текстов ИИ
Персона генерации выведенных концепций
Персона сопоставления выведенных концепций
Персона дедупликации выведенных концепций
Генерация эмбеддингов ИИ для PM
Разрешенные группы для публичного обмена ботами ИИ

Как передать свой вопрос LLM и задать персонажа для получения лучшего результата

Я хочу получить ответ на основе данных из моего форума и модели, если они доступны.

@awesomerobot

Спасибо большое за ваш вклад! Я очень это ценю. Я получаю ответы от бота, но, похоже, контент моего форума не включается. Есть ли у вас какие-либо предложения, как мы могли бы это улучшить, чтобы бот учитывал контент форума? Еще раз спасибо!

Вам нужно переключиться на LLM, поддерживающую использование инструментов. Например, наша встроенная персона «помощник форума» использует инструменты «поиск» и «чтение», чтобы находить релевантный контент на форуме и включать его в свои ответы.

Если модель не поддерживает нативные инструменты, вы всегда можете использовать альтернативу на основе XML, которая включает их в промпт: