Перейти к основному содержанию
CrewAI — Python-фреймворк для мультиагентных сценариев. Вы описываете агентов с ролями, ставите им задачи и собираете из них экипаж (Crew), который выполняет задачи по заданному процессу. Направлять его на SpeShu.AI имеет смысл, когда нужно вести несколько ролей на разных моделях под одним ключом и с одного баланса, не поднимая собственный LLM-шлюз.
Подключение сводится к двум вещам: base_url = "https://speshu.ai/api/v1" и API-ключ. CrewAI обращается к моделям через OpenAI-совместимые эндпоинты, поэтому пользовательский базовый URL — обычно весь необходимый объём настройки.

Установка

Возьмите идентификатор модели

Идентификаторы текстовых моделей меняются вместе с составом каталога, поэтому константа в коде — это отложенный 404 model_not_found. Возьмите идентификатор из каталога и сохраните его в переменную окружения:
cURL
.data[0] — первый элемент, чтобы пример был запускаемым. В своём коде выбирайте модель по context_length, наличию зрения и цене; формат ответа разобран в разделе Модели и цены.

Конфигурация

Класс LLM из crewai принимает base_url и api_key напрямую:
Python
Тот же результат дают переменные окружения — их достаточно, чтобы ничего не передавать в конструктор:
Строка модели уходит в LiteLLM, где формат — провайдер/имя, а отсутствие префикса означает openai. Убедитесь, что выбранный из каталога идентификатор не содержит / — иначе часть до слэша будет прочитана как имя провайдера. Если в вашем идентификаторе есть слэш, возьмите модель без него либо вызывайте Chat Completions напрямую — там такой разбор отсутствует.
Набор параметров конструктора меняется между версиями CrewAI. Проверьте сигнатуру в своей версии: python -c "import inspect, crewai; print(inspect.signature(crewai.LLM))". Имена model, base_url, api_key, temperature и timeout устойчивы в линейке 0.x и 1.x.

Первый рабочий пример

Два агента, две задачи, один запуск. Модель — из переменной SPESHU_MODEL, адрес и ключ — из конфигурации выше.
Python
Один запуск экипажа — это несколько запросов к /api/v1/chat/completions: каждый агент со своей ролью делает собственный вызов на каждую задачу. Считайте расход по usage.cost.total_cost каждого ответа; разбор — на странице Учёт средств.

Структурированный вывод

Task умеет возвращать не текст, а объект pydantic: результат лежит в result.pydantic.
Python
output_pydantic — это схема, а не принуждение: модель может вернуть лишние поля или пропустить требуемые. Валидируйте результат на своей стороне. Формат ответа на уровне API — в гайде Структурированный вывод.

Инструменты

Инструменты объявляются декоратором @tool и передаются агенту списком. Модель получает их описание, решает, что вызвать, а выполняете код вы.
Python
Дальше — Agent(tools=[find_cheapest_model], ...). Описание в docstring — единственное место, где модель читает, когда звать инструмент; формулировка «полезная функция» работает хуже, чем её отсутствие. Полный цикл вызова — в гайде Вызов функций.

Генерация изображения

Отдельного медиа-инструмента в CrewAI нет, но любой вызов API оборачивается в @tool за несколько строк. Деньги списываются при создании задачи, а не при успешном результате.
Python
Каталог медиа-моделей и схемы их параметров — GET /api/v1/media/models, разбор — в Создание задачи.

Потоковая передача

Поток включается флагом на экипаже, а не параметром запроса:
Python
Флаг stream=True и итерация по result.stream относятся к CrewAI 0.8x и новее; в более старых версиях такого параметра нет, и поток включается на уровне HTTP-клиента. Формат кадров, [DONE] и кадр со списанием разобраны в гайде Потоковая передача.
Поток идёт на контексте, отвязанном от соединения: закрытие соединения не отменяет генерацию и не возвращает деньги. Клиентский таймаут должен быть длиннее серверного — иначе обрыв случится на ровном месте.

Про RAG и эмбеддинги

В API SpeShu.AI нет эндпоинта /embeddings. Любой сценарий CrewAI, которому нужен векторный индекс, придётся питать из другого источника: не подставляйте в base_url адрес эндпоинта эмбеддингов, которого нет.
Честных вариантов два. (а) Эмбеддинги — отдельный провайдер, генерация — SpeShu.AI. Это предпочтительный путь: векторы считает сторонний сервис, а текст пишет ваша платная модель.
Python
Результат embed() кладите в любой векторный индекс, а найденные фрагменты передавайте в задачу как context: к этому моменту генерация уже идёт через SpeShu.AI. (б) Экипаж без эмбеддингов. Если индекс не нужен, оставьте CrewAI в роли оркестратора: агенты, задачи, инструменты и память между задачами работают без векторов. Пример из раздела выше — как раз такой случай.

Если что-то не работает

Неверный base_url. Должно быть ровно https://speshu.ai/api/v1 — с суффиксом /v1 и без завершающего слэша. Вариант https://speshu.ai/api даст 404 на маршруте, а .../api/v1/ — путь с двойным слэшем, который тоже не пройдёт.
Ключ не передан или не тот. Проверьте, что в LLM(...) задан api_key, либо что задана переменная OPENAI_API_KEY. Подробности — в разделе Аутентификация.
Идентификатор устарел или скопирован с ошибкой. Возьмите id заново из GET /api/v1/models и подставьте как есть. Если проверили каталог, а отказ остался — посмотрите на модель со слэшем в идентификаторе: это разбор префикса провайдера, описанный выше.
Экипаж накапливает историю: результат первой задачи уходит в контекст второй, и сумма быстро упирается в окно модели. Сравните длину задач с context_length из каталога, сократите expected_output или возьмите модель с окном побольше. Полный разбор — на странице Ошибки.
Проверьте таймаут: запрос к /api/v1/* ограничен 300 секундами, а мультиагентный прогон делает их несколько подряд — клиентский таймаут должен покрывать весь запуск, а не один вызов. Если ошибка про неизвестный параметр, сверьтесь с сигнатурой crewai.LLM в вашей версии. Коды и цикл повторов — на странице Ошибки, таймауты — в разделе Лимиты.

Что дальше

Модели и цены

Как выбрать модель под роль агента

Вызов функций

Как модель вызывает ваши инструменты

Потоковая передача

SSE, [DONE] и кадр со списанием

Учёт средств

Сколько стоит запуск экипажа