Перейти к содержанию

Модели и ключи конфигурации

Модели

Чат-модели создаются в коде и передаются фабрике под именами:

import os

from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI

factory = LangfuseChainFactory(
    langfuse,
    models={
        "openai": ChatOpenAI(model="gpt-5.5", api_key=os.environ["OPENAI_API_KEY"], timeout=30),
        "anthropic": ChatAnthropic(model="claude-sonnet-5-5", api_key=os.environ["ANTHROPIC_API_KEY"]),
    },
    allowed_config_keys={"model", "temperature", "max_tokens"},
)

Подходит любая чат-модель LangChain. Всё, что не выражается в JSON — ключи, адреса, HTTP-клиенты, ограничители частоты запросов, — задаётся в этих конструкторах.

Конфигурация промпта выбирает модель ключом provider, одним из ключей словаря models:

{"provider": "anthropic", "model": "claude-opus-5-5", "temperature": 0.2, "max_tokens": 800}

Если модель одна, provider можно опустить. Если моделей несколько, он обязателен, а имя, которого нет в models, срывает сборку с ChainBuildError.

Разрешённые ключи конфигурации

Каждый ключ конфигурации, кроме provider и template_format, переопределяет поле выбранной модели. Какие переопределения действуют, решает allowed_config_keys:

Значение Что может изменить конфигурация
None (по умолчанию) Ничего. Конфигурация только выбирает модель.
Набор ключей, {"model", "temperature", "max_tokens"} Эти поля.
"any" Любое поле, включая base_url и api_key.

С фабрикой выше показанная конфигурация запускает цепочку на модели Anthropic с именем модели, температурой и лимитом токенов из конфигурации; ключи и тайм-аут остаются такими, какими их задал код. Ключ вне набора модель не видит, но хуки по-прежнему могут его прочитать. template_format в наборе позволяет конфигурации выбирать движок рендера (см. раздел Шаблоны).

Как применяется переопределение

Переопределение никогда не меняет модель, переданную фабрике. Оно создаёт новый объект того же класса из полей выбранной модели и значений конфигурации — через конструктор, так же, как это делает init_chat_model(configurable_fields=...). Отсюда:

  • Конструктор проверяет значения. "temperature": "hot" срывает сборку с ChainBuildError, а предыдущая цепочка продолжает работать.
  • Ключ конфигурации может быть именем поля или его алиасом. model задаёт model_name у ChatOpenAI.
  • Если переопределять нечего, цепочка работает на самом объекте модели.
  • HTTP-клиент, созданный моделью при конструировании, переезжает в новый объект. ChatOpenAI сохраняет свой клиент, поэтому переопределение base_url или timeout меняет поле, но не запросы; ChatAnthropic пересобирает клиент из новых полей.

Имена полей у провайдеров

Ключи — это аргументы конструктора класса модели, поэтому у провайдеров они различаются. Ключ, которого класс не знает, игнорируется или, как у ChatOpenAI, уходит в model_kwargs с предупреждением.

ChatOpenAI ChatAnthropic ChatGoogleGenerativeAI ChatOllama
Имя модели model model model model
Температура temperature temperature temperature temperature
Лимит токенов max_tokens max_tokens max_output_tokens num_predict