Перейти к основному содержанию
Weaviate — open-source vector database: она хранит объекты с векторами и свойствами, ищет по семантической близости, фильтрует результаты по свойствам и умеет отдавать гибридный поиск. Её ставят в RAG-конвейер там, где нужен собственный слой хранения и retrieval: индексация документов, поиск по базе знаний, дедупликация, рекомендации. Weaviate — хранилище, а не генератор. Ответ пишет языковая модель, и вот её вы можете взять в SpeShu.AI: OpenAI-совместимый chat/completions по вашему ключу.
Важны ровно две вещи: base_url = "https://speshu.ai/api/v1" и API-ключ из профиля. Weaviate работает с OpenAI-совместимыми эндпоинтами, поэтому отдельного провайдера настраивать не нужно — достаточно сменить адрес и ключ. В примерах ниже генерация идёт через официальный OpenAI-клиент, у которого есть поле base_url; модуль generative_config в самом Weaviate разобран в разделе Генерация штатным модулем Weaviate.
В API SpeShu.AI нет эндпоинта эмбеддингов. /api/v1/embeddings не существует, и вызов client.embeddings.create(...) с base_url SpeShu.AI вернёт 404. Это не ограничение Weaviate — это ограничение источника векторов. Дальше показаны два честных варианта: (а) векторы считает отдельный эмбеддинг-провайдер (в примере помечен как отдельная конфигурация), а SpeShu.AI отвечает только за генерацию; (б) Weaviate используется без эмбеддингов — как хранилище готовых векторов или как фильтруемый источник для RAG без семантики.

Установка

weaviate-client — официальный Python-клиент. Сервер Weaviate при этом поднимается отдельно: локально через Docker, либо берётся как управляемый инстанс.
Примеры ниже используют connect_to_local(). Для облака — weaviate.connect_to_weaviate_cloud(cluster_url=..., auth_credentials=Auth.api_key(...)), для произвольного адреса — weaviate.connect_to_custom(http_host=..., http_port=..., grpc_port=..., auth_credentials=...).

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

Два независимых клиента: Weaviate работает с вашими векторами, OpenAI-клиент — только с генерацией.
Python
EMBEDDING_BASE_URL, EMBEDDING_API_KEY и EMBEDDING_MODEL — это ваш отдельный эмбеддинг-провайдер, не SpeShu.AI. Провайдера нужно выбрать и оплатить отдельно. Сюда подходит любой OpenAI-совместимый /embeddings, включая локальный: тогда достаточно base_url локального сервиса, а ключ может быть пустым. В этом файле нет ни одного адреса эмбеддингов — они конфигурируются у вас.
Идентификатор текстовой модели тоже берётся из каталога, а не пишется в коде: состав каталога меняется, и зашитый идентификатор падает с 404 model_not_found.
cURL
Python
Почему так: каталог — единственный источник истины. Идентификаторы переименовываются и исчезают, и строка в коде устаревает молча, без ошибки на этапе сборки. Валидатор JSON Schema на id в вашем конфиге такую ошибку не поймает.

Индексация

wc.Configure.Vectors.self_provided() объявляет, что векторы считаете вы, а не встроенный vectorizer Weaviate.
Python
Создание коллекции, если она уже есть, падает. Для повторного прогона скрипта проверка collections.exists() выше обязательна — без неё скрипт не переживёт второй запуск.

Поиск и ответ

Python
usage.cost.total_cost — единственное поле, по которому считается расход, в рублях. Подробности — в разделе Учёт средств.

Вариант без эмбеддингов

Если эмбеддингов у вас нет, Weaviate всё равно полезен: он становится хранилищем готовых векторов или источником для фильтруемого RAG, где отбор идёт по свойствам, а не по близости.
Python
Качество такого отбора целиком определяется тем, насколько хорош ваш source или любой другой тег. Это осознанный компромисс: без эмбеддингов поиск становится фильтрацией, а не семантикой.

Генерация штатным модулем Weaviate

Weaviate умеет вызывать генеративную модель сам, из коробки — без отдельного OpenAI-клиента. Это работает начиная с версий Weaviate 1.25+ (weaviate-client 4.7+), поле называется generative_config; в более старых релизах его нет, и пример не сработает.
Python
Этот путь удобен, но непрозрачен: запрос к модели уходит изнутри Weaviate, поэтому usage.cost.total_cost вы в своём коде не увидите. Списывание при этом происходит. Если расход важен, генерацию ведите через OpenAI-клиент из раздела выше.

Продвинутые возможности

Weaviate ничего не добавляет к формату запроса — SpeShu.AI отвечает на обычные вызовы. Всё остальное разбирается в канонических гайдах:
  • Потоковая передача — stream: true в speshu.chat.completions.create(...), ответ печатается по частям, кадр с usage приходит последним: Потоковая передача.
  • Вызов функций — объявляете tools, выполняете вызовы, возвращаете результат сообщениями с ролью tool: Вызов функций.
  • Структурированный вывод — response_format с JSON Schema, если модель это поддерживает: Структурированный вывод.
  • Генерация изображений — отдельный API, результат приходит по опросу задачи: Создание медиа-задачи.
Гибридный поиск (query.hybrid) в Weaviate требует отдельно настроенной BM25-конфигурации коллекции и не связан с генерацией — это часть настройки хранилища, а не SpeShu.AI.
Размерность векторов в коллекции должна совпадать с тем, что возвращает ваш эмбеддинг-провайдер. Смена модели эмбеддингов означает переиндексацию: старые векторы в новой коллекции считаться не будут.

Частые проблемы

Эндпоинта /api/v1/embeddings в API нет. Проверьте, что у OpenAI-клиента, который считает векторы, в base_url стоит адрес эмбеддинг-провайдера, а не https://speshu.ai/api/v1. Клиент для генерации должен указывать на SpeShu.AI.
Ключ не отправлен или отправлен не туда. Строка подключения Weaviate — это адрес gRPC-сервера (grpc://localhost:50051), а не HTTP-эндпоинт; ключ в неё не вставляется. Проверьте ключ отдельно, запросом баланса: curl -s https://speshu.ai/api/v1/balance -H "Authorization: Bearer $SPESHU_API_KEY".
Идентификатор модели устарел. Возьмите его заново из GET /api/v1/models и подставьте как есть — без префикса и без обрезки. Формат ответа — в Каталоге моделей.
collections.create() на существующем имени падает. Оберните создание в if not client.collections.exists(NAME) либо удаляйте коллекцию перед пересозданием — как в примере выше. Внимание: delete уничтожает все объекты коллекции.
Проверьте три вещи: вставка действительно прошла (у insert есть возвращаемый UUID), вектор при вставке не None, а размерность векторов совпадает с настройкой коллекции. Отдельно: near_vector ищет только по векторам, а не по тексту — свойства сами по себе не находятся.
Либо в context попал пустой результат поиска, либо длина запроса перевалила за context_length модели и контекст обрезался. Актуальную длину окна смотрите в поле context_length каталога. Формат ошибок — в разделе Ошибки.
Полная таблица кодов и цикл повторов — на странице Ошибки, таймауты и квоты — в разделе Лимиты.

Что дальше

Запрос чату

Роли, блоки контента, параметры генерации

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

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

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

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

Модели и цены

Как выбрать модель и посчитать бюджет