# LangChain в России: один ключ на чат, RAG и эмбеддинги

> Polza — OpenAI-совместимый API, поэтому в LangChain используется обычный ChatOpenAI с другим base_url. Оплата картой РФ, зарубежные аккаунты не нужны.

- Обычный ChatOpenAI
- Работает из РФ напрямую
- Карта РФ и СБП
- Чат, RAG и эмбеддинги

LangChain — библиотека для Python, на которой собирают приложения с языковыми моделями: чаты, агентов, поиск по своим документам. Она берёт на себя рутину — работу с промптами, память диалога, вызов функций, разбиение длинных текстов.

Модель библиотека сама не содержит: она обращается к провайдеру. Для OpenAI-совместимых API это класс ChatOpenAI, и именно через него подключается Polza — меняется только адрес.

Библиотека бесплатная и с открытым кодом. Платите только за токены моделей, которые вызывают ваши цепочки.

## Где ломается LangChain из России

Сама библиотека ставится из pip без ограничений. Проблемы начинаются на первом же вызове модели — и ещё одна поджидает на эмбеддингах.

- **Провайдер не отвечает.** Штатные вызовы уходят к api.openai.com или api.anthropic.com, а они не обслуживают российские адреса. Решение: base_url на Polza отвечает из РФ напрямую.
- **Не тот класс — запрос мимо Polza.** ChatAnthropic, init_chat_model("claude-…") и langchain-openrouter ходят к своим провайдерам, а не по вашему base_url. Решение: Только ChatOpenAI из langchain-openai.
- **Эмбеддинги возвращают 400.** LangChain пре-токенизирует тексты через tiktoken и шлёт массив целых чисел, а Polza принимает строки — отсюда BAD_REQUEST. Решение: Небольшой свой класс через httpx.
- **Картой не оплатить.** Зарубежным провайдерам нужна иностранная карта у каждого отдельно. Решение: Карта РФ, СБП или счёт для юрлица.
- **Рассуждающая модель «молчит».** Модель списывает токены, а content пустой: reasoning_tokens идут сверх лимита и съедают видимый вывод. Решение: Ставим max_tokens с запасом.
- **Стриминг рвётся.** В корпоративных сетях прокси режет SSE, и поток обрывается после первого чанка. Решение: Прямое подключение без прослоек.

## Как подключить LangChain к Polza

Библиотека одна, класс обычный, меняется только адрес. Нужен Python 3.10 или новее.

Что нужно:

- **Python 3.10 и пакеты.** langchain-openai обязательно, httpx — для эмбеддингов, numpy — для косинусной близости в InMemoryVectorStore.
- **Ключ Polza.** Создаётся в кабинете за минуту. Пополняется картой РФ, через СБП или по счёту для юрлица.
- **Полный slug модели.** Имя пишется с префиксом провайдера. Без него API вернёт 404, даже если модель существует.

### 1. Поставьте пакеты

`langchain-openai` — основной пакет, `httpx` понадобится для эмбеддингов, `numpy` — для косинусной близости в InMemoryVectorStore.

Терминал:

```
$ pip install -U langchain-openai httpx numpy

# требуется Python 3.10+
```

### 2. Создайте ChatOpenAI

Адрес указывается в `base_url` — обратите внимание на слеш в конце. Имя модели берётся из каталога целиком, вместе с префиксом провайдера:

chat.py:

```
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="anthropic/claude-sonnet-4.6",
    base_url="https://polza.ai/api/v1/",
    api_key="ваш ключ", max_tokens=1500)
```

### 3. Для эмбеддингов — свой класс

`OpenAIEmbeddings` с Polza напрямую не работает: LangChain шлёт токены вместо строк. Обходится небольшим классом, который дёргает эндпоинт через httpx:

embeddings.py:

```
class PolzaEmbeddings(Embeddings):
    httpx.post(
      f"{base_url}/embeddings",
      json={"model": …, "input": ["строка"]}

# input — только строки, не массив токенов
```

### 4. Проверьте на простом вызове

Запустите `llm.invoke()` с коротким запросом. Если ответ пришёл — дальше работают цепочки, стриминг, tool calling и RAG как обычно.

**Почему max_tokens нужно ставить с запасом.** У рассуждающих моделей — DeepSeek R1, Claude с thinking, o1 и подобных — внутренние reasoning-токены расходуются сверх лимита. Если поставить max_tokens впритык, модель потратит бюджет на размышление, а видимого текста не останется: в ответе будет пустой content при списанных токенах. Для коротких ответов закладывайте 600–800, для кода — 1500–2500.

## Что собирают на LangChain

Библиотека закрывает весь путь от простого запроса до поиска по своим документам — и всё это работает на одном ключе.

- **Чат и цепочки.** Обычный вызов модели, цепочки из нескольких шагов, стриминг и асинхронные вызовы через ainvoke и astream.
- **RAG по своим документам.** Поиск по загруженной базе: от варианта в пять строк до полноценного InMemoryVectorStore с разбиением длинных текстов.
- **Tool calling.** Модель вызывает ваши функции — обращается к базе, считает, ходит во внешние сервисы и возвращается с результатом.
- **Структурированный вывод.** Ответ приходит готовой схемой, а не текстом, который надо разбирать регулярками.
- **Две модели в одной цепочке.** Дешёвая классифицирует запрос, сильная отвечает. Классический способ срезать расходы без потери качества.
- **LangGraph и агенты.** Поверх LangChain строятся агенты с состоянием и ветвлением — подключение моделей остаётся тем же.

- **https://polza.ai/api/v1/.** Для LangChain — именно со слешем. Так указано в документации и так собирается путь до эндпоинтов.
- **Полный slug модели.** Имя модели пишется целиком, с префиксом провайдера: anthropic/claude-sonnet-4.6, а не claude-sonnet-4.6. Без префикса вернётся 404.

## Чем LangChain отличается от n8n и прямых вызовов API

Одну и ту же задачу можно решить тремя способами, и выбор зависит от того, сколько кода вы готовы писать.

- **LangChain.** Код на Python и полный контроль: цепочки, RAG, агенты, tool calling. Больше работы на старте, зато никаких ограничений платформы.
- **n8n.** Визуальный конструктор сценариев: быстрее собрать и проще передать коллеге без Python. Под него есть отдельная страница.
- **Прямые вызовы API.** Самый простой путь для одного запроса. Как только появляются память, инструменты и поиск по документам — вы начинаете писать свой LangChain.

## Напрямую или через Polza

| Из России | Провайдеры напрямую | LangChain через Polza |
| --- | --- | --- |
| Оплата | Зарубежная карта у каждого | Карта РФ, СБП, счёт для юрлиц |
| Доступ к API | Закрыт, нужны обходные пути | Работает из РФ напрямую |
| Классы | Свой пакет под каждого вендора | Один ChatOpenAI на всё |
| Смена модели | Другой пакет и другой ключ | Правка одной строки model= |
| Эмбеддинги | Отдельный провайдер и ключ | Тот же ключ, свой класс на httpx |
| Документы | Нет | Договор, счёт, УПД, НДС |
| Расходы | По кабинетам провайдеров | Статистика по ключам и моделям |

## Сколько стоит LangChain в России

Библиотека бесплатная и с открытым кодом. Платите только за токены моделей по ценам каталога, в рублях.

- **Массовые вызовы в цепочках.** DeepSeek V4 Flash и GLM — классификация, разметка и промежуточные шаги, где вызовов много, а каждый короткий.
- **Основной ответ.** Claude Sonnet 4.6 и GPT-5.5 — финальный шаг цепочки, где качество видно пользователю.
- **Эмбеддинги для RAG.** Отдельные модели эмбеддингов из каталога: они дешевле генеративных, а размерность указана на странице каждой.

- [anthropic/claude-sonnet-4.6](https://polza.ai/models/anthropic/claude-sonnet-4.6.md) — основной ответ в цепочке
- [openai/gpt-5.5](https://polza.ai/models/openai/gpt-5.5.md) — сложные рассуждения
- [deepseek/deepseek-v4-flash-0731](https://polza.ai/models/deepseek/deepseek-v4-flash-0731.md) — массовые промежуточные вызовы
- [z-ai/glm-5.1](https://polza.ai/models/z-ai/glm-5.1.md) — классификация и разметка

## Если что-то не работает

Четыре причины, на которые приходится почти вся переписка с поддержкой.

- **Ошибка 401 Unauthorized.** base_url должен быть https://polza.ai/api/v1/ — со слешем на конце и с /v1. Ключ скопируйте заново: пробелы и невидимые символы ломают авторизацию.
- **Ошибка 400 на эмбеддингах.** LangChain шлёт токены вместо строк. Используйте свой класс на httpx вместо OpenAIEmbeddings напрямую.
- **Ошибка 404: model not found.** Slug устарел или указан без префикса. Актуальный список — в каталоге или запросом GET на /api/v1/models.
- **ImportError про numpy.** InMemoryVectorStore считает косинусную близость через numpy. Поставьте пакет: pip install numpy.

## Частые вопросы

### Как подключить LangChain к Polza?

Используйте ChatOpenAI из langchain-openai и укажите base_url https://polza.ai/api/v1/ вместе со своим ключом. Больше ничего менять не нужно.

### Почему нельзя использовать ChatAnthropic?

Этот класс ходит напрямую к Anthropic и ваш base_url не учитывает. То же самое с init_chat_model("claude-…") и langchain-openrouter — запросы уйдут мимо Polza.

### Почему эмбеддинги возвращают 400?

LangChain пре-токенизирует тексты через tiktoken и отправляет массив целых чисел, а Polza принимает строку или массив строк. Решается небольшим своим классом на httpx — пример есть в документации.

### Модель отвечает пустым content, но токены списываются

Так ведут себя рассуждающие модели: reasoning-токены идут сверх лимита. Увеличьте max_tokens минимум до 600–1000.

### Ошибка 404: model not found

Имя модели указано без префикса провайдера. Нужен полный slug из каталога, например anthropic/claude-sonnet-4.6.

### Стриминг обрывается после первого чанка

Обычно это корпоративный прокси, который режет SSE. Отключите стриминг или обеспечьте прямое соединение с polza.ai.

### Работает ли RAG и tool calling?

Да, всё штатно: цепочки, стриминг, асинхронные вызовы, tool calling, структурированный вывод и векторные хранилища.

### Какая версия Python нужна?

Python 3.10 или новее. Пакеты: langchain-openai, httpx для эмбеддингов и numpy для косинусной близости.

## Читать дальше

- [API нейросетей: единый ключ для ChatGPT, Claude и 400+ моделей](https://polza.ai/blog/api-neyrosetei.md)
- [Российский API нейросетей без VPN](https://polza.ai/blog/rossiyskiy-api-dlya-neyrosetey-bez-vpn-polnyy-gayd-2026.md)
- [Агрегатор нейросетей: что это и лучшие сервисы 2026](https://polza.ai/blog/agregator-nejrosetej.md)

## Ссылки

- Документация: https://polza.ai/docs/integracii/langchain
- Страница: https://polza.ai/integrations/langchain
- Обновлено: 2026-09-26
