textmachine/eval/editor_contract/effort_probe.py

95 lines
4.4 KiB
Python
Raw Permalink 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.

#!/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)()