Перейти к основному содержанию
LangGraph — фреймворк для агентов, которые не просто отвечают, а проходят управляемый процесс: ветвятся, вызывают инструменты, возвращаются к предыдущему шагу, помнят состояние между сообщениями и могут быть остановлены и продолжены. Вместо линейной цепочки вы описываете граф: узлы выполняют действия, рёбра задают переходы, состояние передаётся между шагами. Модели в LangGraph не встроены — граф лишь вызывает объект, совместимый с Chat Completions, а SpeShu.AI даёт такой объект через OpenAI-совместимый эндпоинт.
От LangGraph нужны ровно две настройки: base_url = "https://speshu.ai/api/v1" и API-ключ. Модель совместима с OpenAI Chat Completions, поэтому ChatOpenAI из langchain-openai работает с ней без специального адаптера — меняются только адрес и ключ.

Установка

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

Идентификаторы текстовых моделей не зашивайте в код: состав каталога меняется, и зашитый в код идентификатор начинает падать с 404 model_not_found. Возьмите id из GET /api/v1/models и сохраните его в SPESHU_MODEL — во всех примерах ниже используется именно эта переменная.
cURL

Настройка клиента

ChatOpenAI — pydantic-модель: model, base_url и api_key — алиасы её полей model_name, openai_api_base и openai_api_key. Принимаются оба написания, примеры используют короткие.
Python
Ключ можно не передавать — ChatOpenAI возьмёт его из OPENAI_API_KEY — но задавайте api_key явно: так код одинаково работает в любом окружении. Суффикс /v1 в адресе обязателен, слэш в конце — нет: https://speshu.ai/api и https://speshu.ai/api/v1/ дают 404, и клиент OpenAI ничего от себя не дописывает.

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

Граф из одного узла с памятью. Checkpointer сохраняет состояние по thread_id, поэтому второй вызов с тем же идентификатором диалога видит историю.
Python
InMemorySaver хранит состояние в процессе и умирает вместе с ним — годится для примера и тестов. Имя актуально для langgraph 0.4 и новее — в более ранних версиях тот же класс назывался MemorySaver. Для продакшена поставьте постоянный checkpointer: pip install -U langgraph-checkpoint-postgres, затем langgraph.checkpoint.postgres.PostgresSaver. Отдельно: LangChain не пробрасывает usage.cost.total_cost в AIMessage — расход смотрите запросом GET /api/v1/balance, он бесплатный. Разбор — в разделе Тарификация и оплата.

Инструменты

ToolNode исполняет вызванные моделью функции и возвращает их результаты в состояние. Модель ничего не знает о вашем коде: что и когда звать, она решает по name и description инструмента.
Python
tools_condition завершает цикл, когда модель перестала возвращать tool_calls. Ограничьте число шагов счётчиком в состоянии: без ограничения модель может зациклиться на одном инструменте и съесть бюджет. Полный цикл вызова инструмента, формат tool_calls и разбор ошибок — в гайде Вызов функций.

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

stream_mode="messages" на graph.stream отдаёт пары (фрагмент_сообщения, метаданные). Это тот же SSE, что и на потоковой передаче, только кадры разбирает библиотека.
Python
Поток идёт на контексте, отвязанном от соединения: прерывание чтения не отменяет генерацию и не возвращает деньги. Клиентский таймаут ставьте выше серверного — до 15 минут на поток.

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

with_structured_output заставляет модель вернуть объект заданной схемы. Аргумент method в разных версиях langchain-openai принимает разные значения, поэтому ниже он не указан — используется значение по умолчанию текущей версии.
Python
Разбор JSON Schema, strict и поведения при невалидном результате — в гайде Структурированный вывод.

Генерация медиа

Медиа создаётся отдельным API: запрос создаёт задачу, деньги списываются сразу, результат приходит по опросу. Из узла графа это обычная блокирующая функция. Идентификатор медиа-модели, в отличие от текстовой, можно написать литералом — каталог GET /api/v1/media/models публичный и стабильный.
Python
Подключите функцию как @tool к узлу ToolNode — и агент сможет звать генерацию как обычный инструмент. Формат задачи, опрос и коды — в разделе Создание задачи.

Если нужен RAG с эмбеддингами

SpeShu.AI не отдаёт эндпоинт эмбеддингов: /api/v1/embeddings не существует, а в GET /api/v1/models лежат только генеративные модели. Подставить векторы через этот API не получится, и честных вариантов два.
(а) Эмбеддинги — отдельный провайдер, генерация — SpeShu.AI. Так делают в большинстве проектов: векторизация дешевле, и её качество не зависит от модели, на которой вы пишете промпт. Держите адрес и ключ этого провайдера отдельной конфигурацией, чтобы он не перепутался с ключом SpeShu.AI.
Python
(б) Граф без эмбеддингов. LangGraph не обязан использовать векторный поиск: узел может получать контекст обычным запросом в свою базу, из хранилища файлов SpeShu.AI по ссылке или из контекста диалога. Это проще, дешевле и не требует второго провайдера.

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

Проверьте адрес: он должен быть ровно https://speshu.ai/api/v1 — с суффиксом /v1 и без слэша в конце. Варианты https://speshu.ai/api и https://speshu.ai/api/v1/ дают 404, и клиент OpenAI ничего к адресу не дописывает.
Ключ не передан либо недействителен. Проверьте api_key в ChatOpenAI и заголовок Authorization: Bearer, убедитесь, что в переменной нет кавычек и переноса строки. Ключ отзывается в профиле — подробности в разделе Аутентификация.
Идентификатор устарел или скопирован с ошибкой. Возьмите его заново из GET /api/v1/models и подставьте как есть. Список, зашитый в код, устаревает молча — поэтому в примерах используется переменная SPESHU_MODEL.
Checkpointer не подключён или у вызовов разный thread_id. compile(checkpointer=...) обязателен, иначе граф не имеет состояния. Идентификатор диалога передаётся вторым аргументом в invoke — по ключу config["configurable"]["thread_id"].
Модель возвращает tool_calls по кругу. Ограничьте число шагов: добавьте в состояние счётчик итераций и ведите из него ребро в конец графа.
Полная таблица кодов, три формата ошибок и цикл повторов — на странице Ошибки. Таймауты и квоты — в разделе Лимиты.

Что дальше

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

Полный цикл вызова инструмента

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

Разбор SSE, таймауты и когда списываются деньги

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

JSON Schema и валидация результата

Модели и цены

Каталог, фильтры и выбор модели под задачу