#!/usr/bin/env python3 """Пере-проба маппинга эффорта `deepseek-v4-pro` — исполнение вахты D39.92 (реестр загейченных триггеров, строка 108): «дата > 05.08 ⇒ пере-проба маппинга + сверка changelog; абсорбция в 00-provider-quirks.md — полигоном». ЧТО ПРОВЕРЯЕТ (поведением, не докой): (1) квирк 3а «на v4-pro ручка `low` НЕ РАБОТАЕТ — маппится в high» — у нас стоит СО СЛОВ вендора; (2) расхождение реестра с первоисточником: `00-provider-quirks.md` §3а пишет для pro `xhigh` → `max`, а вендор-дока (снята 05.08) отдаёт `xhigh` → `xhigh`. Метод: побайтно ОДИН вход (реальный редакторский дифф-вызов окна 0), три арма — без параметра (вендор-дефолт) · `low` · `xhigh` — по 3 розыгрыша. N=1 непригоден: квирки 00 §2 документируют разброс reasoning ×163 на побайтно одном входе. Решает СРАВНЕНИЕ РАСПРЕДЕЛЕНИЙ reasoning_tokens. Сырьё durable, префикс `eff-*`. """ from __future__ import annotations import json import statistics as st import sys import time from pathlib import Path REPO = Path("/home/ubuntu/projects/textmachine") HERE = Path(__file__).resolve().parent RAW = Path.home() / "books" / "gu-zhenren" / "bank-arbitration" sys.path.insert(0, str(HERE)) sys.path.insert(0, str(REPO / "eval" / "bank_arbitration")) import editor_wire_probe as P # noqa: E402 import probe as Q # noqa: E402 from inject_probe import pick_windows # noqa: E402 REPS = 3 ARMS = {"default": None, "low": "low", "xhigh": "xhigh"} CEILING_USD = 0.10 def build_msgs(): _, buf, terms = pick_windows()[0] draft = P.draft_of(0) blk = P.editor_block(terms, P.HEADER_LAW_CLAUSE, None) return Q.messages("diff", buf, draft, blk) def run(): msgs = build_msgs() cl = P.client() total = 0.0 for arm, eff in ARMS.items(): for r in range(1, REPS + 1): tag = f"eff-{arm}-r{r}" if (RAW / f"{tag}.json").exists(): print(f"[{tag}] уже есть — пропуск") continue if total > CEILING_USD: print(f"СТОП: ${total:.4f} > ${CEILING_USD}") return extra = {"reasoning_effort": eff} if eff else None try: rec = P.call(cl, msgs, tag, extra=extra) total += rec["cost_usd"] except Exception as e: print(f"[{tag}] ОШИБКА {type(e).__name__}: {str(e)[:200]}") time.sleep(0.4) print(f"TOTAL пере-пробы эффорта: ${total:.6f}") def score(): print("вход побайтно ОДИН во всех армах; reasoning_tokens = поле usage провайдера\n") base = None for arm in ARMS: rows = [] for r in range(1, REPS + 1): f = RAW / f"eff-{arm}-r{r}.json" if not f.exists(): continue d = json.load(open(f, encoding="utf-8")) rows.append((d["completion_tokens"], d["reasoning_chars"], d["cost_usd"], d["finish"])) if not rows: print(f" {arm}: нет данных (все вызовы упали?)") continue rc = [b for _, b, _, _ in rows] ct = [a for a, _, _, _ in rows] med = st.median(rc) if arm == "default": base = med delta = "" if base is None or arm == "default" else f" ⇒ против дефолта ×{med/base:.2f}" if base else "" print(f" {arm:8s} n={len(rows)} · reasoning медиана {med:.0f} симв (розыгрыши {rc}) · " f"completion {ct} · finish={ {x[3] for x in rows} }{delta}") print("\nЧитать так: если `low` НЕ отличается от дефолта — квирк 3а «ручка мёртвая» подтверждён") print("ПОВЕДЕНИЕМ. Если отличается — квирк устарел, и бюджет размышления на pro управляем.") if __name__ == "__main__": (score if "--score" in sys.argv else run)()