oclaw/tests/test_tool_error_hints.py
oliver f1d025ed60 Steer WhatsApp ops short intents and clarify busy/CLI failures.
Inject English recipe hints for fiber/offline/excel/continue, ack the first queued follow-up, localize gate copy, and classify execManagedNe errors so agents stop blind retries.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-10 22:53:35 +08:00

45 lines
1.6 KiB
Python

from __future__ import annotations
from runtime.tools.tool_error_hints import (
enrich_mcp_scope_error,
format_unregistered_tool_error,
suggest_tool_names,
)
def test_suggest_tool_names_prefers_substring() -> None:
pool = [
"mcp__netx__queryUmeAlarms",
"mcp__netx__queryUmeAlarmsRaw",
"mcp__netx__aggregateUmeAlarms",
"write_xlsx",
]
hits = suggest_tool_names("mcp__netx__queryUmeAlarmsRaw", pool)
assert "mcp__netx__queryUmeAlarmsRaw" in hits or "mcp__netx__queryUmeAlarms" in hits
def test_format_unregistered_includes_suggestions() -> None:
out = format_unregistered_tool_error(
"mcp__netx__queryUmeAlarmsRaw",
["mcp__netx__queryUmeAlarms", "mcp__netx__aggregateUmeAlarms", "ume_alarm_xlsx_report"],
lang="en",
)
assert out["error_code"] == "tool_not_registered"
assert out.get("suggestions")
assert any("queryUmeAlarms" in s for s in out["suggestions"])
def test_enrich_mcp_scope_sql() -> None:
raw = {"ok": False, "error_code": "mcp_rpc_error_-32001", "error": "insufficient_scope:sql:query"}
out = enrich_mcp_scope_error(raw)
assert out["error_code"] == "insufficient_scope"
assert out["required_scope"] == "sql:query"
assert "fallback_tools" in out
assert "ume_alarm_xlsx_report" in out["fallback_tools"]
def test_enrich_exec_auth() -> None:
from runtime.tools.tool_error_hints import enrich_exec_managed_ne_error
out = enrich_exec_managed_ne_error({"ok": False, "error": "authentication failed: Permission denied"})
assert out["error_class"] == "auth"