textmachine/backend/configs/models.yaml

242 lines
19 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Модели и цены TextMachine (Р4/Р5: состав и цены — ТОЛЬКО здесь, с датой
# проверки; код не знает ни одной цены).
#
# Источники проверки 2026-07-10 (D3-цепочка/канал B заведены пакетом №3; каждый
# слаг live-фактчекнут — /models И пробный вызов, правило двух направлений):
# DeepSeek https://api-docs.deepseek.com/quick_start/pricing (v4-pro $0.435/$0.87, cache-hit $0.003625)
# Z.AI/GLM https://docs.z.ai/guides/overview/pricing (glm-5.1 $1.4/$4.4, cached $0.26)
# Kimi https://platform.kimi.ai/docs/pricing/chat-k26
# xAI https://docs.x.ai/docs/models (Grok 4.1 Fast retired 15.05.2026!)
# Gemini https://ai.google.dev/gemini-api/docs/pricing (3.1-pro-preview $2/$12 ≤200k, cache $0.20, output incl. thinking)
# Mistral https://mistral.ai/pricing/api (Large 3 = mistral-large-2512 $0.5/$1.5; FAQ "$2/$6" = legacy Large 2)
# OpenAI https://developers.openai.com/api/docs/models/gpt-5-mini (gpt-5-mini $0.25/$2.0, cached $0.025)
# Live-факты пакета №3 (2026-07-10, все HTTP 200 пробным вызовом, кроме отмеченного):
# • gemini-3.1-pro → 404 NOT_FOUND; callable слаг ТОЛЬКО gemini-3.1-pro-preview (D3-текст назвать -preview — пинг).
# • Gemini thinking-токены НЕ в completion_tokens (проба: completion=2, total=847 → 823 thinking в total_tokens,
# поля reasoning_tokens нет) → провайдер gemini reasoning:additive_total (адаптер деривит reasoning=totalpromptcompletion,
# иначе mistral-класс слепоты потолка на mandatory-thinking апексе).
# • gpt-5-mini жив пробой (→ dated gpt-5-mini-2025-08-07), но снят с прайс-страницы (там gpt-5.4/5.5/5.6); кандидат D3, не в цепочке Ф1.
prices_checked: "2026-07-10"
# Fallback-якорь цены: неизвестная модель (например, фактическая модель после
# фейловера, которой нет в таблице) книжится по этой цене, никогда по $0.
default_model: deepseek-v4-flash
providers:
deepseek:
kind: openai
base_url: https://api.deepseek.com/v1
api_key_env: DEEPSEEK_API_KEY
reasoning: subset # thinking внутри completion_tokens
# ⚠️ ЭХО-МИНА (трасса 2026-07-04, PROGRESS «Ответ Полигону»): на плотном CJK
# DeepSeek с thinking ВЫКЛ воспроизводимо возвращает ИСХОДНИК вместо перевода
# (тихий отказ, HTTP 200). Держится только тем, что reasoning:"off" через
# ReasoningNone — осознанный no-op (thinking остаётся ON по дефолту). Флаг
# включает fail-fast (config.echoMineViolation): нельзя завести deepseek
# capabilities.reasoning.off_extra_body:{thinking:{type:disabled}} — включит
# эхо в проде. GLM с thinking:disabled безопасен (вход — русский черновик).
echoes_when_thinking_off: true
timeouts: { attempt_s: 240, max_attempts: 3, backoff_cap_s: 60 }
zai: # GLM, международный контур (docs.z.ai)
kind: openai
base_url: https://api.z.ai/api/paas/v4
api_key_env: ZAI_API_KEY
reasoning: subset
timeouts: { attempt_s: 240, max_attempts: 3, backoff_cap_s: 60 }
kimi: # API-хост — api.moonshot.ai (intl, НЕ .cn). Веб-консоль переехала
# platform.moonshot.ai → platform.kimi.ai, но API-эндпоинт остаётся
# api.moonshot.ai: api.kimi.ai НЕ резолвится (DNS fail, live-проба 2026-07-04
# /models: 000; moonshot.ai → 200 c kimi-k2.6). Прежний base_url был битый.
kind: openai
base_url: https://api.moonshot.ai/v1
api_key_env: KIMI_API_KEY
reasoning: subset
timeouts: { attempt_s: 240, max_attempts: 3, backoff_cap_s: 60 }
xai: # Grok — центральная модель Фазы 1: дефолт-редактор SFW + главный тир канала B + судья 18+.
# ⚠️ ГИГИЕНА АККАУНТОВ (D8/оркестратор): XAI_API_KEY обязан быть ЧИСТЫМ прод-аккаунтом
# БЕЗ data-sharing. Промо-$150-аккаунт (data-sharing) — ТОЛЬКО eval/NSFW, реальные книги
# через него гнать нельзя. По ключу это не проверяется — подтвердить перед боевым прогоном.
kind: openai
base_url: https://api.x.ai/v1
api_key_env: XAI_API_KEY
reasoning: additive # xAI биллит reasoning ПОВЕРХ completion (проверено vojo); think-ON заблокирован до резерва в EstimateUSD (D6.2/F3)
permissive: true # главный пермиссив-тир канала B + reasoning-ON эскалация (D3/D19.1): channel:adult-стадия/escalate_to изолируются ТИПОМ на permissive-провайдера (D4.1)
timeouts: { attempt_s: 240, max_attempts: 3, backoff_cap_s: 60 }
# Anthropic убран из стека по решению владельца (04.07): дорого, в RU-контуре
# экономически недоступен (Р5), в eval не валидирован. Судья Р4 — Gemini
# (нативный адаптер, Фаза 2). Нативный Anthropic-адаптер в коде помечен
# DEPRECATED, но НЕ удалён — оставлен как референс нативного адаптера под
# Gemini Фазы 2 (см. provider_anthropic.go). Эскалация — не-Anthropic (Kimi/GLM).
gemini: # Google Gemini через OpenAI-совместимый слой (base .../v1beta/openai). Апекс канала A +
# судья Фазы 2. ⚠️ Нативный Gemini API нужен для safety-off судьи 18+ (safety_settings не
# проходят через OpenAI-слой — exp00); OpenAI-слой достаточен для перевода/эскалации (фильтры OFF
# по дефолту у 3.x, кроме неконфигурируемого PROHIBITED_CONTENT — D21.9).
kind: openai
base_url: https://generativelanguage.googleapis.com/v1beta/openai
api_key_env: GEMINI_API_KEY
# reasoning:additive_total — thinking у Gemini биллится как output, но в OpenAI-слое НЕ попадает в
# completion_tokens и НЕ отдаётся полем reasoning_tokens (в отличие от xAI); виден ТОЛЬКО как
# total_tokenspromptcompletion (live-проба 2026-07-10: completion=2, total=847 → 823 thinking).
# Адаптер деривит их из total и биллит по output — иначе mandatory-thinking апекс слепил бы потолок.
reasoning: additive_total
timeouts: { attempt_s: 300, max_attempts: 3, backoff_cap_s: 60 } # апекс думает дольше
openai: # OpenAI прямой ключ (D3: Anthropic убран, OpenAI ОСТАЁТСЯ). gpt-5-nano альт-черновик,
# gpt-5-mini кандидат-редактор/second-opinion судья — НЕ в дефолтной цепочке Ф1 (слот под Ф2).
kind: openai
base_url: https://api.openai.com/v1
api_key_env: OPENAI_API_KEY
reasoning: subset # gpt-5: reasoning_tokens ⊆ completion (OpenAI-спека), покрыто maxTokens
timeouts: { attempt_s: 240, max_attempts: 3, backoff_cap_s: 60 }
mistral: # Mistral La Plateforme (base api.mistral.ai/v1). Переводчик-дефолт канала B (D19.1):
# 10/10 чисто на violence, policy 11.06.2026 без запрета adult, НЕ reasoning-модель → эхо-мины нет.
kind: openai
base_url: https://api.mistral.ai/v1
api_key_env: MISTRAL_API_KEY
reasoning: subset # mistral-large — не thinking-модель; reasoning-токенов нет
permissive: true # переводчик канала B (D19.1); channel:adult-стадия изолируется ТИПОМ (D4.1)
timeouts: { attempt_s: 240, max_attempts: 3, backoff_cap_s: 60 }
local: # ollama/llama-server на стенде (боевой env — memory textmachine-local-stand)
kind: local
base_url: http://127.0.0.1:11434/v1
model: huihui_ai/qwen3-abliterated:8b
max_tokens: 8192 # у ollama лимит покрывает thinking+ответ вместе
permissive: true # abliterated-скрининг/дешёвый фолбэк канала B (D3/D19.1)
timeouts: { attempt_s: 600, max_attempts: 2, backoff_cap_s: 10 } # полигон: чанки 63278 с
models:
deepseek-v4-flash:
provider: deepseek
price: { input_per_m: 0.14, cached_per_m: 0.0028, cache_write_per_m: 0, output_per_m: 0.28 }
capabilities:
# Floor per quirks (thinking ⊆ completion, subset): <8000 → reasoning eats the
# budget, content пуст, finish=length (НЕ отказ). Schema, not a comment (D24.3).
min_max_tokens: 8000
note: >-
Черновик (Р4). Автокэш по префиксу, отдельной цены записи нет.
deepseek-chat/reasoner отключаются 24.07.2026 — сюда не возвращаться.
deepseek-v4-pro:
provider: deepseek
# $0.435/$0.87, cache-hit $0.003625 (факт. 2026-07-10, api-docs.deepseek.com/quick_start/pricing).
price: { input_per_m: 0.435, cached_per_m: 0.003625, cache_write_per_m: 0, output_per_m: 0.87 }
capabilities:
# Floor 8000 (D24.3): без него хоп наследовал бюджет праймари (2048/3291 на
# приёмке этапа A) и вернул finish=length / 0 байт контента — эскалация впустую.
min_max_tokens: 8000
note: >-
Эскалация черновика канала A, хоп 1 (D3): deepseek-эхо 25% на приёмочной 蛊真人 (D18) → single-hop
фолбэк с draft. Наследует deepseek: thinking ON (эхо-мина того же класса — echoes_when_thinking_off),
reasoning ⊆ completion (subset). Живьём 2026-07-10: /models ✓, chat 200 (reasoning_content, перевёл).
glm-5:
provider: zai
price: { input_per_m: 1.0, cached_per_m: 0.2, cache_write_per_m: 0, output_per_m: 3.2 }
# thinking-выключатель переехал из extra_body в capabilities.reasoning (D3.1):
# тело запроса байт-в-байт то же ({thinking:{type:disabled}} при reasoning=off),
# но теперь это единая wire-форма — и off_extra_body разблокирует think-ON
# эскалацию (D6.2) без второй ручки. Смена снапшота осознанная (--resnapshot).
capabilities:
reasoning:
control: extra_body_disable
off_extra_body: { thinking: { type: disabled } } # эмпирика полигона: thinking GLM — таймауты ×3
note: Редактор ru-стиля (Р4). Флагманы линейки уже GLM-5.1/5.2 ($1.4/$4.4) — пересмотреть к Фазе 2.
glm-5.1:
provider: zai
# $1.4/$4.4, cached $0.26 (факт. 2026-07-10, docs.z.ai/guides/overview/pricing).
price: { input_per_m: 1.4, cached_per_m: 0.26, cache_write_per_m: 0, output_per_m: 4.4 }
capabilities:
reasoning:
control: extra_body_disable
off_extra_body: { thinking: { type: disabled } } # как glm-5: thinking GLM — таймауты ×3 (полигон)
note: >-
Эскалация канала A, хоп 2 (D3), кросс-семейный к deepseek-хопу 1. Живьём 2026-07-10: /models ✓
(glm-4.5..5.2 листятся), chat 200 (thinking:disabled → reasoning_tokens=0). Флагман линейки vs glm-5.
kimi-k2.6:
provider: kimi
price: { input_per_m: 0.95, cached_per_m: 0.16, cache_write_per_m: 0, output_per_m: 4.0 }
# Альт-редактор (bake-off эксп-04, проиграл grok-4.3): принимает ТОЛЬКО temperature:1
# (иначе 400), ~11k reasoning tok/абзац. capabilities фиксируют квирк, чтобы edit-стадия
# на temp 0.4 не 400-ла; min_max_tokens закрепляет min-бюджет схемой (был комментарий).
capabilities:
temperature: { mode: force, value: 1 }
# Floor 16000 (D24.3): <16000 → reasoning съедает лимит, content пустой, finish=length.
min_max_tokens: 16000
note: Альтернативный редактор (Р4).
grok-4.3:
provider: xai
# $1.25/$2.50/1M (факт. 2026-07-04, docs.x.ai). cached_per_m=input: кэш-цену xAI
# не верифицировали, а для редактора (черновик — свежий вход на чанк) cache-hit≈0,
# поэтому консервативно не моделируем скидку — потолок не слепнет. Уточнит полигон.
price: { input_per_m: 1.25, cached_per_m: 1.25, cache_write_per_m: 0, output_per_m: 2.50 }
# Дефолт-редактор (bake-off эксп-04): temperature шлём; reasoning OFF даётся ТОЛЬКО явным
# reasoning_effort:"none" (control:effort + off_effort:none). Дефолт grok = low → омиссия
# заставляет думать: проба eval 05.07 (Chat Completions) — omission→444 reasoning-ток., "none"→0.
# control:none (off-by-omission) молча оставил бы low; control:effort/off_effort шлёт явный none.
capabilities:
temperature: { mode: send }
reasoning: { control: effort, off_effort: none }
note: >-
Дефолт-редактор SFW (D3, bake-off эксп-04) + главный пермиссив-тир канала B + судья 18+.
reasoning additive: think-ON только после резерва в EstimateUSD (D6.2/техдолг F3). Включена
в edit-стадию C1/C2 (D1/D3, консолидация 05.07); прод-прогон — только с ЧИСТЫМ xAI-ключом без data-sharing.
gemini-3.1-pro-preview: # ⚠️ слаг ИМЕННО -preview: gemini-3.1-pro → HTTP 404 NOT_FOUND (live 2026-07-10)
provider: gemini
# $2/$12 за 1M ≤200k (факт. 2026-07-10, ai.google.dev/gemini-api/docs/pricing; >200k тир $4/$18 —
# не моделируем, чанки книги ≤200k). Output ВКЛЮЧАЕТ thinking-токены (reasoning-as-output, D3.2/D6.3).
price: { input_per_m: 2.0, cached_per_m: 0.20, cache_write_per_m: 0, output_per_m: 12.0 }
capabilities:
# mandatory: thinking обязателен (thinking_budget:0 → HTTP 400, D6.3); адаптер молча глотает
# reasoning:"off", forced thinking биллится как output. Учёт токенов — provider gemini reasoning:additive_total.
reasoning: { control: mandatory }
# Floor 8000 (D24.3): mandatory-thinking съедает бюджет; <8000 → перевод обрезан.
# Раньше «дать max_tokens ≥8000» — комментарий; теперь схема (thinking ⊆ бюджета, additive_total).
min_max_tokens: 8000
note: >-
Апекс канала A / судья Фазы 2 (D3). min_max_tokens 8000 держит thinking внутри бюджета (резерв не слепнет; settle
биллит thinking через additive_total). Судья 18+ требует НАТИВНОГО Gemini (safety-off) — Ф2. Живьём 2026-07-10: chat 200.
mistral-large-2512:
provider: mistral
# $0.5/$1.5 за 1M (факт. 2026-07-10, mistral.ai/pricing/api — Mistral Large 3, релиз дек.2025, Apache 2.0,
# 262K). ⚠️ Маркетинг-FAQ mistral.ai/pricing даёт generic "$2/$6" = legacy Large 2; per-model /pricing/api
# = $0.5/$1.5 (OpenRouter согласен) → разрешает D19-подозрение ($0.5/$1.5 при $2/$6 = 4×). cached=input
# консервативно (cache-read не моделируем; канал B — свежий вход/чанк, hit≈0, потолок не слепнет).
price: { input_per_m: 0.5, cached_per_m: 0.5, cache_write_per_m: 0, output_per_m: 1.5 }
note: >-
Переводчик-дефолт канала B (D19.1): 10/10 чисто на violence, policy 11.06.2026 без запрета adult, не
reasoning-модель (эхо-мины нет). Полный wiring канала B — Ф2 (конфиг-слот). Полигон перепроверяет цену (D19.5б).
Живьём 2026-07-10: /models ✓, chat 200.
gpt-5-mini: # кандидат-редактор/second-opinion судья (D3) — НЕ в дефолтной цепочке Ф1
provider: openai
# $0.25/$2.0, cached $0.025 (факт. 2026-07-10, developers.openai.com/api/docs/models/gpt-5-mini). Слаг жив
# (chat 200 → dated gpt-5-mini-2025-08-07), но снят с текущей прайс-страницы (там gpt-5.4/5.5/5.6) — пересмотр к Ф2.
price: { input_per_m: 0.25, cached_per_m: 0.025, cache_write_per_m: 0, output_per_m: 2.0 }
capabilities:
budget_field: max_completion_tokens # gpt-5: max_tokens → HTTP 400
temperature: { mode: omit } # gpt-5: temperature не принимается → HTTP 400
reasoning: { control: effort, off_effort: minimal } # reasoning ON выжигает бюджет → пустой ответ; шлём minimal
note: >-
Кандидат-редактор Р4 / second-opinion судья (D3). Не в дефолтной цепочке Ф1 (слот под Ф2).
Живьём 2026-07-10 — chat 200.
# claude-sonnet-5 / claude-opus-4-8 удалены вместе с провайдером anthropic
# (см. комментарий у providers выше). Судья Фазы 2 — Gemini: нативный адаптер для
# safety-off судьи 18+; для перевода/эскалации достаточно OpenAI-слоя (провайдер gemini выше).
local-qwen3-8b:
provider: local
price: { input_per_m: 0, cached_per_m: 0, cache_write_per_m: 0, output_per_m: 0 }
note: Скрининг/экстракция (Р4 — «спецслужба, не переводчик»). $0 допустим только для local-провайдера.