95 lines
4.4 KiB
Python
95 lines
4.4 KiB
Python
#!/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)()
|