- **Name**: agent-builder
This skill inherits all available tools. When active, it can use any tool Claude has access to.
Provides intelligent assistance for building AI agents with the DAPR Agents framework. Validates configuration, suggests patterns, and ensures best practices.
This skill activates when detecting:
*_agent.py, *agent*.py)dapr_agents or dapr-agents@tool decoratorValidates agent setup:
Suggests appropriate patterns based on use case:
Validates tool definitions:
@tool decorator presentRecommends memory configuration:
Validates LLM setup:
# Required elements:
from dapr_agents import AssistantAgent
agent = AssistantAgent(
name="...", # Required: unique identifier
role="...", # Required: agent's role
instructions="...", # Required: system prompt
tools=[...], # Optional: list of tools
model="...", # Optional: LLM model (default: gpt-4o)
)
# Recommended pattern:
from dapr_agents import tool
from pydantic import BaseModel, Field
class ToolInput(BaseModel):
"""Input validation with descriptions."""
param: str = Field(..., description="Parameter description")
@tool
async def my_tool(input: ToolInput) -> str:
"""
Tool description for LLM.
Args:
input: Validated input parameters
Returns:
Tool result
"""
# Implementation
return result
# Durable agent pattern:
from dapr.ext.workflow import workflow, activity
@activity
async def agent_activity(ctx, data: dict) -> dict:
"""Durable activity with agent logic."""
pass
@workflow
def agent_workflow(ctx: DaprWorkflowContext, data: dict):
"""Workflow orchestrating agent activities."""
result = yield ctx.call_activity(agent_activity, input=data)
return result
When building agents, ensure:
namerole describing purposeinstructions for LLMmodel selectedtemperature set for use case@tool decorator# Bad: LLM won't know when to use
@tool
def my_tool(x: str) -> str:
return x.upper()
# Good: Clear purpose
@tool
def my_tool(x: str) -> str:
"""Convert text to uppercase for formatting."""
return x.upper()
# Bad: Blocks event loop
@tool
def fetch_data(url: str) -> str:
return requests.get(url).text
# Good: Async for I/O
@tool
async def fetch_data(url: str) -> str:
async with httpx.AsyncClient() as client:
return (await client.get(url)).text
# Bad: Security risk
client = OpenAI(api_key="sk-...")
# Good: Environment variable
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# Bad: No validation
@tool
def process(data: dict) -> str:
return data["key"] # May fail
# Good: Pydantic validation
class ProcessInput(BaseModel):
key: str = Field(..., min_length=1)
@tool
def process(input: ProcessInput) -> str:
return input.key
agent = AssistantAgent(
name="assistant",
role="Helpful Assistant",
instructions="Help users with their questions.",
tools=[tool1, tool2],
model="gpt-4o"
)
@activity
async def research(ctx, topic: str) -> str:
agent = AssistantAgent(...)
return await agent.run(f"Research: {topic}")
@workflow
def research_workflow(ctx: DaprWorkflowContext, topic: str):
result = yield ctx.call_activity(research, input=topic)
return result
@app.post("/chat")
async def chat(request: ChatRequest):
response = await agent.run(request.message)
return {"response": response}
specialists = {
"technical": technical_agent,
"support": support_agent,
}
router = AssistantAgent(
name="router",
instructions="Route to appropriate specialist..."
)
Required for agent operation:
# LLM Configuration
OPENAI_API_KEY=sk-... # OpenAI API key
AZURE_OPENAI_API_KEY=... # Azure OpenAI key
AZURE_OPENAI_ENDPOINT=... # Azure endpoint
LLM_MODEL=gpt-4o # Default model
# DAPR Configuration
DAPR_HTTP_PORT=3500 # DAPR sidecar port
DAPR_GRPC_PORT=50001 # DAPR gRPC port
# State Store
STATE_STORE_NAME=statestore # DAPR state store name
# Pub/Sub
PUBSUB_NAME=pubsub # DAPR pub/sub name
Use the /dapr:agent command to generate agent templates:
/dapr:agent assistant my-agent # Basic assistant
/dapr:agent durable my-agent # Workflow-backed
/dapr:agent service my-agent # REST API agent
/dapr:agent multi my-system # Multi-agent
templates/agents/templates/agents/patterns/templates/agents/tools/templates/integrations/