EsempioscriptadvancedEseguibiletool-agent
Livello 3: Agente con chiamata di strumenti — Autonomia circoscritta
L’agente decide quali strumenti chiamare e in quale ordine, ma solo all’interno di un insieme fisso di capacità ben definite.
Fatti chiave
- Livello
- advanced
- Runtime
- Python • Pydantic + Python Dotenv
- Pattern
- Agent autonomy inside a fixed capability boundary
- Interazione
- Sandbox live • Script
- Aggiornato
- 14 marzo 2026
Naviga questo esempio
Libreria
Sfoglia gli esempiRiapri la libreria completa per confrontare pattern vicini e percorsi collegati.Interazione
Esegui ora nel sandboxProva l'interazione direttamente nella superficie guidata di questo esempio.Sorgente
Apri codice completoLeggi l'implementazione reale, i punti evidenziati e i requisiti runtime.MCP
Chiama via MCPUsa la stessa risorsa dentro agenti, export deterministici e setup MCP.
Principi collegati
3-tool-calling-agent.py
python
"""
Level 3: Tool-Calling Agent — Scoped Autonomy
The agent decides which tools to call and in what order,
but only within a fixed set of well-defined capabilities.
"""
from dataclasses import dataclass
from pydantic import BaseModel
from pydantic_ai import Agent, RunContext
from dotenv import load_dotenv
from utils import print_agent_trace
import nest_asyncio
load_dotenv()
nest_asyncio.apply()
# --- Dependencies ---
@dataclass
class CustomerDeps:
customer_id: str
db: dict # simplified — in production this would be a real DB client
# --- Output ---
class BillingResolution(BaseModel):
action_taken: str
refund_amount: float | None
follow_up_needed: bool
# --- Agent ---
billing_agent = Agent(
"anthropic:claude-sonnet-4-6",
deps_type=CustomerDeps,
output_type=BillingResolution,
system_prompt=(
"You are a billing support agent. Use the available tools to look up "
"customer data, check policies, and resolve billing issues. "
"Always verify the charge before issuing a refund."
),
)
# --- Tools (the agent decides when and how to use these) ---
@billing_agent.tool
async def get_customer_balance(ctx: RunContext[CustomerDeps]) -> str:
balance = ctx.deps.db.get("balance", 0)
return f"Current balance: ${balance:.2f}"
@billing_agent.tool
async def get_recent_charges(ctx: RunContext[CustomerDeps]) -> str:
charges = ctx.deps.db.get("charges", [])
return "\n".join(
f"- ${c['amount']:.2f} on {c['date']}: {c['description']}" for c in charges
)
@billing_agent.tool
async def check_refund_policy(
ctx: RunContext[CustomerDeps], charge_description: str
) -> str:
return (
f"Policy for '{charge_description}': "
"Duplicate charges are eligible for automatic refund within 30 days. "
"Refunds over $100 require manager approval."
)
@billing_agent.tool
async def issue_refund(
ctx: RunContext[CustomerDeps], amount: float, reason: str
) -> str:
return f"Refund of ${amount:.2f} issued successfully. Reason: {reason}"
# --- Run ---
if __name__ == "__main__":
import asyncio
deps = CustomerDeps(
customer_id="cust_12345",
db={
"balance": 149.97,
"charges": [
{
"amount": 49.99,
"date": "2025-02-01",
"description": "Monthly subscription",
},
{
"amount": 49.99,
"date": "2025-02-01",
"description": "Monthly subscription",
},
{
"amount": 49.99,
"date": "2025-01-01",
"description": "Monthly subscription",
},
],
},
)
result = asyncio.run(
billing_agent.run(
"I was charged twice on Feb 1st for my subscription. Please fix this.",
deps=deps,
)
)
print_agent_trace(result)
print(f"\nAction: {result.output.action_taken}")
print(f"Refund: ${result.output.refund_amount}")
print(f"Follow-up needed: {result.output.follow_up_needed}")
Principi correlati
- P1delegationProgettare per la delega piuttosto che per la manipolazione direttaProgettare esperienze attorno all'assegnazione del lavoro, l'espressione dell'intento, l'impostazione dei vincoli e la revisione dei risultati, piuttosto che richiedere agli utenti di eseguire manualmente ogni passaggio.Apri il principio →
- P5delegationSostituire la magia implicita con modelli mentali chiariIl prodotto dovrebbe aiutare gli utenti a comprendere cosa il sistema può fare, cosa sta facendo attualmente, cosa non può fare e quali condizioni governano il suo comportamento.Apri il principio →
- P9orchestrationRappresentare il lavoro delegato come un sistema, non solo come una conversazioneDove il lavoro coinvolge più passaggi, agenti, dipendenze o attività concorrenti, dovrebbe essere rappresentato come un sistema strutturato piuttosto che solo come un flusso di messaggi.Apri il principio →
- P10delegationOttimizzare per la guida, non solo per l'inizioIl sistema dovrebbe supportare gli utenti non solo nell'avvio dei compiti, ma anche nella guida, nel perfezionamento, nella riprioritizzazione e nella correzione del lavoro mentre è in corso.Apri il principio →