mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-28 14:07:55 +00:00
Resolve tool names from config["tools"] into actual tool instances using ToolRegistry, inject runtime deps, and pass them to the agent constructor instead of hardcoded tools=[]. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
105 lines
3.3 KiB
Python
105 lines
3.3 KiB
Python
"""Tests for tool wiring in AgentExecutor."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from openjarvis.agents.executor import AgentExecutor
|
|
from openjarvis.agents.manager import AgentManager
|
|
from openjarvis.core.events import EventBus
|
|
from tests.agents.fake_engine import FakeEngine
|
|
from tests.agents.scenario_harness import FakeSystem
|
|
|
|
|
|
def _register_agent():
|
|
"""Re-register MonitorOperativeAgent (cleared by autouse fixture)."""
|
|
from openjarvis.agents.monitor_operative import MonitorOperativeAgent
|
|
from openjarvis.core.registry import AgentRegistry
|
|
|
|
if not AgentRegistry.contains("monitor_operative"):
|
|
AgentRegistry.register("monitor_operative")(MonitorOperativeAgent)
|
|
|
|
|
|
def test_executor_runs_with_tools_from_config(tmp_path):
|
|
"""Executor should resolve tool names from config and complete tick."""
|
|
_register_agent()
|
|
|
|
engine = FakeEngine([{"content": "test response"}])
|
|
system = FakeSystem(engine=engine)
|
|
|
|
mgr = AgentManager(db_path=str(tmp_path / "test.db"))
|
|
agent = mgr.create_agent(
|
|
"test",
|
|
agent_type="monitor_operative",
|
|
config={
|
|
"system_prompt": "You are a test agent.",
|
|
"tools": ["think"],
|
|
"instruction": "test",
|
|
},
|
|
)
|
|
mgr.send_message(agent["id"], "hello", mode="immediate")
|
|
|
|
executor = AgentExecutor(manager=mgr, event_bus=EventBus())
|
|
executor.set_system(system)
|
|
|
|
executor.execute_tick(agent["id"])
|
|
result_agent = mgr.get_agent(agent["id"])
|
|
assert result_agent["status"] == "idle"
|
|
assert result_agent["total_runs"] == 1
|
|
mgr.close()
|
|
|
|
|
|
def test_executor_handles_missing_tools(tmp_path):
|
|
"""Executor should not crash if tool names don't exist in registry."""
|
|
_register_agent()
|
|
|
|
engine = FakeEngine([{"content": "test response"}])
|
|
system = FakeSystem(engine=engine)
|
|
|
|
mgr = AgentManager(db_path=str(tmp_path / "test.db"))
|
|
agent = mgr.create_agent(
|
|
"test",
|
|
agent_type="monitor_operative",
|
|
config={
|
|
"system_prompt": "You are a test agent.",
|
|
"tools": ["nonexistent_tool_xyz"],
|
|
"instruction": "test",
|
|
},
|
|
)
|
|
mgr.send_message(agent["id"], "hello", mode="immediate")
|
|
|
|
executor = AgentExecutor(manager=mgr, event_bus=EventBus())
|
|
executor.set_system(system)
|
|
|
|
executor.execute_tick(agent["id"])
|
|
result_agent = mgr.get_agent(agent["id"])
|
|
assert result_agent["status"] == "idle"
|
|
assert result_agent["total_runs"] == 1
|
|
mgr.close()
|
|
|
|
|
|
def test_executor_handles_string_tools(tmp_path):
|
|
"""Executor should handle comma-separated tool string as well as list."""
|
|
_register_agent()
|
|
|
|
engine = FakeEngine([{"content": "test response"}])
|
|
system = FakeSystem(engine=engine)
|
|
|
|
mgr = AgentManager(db_path=str(tmp_path / "test.db"))
|
|
agent = mgr.create_agent(
|
|
"test",
|
|
agent_type="monitor_operative",
|
|
config={
|
|
"system_prompt": "You are a test agent.",
|
|
"tools": "think,calculator",
|
|
"instruction": "test",
|
|
},
|
|
)
|
|
mgr.send_message(agent["id"], "hello", mode="immediate")
|
|
|
|
executor = AgentExecutor(manager=mgr, event_bus=EventBus())
|
|
executor.set_system(system)
|
|
|
|
executor.execute_tick(agent["id"])
|
|
result_agent = mgr.get_agent(agent["id"])
|
|
assert result_agent["status"] == "idle"
|
|
mgr.close()
|