feat(aiops): structure agent loop shadow output
Some checks failed
CD Pipeline / tests (push) Successful in 2m50s
Code Review / ai-code-review (push) Successful in 33s
CD Pipeline / build-and-deploy (push) Failing after 25m48s
CD Pipeline / post-deploy-checks (push) Has been cancelled

This commit is contained in:
Your Name
2026-05-01 15:09:57 +08:00
parent f53d7e5584
commit b0da6da1e9
5 changed files with 165 additions and 3 deletions

View File

@@ -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"]