feat(aiops): structure agent loop shadow output
This commit is contained in:
@@ -2,9 +2,12 @@ import pytest
|
||||
|
||||
from src.plugins.mcp.interfaces import MCPTool, MCPToolProvider, MCPToolResult
|
||||
from src.plugins.mcp.registry import AuditedMCPToolProvider
|
||||
from src.services.ai_providers.interfaces import AIResult
|
||||
from src.services.ai_providers.agent_loop import AgentToolExecutor
|
||||
from src.services.ai_providers.permissions import filter_tools_for_agent, is_tool_allowed
|
||||
from src.services.ai_providers.interfaces import AIResult
|
||||
from src.services.ai_providers.permissions import (
|
||||
filter_tools_for_agent,
|
||||
is_tool_allowed,
|
||||
)
|
||||
from src.services.ai_providers.tool_schema import (
|
||||
anthropic_tool_schema,
|
||||
openai_tool_schema,
|
||||
@@ -69,6 +72,38 @@ def test_tool_schema_round_trips_provider_safe_names():
|
||||
assert tool_by_provider_name([tool], safe_name) is tool
|
||||
|
||||
|
||||
def test_openclaw_agent_loop_shadow_parser_normalizes_json():
|
||||
from src.services.openclaw import OpenClawService
|
||||
|
||||
raw = """```json
|
||||
{
|
||||
"root_cause_check": "current RCA still needs pod evidence",
|
||||
"evidence_used": ["event spike", "error rate"],
|
||||
"confidence_delta": -0.42,
|
||||
"missing_evidence": ["deployment rollout history"],
|
||||
"human_or_ai_next_step": "query rollout history with read-only tools"
|
||||
}
|
||||
```"""
|
||||
|
||||
parsed = OpenClawService._parse_agent_loop_shadow_response(raw)
|
||||
|
||||
assert parsed["parse_status"] == "ok"
|
||||
assert parsed["root_cause_check"] == "current RCA still needs pod evidence"
|
||||
assert parsed["evidence_used"] == ["event spike", "error rate"]
|
||||
assert parsed["confidence_delta"] == -0.15
|
||||
assert parsed["missing_evidence"] == ["deployment rollout history"]
|
||||
|
||||
|
||||
def test_openclaw_agent_loop_shadow_parser_never_boosts_confidence():
|
||||
from src.services.openclaw import OpenClawService
|
||||
|
||||
parsed = OpenClawService._parse_agent_loop_shadow_response(
|
||||
'{"root_cause_check":"looks good","confidence_delta":0.2}'
|
||||
)
|
||||
|
||||
assert parsed["confidence_delta"] == 0.0
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_audited_provider_strips_internal_audit_context(monkeypatch):
|
||||
audit_calls = []
|
||||
@@ -188,4 +223,7 @@ async def test_openclaw_agent_loop_shadow_uses_read_only_tools(monkeypatch):
|
||||
)
|
||||
|
||||
assert proposal["agent_loop_shadow"]["success"] is True
|
||||
assert proposal["agent_loop_shadow"]["decision_impact"] == "none"
|
||||
assert proposal["agent_loop_shadow"]["structured"]["parse_status"] == "ok"
|
||||
assert proposal["agent_loop_shadow"]["structured"]["root_cause_check"] == "ok"
|
||||
assert [tool.name for tool in fake_ai_provider.seen_tools] == ["list_incidents"]
|
||||
|
||||
Reference in New Issue
Block a user