Иногда, если сидеть на работе без дела, можно заскучать и начать отсчитывать время до окончания рабочего дня. А можно поступить иначе — открыть очередную интересную для себя технологию, начать разбираться, экспериментировать, что-нибудь установить и посмотреть, что из этого получится.

Сегодня как раз один из таких положительных дней. На очереди у меня — CrewAI.

В последнее время я постепенно изучаю различные инструменты и фреймворки, которые могут пригодиться для создания собственного персонального AI-помощника — своеобразного «Умника», если проводить аналогию с одноимённой системой из серии книг Анджея Ясинского.

На этот раз решил посмотреть, что из себя представляет CrewAI и насколько он вообще подходит для подобных экспериментов.

Что такое CrewAI?

Первое, что стоит сразу отметить: CrewAI — это не сама нейросеть.

Если сильно упростить, CrewAI можно рассматривать как оркестратор для AI-агентов. Он позволяет организовать работу одного или нескольких агентов, определить их задачи, последовательность выполнения действий и инструменты, которыми они могут пользоваться.

То есть условно схема выглядит следующим образом:

Я → CrewAI → задание + инструкции → LLM → ответ / действие

В моём случае в качестве языковой модели я планирую использовать локально запущенную через Ollama модель (в качестве вычислительных мощностей пока выступит NVidia Quadro P1000 после того как все интересуемое разберу и пойму):

CrewAI → Ollama → Llama 3.1 8B

Таким образом, сама языковая модель отвечает за генерацию и понимание текста, а CrewAI занимается организацией процесса: кому что поручить, в какой последовательности выполнить задачи и какие инструменты использовать.

Конечно, это довольно сильно упрощённое представление. По мере изучения CrewAI я надеюсь разобраться, насколько эта схема соответствует реальной архитектуре и что именно можно построить на её основе.

Flow, Agent и Crew

Из того, что я успел посмотреть перед началом эксперимента, основная идея CrewAI строится вокруг нескольких понятий.

Упрощённо это можно представить так:

Flow → сценарий выполнения → Agent → задача → LLM → результат

Здесь Flow отвечает за сценарий и последовательность выполнения, а Agent — за исполнителя конкретной задачи.

На практике, разумеется, всё несколько интереснее, и именно это я хочу постепенно проверить уже не по документации, а непосредственно руками.

Почему Ubuntu?

Все эксперименты с будущим персональным помощником я стараюсь ориентировать на Linux, а конкретно — на Ubuntu LTS Server.

Windows в данном случае я сознательно оставляю за рамками эксперимента. Для постоянно работающего локального AI-помощника мне гораздо интереснее серверная Linux-среда: без лишнего графического интерфейса, с возможностью работать по SSH и постепенно превращать отдельную машину в постоянно работающий сервис.

Поэтому сегодня задача достаточно простая:

  1. разобраться с требованиями CrewAI;
  2. установить CrewAI на Ubuntu 24.04 LTS Server;
  3. подключить локальную LLM через Ollama;
  4. запустить небольшой тестовый пример;
  5. посмотреть, как на практике устроено взаимодействие Flow, Agent и языковой модели.

А уже после этого можно будет думать о более серьёзных экспериментах.

Что потребуется для установки?

Первым делом отправляюсь в официальную документацию CrewAI и смотрю, какие требования предъявляются к окружению.

На момент подготовки этой заметки указанный диапазон версий Python:

Python >= 3.10 и < 3.14

Это важный момент, поскольку перед установкой необходимо убедиться, что версия Python в системе соответствует требованиям.

Далее посмотрим непосредственно на Ubuntu 24.04 LTS Server и разберём установку по шагам.

Ну что же, теория на этом пока заканчивается. Переходим к установке.

Шаг №1: Сперва обкатываю развертывание и взаимодействие, как виртуальная машина, а потому создаю контейнер под нее в тестовой виртуализации под управлением Debian 12 + Proxmox 8.2.2

  • RAM: 16Gb
  • CPU: 1 sockets, 4 cores (Type: host)
  • Storage: 70Gb

На заметку: Для быстроты тестирования все же рекомендую использовать SSD или NVme-диски в качестве выбора Storage в среде Proxmox.

Шаг №2: Операционная система Ubuntu 24.04 LTS Server развернута из образа: Ubuntu-24.04.5-live-server-amd64.iso

Шаг №3: Произвожу преднастройку операционной системы перед последующим использованием: (у каждого системного администратора свои предпочтения по преднастройке, так что публиковать свой скрипт не имеет смысла)

W:\tips_sh\tips_ubuntu_24_04_preconfigure_v1.sh

Шаг №4: Т.к. этот фреймворк строится на базе Python, то его развертывание у меня сперва начнется по установке версии 3.13.XX в систему:

По умолчанию в системе:

ekzorchik@srv-s2404a:~$ python3 -V
Python 3.12.3
ekzorchik@srv-s2404a:~$

опираясь на заметку: "Как установить Python 3.XX на Ubuntu 24.04 Server"

ekzorchik@srv-s2404a:~$ sudo apt install -y software-properties-common
ekzorchik@srv-s2404a:~$ sudo add-apt-repository ppa:deadsnakes/ppa
ekzorchik@srv-s2404a:~$ sudo apt install -y python3.13 python3.13-venv python3.13-dev
ekzorchik@srv-s2404a:~$ python3.13 --version
Python 3.13.15
ekzorchik@srv-s2404a:~$

Шаг №5: Опираясь на заметку развернут фреймворк ollama + языковая модель llama3.1:8b

так как сейчас все прорабатываю, то на CPU

после перенесу на GPU

Шаг №6: Устанавливаем uv для управления зависимостями Python:

ekzorchik@srv-s2404a:~$ curl -LsSf https://astral.sh/uv/install.sh | sh
ekzorchik@srv-s2404a:~$ source "$HOME/.local/bin/env"
ekzorchik@srv-s2404a:~$ whereis uv
uv: /home/ekzorchik/.local/bin/uv
ekzorchik@srv-s2404a:~$
ekzorchik@srv-s2404a:~$ uv --version
uv 0.12.16 (x86_64-unknown-linux-gnu)
ekzorchik@srv-s2404a:~$

Шаг №7: Устанавливаем CrewAI CLI:

ekzorchik@srv-s2404a:~$ uv tool install crewai
ekzorchik@srv-s2404a:~$ whereis crewai
crewai: /home/ekzorchik/.local/bin/crewai
ekzorchik@srv-s2404a:~$
ekzorchik@srv-s2404a:~$ crewai version
crewai version: 1.15.22

Шаг №8: Первым делом после установки изучаем справочную систему на предмет как с этим инструментом взаимодействовать, любую информацию опубликованных статей, и официальный сайт не забываем конечно же:

ekzorchik@srv-s2404a:~$ crewai --help
Usage: crewai [OPTIONS] COMMAND [ARGS]...
  Top-level command group for crewai.
Options:
  --version  Show the version and exit.
  --help     Show this message and exit.
Commands:
  chat               Start a conversation with the Crew, collecting...
  checkpoint         Browse and inspect checkpoints.
  config             CLI Configuration commands.
  create             Create a new crew, flow, tool, skill, or template.
  deploy             Deploy the Crew CLI group.
  enterprise         Enterprise Configuration commands.
  env                Environment variable commands.
  flow               Flow related commands.
  install            Install the Crew.
  log-tasks-outputs  Retrieve your latest crew.kickoff() task outputs.
  login              Sign Up/Login to CrewAI AMP.
  logout             Logout from CrewAI AMP.
  memory             Open the Memory TUI to browse scopes and recall...
  org                Organization management commands.
  replay             Replay the crew execution from a specific task.
  reset-memories     Reset the crew memories (memory, knowledge,...
  run                Run the Crew or Flow.
  skill              Create, publish, and install agent skills.
  template           Browse and install project templates.
  test               Test the crew and evaluate the results.
  tool               Tool Repository related commands.
  traces             Trace collection management commands.
  train              Train the crew.
  triggers           Trigger related commands.
  update             Update the pyproject.toml of the Crew project to use...
  uv                 A wrapper around uv commands that adds custom tool...
  version            Show the installed version of crewai.

ekzorchik@srv-s2404a:~$

Шаг №9: Логика работы CrewAI:

Упрощенная логика работы CrewAI.

у меня будут использоваться новые JSONC-шаблоны, а не привычные yaml файлы ну пока во всяком случае:

У меня будут использоваться новые JSONC-шаблоны.

Шаг №10: Прочитав что можно было и как я себе это понял, инструмент CrewAI — это не полнофункциональный персональный помощник в готовом виде, это конструктор, из которого ты программируешь своего помощника.

Компонент Компонент
LLM мозг
Ollama запускает мозг локально
CrewAI организует работу мозга
Agent отдельная роль/исполнитель
Crew команда исполнителей
Flow сценарий работы
Tools руки агента
Memory память
Knowledge/RAG знания из документов

Шаг №11: Разберем создание проекта, только так в процессе можно понять, что и, как и попутно решать моменты этого:

create — Create a new crew, flow, tool, skill, or template.

  • Role -> кем является агент
  • Goal -> чего он должен делать
  • Backstory -> предыстория/контекста агента, которая помогает LLM понять его характер и способ работы

ekzorchik@srv-s2404a:~$ mkdir ~/project

ekzorchik@srv-s2404a:~$ cd ~/project/

ekzorchik@srv-s2404a:~/project$

На заметку: Вычитал, что можно на русском задавать ему, т.к. CrewAI не требует, чтобы запрашиваемое было только на английском.

ekzorchik@srv-s2404a:~/project$ crewai create crew ai

  Creating crew: ai

  Step 1/3 — Agents

  Define the AI agents in your crew.

  Tip: Use {placeholder} for dynamic values you want to change later.

  Agent 1

  Role > check_uptime

  Goal > Получить аптайм текущей системы

  Backstory > Запускаем скрипт на Python который обращается к встроенным функциям для получения времени текущей загрузки системы

  LLM Provider:

    OpenAI

    Anthropic

    Google Gemini

    Groq

  → Ollama

    AWS Bedrock

    Azure OpenAI

    NVIDIA NIM

    Hugging Face

    Cerebras

    SambaNova

    IBM watsonx

    Other (enter manually)

Небольшая справка по выбираемым провайдерам.

  LLM Provider:

  → Ollama

  Ollama Model: (мастер самостоятельно определил какая модель у меня сейчас установлена

  → Llama3.1 8B  (llama3.1:8b)

    Other (enter model name)

нажимаю клавишу "ENTER"

На заметку: тут выбираем как будет осуществлять действо, проект будет читать содержимое директории. Я не уверен на счет этот выбора и в последствии я перередактировал настройки.

  Tools (space to toggle, enter to confirm):

  ↑↓ navigate, space toggle, enter confirm, ▸ rows expand/collapse

      ── Common tools ──

      [ ] Google search via Serper API                     SerperDevTool

      [ ] Extract content from a URL                       ScrapeWebsiteTool

    → [x] List directory contents                          DirectoryReadTool

      [ ] Read local files                                 FileReadTool

      [ ] Write to local files                             FileWriterTool

         ▸ CrewAI Platform  (16 tools)

         ▸ Search & Research  (26 tools)

         ▸ Web Scraping  (16 tools)

         ▸ File & Document  (12 tools)

         ▸ Code & Data  (5 tools)

         ▸ Cloud & Storage  (4 tools)

         ▸ Sandbox & Automation  (7 tools)

         ▸ AI & Vision  (5 tools)

Нажимаю клавишу "ENTER"

  ✔ 1 tool

  Enable step-by-step planning? [y/N] > N

  Allow delegation to other agents? [y/N] > N

  ✔ check_uptime added

  Add another agent? [y/N] > N

  Step 2/3 — Tasks

  Define what your agents should do.

  Tip: Use {placeholder} for dynamic values you want to change later.

  Task 1

  Description > через скрипт на Python определяем uptime

  Expected output >нажал клавишу "ENTER", пока не знаю что вводить

  ✔ Task 1 added

  Add another task? [y/N] > N

  Step 3/3 — Settings

  Enable crew memory? [Y/n] > Y

  API keys and model saved to .env file

hint: Using 'master' as the name for the initial branch. This default branch name

hint: is subject to change. To configure the initial branch name to use in all

hint: of your new repositories, which will suppress this warning, call:

hint:

hint:   git config --global init.defaultBranch <name>

hint:

hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and

hint: 'development'. The just-created branch can be renamed via this command:

hint:

hint:   git branch -m <name>

Initialized empty Git repository in /home/ekzorchik/project/ai/.git/

  ✔ Crew ai created successfully!

  Next steps:

    cd ai

  Run your crew:

    crewai run

  Customize your crew:

    agents/*.jsonc    Define agent roles, goals, and LLMs

    crew.jsonc        Configure tasks and optional input defaults

    tools/            Add custom tools (Python)

ekzorchik@srv-s2404a:~/project$

С учетом полученного:

  • ekzorchik@srv-s2404a:~/project$ la ai/agents/check_uptime.jsonc - это конфигурационный файл агента
  • ekzorchik@srv-s2404a:~/project$ ls ai/crew.jsonc - тут описываемое задание
  • ekzorchik@srv-s2404a:~/project$ ls ai/tools/ - тут размещаем Python-скрипт который выполняет задание

Шаг №12: Проверяем что в проекте ai правильно предопределено использование фреймворка ollama и модели:

ekzorchik@srv-s2404a:~/project$ nano ai/.env
MODEL=ollama/llama3.1:8b
API_BASE=http://localhost:11434
OPENAI_API_KEY=none

Шаг №13: Создаю Python-скрипт который будет получать информацию по uptime-системы:

ekzorchik@srv-s2404a:~/project$ nano ai/tools/check_uptime.py

На заметку: crewai должен найти check_uptime, а мой Python-класс должен регистрировать tool с согласованным именем (str = "check_uptime")

from crewai.tools import BaseTool
import subprocess
class UptimeTool(BaseTool):
    name: str = "check_uptime"
    description: str = (
        "Показывает, сколько времени система работает с момента загрузки."
    )
    def _run(self) -> str:
        result = subprocess.run(
            ["uptime", "-p"],
            capture_output=True,
            text=True,
            check=True,
        )
        return result.stdout.strip()

На заметку: что выводит на консоль команда uptime -p

up 1 hour, 33 minutes

Шаг №14: Описываю задание — crew.jsonc:

На заметку: я привожу содержимое файла, а так он создается через nano.

ekzorchik@srv-s2404a:~/project$ cat ai/crew.jsonc | grep -v "//\|^$" | jq .

{
  "name": "ai",
  "agents": ["check_uptime"],
  "tasks": [
    {
      "name": "task_check_uptime",
      "description": "через скрипт на Python определяем uptime",
      "expected_output": "Время работы текущей Linux-системы с момента загрузки, например ",
      "agent": "check_uptime"
    }
  ],
  "process": "sequential",
  "verbose": true,
  "memory": true,
  "inputs": {}
}
ekzorchik@srv-s2404a:~/project$

Шаг №15: Описываю поведение агента — agent/*.jsonc:

На заметку: для "backstory": Агент отвечает за получение uptime текущей Linux-системы. Для этого он использует предоставленный инструмент check_uptime.

На заметку: я привожу содержимое файла, а так он создается через nano.

ekzorchik@srv-s2404a:~/project$ cat ai/agents/check_uptime.jsonc | grep -v "//\|^$" | jq .

{
  "role": "check_uptime",
  "goal": "Получить аптайм текущей системы",
  "backstory": "Агент отвечает за получение uptime текущей Linux-системы. Для этого он использует предоставленный инструмент check_uptime.",
  "llm": "ollama/llama3.1:8b",
  "tools": [
    "custom:check_uptime"
  ],
  "settings": {
    "verbose": false,
    "allow_delegation": false
  }
}

Шаг №16: Запускаю проект, нужно находится в каталоге где имеет место быть файл crew.jsonc:

ekzorchik@srv-s2404a:~/project$ cd ai/

ekzorchik@srv-s2404a:~/project/ai$ crewai run

может возникнуть окно

Окно, а можно ли отправить диагностические данные разработчикам, нажимаем "Cancel" или ждем 20 секунд.

в нем я выбираю "Cancel" но можно подождать 20 секунд и оно закроется и будет ниже указанный скриншот:

На заметку: Надо как нибудь посмотреть как убрать окно "Share this execution trace with CrewAI?"

почитал — это CrewAI спрашивает можно ли отправить telemetry/execution trace (диагностическую информацию) о выполнении твоего проекта разработчикам.

Отключаем:

ekzorchik@srv-us2404a:~/project/ai$ crewai traces disable

╭───────────────────────────────────────────────── Traces Disabled ──────────────────────────────────────────────────╮

│                                                                                                                    │

│  ❌ Trace collection disabled.                                                                                     │

│                                                                                                                    │

│  Your crew/flow executions will no longer send traces (unless CREWAI_TRACING_ENABLED=true is set in the            │

│  environment, which overrides the opt-out).                                                                        │

│  Use 'crewai traces enable' to opt back in.                                                                        │

│                                                                                                                    │

╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

ekzorchik@srv-us2404a:~/project/ai$

или

ekzorchik@srv-us2404a:~/project/ai$ nano .env

CREWAI_TRACING_ENABLED=false

Результат выполнения моей задачи.

нажал клавишу "q" и вышел в консоль:

ekzorchik@srv-s2404a:~/project/ai$ crewai run

╭─  ai  ─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮

│   ✔ Completed 1 tasks in 97.9s  ↑1,320  ↓67 tokens                                                                 │

╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

  Final Result

  Время работы текущей Linux-системы с момента загрузки равно 57 минут.

Продолжаю свое изучение и преследую цель сделать локального AI-оператора, который будет по заданиям вида:

  • "Проверь состояние сервера"
  • "Посмотри состояние дисков"
  • "Посмотри состояние сети"

выдавать мне свободный отчет.

Вот как-то так, а пока я прощаюсь, задумка прям горит и сижу разбираю далее все меня интересуемое, я увидел практический результат.

На этом все, с уважением автор блога ekzorchik.