Skip to main content
LangChain через Polza.AI: 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.

Чат

Имя модели — полный slug из каталога Polza.AI с префиксом провайдера через /. Без префикса (claude-sonnet-4.6) slug не найдётся в Polza и вернётся ошибка 404.
Для рассуждающих моделей (DeepSeek R1, Claude с thinking, o1/o3) закладывайте max_tokens с запасом: внутренний reasoning_tokens идёт сверх лимита и съедает видимый вывод. Для коротких ответов хватит 600–800, для кода — 1500–2500.

Эмбеддинги

OpenAIEmbeddings из langchain-openai не работает с Polza.AI as-is. LangChain пре-токенизирует тексты через tiktoken и шлёт {"input": [[15339, 1917]]} — массив целочисленных токенов. Polza принимает только строки или массив строк и возвращает 400 BAD_REQUEST с сообщением «input должен быть непустой строкой либо непустым массивом непустых строк». Это особенность Polza — формат input строго string или array of strings (см. API Reference), без автоматической детокенизации.
Обходной путь — кастомный класс через httpx:
Доступные модели эмбеддингов в каталоге Polza.AI (актуальный список — GET /v1/models): text-embedding-3-small/large поддерживают параметр dimensions — можно запросить сжатый вектор (например, 512d) для экономии места:

Примеры

Цепочка

Стриминг

Стриминг отдаёт токены по мере генерации — используйте в UI для отзывчивости.

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

Шаблон «дешёвая модель классифицирует → дорогая генерирует»:
Gemini 2.5 Flash стоит дёшево и быстро классифицирует, Claude Sonnet 4.6 генерирует финальный ответ — на длинном потоке экономия ×5–10×.

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.

Решение проблем

LangChain шлёт токены вместо строк. Используйте PolzaEmbeddings (см. выше) вместо OpenAIEmbeddings напрямую.
  • Проверьте base_url — должен быть https://polza.ai/api/v1/ (со слешем на конце и /v1)
  • Ключ скопирован без пробелов и Unicode-символов
  • На ключе положительный баланс в кабинете
Slug модели устарел или не существует. Проверьте актуальный список через GET https://polza.ai/api/v1/models или в каталоге.
В некоторых сетях прокси режет SSE. Отключите стриминг (llm.invoke вместо llm.stream) или используйте прямое HTTP-подключение к polza.ai в обход корпоративного прокси.
Это нормально: DeepSeek R1 / Claude thinking / o1 тратит токены на внутренние reasoning_tokens, видимый текст генерируется отдельно. Увеличьте max_tokens (минимум 600–1000) и проверьте response.usage_metadata["output_token_details"]["reasoning"].
Установите numpy: pip install numpy. InMemoryVectorStore использует numpy для cosine similarity.

Следующие шаги

API Reference: Embeddings

Полная справка по эндпойнту /v1/embeddings — параметры, форматы, лимиты

Каталог моделей

Все доступные модели с ценами и размерностью эмбеддингов

Быстрый старт

Создание ключа и первый запрос за 2 минуты

Кеширование промптов

Снижение стоимости повторных запросов через cache_control и провайдерский кеш