-
Create the tool file at src/medox/agent/tools/tool_<name>.py:
"""One-line description of the data source and lookup strategy."""
from langchain_core.tools import tool
from medox.pipeline.config_pipeline import PipelineSettings
@tool
def <tool_name>(<param>: str) -> str:
"""
<What this tool does — written for the LLM, not a human developer.>
Include:
- What the parameter means and expected format
- Example values or class names the LLM should pass
- What the tool returns and how to interpret it
Example: pass 'ANTIVITAMINES K' for warfarine, 'STATINES' for simvastatine.
"""
settings = PipelineSettings()
-
Register the tool in src/medox/agent/graph_agent.py:
- Add the import
- Add to the
tools = [...] list passed to build_agent()
-
Docstring rules (critical — the LLM uses this to decide when/how to call the tool):
- Written in English
- Explain when to use this tool vs other tools
- Give concrete input examples (especially for ANSM class names)
- Describe the return format
-
Write the test at tests/agent/test_tool_<name>.py:
def test_<tool_name>_returns_expected():
result = <tool_name>.invoke({"<param>": "<known_value>"})
assert "<expected_substring>" in result
def test_<tool_name>_handles_unknown():
result = <tool_name>.invoke({"<param>": "nonexistent_xyz"})
assert result
-
Update .claude/rules/agent.md — add the tool to the tools table.
-
Validate:
uv run pytest tests/agent/test_tool_<name>.py -v
uv run pytest tests/agent/ -v