ChatOpenAI из пакета langchain-openai, указав адрес шлюза вместо адреса провайдера по умолчанию.
Подключение сводится к двум значениям:
base_url = "https://speshu.ai/api/v1" и API-ключ. Эндпоинт /api/v1/chat/completions совместим с OpenAI Chat Completions, поэтому менять код фреймворка не нужно — достаточно задать адрес шлюза и ключ. Ключ создаётся в личном кабинете, подробности — в разделе Аутентификация.Установка
langchain-openai даёт класс ChatOpenAI. Документация по нему верна для langchain-openai 0.2 и новее.
Настройка
Два параметра конструктора —model и base_url:
Python
Возьмите идентификатор модели из каталога
Идентификаторы текстовых моделей не зашивайте в код: состав каталога меняется, и зашитый в код идентификатор начинает падать с404 model_not_found. Возьмите его из GET /api/v1/models один раз при настройке окружения:
cURL
model=os.environ["SPESHU_MODEL"] и в остальных примерах этой страницы. Формат ответа и параметры выбора — в разделе Модели и цены.
Первый запрос
Цепочка из шаблона, модели и парсера — обычный LCEL-пайплайн:Python
Потоковая передача
stream() возвращает итератор кусков AIMessageChunk — печатайте их подряд, без ожидания остальных:
Python
str(stream(...)) собирается одна строка целиком — так удобно для веб-интерфейса, который отдаёт ответ в SSE. Формат кадров, маркер [DONE] и кадр со списанием разобраны на странице Потоковая передача.
Вызов функций
Python
tool_call_id, — на странице Вызов функций.
Структурированный вывод
Python
response_format и поведение разных моделей — на странице Структурированный вывод.
Об эмбеддингах
Вариант 1 — эмбеддинги у другого провайдера. Ключ и адрес эмбеддингов — отдельная конфигурация, к SpeShu.AI она отношения не имеет:Python
Python
422 content_too_large, и длинные документы придётся резать вручную.
Генерация медиа
LangChain не покрывает медиа-задачи: они асинхронные, с оплатой при создании и отдельным опросом статуса. Работайте с ними черезhttpx/requests и ждите state: "success" — порядок полей и коды ошибок разобраны в Создании задачи и Статусе задачи. Идентификаторы медиа-моделей, в отличие от текстовых, стабильны: берите их из GET /api/v1/media/models.
Типичные проблемы
404 на любом запросе: в base_url нет /v1
404 на любом запросе: в base_url нет /v1
Правильное значение —
https://speshu.ai/api/v1. Адрес без суффикса указывает на корень сайта, где /chat/completions не существует. Проверьте переменную целиком — так видны скрытые пробелы и лишний слэш в конце.404 из-за слэша в конце base_url
404 из-за слэша в конце base_url
https://speshu.ai/api/v1/ даёт путь с двойным слэшем и тот же 404. Значение должно заканчиваться ровно на /v1, без завершающего /.401 invalid_api_key при верном ключе в окружении
401 invalid_api_key при верном ключе в окружении
Если
api_key не передан в ChatOpenAI, класс читает OPENAI_API_KEY, а не SPESHU_API_KEY. Передайте ключ параметром явно.404 model_not_found
404 model_not_found
Идентификатор устарел или скопирован с ошибкой. Возьмите его заново из
GET /api/v1/models и подставьте как есть — без префикса и без обрезки. Список в коде устаревает молча.404 при similarity_search или при индексации документов
404 при similarity_search или при индексации документов
Это не проблема векторного хранилища: эндпоинта эмбеддингов у SpeShu.AI нет. Перенесите шаг эмбеддингов к отдельному провайдеру или откажитесь от векторного поиска — оба варианта разобраны выше.
Поток отдаётся целиком в конце
Поток отдаётся целиком в конце
Метод
stream() уже читает поток инкрементально; проблема обычно в вашем коде — строка собирается целиком перед выводом. Печатайте каждый фрагмент сразу. Разбор SSE — на странице Потоковая передача.Что дальше
Начало работы
Полный маршрут от ключа до медиа-задачи
Модели и цены
Как выбрать идентификатор и на что смотреть
Вызов функций
Полный цикл вызова инструмента
Структурированный вывод
JSON Schema и валидация результата
