Pydantic AI Agent

Examples of using the Agentuity Python SDK with Pydantic

Basic Pydantic AI Agent

Example taken from: https://ai.pydantic.dev/agents/#introduction

import random # Added for random number generation
from pydantic_ai import Agent, RunContext
from agentuity import AgentRequest, AgentResponse, AgentContext
 
# A pydantic agent
roulette_agent = Agent(
    'openai:gpt-4o',
    deps_type=int,
    output_type=bool,
    system_prompt=(
        'Use the `roulette_wheel` function to see if the '
        'customer has won based on the number they provide.'
    ),
)
 
# A tool for the pydantic agent
@roulette_agent.tool
async def roulette_wheel(ctx: RunContext[int], square: int) -> str:
    """check if the square is a winner"""
    return 'winner' if square == ctx.deps else 'loser'
 
async def run(request: AgentRequest, response: AgentResponse, context: AgentContext):
		# Spin that wheel!
    success_number = random.randint(0, 20)  
 
		# Pull out the user query from the request
    user_query = await request.data.text()
    if not user_query:
        user_query = random.randint(0, 20)
 
    context.logger.info("User query: %s, Winning number: %s", user_query, success_number)
 
    try:
        context.logger.info("Calling PydanticAI roulette agent with query: '%s' and deps: %s", user_query, success_number)
        
        pydantic_ai_result = await roulette_agent.run(
            user_query,
            deps=success_number
        )
        context.logger.info("PydanticAI result output: %s", pydantic_ai_result.output)
 
        return response.json({
            "won": pydantic_ai_result.output, 
            "details": "Bet processed by PydanticAI roulette agent.",
            "user_query": user_query,
            "success_number": success_number
        })
 
    except Exception as e:
        context.logger.error("Error running PydanticAI agent: %s", e)
        return response.json({"error": str(e)}, status_code=500)

More advanced Pydantic AI agent - Bank support agent

Taken from: https://ai.pydantic.dev/examples/bank-support/#example-code

from dataclasses import dataclass
from pydantic import BaseModel, Field
from pydantic_ai import Agent, RunContext
from agentuity import AgentRequest, AgentResponse, AgentContext
 
class DatabaseConn:
    """This is a fake database for example purposes.
 
    In reality, you'd be connecting to an external database
    (e.g. PostgreSQL) to get information about customers.
    """
 
    @classmethod
    async def customer_name(cls, *, id: int) -> str | None:
        if id == 123:
            return "John"
        # Return None or raise an error for other IDs if needed
        return None
 
    @classmethod
    async def customer_balance(cls, *, id: int, include_pending: bool) -> float:
        if (
            id == 123
        ):  # and include_pending: # Example always shows balance if id is 123
            return 123.45
        else:
            # PydanticAI example raises ValueError, which is fine for tools
            # if the LLM is expected to handle/retry based on it.
            raise ValueError("Customer not found or query parameters invalid")
 
@dataclass
class SupportDependencies:
    customer_id: int
    db: DatabaseConn
 
class SupportOutput(BaseModel):
    support_advice: str = Field(description="Advice returned to the customer")
    block_card: bool = Field(description="Whether to block their card or not")
    risk: int = Field(description="Risk level of query", ge=0, le=10)
 
# --- PydanticAI Agent Definition (from Example) ---
 
support_agent = Agent(
    "openai:gpt-4o",  # Or your preferred LLM
    deps_type=SupportDependencies,
    output_type=SupportOutput,
    system_prompt=(
        "You are a support agent in our bank, give the "
        "customer support and judge the risk level of their query. "
        "Reply using the customer's name."
    ),
)
 
@support_agent.system_prompt
async def add_customer_name(ctx: RunContext[SupportDependencies]) -> str:
    customer_name = await ctx.deps.db.customer_name(id=ctx.deps.customer_id)
    if customer_name:
        return f"The customer's name is {customer_name!r}."
    return "The customer's name could not be determined."
 
@support_agent.tool
async def customer_balance(
    ctx: RunContext[SupportDependencies], include_pending: bool
) -> str:
    """Returns the customer's current account balance."""
    try:
        balance = await ctx.deps.db.customer_balance(
            id=ctx.deps.customer_id,
            include_pending=include_pending,
        )
        return f"${balance:.2f}"
    except ValueError as e:
        # Let the LLM know the tool failed and why
        return f"Could not retrieve balance: {e}"
 
# --- Agentuity Agent Entry Point ---
async def run(request: AgentRequest, response: AgentResponse, context: AgentContext):
    context.logger.info("BankSupport agent initiated.")
 
    user_query = await request.data.text()
    if not user_query:
        user_query = "What is my balance?"  # Default query
        context.logger.info("No user query provided, using default: '%s'", user_query)
 
    # For this example, we'll use a hardcoded customer ID and instantiate the DB.
    # In a real scenario, customer_id might come from the request or session.
    customer_id = 123
    db_instance = DatabaseConn()
 
    dependencies = SupportDependencies(customer_id=customer_id, db=db_instance)
 
    context.logger.info(
        "Calling PydanticAI support_agent with query: '%s' for customer_id: %s",
        user_query,
        customer_id,
    )
 
    try:
        pydantic_ai_result = await support_agent.run(user_query, deps=dependencies)
 
        output_data = pydantic_ai_result.output
        context.logger.info("PydanticAI support_agent output: %s", output_data)
 
        return response.json(output_data.model_dump())
 
    except Exception as e:
        context.logger.error(
            "Error running PydanticAI support_agent: %s", e, exc_info=True
        )
        return response.json(
            {
                "error": str(e),
                "details": "An unexpected error occurred in the BankSupport agent.",
            },
            status_code=500,
        )

Need Help?

Join our DiscordCommunity for assistance or just to hang with other humans building agents.

Send us an email at hi@agentuity.com if you'd like to get in touch.

Please Follow us on

If you haven't already, please Signup for your free account now and start building your first agent!

On this page