openrouter/z-ai/glm-5.1 побеждает по балансу цены/надёжности/качества. Развёрнуто в продакшене по $0.059 за диалог. Кэширование через OpenRouter работает для GLM и DeepSeek-direct (~66% попаданий). DeepSeek через :nitro провалился: пустые ответы посередине цикла и без кэширования. GLM-4.6 примерно в 1 случае из 5 подтверждает контакт, но не вызывает send_lead внутри диалога — таймер фолоу-апов в этом случае подбирает заявку, так что это наблюдаемое поведение, не блокирующее.
Методология
- Один и тот же сценарий разговора для всех кандидатов: клиент просит оценку квартиры → уточняет наследство + Барнаул → задаёт вопросы по документам → загружает паспорт → даёт телефон → бот передаёт заявку.
- Каждая сессия даёт ~50K–90K входных токенов, ~1–2K выходных, 10–15 раундов с LLM.
- Подсчёт токенов точный — берутся из поля
usageответа API, пишутся в трейс строкойusage: in=N out=N cached_read=N cache_write=N. - Стоимость точна для маршрутов OpenRouter — берётся из
usage.costв ответе chat completion. Для прямых OpenAI/Anthropic стоимость рассчитывается детерминированно из количества токенов.
Результаты
| Модель | $/диалог | $/1k | Надёжность передачи лидов | Рассуждения | Заметки |
|---|---|---|---|---|---|
openrouter/z-ai/glm-5.1 (прод) |
$0.059 | $59 | чисто (1/1) | очень хорошо (опирается на базу) | Кэширование через OpenRouter, ~66% попаданий |
openrouter/z-ai/glm-4.6 |
$0.012–0.013 | $13 | наблюдается: ~1 случай из 5 пропускает send_lead внутри диалога; таймер подбирает заявку |
очень хорошо (чуть слабее 5.1 / GPT-5 в нашем сценарии) | Дешевле 5.1; потеря в-диалоге восстанавливается, не блокер |
openai/gpt-5.4 |
$0.063 | $63 | чисто (1/1) | очень хорошо | Авто-кэширование OpenAI; чтение кэша 10% от обычной цены |
anthropic/claude-sonnet-4.6 (с кэшем) |
$0.118 | $118 | чисто (1/1) | очень хорошо | Явные маркеры cache_control; 90% скидка на кэш-чтение |
openrouter/deepseek/deepseek-v4-pro:nitro |
нестабильно | n/a | тестирование сорвалось | n/a | Пустые ответы посередине цикла; кэширование не пропускается |
Кэширование
| Провайдер | Механизм | Скидка | Прокидывается через OpenRouter |
|---|---|---|---|
| OpenAI (GPT-5) | автомат | 90% | да |
| OpenAI (GPT-4.1 / 4o) | автомат | 75% / 50% | да |
| Anthropic | явный cache_control | 90% | да (если маркеры пробрасываются) |
| DeepSeek | автомат | ~90% | только через собственный API DeepSeek; не через Together/Fireworks |
| Z.AI GLM | автомат | ~80% | да (~66% наблюдаемо для GLM-5.1) |
| Moonshot Kimi / Qwen | зависит | неизвестно | не задокументировано |
Для нашего агента стабильный кэшируемый префикс системного промпта составляет ~3,500–4,300 токенов (преамбула движка + Prompt1 проекта + схема инструментов). Изменчивый суффикс (текущее состояние диалога на ходу) не кэшируется по дизайну — он лежит в отдельном системном блоке, чтобы его изменения не сбивали кэш префикса.
Промахи кэша на OpenRouter
Передача кэша через OpenRouter недетерминированна, потому что OpenRouter балансирует нагрузку между несколькими апстримами (Together, Fireworks, DeepInfra, собственный API автора модели). У разных апстримов разные кэши; если запрос попал на другой апстрим, чем предыдущий, префикс там холодный и оплачивается полностью.
В трейсах продакшена GLM-5.1 наблюдается обычно один промах кэша за сессию (вариативность стоимости ~17%). Чистый эффект: $59/1k вместо теоретического минимума ~$50/1k при идеальном кэшировании. Допустимо для текущего этапа; решается полем provider.order в запросе OpenRouter, если станет систематическим.
Структура стоимости по ходам (продакшен GLM-5.1, 6 ходов)
ход сообщение пользователя $/ход
─────────────────────────────────────────────────────────────
1 "нужна оценка квартиры" $0.0108
2 "барнаул, оформить наследство" $0.0102
3 "а где взять ергн?" $0.0105
4 <файл: passport.pdf> $0.0000 (file_ack)
5 "паспорт" $0.0120
6 "понял. да, номер актуальный" → send_lead $0.0157
─────────────────────────────────────────────────────────────
ИТОГО $0.0591
Наблюдения по надёжности
- GPT-5.4 / Sonnet — обе на 100% надёжны в тестах. Чисто вызывают
send_leadна том же ходу, когда контакт + 3 ключевых параметра впервые собраны. - GLM-5.1 — 100% надёжна в 2/2 тестах. Чистая передача. Качество рассуждений на уровне GPT-5.4.
- GLM-4.6 — примерно в 1 случае из 5: бот получил контакт, сказал «свяжемся», но не вызвал
send_leadвнутри диалога. Таймер фолоу-апов её подбирает (на холодном клиенте на последнем интервале заявка передаётся автоматически), так что это восстанавливаемое поведение, не блокер. Стоит знать, но не повод отказываться от модели. - DeepSeek через
:nitro— пустые ответы посередине цикла. Даже новый retry для transient-ошибок не всегда помогает.
Рекомендации
| Сценарий | Модель |
|---|---|
| Продакшен по умолчанию | openrouter/z-ai/glm-5.1 |
| Премиум-уровень (платить ~7× за качество) | anthropic/claude-sonnet-4.6 с кэшированием |
| Средний уровень-альтернатива | openai/gpt-5.4 |
| Дешёвая альтернатива | openrouter/z-ai/glm-4.6 — примерно в 5 раз дешевле 5.1, с указанной выше особенностью в-диалоге (таймер подбирает заявку) |
| Не использовать | любой :nitro вариант (без кэширования) |
Воспроизводимость
Чтобы повторить исследование:
# Замените models.toolcaller в config.dev.json, прогоните 5 ходов через CLI:
bin/aichat-cli --config config.dev.json --project abo22
# Сумма стоимости из трейса:
grep '^usage:' traces/1/<последний>.log | sed 's/.*cost=\$\([0-9.]*\).*/\1/' | paste -sd+ | bc
Строки usage: и cost= пишутся в каждый трейс компонентом internal/agent/toolagent.go (debugDumpBlocks + per-call usage line). Подсчёт токенов точный; cost= от OpenRouter точен для маршрутов, которые его возвращают.