mirror of
https://github.com/hansjone/oclaw.git
synced 2026-10-09 12:30:44 +08:00
Soften short-intent gates and add tool-result refs plus MCP wire invalidate.
Prefer report tools without hard-hiding CLI, keep soft CLI budgets, store compact+result_ref for the model, and clear frozen wire after MCP sync. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
3785e78a72
commit
605751b6a6
13 changed files with 636 additions and 65 deletions
|
|
@ -5,9 +5,9 @@ from runtime.application.gateway.ops_short_intent import (
|
|||
filter_tool_specs_for_ops_short_intent,
|
||||
is_ops_short_intent_suppressed_tool,
|
||||
maybe_ops_short_intent_system_hint,
|
||||
ops_short_intent_cli_soft_budgets,
|
||||
)
|
||||
from runtime.tools.base import ToolSpec
|
||||
from runtime.tools.tool_error_hints import enrich_exec_managed_ne_error, enrich_get_managed_ne_error
|
||||
|
||||
|
||||
def test_detect_ops_short_intent_english_field() -> None:
|
||||
|
|
@ -20,18 +20,19 @@ def test_detect_ops_short_intent_english_field() -> None:
|
|||
assert detect_ops_short_intent("hello there how are you doing today with something else") is None
|
||||
|
||||
|
||||
def test_ops_short_intent_suppresses_inventory_cli_tools() -> None:
|
||||
assert is_ops_short_intent_suppressed_tool("mcp__netx__listCliTargets", intent="fiber_cut")
|
||||
assert is_ops_short_intent_suppressed_tool("mcp__netx__execManagedNe", intent="offline")
|
||||
def test_ops_short_intent_suppresses_diy_xlsx_shell_only() -> None:
|
||||
assert is_ops_short_intent_suppressed_tool("run_command", intent="excel_export")
|
||||
assert is_ops_short_intent_suppressed_tool("write_xlsx", intent="fiber_cut")
|
||||
assert is_ops_short_intent_suppressed_tool("write_xlsx", intent="excel_export")
|
||||
# Soft preference: CLI/inventory stay available for device confirmation.
|
||||
assert not is_ops_short_intent_suppressed_tool("mcp__netx__listCliTargets", intent="fiber_cut")
|
||||
assert not is_ops_short_intent_suppressed_tool("mcp__netx__execManagedNe", intent="offline")
|
||||
assert not is_ops_short_intent_suppressed_tool("ume_alarm_xlsx_report", intent="fiber_cut")
|
||||
assert not is_ops_short_intent_suppressed_tool("mcp__netx__queryUmeAlarmsRaw", intent="alarm_tally")
|
||||
assert not is_ops_short_intent_suppressed_tool("mcp__netx__execManagedNe", intent="continue")
|
||||
|
||||
|
||||
def test_filter_tool_specs_for_ops_short_intent_keeps_report_path() -> None:
|
||||
def test_filter_tool_specs_for_ops_short_intent_keeps_cli_and_report() -> None:
|
||||
def _spec(name: str) -> ToolSpec:
|
||||
return ToolSpec(
|
||||
name=name,
|
||||
|
|
@ -52,20 +53,33 @@ def test_filter_tool_specs_for_ops_short_intent_keeps_report_path() -> None:
|
|||
names = {t.name for t in kept}
|
||||
assert "ume_alarm_xlsx_report" in names
|
||||
assert "mcp__netx__aggregateUmeAlarms" in names
|
||||
assert "mcp__netx__listCliTargets" in names
|
||||
assert "mcp__netx__execManagedNe" in names
|
||||
assert "write_xlsx" not in names
|
||||
assert "mcp__netx__listCliTargets" not in names
|
||||
assert "mcp__netx__execManagedNe" not in names
|
||||
assert "run_command" not in names
|
||||
assert len(filter_tool_specs_for_ops_short_intent(tools, intent="continue")) == len(tools)
|
||||
|
||||
|
||||
def test_ops_short_intent_cli_soft_budgets() -> None:
|
||||
soft = ops_short_intent_cli_soft_budgets("fiber_cut")
|
||||
assert soft is not None
|
||||
assert int(soft["single"]) <= 2
|
||||
assert int(soft["batch"]) == 1
|
||||
assert ops_short_intent_cli_soft_budgets("continue") is None
|
||||
assert ops_short_intent_cli_soft_budgets(None) is None
|
||||
|
||||
|
||||
def test_ops_short_intent_hint_english_default() -> None:
|
||||
hint = maybe_ops_short_intent_system_hint(text="LOS on these sites", lang="en")
|
||||
assert "fiber" in hint.lower() or "LOS" in hint
|
||||
assert "ume_alarm_xlsx_report" in hint
|
||||
assert "soft budget" in hint.lower() or "targets" in hint.lower()
|
||||
assert "断纤" not in hint
|
||||
|
||||
|
||||
from runtime.tools.tool_error_hints import enrich_exec_managed_ne_error, enrich_get_managed_ne_error
|
||||
|
||||
|
||||
def test_enrich_exec_timeout() -> None:
|
||||
out = enrich_exec_managed_ne_error(
|
||||
{"ok": False, "error_code": "tool_timeout_or_failed", "error": "timeout"}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue