Title here
Summary here
This page documents the current v2 way to build an agent in Fred.
It focuses on:
agents_catalog.yamlA v2 agent is a class-based definition, usually built from:
ReActAgent for common tool-first agents@tool for local Python toolsStart from the maintained sample:
agentic_backend/agentic_backend/agents/v2/samples/tutorial_tools/agent.pyfrom __future__ import annotations
from pydantic import Field
from agentic_backend.core.agents.v2.authoring import (
ReActAgent,
ToolContext,
ToolOutput,
tool,
)
@tool(tool_ref="sample.math.add", description="Add two numbers.")
def add_numbers(ctx: ToolContext, left: float, right: float) -> ToolOutput:
total = left + right
return ctx.json({"left": left, "right": right, "total": total}, text=f"{total}")
class Definition(ReActAgent):
agent_id: str = "sample.tutorial.tools.v2"
role: str = "Tutorial Tools Sample"
description: str = "Simple v2 sample agent with tiny Python tools."
tools = (add_numbers,)
system_prompt_template: str = Field(
default="You are a concise tutorial assistant. Use tools when useful.",
min_length=1,
)For a project-local custom agent, register the class path directly:
# agentic-backend/config/agents_catalog.yaml
version: v1
agents:
- id: "MyTutorialV2"
name: "MyTutorialV2"
type: "agent"
class_path: "agentic_backend.agents.v2.samples.tutorial_tools.Definition"
enabled: trueFor built-in stable definitions, use definition_ref (for example v2.react.basic).
The runtime resolves models through models_catalog.yaml:
default_profile_by_capability defines baseline profilesprofiles defines concrete providers/models/settingsrules optionally route by team/user/agent/operationKeep this separation:
You can mix:
@toolPrefer simple local tools first, then add MCP only when needed.
agents_catalog.yaml without import errors.Recommended lifecycle for new work:
agents/v2/samples/.agents/v2/candidate/<agent_name>/.agents/v2/production/<agent_name>/ when stable.definition_ref only for stable published definitions.