ChatOpenAI и эмбеддинги, один ключ, оплата в рублях, VPN не нужен.
Polza.AI — OpenAI-совместимый API. Подключайте
ChatOpenAI / OpenAIEmbeddings
из langchain-openai с base_url=https://polza.ai/api/v1/.Не используйте ChatAnthropic, init_chat_model("claude-...")
или langchain-openrouter — они уйдут мимо Polza.AI.Требования
- Python 3.10+
- Аккаунт на polza.ai и API-ключ
- Установленные пакеты:
httpx нужен для обхода проблемы с эмбеддингами (см. ниже), numpy — для cosine similarity в InMemoryVectorStore.
Чат
/. Без префикса (claude-sonnet-4.6) slug не найдётся в Polza и вернётся ошибка 404.
Для рассуждающих моделей (DeepSeek R1, Claude с thinking, o1/o3) закладывайте
max_tokens с запасом: внутренний reasoning_tokens идёт сверх лимита и съедает видимый вывод. Для коротких ответов хватит 600–800, для кода — 1500–2500.Эмбеддинги
Обходной путь — кастомный класс черезhttpx:
GET /v1/models):
text-embedding-3-small/large поддерживают параметр dimensions — можно запросить сжатый вектор (например, 512d) для экономии места:
Примеры
Цепочка
Стриминг
Async: ainvoke и astream
Для FastAPI / asyncio-приложений LangChain поддерживает async-API:
Tool calling
Polza проксирует tool calling по OpenAI-схеме. Через LangChain — стандартныйbind_tools:
ToolNode и агентом — в документации LangGraph.
Structured output
Если нужно получить не строку, а dict по схеме:RAG: короткий (5 строк без LangChain vectorstore)
Для простых случаев —httpx для эмбеддингов, numpy для cosine similarity, без LangChain-обёрток:
RAG: полный (InMemoryVectorStore)
Для продакшена —InMemoryVectorStore + кастомные embeddings. Тот же PolzaEmbeddings подставляется в LangChain, тот же pipeline работает:
InMemoryVectorStore держит векторы в памяти процесса — подходит для прототипов и небольших датасетов (до ~10k документов). Для продакшена с persistent storage используйте FAISS, Chroma или pgvector (через langchain-community / langchain-postgres).
RAG с длинными документами (text splitter)
Для реальных документов разбивайте текст на чанки перед индексацией:Две модели: fast classify → smart answer
Шаблон «дешёвая модель классифицирует → дорогая генерирует»:Polza-специфика
-
Стоимость в рублях. Каждый ответ содержит
usage.cost_rub(и дублирующийusage.cost) — стоимость запроса в рублях с точностью до 8 знаков. Можно логировать для биллинга. -
Заголовки ответа.
x-trace-id(UUID v4) — для трассировки в поддержку: сохраните и приложите к тикету. Polza не отдаёт стандартныеx-ratelimit-*заголовки — для контроля лимитов опирайтесь на статус-коды 429 и собственные счётчики запросов. -
Reasoning tokens. Для рассуждающих моделей (DeepSeek R1, Claude с thinking, o1/o3) в
usage.completion_tokens_details.reasoning_tokensприходит число «мыслей» модели. Они тарифицируются по обычной цене output-токенов, но не видны вresponse.content— и при этом считаются вmax_tokens. Закладывайте запас. -
Один ключ на всё.
ChatOpenAI, эмбеддинги (через обёртку), картинки, аудио — один API-ключ, один аккаунт. -
Кеширование. Polza проксирует cache-aware провайдеров (Anthropic, OpenAI, DeepSeek) — при повторных запросах
usage.prompt_tokens_details.cached_tokensпокажет, сколько токенов взято из кеша. У Claude также работает ручной режимcache_control— см. Кеширование промптов.
Практика
-
Не дублируйте ключ в коде. Используйте переменные окружения:
Или ещё проще — задайте
OPENAI_API_KEYиOPENAI_BASE_URL=https://polza.ai/api/v1/, тогдаapi_keyиbase_urlв конструкторе можно опустить (LangChain читает их автоматически). -
Slug модели со слешем.
anthropic/claude-sonnet-4.6— правильно.claude-sonnet-4.6без префикса вернёт 404. -
max_tokensподбирайте по задаче. Для классификации хватит 50, для генерации писем — 400–800, для кода — 1500–2500, для рассуждающих моделей — с запасом ×2. -
Embeddings — отдельная модель.
text-embedding-3-smallработает, но есть и русскоязычные:qwen/qwen3-embedding-8b(4096d),intfloat/multilingual-e5-large(1024d). -
LangSmith tracing. Для отладки промптов и токенов:
Все вызовы
llm.invoke/chain.invokeначнут логироваться в smith.langchain.com.
Решение проблем
Ошибка 400 при эмбеддингах: 'input должен быть непустой строкой либо непустым массивом непустых строк'
Ошибка 400 при эмбеддингах: 'input должен быть непустой строкой либо непустым массивом непустых строк'
LangChain шлёт токены вместо строк. Используйте
PolzaEmbeddings (см. выше) вместо OpenAIEmbeddings напрямую.Ошибка 404: model not found
Ошибка 404: model not found
Slug модели устарел или не существует. Проверьте актуальный список через
GET https://polza.ai/api/v1/models или в каталоге.Стриминг обрывается после первого чанка
Стриминг обрывается после первого чанка
В некоторых сетях прокси режет SSE. Отключите стриминг (
llm.invoke вместо llm.stream) или используйте прямое HTTP-подключение к polza.ai в обход корпоративного прокси.Рассуждающая модель возвращает пустой content, но списывает токены
Рассуждающая модель возвращает пустой content, но списывает токены
Это нормально: DeepSeek R1 / Claude thinking / o1 тратит токены на внутренние
reasoning_tokens, видимый текст генерируется отдельно. Увеличьте max_tokens (минимум 600–1000) и проверьте response.usage_metadata["output_token_details"]["reasoning"].ImportError: cosine_similarity requires numpy
ImportError: cosine_similarity requires numpy
Установите
numpy: pip install numpy. InMemoryVectorStore использует numpy для cosine similarity.Следующие шаги
API Reference: Embeddings
Полная справка по эндпойнту
/v1/embeddings — параметры, форматы, лимитыКаталог моделей
Все доступные модели с ценами и размерностью эмбеддингов
Быстрый старт
Создание ключа и первый запрос за 2 минуты
Кеширование промптов
Снижение стоимости повторных запросов через cache_control и провайдерский кеш