Что понадобится
Всё подключение сводится к двум значениям:
base_url = "https://speshu.ai/api/v1" и API-ключ. langchain-openai говорит по протоколу OpenAI Chat Completions, поэтому достаточно подставить свой адрес — код клиента переписывать не нужно.cURL
Установка
1
Установите пакеты
langchain-qdrant — обёртка Qdrant с интерфейсом LangChain, qdrant-client — сам клиент, langchain-openai — чат-модель через OpenAI-совместимый эндпоинт.2
Возьмите идентификатор модели из каталога
Идентификаторы текстовых моделей не зашивайте в код: состав каталога меняется, и зашитый в код идентификатор падает с Формат ответа — в разделе Каталог моделей, как выбрать модель под задачу — в Модели и цены.
404 model_not_found без предупреждения. Прочитайте каталог один раз при развёртывании и сохраните идентификатор в переменную окружения.cURL
3
Поднимите Qdrant
Для локального режима сервер не нужен: клиент работает и в памяти, и в файле. Для продакшена нужен настоящий сервер — локально или в Qdrant Cloud.
Эмбеддинги: честное ограничение
Вариант A — векторы от другого провайдера. Это предпочтительный путь: генерация остаётся в SpeShu.AI, эмбеддинги считаются отдельным сервисом с отдельной конфигурацией.Python
QdrantClient.scroll возвращает записи, подходящие под scroll_filter.
Python
Настройка
QdrantVectorStore принимает готовый клиент Qdrant, имя коллекции и объект эмбеддингов. Чат-модель настраивается отдельно — через ChatOpenAI, где base_url указывает на SpeShu.AI.
Python
Если сервера Qdrant нет, замените
QdrantClient(url=...) на QdrantClient(path="/tmp/qdrant_data") — данные переживут перезапуск процесса, но останутся на этой машине. QdrantVectorStore.from_documents(...) делает те же шаги за вас, включая создание коллекции, если укажете collection_name и embedding.Рабочий пример
Индексация документов, поиск и ответ с опорой на найденное.Python
Поиск в Qdrant не тарифицируется — деньги списываются только за генерацию. Сумма за один вызов чата приходит в поле
usage.cost.total_cost ответа; StrOutputParser её отбрасывает, поэтому за расходом удобнее следить на уровне HTTP-клиента. Разбор — в разделе Тарификация и оплата.Что ещё поддерживает стек
Генерация медиа в Qdrant не встраивается — это отдельный асинхронный API с оплатой при создании задачи. Идентификаторы медиа-моделей берутся из
GET /api/v1/media/models и указываются буквально: этот каталог публичный и стабильный.Типичные проблемы
404 not_found на клиентском URL
404 not_found на клиентском URL
Проверьте адрес. Нужен ровно
https://speshu.ai/api/v1, с суффиксом /v1 и без слэша в конце. Значение https://speshu.ai/api даст 404, а https://speshu.ai/api/v1/ даст 404 на самом маршруте — клиент склеит путь в вид .../v1//chat/completions.401 invalid_api_key при наличии баланса
401 invalid_api_key при наличии баланса
Ключ не ушёл в запрос. У
ChatOpenAI он передаётся параметром api_key, у переменной окружения проверьте её значение — оно начинается с sk- и не содержит кавычек и переноса строки. Отладка: echo "$SPESHU_API_KEY" | wc -c.404 model_not_found на первом же чате
404 model_not_found на первом же чате
Идентификатор модели зашит в коде и устарел. Возьмите его из
GET /api/v1/models и положите в SPESHU_MODEL при развёртывании. Зашитый в исходник идентификатор ломается молча, без предупреждения при сборке.400 invalid_request при записи в коллекцию
400 invalid_request при записи в коллекцию
Размерность вектора не совпадает с
VectorParams(size=...). Возьмите её из документации модели эмбеддингов и либо создайте коллекцию заново, либо перезапишите коллекцию в правильном размере — сменить размерность существующей коллекции нельзя.Поток отдаётся целиком в конце
Поток отдаётся целиком в конце
Клиент буферизует тело ответа. В
curl помогает флаг -N, в коде — чтение потока по мере прихода. Разбор кадров SSE — на странице Потоковая передача.404 на пути /embeddings
404 на пути /embeddings
Такого эндпоинта в API нет. Уберите вызов и перейдите на вариант A или B из раздела «Эмбеддинги: честное ограничение». Полная таблица кодов — на странице Ошибки.
Что дальше
Модели и цены
Каталог текстовых и медиа-моделей, стоимость в рублях
Тарификация и оплата
Как читать
usage.cost.total_cost и контролировать расходПотоковая передача
SSE, кадры и
[DONE]Вызов функций
Инструменты, которые Qdrant отдаёт модели как контекст
