# CrewAI с Ollama: локальная модель и проверка вызова инструмента

Источник: https://modelium.tech/zhurnal/crewai-s-ollama/

CrewAI может передать задачу модели Qwen3:4b, работающей через Ollama на вашем компьютере. Для проверки агента мало получить правдоподобный ответ: нужно увидеть запись о выполнении заранее ограниченного тестового инструмента и сверить её с ответом. Этот инженерный пример для Linux и Python 3.12 сверён с документацией, но редакция не запускала модель и не доказывала офлайн-режим всего компьютера.

**Инженерный гайд, не домашний рецепт с интерфейсом.** Нужны Linux, терминал, Python 3.12 и готовность читать короткий Python-файл. Сверено по CrewAI Git `1d401543` и документации Ollama 8 октября 2026 года; Modelium не запускал программу или модель. Сеть понадобится для установки пакетов и загрузки весов. Выполнение через `localhost` само по себе не доказывает отсутствия других сетевых соединений. [s1](#src-s1) [s8](#src-s8)

## Какую задачу решает этот пример?

Представьте учебную запись: «Заказ A-17: встреча в четверг». Агент должен спросить у **одного** разрешённого инструмента день встречи и вернуть его. Если он просто напишет «четверг» без вызова инструмента, тест **не пройден**: модель могла угадать из задания. CrewAI управляет агентом и задачей; Ollama обслуживает локальную языковую модель; инструмент исполняет ваш Python-код только если приложение получило и приняло вызов. Именно ответ сервера модели, реальная запись инструмента и конечный ответ проверяются отдельно. [s2](#src-s2) [s3](#src-s3) [s4](#src-s4) [s9](#src-s9)

Для теста выбрана конкретная модель `qwen3:4b`: официальный каталог Ollama помечает её как поддерживающую инструменты. Это не гарантия, что вызов состоится на вашем компьютере или в вашей версии CrewAI. Файл в каталоге указан как 2,5 ГБ, но **это размер загрузки, а не минимальная оперативная или видеопамять**; подтверждённого универсального минимума RAM/VRAM для этого стека у нас нет. Сначала оцените свободные ресурсы своего компьютера. [s7](#src-s7)

## Что подготовить в Linux?

- Установите Ollama по [базовому гайду](/zapusk/ollama/) и откройте терминал. Выполните `ollama pull qwen3:4b` — эта команда скачивает модель; затем `ollama list` должен показывать **точный тег**. Проверить ответ сервера можно командой `curl -fsS http://127.0.0.1:11434/api/tags`: в JSON ищите `qwen3:4b`. Если Ollama уже запущена приложением, второй сервер не запускайте. [s7](#src-s7) [s8](#src-s8)

- Создайте **пустую** тестовую папку без ключей, документов и рабочего проекта. Установите Python 3.12 и `uv` по официальной инструкции CrewAI; в папке создайте окружение `uv venv --python 3.12` и установите `uv pip install 'crewai[litellm]==1.15.25'` (версия закреплена на просмотренном Git-коммите). Перед работой в том же терминале активируйте `source .venv/bin/activate`. Дождитесь завершения установки без ошибок; не переиспользуйте рабочий профиль с облачными ключами. Пакеты и веса требуют сети, но исполнение локальной модели направляется на адрес этой машины. [s1](#src-s1) [s10](#src-s10) [s11](#src-s11)

- В этом терминале до запуска своего файла установите `export CREWAI_DISABLE_TELEMETRY=true OTEL_SDK_DISABLED=true`. Не включайте `share_crew`, tracing, поиск в сети, knowledge sources, memory, planning и автоматические инструменты, если проверяете именно узкий локальный маршрут. Первый параметр отключает телеметрию CrewAI, второй — OpenTelemetry; ни один не служит доказательством отсутствия всех соединений сторонних библиотек. Если нужен закрытый контур, проведите [отдельную сетевую проверку](/zhurnal/proverka-offline-kontura-ii/). [s5](#src-s5) [s6](#src-s6)

## Как связать CrewAI с моделью и ограниченным действием?

В отдельном файле Python настройте `LLM(model="ollama/qwen3:4b", base_url="http://127.0.0.1:11434")`. Для Ollama CrewAI использует дополнительную библиотеку LiteLLM; укажите **этот же объект** в `llm` и `function_calling_llm` агента, чтобы вызов инструмента не ушёл к модели по умолчанию. Не задавайте облачного запасного LLM. Если провайдер или пакет не распознан, проверьте установленную версию и `crewai[litellm]`, не подставляйте настоящий облачный API-ключ. [s1](#src-s1) [s2](#src-s2)

Создайте собственную функцию `check_day(code: str) -> str` с `@tool("check_day")` из `crewai.tools`. Её единственное разрешённое действие: сравнить аргумент с **буквальным** `A-17`, записать факт вызова в пустой локальный файл `tool-audit.txt` и вернуть `четверг` при совпадении либо `неизвестный код` при несовпадении. Добавьте краткую строку документации к функции — зачем агенту этот инструмент. Не давайте функции доступ к сети, оболочке, исходным файлам или пользовательским данным. Декоратор и список инструментов агента описаны в руководстве CrewAI; этот простой пример — независимая редакционная адаптация, не скопированный чужой скрипт. [s4](#src-s4)

Создайте `Agent` с понятной ролью «проверяющий день заказа», `tools=[check_day]`, выбранными `llm` и `function_calling_llm`, `allow_delegation=False`, `allow_code_execution=False`, `max_iter=3`. Дайте ему одну `Task`: «Спроси у инструмента день для A-17 и верни день; не угадывай»; ожидаемый выход (`expected_output`) — день и код заказа. Передайте агент и задачу в `Crew(agents=[agent], tasks=[task], process=Process.sequential, memory=False, planning=False, share_crew=False)` и вызовите `kickoff()`. В документации описаны конструкторы агента, задачи, инструмента и Crew; их надо сверить с **установленной** версией пакета. [s2](#src-s2) [s3](#src-s3) [s4](#src-s4) [s5](#src-s5)

**Важное ограничение:** здесь приведён состав безопасного учебного файла и ключевые аргументы API, а не готовый к копированию многострочный скрипт. Текущий рендерер Modelium не сохраняет отступы Python-фрагментов, поэтому публиковать потенциально сломанный код как исполняемый пример было бы нечестно. Если вам нужен код целиком, начните с [официальных примеров инструментов CrewAI](https://docs.crewai.com/en/concepts/tools) и замените их действие на описанную проверку. Установка пакета и сборка этого файла редакцией не проверялись. [s2](#src-s2) [s3](#src-s3) [s4](#src-s4) [s5](#src-s5)

## Как понять, что агент действительно выполнил действие?

Перед каждым прогоном удалите **только** учебный `tool-audit.txt` в пустой тестовой папке. После `kickoff()` проверьте три вещи: в журнале CrewAI есть вызов `check_day` с кодом `A-17`; в `tool-audit.txt` появилась запись о вызове; конечный ответ соответствует **вашей** записи и содержит «четверг». Пустой файл, другой код, отсутствие следа вызова либо один правдоподобный финальный ответ означают, что проверка действия **не прошла**. Введите затем несуществующий код `B-00`: инструмент должен вернуть «неизвестный код», а агент не должен придумывать день. Этот отрицательный тест — предложенный протокол читателя, не измеренный Modelium результат. [s4](#src-s4) [s9](#src-s9)

Если модель отвечает текстом, похожим на вызов, но `tool-audit.txt` пуст, проверьте точный тег, адрес `11434`, `function_calling_llm`, список `tools` и версию LiteLLM. Не объявляйте запуск успешным только по распечатке CrewAI; читайте след исполнения. При необходимости оцените сеть **после** подготовки зависимостей; локальность модели не равна полной офлайн-работе агента. [s1](#src-s1) [s2](#src-s2) [s9](#src-s9)

**Следующий шаг:** [разберите полный цикл tool calling](/zhurnal/tool-calling-lokalnyh-modeley/) и сравните предложение модели с записью фактического действия. Для остановки учебного процесса завершите Python-программу; модель можно выгрузить средствами Ollama, а тестовое окружение и папку удалить после просмотра записей. [s8](#src-s8) [s9](#src-s9)

## Источники

1. [CrewAI: LLM providers и Ollama (Git, закреплённая ревизия)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/concepts/llms.mdx) — получено 2026-10-08
2. [CrewAI: Agent, инструменты и ограничения (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/concepts/agents.mdx) — получено 2026-10-08
3. [CrewAI: Tasks и expected_output (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/concepts/tasks.mdx) — получено 2026-10-08
4. [CrewAI: пользовательский @tool (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/concepts/tools.mdx) — получено 2026-10-08
5. [CrewAI: Crew и последовательная задача (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/concepts/crews.mdx) — получено 2026-10-08
6. [CrewAI: настройки телеметрии (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/telemetry.mdx) — получено 2026-10-08
7. [Ollama: официальный каталог Qwen3:4b](https://ollama.com/library/qwen3:4b) — получено 2026-10-08
8. [Ollama: локальные модели и облачный API — Quickstart](https://docs.ollama.com/quickstart) — получено 2026-10-08
9. [Ollama: модель предлагает вызов, клиент выполняет инструмент](https://docs.ollama.com/capabilities/tool-calling) — получено 2026-10-08
10. [CrewAI: версия пакета и диапазон Python (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/lib/crewai/pyproject.toml) — получено 2026-10-08
11. [CrewAI: установка и uv (Git)](https://raw.githubusercontent.com/crewAIInc/crewAI/1d4015439a7a7b13d473a7df06da7d5c69f3cd08/docs/edge/en/installation.mdx) — получено 2026-10-08
