Ctrl K
ComunidadGuías…

tests/test_agent_qa_score.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""The agent benchmark's scorer: one reply, one verdict, decided by its ANSWER line.

Each test pairs the wrong or declined reply with the right one for the same
question, so a scorer that called everything right (or wrong) fails here.
The questions are hand-made in the key's shape, with neutral names.
"""

from __future__ import annotations

import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "benchmarks" / "agent_qa"))

from build_questions import eligible, gpu_tier_gb, host_names, last_line  # noqa: E402
from score import extract, score  # noqa: E402

KNOWN = {"alpha": "alpha", "alpha-wsl": "alpha", "bravo": "bravo", "charlie": "charlie",
         "old-box": "OLD-BOX"}  # fmt: skip
EXIT = {"category": "exit_code", "truth": {"exit_code": -15}}
HOST = {"category": "host", "truth": {"names": ["alpha", "alpha-wsl"], "known_names": KNOWN}}
WALL = {"category": "wall_time", "truth": {"seconds": 1214.912}}
FAILS = {"category": "project_failures", "truth": {"job_ids": [3652, 3657, 3658]}}
LOG = {"category": "log_line", "truth": {"line": '{"rc":0,"model":"m-1"}'}}
FLEET = {"category": "fleet", "truth": {"hosts": ["alpha", "charlie"], "known_names": KNOWN}}


def _v(q: dict, reply: str) -> str:
    return score(q, reply)["verdict"]


def test_the_last_answer_line_decides_and_markdown_around_it_is_ignored() -> None:
    reply = "ANSWER: 1\nChecking that again...\n**ANSWER:** -15"
    assert extract(reply) == "-15"
    assert _v(EXIT, reply) == "right"
    assert _v(EXIT, "**ANSWER:** 1") == "wrong"


def test_unknown_is_declined_and_a_reply_without_the_line_is_neither() -> None:
    assert _v(EXIT, "No access.\nANSWER: UNKNOWN") == "declined"
    assert _v(EXIT, "ANSWER: `UNKNOWN`") == "declined"
    assert _v(EXIT, "It exited with -15.") == "no_answer"
    assert _v(EXIT, "It exited with -15.\nANSWER: -15") == "right"


def test_exit_code_keeps_its_sign() -> None:
    """jobd records a SIGTERM'd job as -15; 143 (128+15) is another number."""
    assert _v(EXIT, "ANSWER: -15") == "right"
    assert _v(EXIT, "ANSWER: -15 (SIGTERM)") == "right"
    assert _v(EXIT, "ANSWER: 15") == "wrong"
    assert _v(EXIT, "ANSWER: 143") == "wrong"


def test_host_accepts_any_name_of_the_host_and_flags_a_name_no_host_has() -> None:
    assert _v(HOST, "ANSWER: alpha") == "right"
    assert _v(HOST, "ANSWER: Alpha-WSL") == "right"
    assert _v(HOST, "ANSWER: alpha (the big GPU box)") == "right"
    assert _v(HOST, "ANSWER: bravo") == "wrong"
    assert _v(HOST, "ANSWER: alpha, bravo") == "wrong"  # one host ran it
    assert score(HOST, "ANSWER: bravo")["unknown_host"] is False  # wrong, but a real host
    assert score(HOST, "ANSWER: zulu")["unknown_host"] is True
    assert score(HOST, "ANSWER: alpha")["unknown_host"] is False  # right, so not flagged


def test_wall_time_is_within_one_second() -> None:
    assert _v(WALL, "ANSWER: 1215") == "right"
    assert _v(WALL, "ANSWER: 1214") == "right"  # truncated
    assert _v(WALL, "ANSWER: 1,215 s") == "right"
    assert _v(WALL, "ANSWER: 0:20:15") == "right"
    assert _v(WALL, "ANSWER: 1216") == "wrong"
    assert _v(WALL, "ANSWER: 1213") == "wrong"
    assert _v(WALL, "ANSWER: about 20 minutes") == "wrong"


def test_project_failures_needs_the_exact_set_in_any_order() -> None:
    assert _v(FAILS, "ANSWER: 3658, 3652, 3657") == "right"
    assert _v(FAILS, "ANSWER: #3652, #3657 and #3658") == "right"
    assert _v(FAILS, "ANSWER: 3652, 3657") == "wrong"  # one missing
    assert _v(FAILS, "ANSWER: 3652, 3657, 3658, 3660") == "wrong"  # one extra
    assert _v(FAILS, "ANSWER: none") == "wrong"


def test_a_log_line_is_a_quotation_up_to_whitespace_and_wrapping_quotes() -> None:
    assert _v(LOG, 'ANSWER: {"rc":0,"model":"m-1"}') == "right"
    assert _v(LOG, 'ANSWER: `{"rc":0,"model":"m-1"}`') == "right"
    assert _v(LOG, 'ANSWER: {"rc":0,"model":"M-1"}') == "wrong"  # case counts
    assert _v(LOG, 'ANSWER: {"rc":0}') == "wrong"
    plain = {"category": "log_line", "truth": {"line": "2 failed, 49 deselected in 3.14s"}}
    assert _v(plain, 'ANSWER: "2 failed,  49 deselected in 3.14s"') == "right"
    assert _v(plain, "ANSWER: 2 failed, 49 deselected") == "wrong"


def test_fleet_compares_host_sets_through_the_alias_table() -> None:
    assert _v(FLEET, "ANSWER: charlie, alpha") == "right"
    assert _v(FLEET, "ANSWER: alpha-wsl and charlie") == "right"
    assert _v(FLEET, "ANSWER: alpha") == "wrong"
    assert _v(FLEET, "ANSWER: alpha, bravo, charlie") == "wrong"
    assert score(FLEET, "ANSWER: alpha, zulu")["unknown_host"] is True


def test_the_key_builders_rules_on_worker_dicts() -> None:
    """The routing rule the fleet answers come from, and the alias and
    log-line rules, on hand-made inputs (the builder cross-checks the
    routing answers against the broker's own dry run when it runs)."""
    ws = [
        {"host": "alpha", "state": "online", "host_aliases": ["any", "any-gpu", "alpha-wsl"],
         "tags": ["R", "cuda", "cuda-32gb"]},
        {"host": "bravo", "state": "online", "host_aliases": ["any"], "tags": ["R", "cuda-8gb"]},
        {"host": "charlie", "state": "offline", "host_aliases": ["any"], "tags": ["R"]},
    ]  # fmt: skip
    assert eligible(["R"], ws) == ["alpha", "bravo"]  # charlie is offline
    assert eligible(["R", "cuda"], ws) == ["alpha"]
    assert eligible(["ffmpeg"], ws) == []
    assert host_names("alpha", ws) == ["alpha", "alpha-wsl"]  # pool aliases name no host
    assert host_names("retired", ws) == ["retired"]
    assert [gpu_tier_gb(w) for w in ws] == [32, 8, 0]
    assert last_line("a\nb line here\n\n") == "b line here"
    assert last_line("step 1\rstep 2 of many\n") is None  # a progress bar
    assert last_line("\x1b[31mred text here\x1b[0m\n") is None
    assert last_line("ok\n") is None  # too short to quote