Feat/tool based coordinator routing (#5)
Co-authored-by: Michael <michael@example.com> Reviewed-on: #5
This commit is contained in:
@@ -511,3 +511,60 @@ async def test_dispatch_skips_pr_if_not_requested_reviewer() -> None:
|
||||
assert len(results) == 1
|
||||
assert "SKIP: Agent is not a requested reviewer" in results[0]
|
||||
|
||||
|
||||
def test_coordinator_tools_registration() -> None:
|
||||
from core.coordinator_tools import CoordinatorTools
|
||||
tools: CoordinatorTools = CoordinatorTools()
|
||||
assert not tools.tool_called
|
||||
assert tools.action == "NO_ACTION"
|
||||
|
||||
tools.propose_plan(plan="my plan", issue_number=42)
|
||||
assert tools.tool_called
|
||||
assert tools.action == "PROPOSE_PLAN"
|
||||
assert tools.arguments == {"plan": "my plan", "issue_number": 42}
|
||||
|
||||
tools.start_implementation(approved_plan="my approved plan", issue_number=42)
|
||||
assert tools.action == "EXECUTE_PLAN"
|
||||
assert tools.arguments == {"approved_plan": "my approved plan", "issue_number": 42}
|
||||
|
||||
|
||||
@patch("core.dispatcher.CodingAgent")
|
||||
async def test_dispatch_uses_coordinator_tool_calling(mock_agent_class: MagicMock) -> None:
|
||||
mock_client: MagicMock = MagicMock(spec=GiteaClient)
|
||||
mock_tools: MagicMock = MagicMock(spec=GiteaTools)
|
||||
|
||||
mock_client.list_repo_pull_requests.return_value = []
|
||||
mock_client.get_issue_comments.return_value = []
|
||||
mock_client.get_authenticated_user.return_value = UserModel(login="meeks-ai")
|
||||
|
||||
# Mock agent invoking propose_plan tool
|
||||
async def mock_run_tools(mission: str, tools: list[any]) -> str:
|
||||
for t in tools:
|
||||
if getattr(t, "__name__", "") == "propose_plan":
|
||||
t(plan="Step 1. Code X", issue_number=42)
|
||||
return "Agent finished turn after tool calling."
|
||||
|
||||
mock_agent_instance = MagicMock()
|
||||
mock_agent_instance.run_with_tools = AsyncMock(side_effect=mock_run_tools)
|
||||
mock_agent_class.return_value = mock_agent_instance
|
||||
|
||||
dispatcher = AgentDispatcher(client=mock_client, tools=mock_tools)
|
||||
work_item = WorkItem(
|
||||
repo_full_name="meeks/repo1",
|
||||
task_type="issue",
|
||||
task_number=42,
|
||||
task_info=IssueModel(number=42, title="add X", body=""),
|
||||
priority=0
|
||||
)
|
||||
|
||||
results = await dispatcher.dispatch("meeks/repo1", [work_item])
|
||||
assert len(results) == 1
|
||||
assert "POSTED_COMMENT: PROPOSE_PLAN" in results[0]
|
||||
mock_client.add_comment.assert_called_once_with(
|
||||
"meeks",
|
||||
"repo1",
|
||||
42,
|
||||
"### Proposed Implementation Plan\n\nStep 1. Code X\n\nIs this plan ok for implementation or do you have any comments/changes?\n<!-- agent:plan-proposal -->\n<!-- agent:awaiting-reply -->"
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user