Building Custom Agents¶
Versifai's modular architecture makes it straightforward to add custom tools and agents.
Create a Custom Tool¶
Subclass BaseTool and implement name, description, parameters_schema, and execute():
from versifai.core import BaseTool, ToolResult
class FetchWeatherTool(BaseTool):
name = "fetch_weather"
description = "Fetch current weather for a city"
parameters_schema = {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
},
"required": ["city"],
}
def execute(self, city: str) -> ToolResult:
# Your implementation here
data = call_weather_api(city)
return ToolResult(success=True, data=data)
Every tool returns a ToolResult:
success=Truewithdata-the tool worked, data is returned to the agentsuccess=Falsewitherror-the tool failed, error message is returned to the agent
Create a Custom Agent¶
Subclass BaseAgent and wire up your tools:
from versifai.core import (
BaseAgent, LLMClient, AgentMemory, AgentDisplay, ToolRegistry,
)
class WeatherAgent(BaseAgent):
def __init__(self):
registry = ToolRegistry()
registry.register(FetchWeatherTool())
super().__init__(
display=AgentDisplay(),
memory=AgentMemory(),
llm=LLMClient(model="gpt-4o"),
registry=registry,
)
self._system_prompt = "You are a helpful weather assistant."
def ask(self, question: str) -> str:
return self._run_phase(prompt=question, max_turns=10)
# Use it
agent = WeatherAgent()
answer = agent.ask("What's the weather in San Francisco?")
Where to Put Your Code¶
| What you're adding | Where it goes |
|---|---|
| A tool used by multiple agent families | src/versifai/core/tools/ |
| A tool specific to one agent | src/versifai/<family>/<agent>/tools/ |
| A new agent in an existing family | src/versifai/<family>/<new_agent>/ |
| A new agent family | src/versifai/<new_family>/ |
| Shared config or data models | src/versifai/core/config.py or src/versifai/<family>/models/ |
| Internal helpers | src/versifai/_utils/ |
Key Design Patterns¶
- BaseAgent -All agents subclass
BaseAgent, which provides the ReAct loop, error recovery, and tool dispatch - ToolRegistry -Tools are registered at construction time; the agent's loop automatically matches LLM tool calls to registered tools
- BaseTool -Every tool implements
name,description,parameters_schema, andexecute(). Drop-in replaceable. - AgentMemory -Manages conversation history with automatic summarization for long-running tasks