The call record: every model call, for the operator's study (M6.6a)
nisse-core records each model call of every agent into a file beside its state store (<state>.calls.db), for the status page (L7, X6): - the request body exactly as sent (never headers), the raw response with its reasoning, the model asked and the one that answered, time, tokens and llama-server's own prompt reuse (timings.cache_n); - its work item, role, run and purpose: Driver.run and nisse-dev's delegation loop open runs, nested; compaction, expert consults, the classifier and the go-ahead reader label their calls; - provenance, worked out in BudgetedClient by comparing the events at each stage: each event sent with its log id and content as sent, which a compaction replaced, which fitting shortened (by how much) and dropped. Content is stored once by hash, compressed. It is diagnostic only: the agent never reads it, a failed write is logged once and recording stops while the call goes on, and the file is deleted when the agent starts, so its layout never migrates; CallReader refuses a layout it doesn't know. While recording, the system prompt ends with one sentence saying so. `call_record: false` in either agent's YAML turns it off. The benchmark records each run beside that run's own state store, and `--keep-runs DIR` keeps both for the page. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
This commit is contained in:
1 parent
cba35eb7d4
commit
dd060566b2
22 files changed
+1346
-48
No files matched your search
@@ -429,3 +429,26 @@ def test_runs_from_before_the_driver_read_as_its_defaults() -> None:
|
||||
old["tuning"]["executor"] = old["tuning"].pop("driver")
|
||||
[row] = summarise([old], current)
|
||||
assert row.tuning == ""
|
||||
|
||||
|
||||
def test_a_kept_run_leaves_its_state_and_call_record(tmp_path: Path) -> None:
|
||||
# As the agent records itself (L7), so the status page can open a
|
||||
# benchmark run (X6); each run gets its own record, and the client is
|
||||
# left as it was.
|
||||
from nisse_core.models.calls import CallReader
|
||||
|
||||
[task] = load_tasks(["write-function"])
|
||||
client = Scripted(list(SOLVE_SLUGIFY))
|
||||
record = run_task(task, FACTS, client, Tuning(), host=HOST, keep=tmp_path / "runs")
|
||||
|
||||
[kept] = list((tmp_path / "runs").iterdir())
|
||||
assert kept.name.startswith("write-function-")
|
||||
assert (kept / "state.db").exists()
|
||||
[run] = CallReader(kept / "state.calls.db").runs()
|
||||
assert (run["work_item"], run["role"], run["outcome"]) == (
|
||||
"bench",
|
||||
"driver",
|
||||
"wait",
|
||||
)
|
||||
assert record.success
|
||||
assert not hasattr(client, "call_recorder")
|
||||
Reference in new issue
Block a user