llm: провайдер за протоколом, фабрика, mock #17
Notifications
Due Date
No due date set.
Blocks
Depends on
Reference: HSE/tgit#17
Reference in New Issue
Block a user
Описание
ADR-008: модель не выбрана — код не должен от неё зависеть.
Желаемый результат
LLMProviderProtocol:complete(messages, json_schema=None) -> LLMResult(текст/JSON + токены).openai_compat(base_url, model, api_key, timeout) иmock(детерминированные ответы для тестов).LLM_PROVIDERв.env.Подзадачи
app/llm/provider.py— протокол,LLMResultapp/llm/openai_compat.pyна httpxapp/llm/mock.pyapp/llm/factory.pyLLMSettingsв конфигеАнализ
Затрагиваемые файлы
app/llm/app/config.pyОграничения и риски
Ключ — секрет. Таймаут и ретраи на 429/5xx. Учёт токенов — в ответе.
Как проверить
make test; с реальным ключом:python -m app.llm.cli 'привет'.Лог выполнения
2026-10-14
app/llm/provider.py— протоколLLMProvider.complete(messages, schema=None) -> LLMResult(текст,data— разобранный JSON при запросе схемы, токены).data— только «синтаксически JSON»: форму проверяет вызывающий код (#18).openai_compat.py—/chat/completions, structured output черезresponse_format: json_schema (strict), JSON вынимается и из ```-обёртки; ретраи 408/409/429/5xx и сетевые ошибки (1→2→… с), прочие 4xx —LLMErrorсразу; тело запроса (текст пользователя) в ошибки не попадает.mock.py— правила «подстрока → ответ» для тестов и демо без сети;factory.py,LLMSettings(LLM_*), CLIpython -m app.llm.cli.sleep), покрытие проекта 92 %.response_format: json_schema(у OpenAI-совместимого API YandexGPT — уточнить); если не поддерживает — fallback на «JSON в тексте» уже работает через разбор ответа.