250 lines
115 KiB
Markdown
250 lines
115 KiB
Markdown
# 00. Провайдерские грабли — справочник для адаптеров
|
||
|
||
Назначение: единый список практических особенностей LLM-провайдеров, найденных полигоном при живых вызовах. **Бэкенд-сессия читает это напрямую** при написании/правке адаптеров `internal/llm`, чтобы не переоткрывать в Go то, что уже поймано в Python. Дата: 2026-07-04, проверять при смене версий моделей.
|
||
|
||
Разделение ролей: полигон (`eval/`, Python) — тупой замерочный зонд, характеризует **сырое поведение** провайдера (отказ/качество/латентность); бэкенд (`backend/internal/llm`, Go) — продакшн-адаптеры (retry/failover/ledger). Код не общий (разные языки) и не должен быть — но знание о граблях общее и живёт здесь.
|
||
|
||
**⚠ ПРАВИЛО ДВУХ НАПРАВЛЕНИЙ (решение владельца 10.07, после Gemini-кейса):** (1) клейм о поведении модели → проверяй живой пробой (уже было правилом); (2) **аномалия на проводе (интермиттентные 4xx/5xx, «model no longer available», новый/неожиданный `finish_reason`, молча игнорируемые параметры) → СНАЧАЛА официальная дока вендора (deprecations / changelog / status page) + свежий /models-листинг, ПОТОМ диагноз.** Не гадать и не абсорбировать интерпретацию аномалии в доки/промты/адаптеры без вендор-сверки с датой и URL. Прецедент: 404-флейки gemini-2.5-flash интерпретировались вслепую, а офиц. дока сразу давала ответ — вся 2.5-серия EOL 16.10.2026 (см. календарь ниже).
|
||
|
||
## Эндпоинты и модели (OpenAI-совместимые, если не указано иное)
|
||
|
||
> ✅ **ЖИВОЙ ЛИСТИНГ `/models` ПЕРЕ-СНЯТ 2026-08-10** (полигон, фаза Д; $0, `eval/role_topology/
|
||
> list_models.py`, снимок `~/books/role-topology/models-live.json`). Все семь ключей отвечают.
|
||
> Счёт слагов: **deepseek 2 · zai 8 · kimi 12 · openai 124 · gemini 59 · xai 10 · mistral 53.**
|
||
> Дельты к колонке «на 2026-07-04», которую таблица ниже НЕ переписывает (она датирована):
|
||
> * **zai** — в листинге сверх записанных: `glm-4.5`, `glm-4.5-air`, `glm-4.6`, `glm-5-turbo`
|
||
> (то есть все восемь). `glm-4.7-flash`/`glm-4.7-flashx` в `/models` по-прежнему НЕТ — их видно
|
||
> только на прайс-странице (находка эксп-22 §0.5, в ростер не берутся).
|
||
> * **kimi** — появился **`kimi-k3`** (эксп-23 его замерил: пустой выход при 99.9% размышления
|
||
> и $0.0804 за клетку, но под СВОИМ потолком 4000 — вывода об отказном режиме вендора нет).
|
||
> * **openai** — линейка ушла далеко вперёд `gpt-5-mini`: живы `gpt-5.4`(+`-2026-03-05`), `gpt-5.5`,
|
||
> и тройка **`gpt-5.6-luna` · `gpt-5.6-terra` · `gpt-5.6-sol`**. Первые два меряны паками 22/23.
|
||
> * **gemini** — **`models/gemini-3.1-pro-preview` В ЛИСТИНГЕ ЖИВ** (важно: эксп-22 не получил от
|
||
> него панели по ПРОВОДУ, а не по отсутствию слага); рядом `gemini-3.5-flash`, `gemini-3.6-flash`,
|
||
> `gemini-3.1-flash-lite`. Вся 2.5-серия ещё в листинге — shutdown объявлен на 16.10.2026.
|
||
> * **xai** — `grok-4.3` и `grok-4.5` живы, плюс три слага-обёртки `grok-4.20-0309-*`.
|
||
> * **mistral** — `mistral-large-latest`/`-2512`, `mistral-medium-latest` живы.
|
||
>
|
||
> ⚠ **«Слаг живой» ≠ «модель та же»** (урок катовера DeepSeek 31.07, D39.61) — листинг доказывает
|
||
> только доступность имени. Цены DeepSeek пере-сняты в тот же день и НЕ изменились (flash
|
||
> $0.14/$0.28 cache-hit $0.0028 · pro $0.435/$0.87 cache-hit $0.003625); сноска вендора о
|
||
> **готовящемся значительном повышении** на прайс-странице ПРИСУТСТВУЕТ и на 10.08.
|
||
|
||
| Провайдер | base_url | Модель (на 2026-07-04) | env-ключ |
|
||
|---|---|---|---|
|
||
| DeepSeek | `https://api.deepseek.com/v1` | **`deepseek-v4-flash`** + `deepseek-v4-pro` — и это **ВЕСЬ** листинг (live 25.07.2026). **Катовер ИСПОЛНЕН:** `deepseek-chat`/`deepseek-reasoner` сняты не только из листинга, но и из реестра — `GET /v1/models/deepseek-chat` → **404 `Model Not Found`**, алиас-оговорка календаря на них больше НЕ распространяется. Цены пост-катовера НЕ изменились (25.07: flash $0.14/$0.28 cache-hit $0.0028 · pro $0.435/$0.87 cache-hit $0.003625) — `models.yaml` актуален. Эхает zh — см. ниже, брать v4-flash с thinking | `DEEPSEEK_API_KEY` |
|
||
| xAI Grok | `https://api.x.ai/v1` | **`grok-4.3`** *(→ D30.1: из роли РЕДАКТОРА reasoning-off СНЯТ — no-op, exp12; grok — эскалация канала B reasoning-ON и судья 18+, не дефолт-редактор)* (для thinking-OFF слать явный `reasoning_effort:"none"` — см. thinking-таблицу ниже; слаг НЕ меняем на non-reasoning вариант — он = grok-4.3+`none` под капотом, ретайр 15.05.2026). `grok-4-fast` не в /v1/models, но работает как алиас (HTTP 200). | `XAI_API_KEY` |
|
||
| GLM (Z.ai) | `https://api.z.ai/api/paas/v4` | `glm-4.5-air` (дёшево) / `glm-4.6`; в /models: glm-4.7, glm-5, glm-5.1, glm-5.2 | `ZAI_API_KEY` |
|
||
| Gemini | `https://generativelanguage.googleapis.com/v1beta/openai` | `gemini-2.5-flash`, `gemini-2.5-pro`, `gemini-3.1-pro-preview` | `GEMINI_API_KEY` |
|
||
| Kimi (Moonshot) | `https://api.moonshot.ai/v1` (intl, **не** `.cn`) | `kimi-k2.6` (доступны k2.5, k2.7-code) | `KIMI_API_KEY` |
|
||
| OpenAI | `https://api.openai.com/v1` | `gpt-5-mini` | `OPENAI_API_KEY` |
|
||
| Qwen (DashScope intl) | `https://dashscope-intl.aliyuncs.com/compatible-mode/v1` | `qwen-flash` | `DASHSCOPE_API_KEY` |
|
||
| OpenRouter | `https://openrouter.ai/api/v1` | зависит от хостера | `OPENROUTER_API_KEY` |
|
||
| Локаль (ollama) | `http://localhost:11434/v1` (chat) или `/api/generate` | тег модели | не нужен |
|
||
|
||
## Thinking / reasoning — главный источник граблей
|
||
|
||
У всех современных моделей режим «размышления» включён по умолчанию и **ломает роль переводчика**: рассуждения съедают бюджет вывода → перевод обрезается или пустой, латентность ×3–5. **Для роли переводчика/редактора reasoning обязателен к управлению.** Как — зависит от провайдера:
|
||
|
||
| Провайдер | Поведение по умолчанию | Как управлять (для перевода) |
|
||
|---|---|---|
|
||
| **DeepSeek v4-flash** | гибридная reasoning-модель, thinking ON по умолчанию | **Управление (официальные доки, api-docs.deepseek.com/guides/thinking_mode, проверено 04.07): в body `extra_body={"thinking":{"type":"enabled"\|"disabled"}}`** (дефолт enabled). Т.е. выключить МОЖНО, параметр есть. НО для роли ПЕРЕВОДЧИКА не выключать: `disabled`→non-thinking режим, который на плотном CJK **ЭХАЕТ исходник**. Оставлять thinking ВКЛ; reasoning→`reasoning_content`, `content` чистый; ~~`max_tokens` ≥8000~~ **→ см. строку 0731 ниже: флор 8000 ПРОБИТ**. ⚠ **thinking-режим НЕ поддерживает `temperature`/`top_p`/penalties** (шлём — молча игнорируются). ~~`reasoning_effort`: только `high`/`max` (low/medium→high, xhigh→max)~~ **→ УСТАРЕЛО, см. строку 0731**; `none` в OpenAI-формате НЕ существует → 400. Для дешёвой роли ЭКСТРАКЦИИ (не перевод) thinking можно выключить — echo бьёт по переводу, не по JSON-выводу (перепроверить). |
|
||
| GLM-4.5-air / 4.6 | thinking ON, не влезал в 180с | отключить: `extra_body: {"thinking": {"type": "disabled"}}` |
|
||
| **glm-5** | thinking ON по умолчанию | гасится тем же `extra_body: {"thinking": {"type": "disabled"}}` — подтверждено живыми армами эксп-18/21 (арм B шёл thinking-OFF; провод-факт эксп-21 §8) |
|
||
| Gemini 2.5 Flash | thinking ON, съедал `max_tokens`, **молча обрезал перевод** | ⚠ **ФОРМА, КАК ОНА ЗДЕСЬ СТОЯЛА, НА ПРОВОД НЕ ДОЕЗЖАЕТ** (поймано полигоном 22.08). Проводное тело несёт ключ `extra_body` **НА ВЕРХНЕМ УРОВНЕ**: `{"extra_body":{"google":{"thinking_config":{…}}}}`; в Python-SDK это `extra_body={'extra_body': {'google': {…}}}` (вендор-сэмпл ai.google.dev/gemini-api/docs/openai, 17.08.2026). Один уровень вложенности → HTTP 400 «Unknown name "google"» — это НАША ошибка, а не отказ вендора. Штатный off-switch для серии 2.5 — плоский `reasoning_effort:"none"` |
|
||
| **Gemini 3.x и 2.5 Pro** | thinking **невыключаем У ВСЕЙ СЕРИИ** | дословно вендор (17.08.2026): «Reasoning cannot be turned off for Gemini 2.5 Pro or 3 models». Дефолт `gemini-3.1-pro-preview` — **On (high)**. У 3.x ручка — `thinking_level` (minimal/low/medium/high), у 2.5 — `thinking_budget`; через OpenAI-слой обе задаются как `reasoning_effort`, и **вместе с `thinking_level`/`thinking_budget` слать нельзя**. ⚠ Для `gemini-3.1-flash-lite` строки в вендорской таблице дефолтов НЕТ — **дефолтный уровень НЕ УСТАНОВЛЕН**, писать «не установлено», а не «выключено». НЕ отключать; дать большой `max_tokens` (≥8000) |
|
||
| gpt-5-mini (reasoning) | reasoning ON, выжигал бюджет → пустой ответ | `reasoning_effort: "minimal"`; **без `temperature`**; `max_completion_tokens` вместо `max_tokens` |
|
||
| **gpt-5.4 (reasoning)** | ⚠ **`reasoning_effort:"medium"` РЕПРОДУЦИРУЕМО ОБРЕЗАЕТ ВЫВОД на длинной редактуре** (exp14b: reasoning съел бюджет → `content` 223 out-ток ≈ 602 симв из ~5000, `finish=stop` — выглядит как валидный короткий ответ, НЕ length-обрыв → тихо портит результат) | В роли РЕДАКТОРА/переводчика (длинный выход) слать **`reasoning_effort:"low"`** (exp14b: тот же чанк → 5137 симв, полный); `max_completion_tokens` (не `max_tokens`), без `temperature`. reasoning⊆completion (subset-биллинг). Слаг live-фактчек 2026-07-11: `gpt-5.4-2026-03-05`. *(Верифицировано span-читкой D38; self-review полигона поймал живьём.)* |
|
||
| **gpt-5.6-luna (reasoning)** | reasoning ON; **без явной ручки эффорта выжигает бюджет на рассуждение и отдаёт ПУСТОЙ `content`** (провод-факт эксп-21 §8) | слать явный `reasoning_effort` (`low` для перевода/редактуры); `max_completion_tokens`; пустой `content` при `finish=length` — оплаченный брак, гейтить приёмом ответа |
|
||
| **Kimi K2.6** | думающая, **очень многословная**: ~11k reasoning-токенов на абзац; reasoning в `reasoning_content`, ответ в `content`; при малом бюджете reasoning съедает лимит → `content` **пуст** (finish=length, не ошибка!) | дать `max_tokens` ≥16000; ответ из `content`. **Дорогой в роли редактора** — reasoning биллится как выход |
|
||
| **grok-4.3 (xAI)** | reasoning **ON по дефолту = `low`** (must-be-explicit: не задал → думает) | **Off-switch (Chat Completions) — ПЛОСКИЙ `reasoning_effort:"none"` в теле** (`reasoning_effort` ∈ {none,low,medium,high}). ⚠ **Вложенная форма `extra_body.reasoning.effort:"none"` — это Responses API; Chat Completions её МОЛЧА ГЛОТАЕТ** (остаётся дефолт `low`) — из-за этого exp08-проба ложно решила «не отключается». Проверено 05.07: `reasoning_effort:"none"`→`usage.reasoning_tokens=0`, дефолт→444, `low`→384 (на правке ~2000 ток.). reasoning у xAI **аддитивен к completion** (billed = completion+reasoning). `grok-4.20-0309-non-reasoning` = grok-4.3 + `effort:none` под капотом (ретайр 15.05.2026) → слаг не нужен, слать `none` явно. ⚠ **Для роли РЕДАКТОРА reasoning-off СНЯТ (D30.1): grok reasoning-off — no-op-редактор** (exp12 §2.2: активность 0.001, 3/6 чанков байт-идентичны черновику; exp04-ранг был на дефолт-reasoning + БИЛИНГВ). Если grok когда-либо вернётся в редакторы — только reasoning-ON (D6.2-буфер). Для роли ПЕРЕВОДЧИКА на плотном CJK reasoning-off НЕПРИГОДЕН (D19.1: эхо 4/10 + дегенеративный луп; ⚠ языковой констрейнт в system при `none` ИНВЕРТИРУЕТ эхо 3/10→9/10 — research/15 P4) — эскалация канала B идёт reasoning-ON. *(Сужено оркестратором по D19.1/D21; было «editor/translator».)* Источник: docs.x.ai/developers/model-capabilities/text/reasoning. |
|
||
| Qwen3.5 / локальные | thinking ON | ollama: `think: false` + `num_predict` cap. Иначе рассуждения (в поле `thinking`, не `response`) забивают контекст |
|
||
|
||
### ⚠ `deepseek-v4-flash` → `DeepSeek-V4-Flash-0731`: слаг стабилен, ВЕСА СМЕНИЛИСЬ (полигон, 2026-07-31)
|
||
|
||
**Вендор-факт** (`api-docs.deepseek.com/updates`, запись `Date: 2026-07-31`; снято `curl`, счёт вхождений = 1 по копии без пробелов): *«The official release of the DeepSeek-V4-Flash API is now in public beta. The API calling method remains unchanged — simply set the model name to `deepseek-v4-flash` to use the latest version.»* · *«DeepSeek-V4-Flash-0731 keeps the same model architecture and size as DeepSeek-V4-Flash-Preview, and was only re-post-trained.»* · *«Significantly enhanced **agent** capabilities…»* · *«Note: This update only upgrades the DeepSeek-V4-Flash API. The DeepSeek-V4-Pro API and the APP/WEB models are unchanged.»* ⇒ **v4-pro (редактор, эскалационный хоп) ВЕСАМИ не тронут.** В `/v1/models` ничего не изменилось — там прежние два слага. **Урок календаря: «слаг живой» ≠ «модель та же»; версию проверять поведением, а не листингом.**
|
||
⚠ **У «v4-pro не тронут» есть срок годности (вписано оркестратором 02.08, D39.86):** та же страница `guides/thinking_mode` несёт сноску *«We will update the actual mapped effort of `deepseek-v4-pro` in early August 2026»* — то есть ПРЯМО СЕЙЧАС. Веса пока прежние, но вендор объявил смену МАППИНГА ЭФФОРТА у pro; любой довод формы «берём pro, он не тронут» обязан нести эту оговорку и пере-проверяться пробой, а не changelog'ом (changelog на 02.08 новее 31.07 записей не имеет — сверено оркестратором `curl`, HTTP 200).
|
||
|
||
1. **ФЛОР 8000 ПРОБИТ — боевая форма отдаёт ПУСТОЙ `content`.** Живьём 31.07 18:54 UTC: черновая волна боевым `translator.md` при `max_tokens=8000` дала `finish=length`, `completion_tokens=8000`, `content` = 0 символов на **4 чанках из 4**. ⚠ **Сравнение с холодным прогоном (2 из 68) НЕ является чистым контролём и понижено до индикативного:** тот ехал ДРУГИМ промптом (`translator-banknote.md`) и с ДРУГИМ потолком (`max_tokens=8496`). Несущая улика — не оно, а СОБСТВЕННЫЕ пробы провода: **один и тот же чанк, один и тот же рендер, cap 8000 → `length`+пусто, cap 16000 → `stop`+перевод** (таблица п.2). *(Испр. 31.07 по ревью.)*
|
||
2. **Механизм — не дегенеративный луп, а многословная обдумка.** 20 025 симв. `reasoning_content` = 122 строки, все уникальны: модель пере-переводит фразу за фразой внутри размышления и не доходит до ответа. Наблюдённый `reasoning_tokens` **на одном и том же чанке** (`chunk-1-0`, дефолтный эффорт): **98 · 8000⌐ · 14014 · 16000⌐** (⌐ = упор в потолок) — разброс ×163 при побайтно одном входе. На двух других чанках: 3117 и 16001⌐. **Хвост тяжёлый: при потолке 16000 упор случился в 2 пробах из 5.** *(Испр. 31.07 по ревью: прежняя формулировка смешивала три чанка в один ряд и пробу с потолком 8000 в знаменатель 16000.)*
|
||
3. **`reasoning_effort` — запись 04.07 устарела.** Вендор-дока `guides/thinking_mode` (снята 31.07, счёт = 3) разделяет **тумблер** `{"thinking":{"type":"enabled/disabled"}}` и **эффорт** `{"reasoning_effort":"low/high/max"}`: `low` — отдельный документированный уровень. Замер: `low` при потолке 8000 и temperature 0.3 → `finish=stop`, reasoning **170–313** ток., **$0.00036–0.00091** за вызов (без ручки — $0.0022–0.0045 за пустой ответ).
|
||
**3а. ДЕФОЛТ ЭФФОРТА = `high`, и маппинг per-модельный** (дословно с той же страницы, снято `curl` HTTP 200 бэкендом 02.08 и пере-снято оркестратором при приёмке): *«Thinking mode is enabled by default, **with the default effort being high**»*. Таблица маппинга «запрошенный эффорт → фактический»:
|
||
|
||
| Запрошено | `deepseek-v4-flash` | `deepseek-v4-pro` |
|
||
|---|---|---|
|
||
| `low` | **`low`** | **`high`** |
|
||
| `high` | `high` | `high` |
|
||
| `xhigh` | `high` | `max` |
|
||
| `max` | `max` | `max` |
|
||
|
||
⛔⛔ **ВАХТА D39.92 ПЕРЕ-СНЯТА 2026-08-30 (полигон; `curl`, HTTP 200, страница 108 336 байт, sha256 `f28c4324…`) — ТАБЛИЦА У ВЕНДОРА ИЗМЕНИЛАСЬ, И ЗАПИСЬ НИЖЕ БОЛЬШЕ НЕ ВЕРНА.** Вендор исполнил обещанное сноской обновление маппинга. Живая редакция, дословно: *«(2) The mapping between the effort set by the user and the model's actual reasoning effort is as follows (**identical for `deepseek-v4-flash` and `deepseek-v4-pro`**)»* — и таблица теперь ОДНА на обе модели: `low→low · medium→high · high→high · xhigh→high · max→max`. Плюс *«(1) Thinking mode is enabled by default, with the default effort being `high`»*, а тумблер `{"thinking":{"type":"enabled/disabled"}}` подан как общий для модели DeepSeek, без оговорки «только flash». ⇒ **(i) на `deepseek-v4-pro` ручка `low` ТЕПЕРЬ РАБОТАЕТ и даёт `low`; (ii) рычаг бюджета размышления существует У ОБЕИХ моделей; (iii) размышление у `pro` в принципе ВЫКЛЮЧАЕМО тумблером.** ⚠ Это ДОКА, а не поведенческая проба: по норме проекта («слаг ≠ модель, при аномалии — поведенческая проба, не листинг») клейм действителен как ВЕНДОРСКОЕ ЗАЯВЛЕНИЕ и требует живой пробы перед денежным решением (смета — единицы центов). ⚠ И цена рычага уже замерена с другой стороны: `effort:"low"` **пере-вооружает эхо-мину** (п.4 ниже), а «reasoning-off + плотный CJK-вход = зона эха». ⚠ ЕЩЁ ОДИН ЖИВОЙ ФАКТ С ТОЙ ЖЕ СТРАНИЦЫ, которого у нас не записано нигде: *«Thinking mode does not support the `temperature`, `top_p`, `presence_penalty`, or `frequency_penalty` parameters… setting these parameters will not trigger an error but will also have no effect»* ⇒ **наш `temperature: 0.3`, который ростер шлёт на `deepseek-v4-pro`, МОЛЧА ИГНОРИРУЕТСЯ** — параметр в проводе есть, эффекта нет.
|
||
~~⇒ (i) **не слать `reasoning_effort` = ехать на `high`** — вот почему боевая форма упирается в стену (п.10); (ii) на `deepseek-v4-pro` ручка `low` НЕ РАБОТАЕТ (маппится в `high`); рычаг бюджета размышления существует ТОЛЬКО у flash~~ — **редакция до 30.08, оставлена под зачёркиванием: на ней стоят все денежные выводы фазы Д и вся её арифметика размышления. Дефолт `high` при не-присланной ручке — В СИЛЕ и в новой редакции** — **строка В СИЛЕ**: её отзыв от 05.08 сам ОТОЗВАН адверсариальным ревью того же дня (см. 3б), замер §3б признан недиагностичным; (iii) `none` в OpenAI-формате у DeepSeek не существует вовсе (колонка `reasoning.effort:"none"` — Anthropic-формат), запись 04.07 «`none` → 400» в силе.
|
||
|
||
**3г. ⭐ ПОВЕДЕНЧЕСКАЯ ПРОБА 2026-08-30 (полигон, фаза Д, $0.038276): ПАРАМЕТР `low` НА `pro` ТЕПЕРЬ ДОХОДИТ ДО МОДЕЛИ.** Дока 3а требовала живой пробы перед денежным решением — вот она. **Несущая улика — не размер размышления, а `prompt_tokens`:** при **побайтно одинаковых** `messages` (sha256 `51e7f427940cae15`, проверено исполнением) вызов без параметра дал **3270** входных токенов, вызов с `reasoning_effort:"low"` — **3191**, то есть **−79**. Тело вызова различалось РОВНО одним полем (`eval/dovodka/rol.py:668`=`def call_kwargs`), исходник главы приколот манифестом с гейтом остановки (`eval/role_topology/pair_en.py:132`=`def units`), шаблон промта не менялся с 20.08, кэш смещения не даёт (две клетки с `cached_tokens=0` дали остатки −31.8 и +10.4 при разбросе ±20–44). **ДВА контроля детерминизма.** (1) Замер 05.08 ниже: при побайтно одинаковых `messages` дефолт и `low` вернули ОДИНАКОВЫЕ 2124 — провайдер повторяет `prompt_tokens` в точности, когда параметр не действует; ⚠ но он снят ДО смены сервинга и на другом промте. (2) **Межэпохальный контроль — пред-полётные пробы того же рига:** один и тот же тривиальный запрос БЕЗ ручки дал `prompt_tokens` = **84 · 84 · 84 · 84**, причём четвёртая куплена 30.08 за две минуты до испытуемого вызова ⇒ **дефолтный счёт входа не сдвинулся ни на токен через смену вендорского сервинга**, и −79 принадлежит параметру, а не эпохе. ⚠ **Регулярность без объяснения:** 2203 − 2124 = **79** (05.08, `xhigh` над дефолтом) и 3270 − 3191 = **79** (30.08, дефолт над `low`) на совершенно разных промтах — похоже на серверную вставку фиксированного размера, но это догадка. ⇒ **Статус `low` на `pro` закрыт В ЧАСТИ «доходит ли»: ДОХОДИТ.** ⛔⛔ **НО ЭТО ПРО ПРОВОД ПОЛИГОННОГО РИГА, А НЕ ПРО ДВИЖОК, И РАЗНИЦА СТОИТ ЗАМЕРА.** Проверено исполнением 31.08: у `deepseek-v4-pro` в `backend/configs/models.yaml` блок `capabilities` несёт РОВНО `min_max_tokens` — **`reasoning`-capability отсутствует**, модель резолвится в `ReasoningNone`, и `reasoning: "off"` боевого `backend/configs/pipeline-c1.yaml` есть NO-OP (это и написано в самом конфиге, `pipeline-c1.yaml:69`=`ReasoningNone`). У `glm-5` capability есть (`control: extra_body_disable`), у `gemini-3.1-pro` — `mandatory`. ⛔⛔ **ПОПРАВКА 01.09, ТРЕТЬЯ РЕДАКЦИЯ ЭТОЙ СТРОКИ — ПРЕДЫДУЩАЯ («ДВИЖОК РУЧКУ НЕ ШЛЁТ ВООБЩЕ») БЫЛА НЕВЕРНА, И Я ЕЁ СНИМАЮ.** Я прочитал ОТСУТСТВИЕ `capabilities.reasoning` как «ручка не шлётся», не прочитав, ЧТО делает `ReasoningNone`. Дословно, `backend/internal/llm/capability.go:53`=`reasoning_effort`: **«ReasoningNone is the OpenAI-compat baseline: low|medium|high go out as reasoning_effort; off and "" emit nothing, leaving the provider's OWN default»**. И там же ниже: **«⚠ "Never turned off" is NOT "never configured" (D39.87): low|medium|high are a ratified way to size the thinking BUDGET on such a model»**. ⇒ **ДВИЖОК ШЛЁТ `low`/`medium`/`high` И ЭТО РАТИФИЦИРОВАННЫЙ СПОСОБ ЗАДАТЬ БЮДЖЕТ РАЗМЫШЛЕНИЯ.** Не шлёт он ровно два значения — `off` и пустое, и тогда едет вендор-дефолт `high`. **Именно `off` и стоит в боевом `pipeline-c1.yaml` у редактора** — поэтому редактор едет дефолтным `high`, но это ВЫБОР конфига, а не невозможность. ⇒ Ось «эффорт `off` против `low`» на движке ИЗМЕРИМА и требует правки ОДНОЙ строки конфига книги, без правки Go и без снятия защиты. Гейт `TestDeepSeekEchoMineRejected` запрещает ВЫКЛЮЧЕНИЕ размышления (`extra_body_disable`, `thinking` в `extra_body`, вложенный `chat_template_kwargs`, `effort`-capability) — `low` под запрет НЕ подпадает, потому что едет с размышлением ВКЛЮЧЁННЫМ. **Класс моей ошибки: отсутствие поля прочитано как отсутствие механизма, без чтения того, что делает дефолтная ветка.** Полигонный риг шлёт ручку своим проводом — это верно и остаётся, но движок ему в этом не уступает. Практические следствия: ⛔ **ЭТОТ АБЗАЦ СНЯТ 01.09 ЦЕЛИКОМ — он стоял на неверной посылке (см. поправку выше).** Он утверждал, что «любая движковая проба оси эффорта вернёт разницы нет» и что правка данных «уронила бы батарею». Оба ложны: движок шлёт `low`, а гейт, который я поминал, — `echo_mine_test.go:218` — лежит в `TestBoevoyConfigEditorDsproAndGrokReasoning` (⚠ я атрибутировал его `TestDeepSeekEchoMineRejected` — тоже ошибка) и требует `off` у редактора ТОЛЬКО в шиппинг-конфигах `pipeline-c1`/`c2`. Отдельный профиль книги с `reasoning: "low"` под него не подпадает. ⇒ **Ось «`off` против `low`» на движке измеряется отдельным конфигом книги — это ДАННЫЕ, ровно как записано в §14 отчёта холодного прогона; ни правки Go, ни снятия защиты не требуется.** ⚠ Класс ошибки, которого здесь чуть не случилось: **вендорский факт принят за свойство нашей системы** — между вендором и нами стоит реестр моделей, и он молчит. ⛔ **ВЕЛИЧИНА среза размышления ПО-ПРЕЖНЕМУ НЕ УСТАНОВЛЕНА:** наблюдённые ×2.52 (19 559 → 7 748 токенов) сняты БЛОКАМИ, разнесёнными на 9 дней. ⛔ **Несущий конфаунд здесь — НЕ дрейф, а сама смена сервинга, зафиксированная выше в 3а:** вендор переписал маппинг между двумя блоками, и сравнение «арм 21.08 против арма 30.08» приписывает ручке всё, что он поменял. Дрейф (строка в 3б) — второй и более слабый: у него есть ЗНАК (все шесть розыгрышей монотонно РАСТУТ), и при его продолжении ×2.52 было бы нижней границей среза. Чтобы величина стала известной, нужен интерливинг обоих армов в ОДНОМ блоке; пре-регистрация и цены — `docs/experiments/23-editor-tier.md` §Д46.3 и §Д47 (дорогая восьмёрка $0.565–0.620, дешёвая — $0.078–0.133). ⚠ **Эхо на `low` у `pro`: одна английская клетка дала кириллицу 1.000 и ноль латиницы — это НЕ снимает предупреждение «Не бесплатно» ниже**, эхо-мина живёт на плотном CJK, а проба была на английской паре.
|
||
|
||
**3д. ⚠ 30.08 ($0.134804, интерливинг Д47): ДВА ОДИНОЧНЫХ РОЗЫГРЫША ДЕФОЛТНОГО ПУТИ `deepseek-v4-pro` РАЗОШЛИСЬ В 38 РАЗ. ⛔ ПРИЧИНА НЕ УСТАНОВЛЕНА — «модель сдвинулась» и «выпал хвост» ОБЕ ЖИВЫ.** (Первая редакция этой записи подавала ×38 как замеренный сдвиг во времени; поправлено в тот же день — по лучшей имеющейся оценке разброса это ≈3.1 sd, редкое событие, но не невозможное. Оценка разброса: sd логарифма 0.82, то есть одно sd = ×2.3, снята по шести группам «тот же тег, разные розыгрыши», 18 вызовов, СУДЕЙСКАЯ роль — на переводе чистых повторов в корпусе нет. Разбор — `docs/experiments/23-editor-tier.md` §Д47.7.) Побайтно один промт (sha256 сверен), одна и та же глава, `reasoning_effort` НЕ слался ни разу: 21.08 модель думала **466** токенов, 30.08 — **17 757**. Цена той же клетки $0.005034 → $0.076893. **Для практики обе гипотезы дают одно и то же предупреждение: любая смета DeepSeek, снятая с ОДИНОЧНОГО прошлого вызова, может ошибиться на порядок, и денежные планы на неё ставить нельзя.** ⭐ **Следствие, которое дороже самой записи: сметы и сравнения моделей по размышлению нужно строить на ПОВТОРАХ.** Считано: при sd логарифма 0.82 парный дизайн ловит эффект ×2.5 за 13 пар, ×2.0 за 22, ×1.4 за 93 (80% мощности, α=0.05). Проверено на себе: пре-регистрация оценила восемь пар в $0.078–0.133, одна пара стоила $0.1348. ⭐ **Зато счёт ВХОДА через тот же разрыв стабилен до токена:** `prompt_tokens` = 3 256 и 21.08, и 30.08 при не-присланной ручке, а `low` сдвигает его ровно на −79 (3 177) — то есть провенанс параметра читается по входу даже там, где выход уехал ×38. ⚠ Наблюдённый ВНУТРИ ОДНОГО БЛОКА эффект ручки — ×1.40 (17 757 → 12 676), заметно меньше ×2.52, полученных сравнением через девять дней: конфаунд эффект РАЗДУВАЛ. n=1, знаковый тест p=1.0 ⇒ величина по-прежнему **НЕ УСТАНОВЛЕНА**; разбор — `docs/experiments/23-editor-tier.md` §Д47.6.
|
||
|
||
**3в. ВАХТА D39.92 ИСПОЛНЕНА ПОВТОРНО 2026-08-10 (полигон, фаза Д; $0, `curl` HTTP 200).**
|
||
Таблица маппинга 3а на `guides/thinking_mode` **побайтно та же** (снята разбором ячеек `<td>`:
|
||
`low`→low/high · `high`→high/high · `xhigh`→high/**max** · `max`→max/max), и сноска (3)
|
||
*«We will update the actual mapped effort of deepseek-v4-pro in early August 2026»* **всё ещё на
|
||
странице** — то есть «early August» уже прошёл, а дока не обновлена. Change Log свежее
|
||
**31.07.2026** записей не имеет. ⇒ Расхождение доки с замером 05.08 (звено «б»: `xhigh` на pro
|
||
ведёт себя как отдельный уровень НАД `high`, а не как `max`) **сохраняется и не объяснено
|
||
вендором**; статус `low` на pro — по-прежнему «НЕ УСТАНОВЛЕНО». Следующий триггер вахты: любая
|
||
новая запись Change Log ЛИБО исчезновение сноски (3).
|
||
|
||
**3б. ⚠⚠ ЧАСТИЧНО ОТОЗВАНО В ДЕНЬ ПУБЛИКАЦИИ. Звено про `low` НЕДЕЙСТВИТЕЛЬНО; звено про `xhigh` в силе.** (полигон, живой замер 2026-08-05, ревизия того же дня по адверсариальному ревью — `19-editor-contract-q4b.md` §6.2). Исполнение вахты D39.92 (реестр загейченных триггеров, строка 108: «дата > 05.08 ⇒ пере-проба маппинга + сверка changelog»). Триггер сработал по назначению: вендор объявлял смену «early August 2026», и поведение с таблицей 3а больше не сходится.
|
||
**Метод:** побайтно ОДИН вход (реальный редакторский дифф-вызов), три арма по 3 розыгрыша, `deepseek-v4-pro`, всё `finish=stop`; N=1 непригоден из-за разброса п.2, решает разделение диапазонов. Харнесс — `eval/editor_contract/effort_probe.py`, сырьё `~/books/gu-zhenren/bank-arbitration/eff-*.json`, $0.044163.
|
||
|
||
| Арм | `completion_tokens` по розыгрышам | медиана |
|
||
|---|---|---|
|
||
| без параметра (вендор-дефолт) | 4183 · 5210 · 5692 | 5210 |
|
||
| `reasoning_effort:"low"` | 3492 · 1429 · 3589 | **3492** |
|
||
| `reasoning_effort:"xhigh"` | 10527 · 8666 · 6546 | **8666** |
|
||
|
||
**⛔ ЗВЕНО (а) ПРО `low` ОТОЗВАНО.** Исходно здесь стояло: «диапазоны не пересекаются: max(low)=3589 < min(дефолт)=4183 < min(xhigh)=6546; при n=3 идеальное разделение даёт p≈0.05 на пару ⇒ `low` на pro срезает размышление примерно на треть, бюджет УПРАВЛЯЕМ». Пере-счёт по ВСЕМУ доступному сырью (не только по трём розыгрышам этой пробы) вывод не выдержал:
|
||
|
||
| Улика | Что показывает |
|
||
|---|---|
|
||
| правило «диапазоны не пересекаются» при n=3/3 | минимально достижимый ДВУСТОРОННИЙ p = 0.100 — дизайн не может достичь значимости по построению (в тексте выше стоял ОДНОСТОРОННИЙ p≈0.05) |
|
||
| **нулевой контраст**: два блока ДЕФОЛТА на побайтно одном запросе (sha `92924c85b5fc`) | разделяются ТАК ЖЕ (p=0.100) и с тем же размером эффекта ×1.47, что и «эффект ручки» ⇒ решающее правило срабатывает при ОТСУТСТВИИ вмешательства |
|
||
| объединённый пул на побайтно одном входе: дефолт n=6 против `low` n=6 | диапазоны ПЕРЕСЕКАЮТСЯ, Манн–Уитни p=0.589 и по `completion_tokens`, и по `reasoning_chars` |
|
||
| 36 вызовов арма L | дифф думает −8.1% (p=0.367), full-regen **+29.0%** (p=0.983) — разнонаправленно, что несовместимо с «срезает треть» |
|
||
| `prompt_tokens` при побайтно одинаковых messages | 2124 у дефолта И у `low`; 2203 у `xhigh` ⇒ провайдер серверно реагирует на `xhigh` и НЕ реагирует на `low` |
|
||
| межсессионный дрейф | 6 дефолтных розыгрышей одного запроса по времени: 1952→9104→10818→11157→13421→15720 знаков размышления, строго монотонно (1/720) — сравнение блоков, разнесённых во времени, конфаундировано |
|
||
|
||
⇒ **Статус `low` на pro: НЕ УСТАНОВЛЕНО.** «Ручка нулевая» данные тоже не утверждают (мощность MW при n=6/6 ловит истинный эффект ×0.67 лишь в 37%), но бремя на клейме: он сделан на n=3/3 и воспроизводится нулевым вмешательством. До замера с мощностью действует строка 3а (`low`→`high`). **Что нужно:** интерливинг дефолт/`low` в ОДНОМ блоке (защита от дрейфа), n≥10 на арм.
|
||
|
||
**✅ ЗВЕНО (б) ПРО `xhigh` — В СИЛЕ И УСИЛЕНО:** `xhigh` даёт БОЛЬШЕ дефолта (min(xhigh)=17588 знаков размышления > max(пулевого дефолта)=15720, p=0.0238 на n=3 против n=6), то есть это отдельный уровень НАД `high`, а не `max` — строка таблицы 3а `xhigh`→`max` для pro неверна; вендор-дока, снятая 05.08 живьём, отдаёт `xhigh`→`xhigh` и с замером согласуется. Серверная реакция на `xhigh` видна и по `prompt_tokens` (2203 против 2124).
|
||
|
||
**⚠ Не бесплатно:** п.4 фиксирует, что `low` ПЕРЕ-ВООРУЖАЕТ эхо-мину (на flash 1 чистый китайский выход из 16). ~~**Для pro эхо на `low` НЕ МЕРЕНО НИ РАЗУ**~~ ⛔ **СНЯТО 01.09: МЕРЕНО, и чисто.** `coldrun-v16` (31.08) вёз `stages[draft].reasoning: "low"`, а хоп эскалации наследует эффорт стадии (`escalation.go:158` → `stagerun.go:559`) ⇒ **пять хопов `deepseek-v4-pro` на `low` по плотному CJK**, и все пять `first_flag_reason=cjk_artifact` → `disposition=ok`: флаг был на ЧЕРНОВИКЕ flash, а `pro`@`low` вернул годное. Эхо 0 из 5. ⚠⚠ **НО РОЛЬ ДРУГАЯ, и это несущая граница:** пять хопов — роль ПЕРЕВОДЧИКА (иной промт, без банка редактора и без `few_shot:false`). **Эхо-безопасность РЕДАКТОРСКОЙ роли при `low` на CJK по-прежнему не мерена**, и «поставить редактору `low`» остаётся обменом цены на риск с неизвестным курсом. Перед таким шагом — эхо-контроль ИМЕННО в редакторской роли.
|
||
**Границы:** один вход, одна роль (редактор-дифф), n=3 на арм — **этого оказалось недостаточно для звена (а), см. отзыв выше**; `high` и `max` явными значениями не гнались; сноска вендора о смене маппинга на странице ВСЁ ЕЩЁ присутствует, changelog после 31.07 пуст — то есть смена в доке не объявлена, замечена поведением.
|
||
4. **⚠ `effort:"low"` ПЕРЕ-ВООРУЖАЕТ эхо-мину:** 1 чистый китайский выход из 16 базовых вызовов (`cjk_share 0.83`, `finish=stop`). **Уточнение рамки D19.2: защита от эха деградирует НЕПРЕРЫВНО с эффортом, а не скачком на «выключено».** ⚠ **Хвост «движок эту ручку слать не может — `echoMineViolation`» ОТОЗВАН (оркестратор 02.08 по коду, D39.86): движок её слать МОЖЕТ.** Гейт (`config/models.go:485-501`) инспектирует МЕХАНИЗМ (`capabilities.reasoning.control` ∈ {`extra_body_disable`, `effort`} + thinking-ключ в `extra_body`), а не значение `stage.reasoning`; у deepseek `control = ReasoningNone`, где `off`/`""` — осознанный no-op, а `low|medium|high` уходят на провод как есть (`llm/capability.go:167-171`). Конфиг `stages[draft].reasoning: "low"` грузится без ошибки и доезжает до провода — проверено исполнением (coldrun-b §3.3). ⇒ **вопрос «включать ли `low`» — экономико-качественный (эхо растёт), а не «нельзя технически»; амендмент гейта для этого НЕ нужен.**
|
||
5. **Микро-few-shot: ⚠ ПРЕЖНЯЯ ФОРМУЛИРОВКА ОТОЗВАНА (31.07, адверсариальное ревью).** Числа «reasoning ×1.9» и «постинструкция дешевле на 23.3%» получены НЕПАРНЫМ сравнением средних на распределении, чей разброс ×163 (п.2). **Парный пересчёт по тем же 12 фрагментам:** few-shot думает МЕНЬШЕ базы на **7 из 12** (медиана Δ **−65** ток., знаковый тест p=0.77); постинструкция думает БОЛЬШЕ базы на **9 из 12** (медиана Δ **+208**, p=0.15). «+91%» — артефакт четырёх попаданий в хвост. Скидка постинструкции на 58% состоит из ПРЕФИКСНОГО КЭША (её `system` побайтно равен базовому — sha `e9ea1ae7dae0`, постинструкция уходит в USER-хвост; кэш 95.0% против 27.5% у базы); при пересчёте по некэшированной цене остаётся −9.0%. **Что устояло:** суммарная цена арма few-shot на этой выборке +28.4% и без кэш-эффекта, и **единственный за 48 вызовов выход НА АНГЛИЙСКОМ** (5 770 симв, `finish=stop`) — его. Эхо в том же арме НЕ атрибутируется few-shot (см. п.6).
|
||
6. **⚠ ЭХО НА 0731 СТОХАСТИЧНО ПО ВЫЗОВУ, а не детерминировано по фрагменту** — прямая улика: два вызова с **побайтно идентичным запросом** (sha `5c304c9b3cf4`, `effort:low`, cap 8000, temp 0.3) дали `cjk_share 0.000` и `cjk_share 0.831`. **Это отменяет посылку строки ниже («ретраи не помогают — детерминировано для фрагмента»), снятую на `deepseek-chat`, и посылку комментария `disposition.go:138-148` («retry just re-produces them»), из-за которой `cjk_artifact` идёт СРАЗУ в эскалацию.** Арифметика ремонта перевернулась: эскалация на v4-pro = **$0.007335 за ОДНО эхо** ($0.014670 холодного прогона — это ДВА эха на разных чанках, id 58 и 62), простой ре-ген на flash при `effort:low` = **$0.00096** (**≈7.6×** дешевле). Предложение бэкенду: N=1 ре-ген ПЕРЕД эскалацией. Гейт не ослабляется — D19.2 цел.
|
||
7. **Разгон думания привязан к ПЛОТНОМУ ХАНЬСКОМУ ВХОДУ, не к модели вообще.** Тот же промпт и параметры (cap 8000, дефолтный эффорт): **en** (877 ток. входа) → `stop`, reasoning **435**; **zh короткий** (776 ток.) → `stop`, reasoning **3393**; **zh длинный** (1679 ток.) → `length`, reasoning **8000⌐**, `content` пуст. При сопоставимом входе zh требует **×7.8** размышления против en ⇒ конфаунд длины закрыт. Границы: en n=1, zh-короткий n=1, zh-длинный n=8; **ja не проверялся**.
|
||
8. **Вендорская рамка бюджета вывода** (`quick_start/pricing`): контекст 1M, **max output 384K**, и *«For the high and max reasoning effort levels, a maximum output length of 384K tokens is recommended»*. Наш флор 8000 — **на два порядка ниже** вендорской нормы для высокого эффорта ⇒ дело не в «поломке», а в смещении ДЕФОЛТНОГО эффорта при нашей калибровке под прежний чекпойнт. Багрепортов о регрессии в открытом поиске нет (31.07).
|
||
9. **Движковый леджер `reasoning_tokens` для deepseek держит 0 СОЗНАТЕЛЬНО** (`provider_openai.go:22-24`, `ReasoningSubset` — thinking внутри `completion_tokens`, иначе двойной счёт). Длину думания видно только на сыром проводе — при диагностике идти туда, а не в `request_log`.
|
||
10. **БОЕВАЯ ФОРМА, замер бэкенда 02.08 (coldrun-b, ре-проба строки 74; принято D39.86).** Всё ниже снято САМИМ боевым путём `tmctl translate`, не ригом:
|
||
- **«Поднять флор до 16000» ФАЛЬСИФИЦИРОВАНО.** При боевом `max_tokens=8496` (флор 8000 + `bankTokenBudget` 496) — **0 из 9** свежих вызовов пригодны (8 пусто + 1 обрывок 993 симв., все `finish=length`, `completion` ровно в потолок). На движковом удвоении до 16992 — **4 из 5 тоже пустые**; сырые тела: `reasoning_content` 15 424 → 21 528 симв., то есть добавка потолка уходит в думание. Механизм п.2 подтверждён на боевой форме при ~100% частоте. Сходиться некуда: вендорская норма вывода для `high` — 384K (п.8), ×45 к флору.
|
||
- **`reasoning_effort:"low"` возвращает волну к жизни:** 20 из 22 свежих черновых вызовов `finish=stop`, 18 из 20 чанков отгружено, латентность 9–44 с против 67–190 с. Цена — ниже; эхо — выше (см. следующий пункт).
|
||
- **⚠ ЭХО-МИНА ПРИ ВЫКЛЮЧЕННОМ THINKING ЖИВА НА ВЕСАХ 0731 — клейм пере-подтверждён, а не унаследован** (проба C, вендорский тумблер `extra_body {"thinking":{"type":"disabled"}}` в КАРАНТИННОЙ копии models.yaml вне git; боевой конфиг и гейт не тронуты): **эхо 4/20** против 3/20 у `effort:low` и 0 пустых из 22 вызовов. Это важно: вся прежняя эмпирика флага `echoes_when_thinking_off` была снята на весах `V4-Flash-Preview`, которых больше нет (п. «Вся эмпирика P4» ниже) — теперь клейм имеет носителя на ЖИВЫХ весах. Флаг остаётся оправданным. На N=20 разница 15% vs 20% статистически неразличима: направление согласуется с «непрерывной деградацией защиты» (п.4), но не разделяет её.
|
||
- **Новый класс дефекта: выход на ТРЕТЬЕМ языке.** При `effort:low` 1 черновик из 18 пришёл полным связным переводом **на английский** (`finish=stop`, кириллица 0.000) и прошёл гейт черновой стадии как `ok` — `classify` экранирует ИСХОДНУЮ письменность, пустоту, обрыв и отказ, а «не исходный и не целевой» не ловит ни один предикат (движковая сторона — бэклог 46). При `high` и при thinking-off таких 0/18. Класс совпадает с единственным английским выходом 31.07 (п.5).
|
||
- **Терминолог 0731 упирается в ту же стену и ручкой НЕ лечится:** 4 батча из 5 вернулись `length` с `completion=8000` ровно и пустым телом (на coldrun-a до смены весов было 21/21 `stop`), банк консолидировал 1 терм из 81. Причина движковая, не вендорская: бэнк-роли не имеют ручки эффорта вовсе (бэклог 104) ⇒ **всегда едут вендор-дефолтом `high`**. При выключенном thinking стадия здорова (5/5) — это единственная из трёх замеренных конфигураций, где банк работает без правки Go.
|
||
|
||
*(Полигон, отчёт `archive/reports/POLYGON_PROMPTLANG_ANTIECHO_2026-07-31.md`; харнесс `eval/promptlang/`. Пункты 3а и 10 — бэкенд-сессия coldrun-b, `archive/reports/COLDRUN_B_DEBUG_2026-08-02.md`, внесено оркестратором при приёмке D39.86. Развилка «поднять флор / разрешить `low` / ждать / сменить модель» — за подписью владельца.)*
|
||
|
||
**Находка (эксп. 03):** reasoning реально улучшает реалии/имена в переводе (羅生門: «Радзёмон»→«Рашо-мон»), но локально нежизнеспособен (8.6 мин/фрагмент). **Открытый вопрос для бэкенда: проверить think-ON на быстром облачном черновике/редакторе как рычаг качества.**
|
||
|
||
### Эхо как свойство КЛАССА, не квирк вендора (обобщение D19.2 / D21.9)
|
||
|
||
**«reasoning-off + плотный CJK-вход = зона эха».** Это свойство **класса** reasoning-моделей, а НЕ квирк отдельного вендора: воспроизведено на deepseek (non-thinking режим, `00`-эхо-бюллетень выше) и на **обоих** слагах grok при `reasoning_effort:"none"` (exp10/D19.1: 4/10 verbatim-эхо + 1 дегенеративный луп на zh-фрагментах насилия, `reasoning_tokens=0`; контроль тех же фрагментов при reasoning-ON — 0/10 эха, `reasoning_tokens>0`). Механика одна: без цепочки рассуждений модель на плотной CJK-прозе возвращает исходник вместо перевода — **валидный HTTP 200 с неправильным содержимым** (не ошибка API, не `content_filter`; ретраи не спасают, эхо стохастично per-fragment). Следствия:
|
||
- **Для роли ПЕРЕВОДЧИКА на плотном CJK reasoning-off непригоден в принципе** (не только у одного вендора) — канал B переводит reasoning-ON (grok) либо не-reasoning-моделью без эхо-мины (Mistral: проба zh→ru чисто, `cjk_share=0`). ⚠ **Register-оговорка (exp11/D22, дописано оркестратором):** reasoning-ON снимает эхо на СОВРЕМЕННОЙ прозе (совр. zh-вебновелла 0/10, совр. ja 1/6, en 0/6), но НЕ на архаичной плотно-ханьской (金瓶梅, минский байхуа: grok-ON эхо 4/6 при `reasoning_tokens` 349–847; ON vs OFF там неразличимы) — эскалацию на grok-ON не считать лекарством от эха на архаичных zh-текстах; Mistral на той же архаике чист 6/6.
|
||
- **Downstream echo-гейт (`untranslated_echo`, `cjk_share>0.15`) обязателен НАВСЕГДА** и промпт-митигациями НЕ заменяется — это последняя линия против тихого провала.
|
||
- ⚠ **thinking-ON НЕ исключает эхо даже на современной прозе (живой прогон 31.07, D39.58):** 2/20 черновиков `deepseek-v4-flash` thinking-ON вернулись чистым исходником (`han_share=0.999`, 蛊真人 гл.5/9, современный zh). Гейт поймал оба, эскалация на dspro вылечила ($0.0147). thinking-ON снижает ЧАСТОТУ эха, но не до нуля; «echo 0» пере-прогона 23.07 (D39.20) был свойством выборки. Практика: закладывать в смету черновой волны ~10% на эскалации. *(Внесено оркестратором по D39.58.)*
|
||
- ✅ **FIDELITY-ГЕЙТ ПЕТЛИ D21 п.6 ПРОЙДЕН, направление ОБРАТНОЕ (31.07, судейский риг на готовых парах P4, $0.2855).** Судьи ЧУЖИХ семейств (grok-пары судит `deepseek-v4-pro`, deepseek-пары — `grok-4.3`), полные окна, оба порядка, **floor на идентичных текстах 4/4 «tie» у обоих**. На 16 судимых парах митигация лучше базы в обоих порядках в 10 случаях, база — в 1. ⚠ **Но 16 пар выросли из 6 базовых текстов; по НЕЗАВИСИМЫМ кластерам 5 из 6 смешанные, знаковый тест p=1.0** — «митигации вернее» НЕ установлено. Дефекты, нормированные на базовый текст: база 41.3 против 22.3 (сырые 106/59 завышают базу троекратным повтором); на 2 базах из 6 направление обратное. Конфаунд длины не исключён (митигации чуть длиннее, судья считает пропуски). ⇒ **Читать так: ЦЕНЫ ВЕРНОСТИ У МИТИГАЦИЙ НЕ ОБНАРУЖЕНО** — это ровно то, что гейт D21 п.6 спрашивал; «митигации лучше» — нет. Границы: 21 из 24 пар — grok (вне скоупа wiring D21 п.6), базы — «выжившие» после эха (смещение работает ПРОТИВ найденного направления), 8 пар не куплены (кап).
|
||
- ⚠ **Пере-читка 24 готовых пар P4 (31.07, $0):** ни одна митигация (инстр.-ПОСЛЕ / few-shot / комбо / префилл) **не даёт подписи ПРОПУСКА** — все митигированные выходы доходят до того же конца исходника, что база; Δlen_ratio медианно +0.02…+0.13, то есть митигации чуть МНОГОСЛОВНЕЕ, а не короче. Найден один дефект формы: 1 из 3 выходов «инстр.-ПОСЛЕ» на deepseek дописал **сноски переводчика `[1]…[6]`** вопреки «Выведи ТОЛЬКО перевод» (класс output-санитайзера D30.3). Ось «искажение при сохранённом объёме» детерминированно не берётся — нужен судья.
|
||
- ⚠ **Вся эмпирика P4 (research/15, 09.07) снята на весах `V4-Flash-Preview`, которых больше нет** (катовер 31.07 — секция выше). «0/29 против базы 30–67%» — про прежнюю модель; на 0731 база даёт 0/12 эха при `effort:low`, а по few-shot вердикта НЕТ — первая формулировка «вреден» отозвана самой сессией (п.5 секции катовера; докорректировано оркестратором 01.08 по §12.5 отчёта). Цитировать P4 как текущую эмпирику канала нельзя. *(Полигон, 31.07.)*
|
||
- ⚠ **Инверсия языкового констрейнта (research/15 P4):** языковая строка в `system` у reasoning-off модели может **УСИЛИВАТЬ** эхо, а не гасить его — на grok `reasoning_effort:none` одна формулировка констрейнта подняла эхо 3/10→9/10. Проверена **одна** формулировка на одном слаге; чувствительность к формулировке/модели неизвестна. → **Запрет (D21.6): не вносить языковые констрейнты в промпты reasoning-off путей без per-model замера.** (Латентное: `translator.md:10` уже несёт языковую строку, но едет только на thinking-ON DeepSeek — вне зоны инверсии; при заводке Mistral-канала B прогнать P4-реплику на боевом промпте.)
|
||
|
||
## Параметры сэмплинга
|
||
|
||
| Провайдер | Грабля |
|
||
|---|---|
|
||
| **Kimi K2.6** | принимает **только `temperature: 1`**; иное → HTTP 400 «only 1 is allowed for this model» |
|
||
| gpt-5-mini | `temperature` не принимается вовсе (см. выше) |
|
||
| Локаль (ollama `/v1`) | `top_k`/`min_p`/`repeat_penalty` **не пробрасываются** (ollama issue #11325) → запекать в Modelfile (паттерн `qwen3-vojo`). Для llama-server — расширить запрос этими полями |
|
||
| Локаль (ollama) | `max_tokens`/`num_predict` покрывает **thinking + ответ вместе** (в отличие от xAI, где thinking сверх лимита) |
|
||
|
||
## Контент-фильтры / safety
|
||
|
||
- ⛔⛔ **Gemini, ДВА СИСТЕМНЫХ СООБЩЕНИЯ = ПРОМТ ТЕРЯЕТСЯ МОЛЧА (полигон 22.08, живая проба `eval/dovodka/proba_gemini.py`).** **СТРУКТУРНЫЙ ФАКТ ВЕНДОРА** (`ai.google.dev/api/generate-content`, страница помечена 2026-08-17, снято 2026-08-28): в нативном `GenerateContentRequest` поле `systemInstruction` — ОДИН `object (Content)` (в той же таблице `contents[]` и `tools[]` несут суффикс повторяемого поля), а `Content.role` документирован как «Must be either 'user' or 'model'» ⇒ второму системному ХОДУ в нативном запросе места нет. ⚠ **ПОПРАВКИ ПИНГА №19 (28.08, D39.164), внесены 29.08 — прежняя редакция была сильнее источника в трёх местах.** (а) ~~«слой ФИЗИЧЕСКИ не может пронести больше одного системного»~~ — это про НАТИВНЫЙ запрос; **что делает с двумя системными OpenAI-совместимый ШИМ, вендор не документирует НИГДЕ** (раздел «Current limitations» молчит и в живой странице, и в снимке Wayback 2026-08-21). (б) ~~«уход на нативный API проблемы НЕ решает»~~ верен по сути, но НЕ по причине: `Content.parts[]` — ПОВТОРЯЕМОЕ поле, и вендорская заметка на `systemInstruction` гласит «Only text should be used in parts and content in each part will be in a separate paragraph» ⇒ нативный API МОЖЕТ нести N системных текстов как N частей ОДНОГО `Content`; склеивать всё равно пришлось бы, но «физически не может» — неправда. (в) форум Google — **НЕ вендорский источник**: тред `discuss.ai.google.dev/t/86097` (30.05.2025) — два поста, оба от НЕ-сотрудников, ответа Google нет; ссылаться на него наравне с замером нельзя. При двух и более системных лишние выбрасываются без ошибки. ⛔ **УСТАНОВЛЕНО 29.08: ВЫЖИВАЕТ ПОСЛЕДНЕЕ СИСТЕМНОЕ, ВЫБРАСЫВАЕТСЯ ПЕРВОЕ** (полигон, Д35.3 отчёта 23; $0, детерминированно, на 16 уже купленных клетках). Доказательство арифметическое: у арма `RE` первое системное (ролевой промт) **побайтно одинаково на всех 16 главах**, второе (глоссарий) — **разное** (255–404 знака, термины из текста главы); разность `RE.prompt_tokens − RQ.prompt_tokens` равна **2436 РОВНО на каждой из 16 глав, sd = 0.00** ⇒ выброшено сообщение ПОСТОЯННОГО размера, а таково только первое; будь выброшены оба, разность росла бы вместе с глоссарием. Побочно: `prompt_tokens` карантинных клеток коррелируют с длиной глоссария +0.52 и с длиной исходника +0.04 — глоссарий внутри них физически есть. ~~⚠ КАКОЕ именно выживает — НЕ УСТАНОВЛЕНО~~ — вопрос ЗАКРЫТ этим замером; прежняя интерпретация «не выжило НИ ОДНО» неверна: она сравнила 535 токенов с «размером одного user-сообщения» НА ГЛАЗ, а при шкале 0.324 ток/знак русского глоссарий в 300 знаков весит ~100 токенов и в такой оценке теряется. ⚠ Форум Google (`discuss.ai.google.dev/t/86097`) говорит то же самое, но он **не источник** (не-сотрудники, ответа Google нет) — здесь он лишь СОВПАДАЕТ с замером, а не подпирает его. ⚠⚠ **ГРАНИЦА КЛЕЙМА, названная пингом №19 и подтверждённая здесь:** замер снят на `gemini-3.1-flash-lite` и на клетках, купленных 21.08.2026. Слой у `gemini-3.1-pro-preview` (тот, что стоит в цепочке эскалации) ТОТ ЖЕ, но слаг другой — клейм переносится на него как ПРАВДОПОДОБНЫЙ, не как замеренный. Для решения это безразлично: движок склеивает системные сам. Документированного вендором ограничения в разделе «Current limitations» НЕТ. Замер на одном и том же системном тексте в 7970 знаков: ОДНИМ сообщением → `prompt_tokens` 2994 и маркерная инструкция ИСПОЛНЕНА; ДВУМЯ → **535 токенов** ~~(это размер одного user-сообщения)~~ **и инструкция НЕ исполнена** — ⚠ оценка «размер одного user-сообщения» СНЯТА: 535 = user + глоссарий, см. закрытие вопроса выше. Ответ приходит с `finish=stop` и выглядит правильным переводом — отказа нет, есть тихая потеря инструкции, невидимая всем гейтам годности. ⚠ Так были куплены 16 клеток арма `RE` (промт-роль на gemini): ~~они переведены ВООБЩЕ БЕЗ ИНСТРУКЦИИ~~ — **уточнено 29.08 тем же замером, что закрыл вопрос выше: они переведены БЕЗ РОЛЕВОГО ПРОМТА, но С ГЛОССАРИЕМ** (до модели доехали ~130 токенов канонных форм из 2 566). Вердикт о переносимости из них был бы ложным в обоих чтениях; но арм, собранный из этих клеток, называется «без ролевого промта», а не «без инструкции» — иначе класс «банк» читается неверно. Лечение: склеивать системные в одно ДЛЯ ЭТОГО ВЕНДОРА (`rol.ONE_SYSTEM`/`fit_msgs`) — общая склейка сменила бы форму запроса у всех моделей и рассогласовала бы уже купленные клетки. ⚠ Проверено, что у `deepseek-v4-pro`, `gpt-5.6-luna`, `glm-5` и `grok-4.3` два системных доезжают целиком.
|
||
- ⛔⛔ **ТОТ ЖЕ ДЕФЕКТ ЖИВЁТ В ДВИЖКЕ, А НЕ ТОЛЬКО В ПОЛИГОНЕ (аудит 22.08).** `backend/internal/pipeline/render.go:256-258`=`Content: injection` штатно строит ВТОРОЕ системное сообщение — инъекцию банка памяти (глоссарий/STM), `backend/internal/llm/httpllm.go:517-522`=`SystemMessagesSingle` копирует сообщения дословно, склейки под Gemini нет нигде, а `gemini-3.1-pro-preview` стоит в ратифицированной цепочке эскалации во ВСЕХ арм-конфигах (`pipeline-c1.yaml:129`, `pipeline-arm-glm.yaml:61`, `pipeline-arm-deepseek-pro.yaml:62`, `pipeline-arm-mistral.yaml:61`). ⇒ **любой эскалационный хоп на Gemini при непустой инъекции ТИХО терял текст.** Оговорка D22.3 «экспозиция Ф1 нулевая» держалась только на том, что до Gemini в дефолте не доходят.
|
||
✅ **ДЕФЕКТ ДВИЖКА ЗАКРЫТ 28.08 лендингом `7d0c6f2`** — проверено кодом 29.08, а не пересказано: у провайдера `gemini` объявлено `system_messages: single` (`backend/configs/models.yaml:137`=`system_messages: single`), адаптер склеивает ВЕДУЩИЙ system-ран в одно сообщение и падает громко на системном ходе после не-системного (`backend/internal/llm/httpllm.go:528`=`func toOpenAIMessages`), инвариант запинен тестом (`backend/internal/llm/systemmessages_test.go:78`=`TestSystemMessagesSingleCarriesTheInjection`). ⇒ строки выше про движок — ИСТОРИЯ, а не открытый долг.
|
||
⛔ **НО ЦЕНА ДЕФЕКТА ДО ПОЧИНКИ ОЦЕНИВАЛАСЬ НЕВЕРНО, и это правится здесь (полигон 29.08, Д35.3).** По установленному выше правилу выживает ПОСЛЕДНЕЕ системное, а `render.go:247-258`=`Role: "system"` кладёт первым **сам промт стадии**, вторым — инъекцию банка. ⇒ до 28.08 хоп в Gemini терял **не глоссарий, а ВЕСЬ ПРОМТ СТАДИИ**, оставляя глоссарий: модель получала список канонных форм и текст — без единого слова о том, что с ними делать. Ровно так выглядят 16 клеток `RE` полигона: перевод есть, `finish=stop`, русский, правильной длины, инструкции за ним нет. **Тихая потеря промта не отличима от нормального ответа ничем, кроме счётчика входных токенов.** ⇒ решение «склеивать самим» было единственно верным и при неизвестном тогда чтении квирка; а любой ИСТОРИЧЕСКИЙ вывод, снятый на Gemini-хопе до 28.08, надо читать как «стадия работала без своего промта». ⚠ Класс в проекте уже был решён рядом: `backend/internal/llm/provider_anthropic.go:169-179`=`wire.System = append` сворачивает ведущий system-префикс в одно поле и падает громко на system посреди диалога — просто не обобщён на Gemini. **Зона бэкенда, пинг оркестратору отправлен.**
|
||
- **Gemini**: `safety_settings` через OpenAI-совместимый слой **не передаются** (HTTP 400 «Unknown name safety_settings»). Дефолт фильтров у 2.5/3 — OFF (gap-2). Для явного контроля фильтров (роль судьи 18+) нужен **нативный** Gemini API, не OpenAI-слой. ⚠ **D22.6: на ГРАФИЧНОЙ эротике Gemini 3.x fail-closed `PROHIBITED_CONTENT` (8× wire-verified, exp11) — фильтр НЕконфигурируем, нативный API не спасает; судья эротики — только Grok. На violence/SFW Gemini-судья жив.** `finish_reason` приходит СОСТАВНОЙ строкой `'content_filter: PROHIBITED_CONTENT'` (точные матчеры мертвы — D22.8а). Биллинг Gemini: thinking ТОЛЬКО в `total_tokens` → `reasoning: additive_total`, иначе недоучёт 146×/вызов (D22.3). Нативное имя поля — `usageMetadata.thoughtsTokenCount`; слой AI-Studio `completion_tokens_details.reasoning_tokens` не отдаёт ВОВСЕ, тогда как Vertex AI то же поле отдаёт (форум 15.01.2026) — при переезде на Vertex учёт менять. ⚠⚠ **`reasoning_tokens=0` у Gemini — НОРМА, а не измерение: вывод «размышление выключено» из этого поля НЕДЕЙСТВИТЕЛЕН.** Полигон 22.08 на этом и поскользнулся, объявив «вендор-дефолт flash-lite = размышление ВЫКЛ (замерено)»; считать надо `total − prompt − completion`. ⚠ **В роли редактора Gemini течёт сервис-преамбулой в выход («Вот отредактированный…», 6/6 чанков — exp12) → за output-санитайзером D30.3.** ⚠ **Дополнение эксп-21 (08.08):** fail-closed ответ OpenAI-слоя приходит вовсе БЕЗ объекта `message` (не с пустым `content`) — парсер обязан переживать его отсутствие; на вебновелльном violence-материале срабатывания массовые (10 клеток судейского прогона с `content_filter: PROHIBITED_CONTENT`) ⇒ оговорка «на violence/SFW Gemini-судья жив» целиком НЕ держится — Gemini непригоден как ЕДИНСТВЕННЫЙ второй контур на этом материале (эксп-21 §1/§8).
|
||
- **Qwen Model Studio**: внешний фильтр `data_inspection_failed` на вход/выход, неотключаем (риск молчаливых вырезаний) — не тестировано (нет ключа).
|
||
- Детект отказов/вырезаний — см. `eval/refusal_bench.py` (паттерны soft-отказа + coverage-гейт по len_ratio/sent_cov, пороги в эксп. 02).
|
||
|
||
## Право по ToS/AUP: провайдер × content-label (ось ПРАВА — НЕ ось поведения)
|
||
|
||
> **Внесено полигоном, пакет-5, дата проверки 2026-07-25.**
|
||
> **РЕ-ЧЕК 2026-07-31 по календарному триггеру «головной Google ToS 30.07.2026» (D39.32 п.4, строка 4 бэклога): пере-сняты по первоисточникам `gemini` · `mistral` · `xai` · `deepseek` · `zai` — все пять на ПРЕЖНИХ объявленных ревизиях, ДЕЛЬТ ВЕРДИКТОВ НЕТ. `kimi` / `openai` / `local` в ре-чек НЕ входили и остаются на дате 25.07.** Подробности, дословные цитаты и рекомендация по строке 6 — `docs/archive/reports/TOS_RECHECK_2026-07-31.md`.
|
||
> **Следующая пере-проверка: 2026-10-25 (квартально) И безусловно перед заводкой первой лейблованной книги** (плюс при любой правке `accepts_labels`).
|
||
> Питает `accepts_labels` в `backend/configs/models.yaml` (D39.25–D39.28). **Строки данных применяет оркестратор ТОЛЬКО после подписи владельца** — здесь зафиксированы ФАКТЫ, не юридическое заключение.
|
||
|
||
**⚠ Эта секция — про ДРУГУЮ ось, чем секция «Контент-фильтры / safety» выше. Не смешивать:**
|
||
|
||
| | Что меряет | Чем меряется | Что делает движок |
|
||
|---|---|---|---|
|
||
| **Право** (эта секция) | вправе ли мы по договору ОТПРАВИТЬ такой контент на эндпойнт | чтение ToS/AUP первоисточника | проактивный роутинг по лейблу до вызова (`accepts_labels`) |
|
||
| **Поведение** (секция выше) | ответит ли модель или откажет | живой вызов | обработка отказа причино-агностично (D12/D39.25) |
|
||
|
||
Оси эмпирически расходятся **в обе стороны**, и у нас есть по случаю на каждую: Gemini fail-closed `PROHIBITED_CONTENT` на графичной эротике (D22.6, wire-verified) — это фильтр, а не запрет в договоре; DeepSeek в exp11 переводил explicit-фрагменты **против собственного ToS** — готовность модели не даёт права. Маршрутизируем по ПРАВУ.
|
||
|
||
**Флаг `permissive` как значение конфига НЕ СУЩЕСТВУЕТ** (отставлен D39.26/D39.27; загрузка падает громко). Способность объявляется пер-лейблу через `accepts_labels`. Слово «пермиссивный тир» в тексте ниже/выше — характеристика ПОВЕДЕНИЯ по эмпирике, не флаг и не право.
|
||
|
||
### Вердикты (вокабуляр владельца D39.27 п.5)
|
||
|
||
`ALLOWED` = право есть · `FORBIDDEN` = прямой запрет · `UNCLEAR` = однозначного пункта нет (**честный результат; оставляет fail-closed, что безопасно**). Основание: `explicit-prohibition` · `contrastive-absence` (грант + перечень, где СОСЕДНИЙ более узкий класс назван, а наш — нет) · `ambiguous-term` (пункт есть, но термин/глагол не даёт прочитать однозначно) · `no-clause` (класс не упомянут вовсе) · `scope` (непонятно, какой документ применим).
|
||
|
||
| Провайдер | `violence` | `sexually-explicit` | Применимый первоисточник (объявленная вендором ревизия) |
|
||
|---|---|---|---|
|
||
| **deepseek** | UNCLEAR `ambiguous-term` | **FORBIDDEN** | DeepSeek **Terms of Use** §3.4(5)/(6) — *Last Update: March 27, 2026*; втянут в API через Open Platform ToS §3.1 (*Effective date: April 29, 2026*) |
|
||
| **zai** | **FORBIDDEN** | **FORBIDDEN** | Z.ai **Terms of Use** п. f)/g) — *Last Update: April 14, 2026*; scope прямо `z.ai/model-api` |
|
||
| **kimi** | UNCLEAR `ambiguous-term` | UNCLEAR `no-clause` + катч-олл | **Terms of Service for Kimi OpenPlatform** §3.1(1)/(5) — *Last Updated: May 27th, 2026* (Moonshot AI PTE. LTD.) |
|
||
| **xai** | UNCLEAR `no-clause` (**чистое молчание**) | **ALLOWED** `contrastive-absence` | **xAI AUP** — *Effective: June 26, 2026*; договор API = **Enterprise ToS** *Last Updated: May 12, 2026* |
|
||
| **gemini** | UNCLEAR `ambiguous-term` | ~~FORBIDDEN~~ → **UNCLEAR** ⚠ | **Generative AI Prohibited Use Policy** — *Last Modified: December 17, 2024*; втянут **Gemini API Additional ToS** (*Effective March 23, 2026*), а над ним **Google APIs ToS** (*Last modified: November 9, 2021*) — головной договор API |
|
||
| **openai** | UNCLEAR `ambiguous-term` | UNCLEAR `ambiguous-term` | **Usage Policies** *Effective: October 29, 2025* + **Sharing & publication policy** *Updated: November 14, 2022* (инкорпорирована Services Agreement §17) |
|
||
| **mistral** | UNCLEAR `ambiguous-term` | **ALLOWED** `contrastive-absence` | **Usage Policy** — *Effective: June 11, 2026* (`legal.mistral.ai`, НЕ `mistral.ai/terms/*` — там 404) |
|
||
| **local** | UNCLEAR `scope` | UNCLEAR `scope` | вендор-API нет; веса Apache-2.0 (0 контентных ограничений), но Ollama ToS §4 (*Last updated: May 2026*) формально говорит о «software» |
|
||
|
||
⚠ **Клетка `gemini` × `sexually-explicit` — амендмент D39.32 п.2, а не находка ре-чека.** Текст PUP не менялся; изменилось его ратифицированное ЧТЕНИЕ: оговорка «`-- for example, content created for the purpose of pornography or sexual gratification`» читается владельцем как СУЖЕНИЕ (запрет адресован контенту, созданному РАДИ порнографии), поэтому `FORBIDDEN` снят. Но по доктрине D39.29 («молчание и „нас не запрещает“ ≠ разрешение») клетка становится **`UNCLEAR`, а не `ALLOWED`**: строки в `accepts_labels` Gemini НЕ получает, маршрут не меняется, судья 18+ остаётся grok. Право даст только отдельная подпись владельца — **строка 6 бэклога**. *(Рассинхрон таблицы с D-логом обнаружен ре-чеком 31.07 и помечен, а не переписан молча.)*
|
||
|
||
> **ГЛАВНЫЙ ВЫВОД, который надо прочитать целиком: по `violence` ПРАВА НЕТ НИ У ОДНОГО вендора.** Причина структурная, а не про наши книги: AUP регулируют **пропаганду** насилия («promotes, incites, glorifies, facilitates»), а **нейтральное художественное изображение** не называет НИ ОДИН документ — ни чтобы запретить, ни чтобы разрешить. Z.AI — единственный, кто пишет «violent content» плоско (→ FORBIDDEN); xAI — единственный, у кого слова `violen*` в AUP **нет вообще** (0 вхождений → чистое молчание, а молчание по доктрине не даёт ALLOWED). Следствие: **экономическая посылка D14 п.1 («violence-книга не теряет dspro-редактора») первоисточниками НЕ подтверждается** — под fail-closed violence-книга не поедет никуда. Это решение владельца, не сессии: детали и три варианта — в отчёте `docs/archive/reports/POLYGON_TOS_LABELS_REPORT_2026-07-25.md`.
|
||
|
||
### Доказательства (дословно; каждая цитата подтверждена счётом вхождений = 1 по сохранённой копии — форму проверки см. «Как это добывалось», 31.07 она исправлена)
|
||
|
||
- **deepseek** · *Terms of Use* §3.4 «You will not use the Services to generate, express or promote content or a chatbot that:» → **(5)** `is pornographic, obscene, or sexually explicit (e.g., sexual chatbots);` → SE = FORBIDDEN. **(6)** `facilitates, promotes, incites or glorifies violence or terrorist/extremism content;` → violence = UNCLEAR (глаголы = пропаганда, не изображение). Привязка к API двойная и явная: преамбула Open Platform ToS `serves as a Specific Agreement to the "DeepSeek Terms of Use" and specifically applies to your use of the application programming interface`, плюс §3.1 `you should procure that both of you and your end users comply with the requirements of the "DeepSeek Terms of Use"`; сам ToU §1.1 включает `application programming interfaces (APIs)` в определение «the Services». ⚠ **Поправка к D14 п.1: пункт «§3.4(5)» верен дословно, но он в Terms of Use, а НЕ в «Open Platform Terms of Service» — в последнем §3.4 про оргтехмеры безопасности.**
|
||
- **zai** · *Terms of Use*, «You are prohibited from engaging in or facilitating any of the following actions … including but not limited to:» → **f)** `Creating or disseminating obscene, pornographic, violent, murderous, terroristic, or criminal incitement content.` **g)** `Submitting, creating or disseminating content that is sexually explicit, suggestive, visually shocking, or otherwise disturbing.` Оба лейбла названы ПЛОСКО (без глагола-пропаганды), g) покрывает и **вход** («Submitting») → **FORBIDDEN/FORBIDDEN**. Scope: `as a user of the Z.ai accessible via z.ai/model-api ("Services")`.
|
||
- **kimi** · *OpenPlatform ToS* §3.1 вводится «For example, you will not…» (перечень ЯВНО неисчерпывающий) → contrastive-absence неприменим. §3.1(5) `To spam, bully, harass, defame, sexualize children, or promote violence, hatred or the suffering of others.` (пропаганда, не изображение) + широкий катч-олл §3.1(1) `For purposes that may have a harmful impact on physical or spiritual health or that violate ethical principles.` — «spiritual health»/«ethical principles» не определены → **UNCLEAR/UNCLEAR**.
|
||
- **xai** · *AUP*, грант: `You are free to use our Service so long as you use it to be a good human, act safely and responsibly, comply with the law, not harm people, and respect our guardrails:`. В сексуальной семье названы ТОЛЬКО узкие соседи — реальные лица и дети: `Depicting likenesses of persons in a pornographic manner`, «Undressing or nudifying real persons…», «Sexualizing or exploiting children» → взрослая художественная эротика не названа → **SE = ALLOWED**. По насилию: `grep -c -i violen` по AUP = **0** → **violence = UNCLEAR/no-clause**. Договор API — Enterprise ToS: `these terms are for enterprise (business) users of the xAI API and related xAI Services who are at least 18 years old` (0 контентных пунктов; консьюмерский ToS к нам не применим).
|
||
- **gemini** · *PUP*: `Do not engage in sexually explicit, violent, hateful, or harmful activities. This includes generating or distributing content that facilitates:` → буллит `Sexually explicit content -- for example, content created for the purpose of pornography or sexual gratification.` (класс назван своим именем; «for example» — иллюстрация, не сужение) → **SE = FORBIDDEN**; буллит `Violence or the incitement of violence.` под стемом «facilitates» → **violence = UNCLEAR**. Художественная оговорка НЕ carve-out — это дискреция: `We may make exceptions to these policies based on educational, documentary, scientific, or artistic considerations, or where harms are outweighed by substantial benefits to the public.` Привязка: Gemini API Additional ToS `you must comply with our Prohibited Use Policy`.
|
||
**Добор ре-чека 31.07.2026** (цепочка договора пере-проверена целиком): головной документ API — **не** потребительский `policies.google.com/terms`, а `Google APIs Terms of Service`: Additional ToS дословно требует `you must accept (1) the Google APIs Terms of Service (the " API Terms "), and (2) these Gemini API Additional Terms of Service`. Потребительский ToS цепляется лишь КОСВЕННО, через API ToS §b `You will not violate any other terms of service with Google (or its affiliates).`, и по нашим двум классам он ПУСТ (`violen*` = 0, `sexual*` = 0 вхождений и в ревизии 22.05.2024, и в новой 30.07.2026). Перечень «a. API Prohibitions» в Google APIs ToS по нашей оси тоже пуст (ближайшее — `Defame, abuse, harass, stalk, or threaten others.`, про поведение к людям, не про изображение в вымысле). **Единственная контентная вставка ревизии 30.07.2026** — `Some content may not be suitable for everyone.` в разделе о генерируемом контенте: это дисклеймер о ВЫХОДЕ Google, не разрешение на наш ВХОД, и по D39.29 права не даёт. **Два пункта Additional ToS, прежде не цитированные, важны для судьи Ф2:** `The Services include safety features to block harmful content, such as content that violates our Prohibited Use Policy . You may not attempt to bypass these protective measures…` и `Applications with less restrictive safety settings may be subject to Google's review and approval.` ⇒ обход фильтра запрещён ДОГОВОРОМ, что смыкается с D22.6 (фильтр `PROHIBITED_CONTENT` неконфигурируем) и означает: подпись под строкой 6 даёт ПРАВО, но работающего судьи эротики не даёт.
|
||
- **openai** · *Usage Policies* (взрослый перечень) `terrorism or violence, including hate-based violence` — конструкция «use our services FOR …» = деяние; слово «violent **content**» встречается ТОЛЬКО в минорной секции: `exposing minors to age-inappropriate content, such as graphic self-harm, sexual, or violent content`. Само по себе это тянет на ALLOWED, НО в договор через Services Agreement §17 инкорпорирована *Sharing & publication policy* (2022), чей раздел «Content co-authored with the OpenAI API» бьёт ровно в наш кейс: `are not related to adult content, spam, hateful content, content that incites violence, or other uses that may cause social harm` — «adult content» не определён, хвост «other uses that may cause social harm» открыт → **UNCLEAR по обоим**. ⚠ §17 привязывает применимую редакцию политик к дате НАШЕГО договора/продления, а не к сегодняшнему сайту.
|
||
- **mistral** · *Usage Policy*: в сексуальной семье названы CSAM, `You shall not use the Mistral AI Products to generate intimate images of any person without the explicit consent of all individuals involved` (NCII) и «sexual services»/трафикинг — взрослая художественная эротика не названа → **SE = ALLOWED** (подтверждает репо-клейм «policy 11.06.2026 без запрета adult»). Насилие: `promotes, incites, threatens, or glorifies violence is not permitted` → **UNCLEAR**. Scope-оговорка: `This Usage Policy does not apply to Mistral AI Products deployed on a customer's infrastructure…` — наш путь через платформу покрыт.
|
||
- **local** · Вендор-API нет: инференс на стенде, наружу ничего не уходит. Веса `huihui_ai/qwen3-abliterated:8b` ← `Qwen/Qwen3-8B` и `huihui-ai/Qwen3-8B-abliterated`, обе карточки HF `license: apache-2.0`; в самом LICENSE **0 вхождений** контентных ограничений (`grep -c -iE "sexual|pornograph|violence|acceptable use"` = 0) — Apache-2.0 не ограничивает область применения. Остаётся Ollama Inc. ToS (*Last updated: May 2026*) §4 «You may not: … `Transmit harmful, offensive, or illegal content`»: «offensive» не определён, а «Service» определён через «software», из-за чего непонятно, накрывает ли он локальный `ollama serve` → **UNCLEAR `scope`, вердикт владельца** («н/п» тоже его право).
|
||
|
||
### Как это добывалось (норма «заявление = команда»; приёмка ре-ранит)
|
||
|
||
- Прямой `curl` с браузерными заголовками; текст — стандартным питон-стриппером; **каждая цитата проверена счётом вхождений = 1 по сохранённому файлу**.
|
||
- ⚠ **ПОПРАВКА 31.07.2026: `grep -c -F` по стриппнутому тексту даёт ЛОЖНЫЕ НУЛИ — так проверять больше нельзя.** Пойманы два механизма, оба на DeepSeek: ToU верстает жёсткими переносами (`<br>` рвёт предложение пополам), а Open Platform ToS держит кавычки в отдельных тегах, из-за чего стриппер выдаёт `" DeepSeek Terms of Use "` с пробелами внутри. Три ВЕРНЫЕ цитаты показали `0`, что читалось бы как дельта вендора. **Рабочая форма: сверять по копии с УДАЛЁННЫМИ пробелами с обеих сторон** (`re.sub(r'\s+','',…)` и к цитате, и к документу) — нечувствительно к вёрстке, последовательность символов не трогает.
|
||
- **Cloudflare-403 на `x.ai` и `openai.com`** (воспроизводится и в WebFetch): обход — Wayback `https://web.archive.org/web/<ts>id_/<url>` (суффикс `id_` = оригинальные байты; добавлять `--compressed`, иначе приходит gzip-мусор). **Timestamp снимка ≠ дата ревизии документа** — не путать.
|
||
- ⚠ **`r.jina.ai` как ВТОРОЙ путь МЁРТВ (31.07.2026): 403** и на `x.ai`, и на `ai.google.dev`. Правило пакета-5 «цитата засчитана только при совпадении Wayback и jina» в прежней форме неисполнимо. **Замена, применённая 31.07:** два НЕЗАВИСИМЫХ захвата Wayback разных дат + сверка тел построчно (для xAI: снимки 25.07 и 28.07 побайтно идентичны). Честная граница такой замены — оба снимка в ПРОШЛОМ, живого подтверждения на дату чека нет; писать это явно. Прямой egress (`--noproxy '*'`) от Cloudflare-403 тоже не спасает — проверено.
|
||
- ⚠ **`ai.google.dev` БОЛЬШЕ НЕ ТРЕБУЕТ Wayback (31.07.2026).** Прежняя запись «редиректит в OAuth, curl умирает на 50 редиректах» верна по симптому; причина — петля на cookie `signin=autosignin`. **Лечится cookie-jar + явный язык: `curl -L --compressed -c jar -b jar 'https://ai.google.dev/gemini-api/terms?hl=en'` → HTTP 200 живьём.** Живая копия сверена со снимком Wayback: тело договора построчно идентично, расходится только навигация сайта.
|
||
- ✅ **ФОРМА РЕ-ЧЕКА ВПРЕДЬ (усиление 31.07): «дельты нет» доказывать не объявленной датой ревизии, а ПОСТРОЧНЫМ ДИФОМ тела документа против снимка Wayback на дату ПРОШЛОГО чека.** Объявленная дата — заявление вендора, оно бывает несвежим (тот же класс, что сноска DeepSeek о катовере, оставшаяся в будущем времени уже после катовера). Так закрыты 31.07 оба документа фокуса: тело PUP (снимок 26.07 vs живая 31.07) — идентично построчно, 27 строк против 27; тело Gemini Additional ToS (снимок 29.07 vs живая) — идентично, расходится только навигация сайта.
|
||
- **Головной Google ToS отдаётся по СТРАНОВЫМ версиям** (`?hl=en-US&gl=us` = Google LLC, дефолт с нашего egress = Google Ireland Limited) — версии текстуально разные, дату ревизии смотреть на нужной. Архив ревизий: `policies.google.com/terms/archive`, редлайн между ревизиями — `…/archive/<от>-<до>` (`<ins>`/`<del>` в разметке). **Редлайн вендора использовать как перекрёстную проверку, а дельту строить своим дифом архивной и живой копий.**
|
||
- ⚠ **`mistral.ai/terms/usage-policy` отдаёт HTTP 404** (и снимков в Wayback нет) — рабочий хост **`legal.mistral.ai/terms/usage-policy`**. Наш egress — прокси, так что 404 может быть edge-специфичным; при пере-проверке начинать с `legal.` .
|
||
- ⚠ **WebFetch для цитат НЕ годится** — режет цитату ~125 символами и переходит на пересказ. Только `curl` + `grep -F`.
|
||
|
||
- **Прокси на localhost**: в env стенда webshare-прокси, `NO_PROXY=<local>` — WinINET-нотация, которую curl/urllib/Go **не понимают** → запрос к 127.0.0.1 уходит на прокси и получает **403**. Лечение: явный `NO_PROXY="localhost,127.0.0.1,0.0.0.0,::1"` + в коде обходить прокси для loopback/172.x (бэкенд: local-адаптер с no-proxy транспортом — уже сделано).
|
||
- **DeepSeek cache-поля**: в `usage` два варианта именования (бэкенд обрабатывает оба).
|
||
- **«Эхо» черновика (тихий отказ)**: deepseek-chat на плотной CJK-прозе **воспроизводимо** (3 из 3 ретраев на zh-фрагменте Лу Синя «祝福») возвращает **оригинал вместо перевода** (82% CJK в «переводе»). Не ошибка API — валидный ответ с неправильным содержимым; ретраи не помогают (детерминировано для фрагмента). Митигация в `eval/editor_bench.py`: детектор доли CJK (порог 15%) → фолбэк на другого провайдера (GLM перевёл тот же текст чисто). **Бэкенд/гейт: детектор CJK-артефактов в русском выходе обязателен** (смыкается с anti-omission coverage-гейтом Р7 и уже запланированным «детектором CJK-артефактов» — 7 из 18 моделей грешат); эскалация на другого провайдера, а не ретрай. NB: проверено на deepseek-chat; актуальную роль-модель `deepseek-v4-flash` перепроверить.
|
||
- **Таймауты**: книжные чанки на локали занимают **63–278 с** (не 45 с как в чат-vojo). Нужен per-роль лег-таймаут ~300–600 с + стриминг как keep-alive. Донорский транспорт vojo имел скрытый per-attempt потолок 60 с.
|
||
- **`mistral-large-latest` — агрессивный rate-limiter (тир-зависим, пере-замерить на прод-тире).** Судейский eval-риг exp15 §7.6 REV.2 (N-параллельные вызовы): **~48% retry-fails @1.3s интервала**, max latency **64.7s**; `grok-*` в том же риге — 0%. Расширение интервала 1.3→2.6s эффекта НЕ дало (49.5→48.2%) → лимитер похож на **токен-бакет/конкуренц-кап**, не per-request-пейсинг. Пер-вызовный 429/`Retry-After` в адаптере есть (`httpllm.go`, кап `maxRetryAfterWait`); гэп — N-параллельность волнового раннера → **пер-модельный семафор конкуренции конфигом `models.yaml`** (план 11 WS1(б); заведён — `rate_limit: {max_concurrency: 2, min_interval_ms: 0}` у `mistral-large-2512`). ⚠ **Оговорка «mistral-editor-арм не идёт через прод-путь до этого guard» (D39.12, гейтнутый арм №4) СНЯТА — superseded D39.20:** mistral исключён как несущий РЕДАКТОР (анти-корреляция гладкость↔верность, воспроизведена ×3), гейтнутого арма больше не существует. **Цифры rate-limit ОСТАЮТСЯ в силе и продолжают гейтить прод-путь:** mistral жив как **переводчик под лейблом** (D19.1), а семафор охраняет именно этот путь. Правило двух направлений: цифры из eval-рига, НЕ офиц. доки — при прод-тир-замере запинить вендор-страницу rate-limits. *(Внесено оркестратором при лендинге D39.12; оговорка снята полигоном, пакет-5 25.07.2026; черновик — план 11 §12.)*
|
||
|
||
## Календарь деприкаций / цен (мониторить ежеквартально)
|
||
|
||
- ~~`deepseek-chat` → `deepseek-v4-flash` к **24.07.2026**~~ → **КАТОВЕР ПРОШЁЛ, пункт закрыт (полигон, пакет-5, 25.07.2026).** Вендор-дока (`api-docs.deepseek.com/quick_start/pricing`, сноска (1); тот же текст в Change Log): *«The model names deepseek-chat and deepseek-reasoner will be deprecated on 2026/07/24 15:59 UTC. For compatibility, they correspond to the non-thinking mode and thinking mode of deepseek-v4-flash, respectively»* (⚠ сноска осталась в будущем времени — это несвежесть доки, не отсрочка). Live-проба $0 25.07.2026: `GET /v1/models` → ровно `deepseek-v4-flash` + `deepseek-v4-pro`; `GET /v1/models/deepseek-chat` и `/deepseek-reasoner` → **HTTP 404 `{"message":"Model Not Found","type":"not_found_error"}`**. Это сильнее «нет в /models»: слаг отсутствует и в пер-слаговом реестре, т.е. алиас-урок календаря («нет в /models ≠ не работает») здесь **исчерпан**. ⚠ Честная граница: `chat/completions` этими слагами НЕ дёргался — платные вызовы в пакете-5 не санкционированы; реестр-404 — сильная, но формально не тождественная улика. **Цены пост-катовера не изменились** (flash $0.14/$0.28, cache-hit $0.0028; pro $0.435/$0.87, cache-hit $0.003625) → `prices_checked` в `models.yaml` можно продлить до 25.07.2026 без правки чисел. Заодно с той же страницы: контекст **1M**, max output **384K**, конкуренц-кап **2500** (flash) / **500** (pro).
|
||
- **Gemini 2.5-серия (pro/flash/flash-lite) — shutdown 16.10.2026** («earliest possible date», офиц. deprecations-страница; live-фактчек оркестратора 09.07). Замены по вендору: 3.1-pro-preview / 3.5-flash / 3.1-flash-lite. ⚠ До даты на 2.5-flash уже наблюдён **интермиттентный 404 «model no longer available» при наличии слага в /models** (research/15, сырьё) — вендором не документирован; судья fidelity `memory_eval` сидит на 2.5-flash → мигрировать (D21.9). Отдельно: `finish_reason=PROHIBITED_CONTENT` на Gemini 3.x — **НЕконфигурируемый фильтр-класс** (safety_settings не влияют, в отличие от `SAFETY`); наблюдён на violence-сцене → вывод exp07 «content_filter мёртв» на Gemini 3.x не переносится. *(Добавлено оркестратором по research/15 + фактчеку.)*
|
||
- **Grok 4.1 Fast retired 15.05.2026** → слаги молча редиректят на `grok-4.3` (цена ×9). Ретайрнулся дешёвый тир, НЕ сам xAI: grok-4.3 остаётся основным пермиссивным тиром канала B.
|
||
- **Аудит /models 04.07.2026 (воркфлоу) — с поправкой на перепроверку:** и `deepseek-chat`, и `grok-4-fast` НЕ в списках /models (там v4-flash/v4-pro у DeepSeek; версионные слаги у xAI), НО **оба работают как алиасы** (перепроверено вживую: HTTP 200, переводят). Агент-аудитор написал «сняты» — это была неточность: «нет в /models» ≠ «не работает». deepseek-chat депрекируется 24.07.2026. У xAI есть мигрированные слаги-обёртки (`grok-4.20-0309-non-reasoning` / `-reasoning` / `-multi-agent`, ретайр 15.05.2026), но **для перевода/редактуры берём `grok-4.3` + явный `reasoning_effort:"none"`** (слаг не меняем; non-reasoning вариант = grok-4.3+`none` под капотом — см. thinking-таблицу). xAI `usage` отдаёт нестандартные `cost_in_usd_ticks`/`num_sources_used` — игнорировать. **Урок: имя модели проверять не только `/models`, но и пробным вызовом — алиас может работать, даже если его нет в списке; и наоборот.** Реальная причина сменить deepseek на v4-flash — не «chat умер», а ЭХО на zh (лечится thinking-on), см. раздел thinking.
|
||
- Claude Sonnet 5 промо $2/$10 до **31.08.2026** (не закладывать в долгий прайс).
|
||
- ⭐ **ПИК DEEPSEEK — ЕЩЁ И ТОЛЬКО ПО БУДНЯМ (живое чтение `api-docs.deepseek.com/quick_start/pricing`, 30.08.2026). У нас этой оговорки не было.** Дословно: *«Peak hours are 01:00 - 04:00 and 06:00 - 10:00 UTC, **Monday through Friday** (all other hours are off-peak)»*. Часы у нас совпадали, **день недели — нет**: сводка рига звала воскресное утро пиком (починено, `zakhod.py`, правка ТОЛЬКО печати). ⇒ **Все субботы и воскресенья целиком идут по офф-пику, то есть вдвое дешевле.** Практическое следствие: длинные прогоны планируются на выходные и на не-пиковые часы буднего дня — это ×2 по цене без единой правки архитектуры. ⚠ Ледждер по-прежнему пишет ПИКОВУЮ цену осознанно (D39.136: потолок обязан срабатывать раньше, а не позже) ⇒ **записанная стоимость прогонов, сделанных в офф-пик, вдвое завышена против реального счёта** — это консерватизм, а не ошибка, но при сверке с вендорским счётом (открытый долг Д32.11) разницу надо ждать именно отсюда. **Таблица (за 1M, кэш-хит / кэш-промах / выход):** `v4-pro` офф-пик $0.022 / $0.66 / $1.98 · пик $0.044 / $1.32 / $3.96 — **пины ростера верны и суть ПИКОВАЯ колонка**. `v4-flash` офф-пик $0.007 / $0.22 / $0.66 · пик $0.014 / $0.44 / $1.32. ⚠⚠ **МЕТОДИЧЕСКАЯ ЗАМЕТКА, ЦЕННЕЕ САМОЙ ЦЕНЫ:** первая выжимка страницы дала кэш-хит `$0.44` вместо `$0.044` — десятикратная ошибка на ровном месте, и по ней уже готовилась запись «наш пин занижен в 10 раз». Спасло ПОВТОРНОЕ чтение той же страницы с требованием привести строки дословно. ⇒ **одно чтение вендорской страницы автоматическим извлекателем — НЕ факт; цифра, на которой стоит денежный вывод, читается дважды и разными запросами.**
|
||
- ⛔⛔ **ЖИВОЙ ПЕРЕ-СНЯТЫЙ ПРАЙС GEMINI 2026-08-30 (полигон, вопрос владельца «какая цена у гемини»): ОДИН НАШ ПИН ВДВОЕ ЗАВЫШЕН, И НА СТРАНИЦЕ ЕСТЬ МОДЕЛЬ ДЕШЕВЛЕ ВСЕГО НАШЕГО РОСТЕРА.** Источник — `ai.google.dev/gemini-api/docs/pricing`, за 1M токенов, платный тир. **(1) `gemini-3.1-flash-lite` — пин ВЕРЕН:** $0.25 вход / $0.025 кэш / $1.50 выход (аудио дороже: $0.50/$0.05). **(2) ⛔ `gemini-3.6-flash` — ПИН $1.50/$0.15/$7.50 ВДВОЕ ВЫШЕ ДЕЙСТВУЮЩЕЙ ЦЕНЫ:** вендор дословно — *«$0.75 through December 31, 2026. $1.50 starting January 1, 2027»* (выход соответственно **$3.75** до конца 2026 и $7.50 после). То есть в ростере стоит ПОСЛЕ-промо цена, и все сметы на этой модели завышены ×2. ⚠ **Пин НЕ правлен сессией сознательно:** `roster.cost()` считает цену клеток ИЗ ПИНА, и правка задним числом переписала бы стоимость **8 уже купленных клеток** этой модели (норма Д32.11 — леджер фазы есть оценка). Решение о правке — владельца, вместе с ценой пере-счёта. **(3) `gemini-3.1-pro-preview` — пин верен для промтов ≤200k** ($2.00/$0.20/$12.00); у вендора есть НЕ записанный у нас второй тир **>200k: $4.00/$0.40/$18.00** — наши чанки в него не попадают, но при смене нарезки попадут. **(4) ⭐ НЕ В РОСТЕРЕ И ДЕШЕВЛЕ ВСЕГО, ЧТО В НЁМ ЕСТЬ: `gemini-2.5-flash-lite` — $0.10 / $0.01 / $0.40 выход**, то есть выход втрое дешевле самой дешёвой нашей модели (`gpt-5.6-luna`, $1.20). ⛔ Брать в смету НЕЛЬЗЯ без двух проверок: 2.5-серия имеет **shutdown 16.10.2026** (строка выше) и уже даёт интермиттентный 404 при живом слаге, а качество/эхо на нашем материале не мерены ни разу. **(5) Прочее живьём:** `gemini-3.7 Flash` (у нас нет) — те же промо-$0.75/$3.75 до конца 2026; `gemini-3.5 Flash` $1.50/$0.15/$9.00; `gemini-3.5 Flash-Lite` $0.30/$0.03/$2.50. ⚠ **Общий урок тот же, что с DeepSeek:** промо-цены с датой окончания в пин попадают как постоянные и тихо завышают или занижают смету — у пина обязана быть дата И оговорка о промо.
|
||
- **ПОПРАВКА (04.07, владелец): удалён только Anthropic (за дороговизну). OpenAI ОСТАЁТСЯ** (ключ есть — GPT-5 nano/mini). Живой набор ключей у бэкенда и полигона: DEEPSEEK, ZAI, KIMI, OPENAI, GEMINI, XAI, MISTRAL (добавлен 09.07, 6ab92b5). Источник истины по стеку — `architecture/05-decisions-log.md` (D3) и Р4. Ранее эта строка ошибочно исключала OpenAI — исправлено оркестратором.
|
||
|
||
## Провенанс
|
||
|
||
Кто что нашёл: эндпоинты/thinking/temp/safety — полигон (эксп. 02, 03, 04, живые вызовы); Grok-retired/cache-write Anthropic/per-attempt-60с — бэкенд (шаг 0 валидации); localhost-прокси — оба стенда независимо.
|