|
|
@@ -6,6 +6,7 @@ from pathlib import Path
|
|
|
import httpx
|
|
|
import pytest
|
|
|
from fastapi.testclient import TestClient
|
|
|
+from pydantic import ValidationError
|
|
|
|
|
|
from agent_lab.application.contracts import AgentParams, DebugRunRequest, EventAgentParams
|
|
|
from agent_lab.application.queues import RuntimeQueues
|
|
|
@@ -153,6 +154,42 @@ def test_websocket_debug_sends_error_for_invalid_request():
|
|
|
assert "user_message" in message["message"]
|
|
|
|
|
|
|
|
|
+def test_debug_run_request_rejects_invalid_pre_message_role():
|
|
|
+ payload = _request_payload()
|
|
|
+ payload["pre_messages"] = [{"role": "developer", "content": "invalid"}]
|
|
|
+
|
|
|
+ with pytest.raises(ValidationError) as exc_info:
|
|
|
+ DebugRunRequest.model_validate(payload)
|
|
|
+
|
|
|
+ assert "role" in str(exc_info.value)
|
|
|
+
|
|
|
+
|
|
|
+def test_debug_run_request_rejects_tool_pre_messages():
|
|
|
+ payload = _request_payload()
|
|
|
+ payload["pre_messages"] = [
|
|
|
+ {
|
|
|
+ "role": "tool",
|
|
|
+ "content": "orphan result",
|
|
|
+ "tool_call_id": "call_1",
|
|
|
+ }
|
|
|
+ ]
|
|
|
+
|
|
|
+ with pytest.raises(ValidationError, match="pre_messages cannot include tool messages"):
|
|
|
+ DebugRunRequest.model_validate(payload)
|
|
|
+
|
|
|
+
|
|
|
+def test_chat_message_allows_internal_tool_replies():
|
|
|
+ message = ChatMessage(
|
|
|
+ role="tool",
|
|
|
+ content='{"message":"handled"}',
|
|
|
+ name="handoff_note",
|
|
|
+ tool_call_id="call_1",
|
|
|
+ )
|
|
|
+
|
|
|
+ assert message.role == "tool"
|
|
|
+ assert message.tool_call_id == "call_1"
|
|
|
+
|
|
|
+
|
|
|
class HistoryCapturingChatClient:
|
|
|
def __init__(self) -> None:
|
|
|
self.calls = 0
|