chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
from pathlib import Path
|
||||
from textwrap import dedent
|
||||
from pydantic import BaseModel, Field
|
||||
from pydantic_ai import Agent, RunContext
|
||||
from pydantic_ai.ag_ui import StateDeps
|
||||
from ag_ui.core import EventType, StateSnapshotEvent
|
||||
from pydantic_ai.models.openai import OpenAIResponsesModel
|
||||
|
||||
# load environment variables
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
|
||||
load_dotenv()
|
||||
|
||||
|
||||
# =====
|
||||
# State
|
||||
# =====
|
||||
class ProverbsState(BaseModel):
|
||||
"""List of the proverbs being written."""
|
||||
|
||||
proverbs: list[str] = Field(
|
||||
default_factory=list,
|
||||
description="The list of already written proverbs",
|
||||
)
|
||||
|
||||
|
||||
# =====
|
||||
# Agent
|
||||
# =====
|
||||
agent = Agent(
|
||||
model=OpenAIResponsesModel("gpt-4.1-mini"),
|
||||
deps_type=StateDeps[ProverbsState],
|
||||
system_prompt=dedent("""
|
||||
You are a helpful assistant that helps manage and discuss proverbs.
|
||||
|
||||
The user has a list of proverbs that you can help them manage.
|
||||
You have tools available to add, set, or retrieve proverbs from the list.
|
||||
|
||||
When discussing proverbs, ALWAYS use the get_proverbs tool to see the current list before
|
||||
mentioning, updating, or discussing proverbs with the user.
|
||||
""").strip(),
|
||||
)
|
||||
|
||||
|
||||
# =====
|
||||
# Tools
|
||||
# =====
|
||||
@agent.tool
|
||||
def get_proverbs(ctx: RunContext[StateDeps[ProverbsState]]) -> list[str]:
|
||||
"""Get the current list of proverbs."""
|
||||
print(f"📖 Getting proverbs: {ctx.deps.state.proverbs}")
|
||||
return ctx.deps.state.proverbs
|
||||
|
||||
|
||||
@agent.tool
|
||||
async def add_proverbs(
|
||||
ctx: RunContext[StateDeps[ProverbsState]], proverbs: list[str]
|
||||
) -> StateSnapshotEvent:
|
||||
ctx.deps.state.proverbs.extend(proverbs)
|
||||
return StateSnapshotEvent(
|
||||
type=EventType.STATE_SNAPSHOT,
|
||||
snapshot=ctx.deps.state,
|
||||
)
|
||||
|
||||
|
||||
@agent.tool
|
||||
async def set_proverbs(
|
||||
ctx: RunContext[StateDeps[ProverbsState]], proverbs: list[str]
|
||||
) -> StateSnapshotEvent:
|
||||
ctx.deps.state.proverbs = proverbs
|
||||
return StateSnapshotEvent(
|
||||
type=EventType.STATE_SNAPSHOT,
|
||||
snapshot=ctx.deps.state,
|
||||
)
|
||||
|
||||
|
||||
@agent.tool
|
||||
def get_weather(_: RunContext[StateDeps[ProverbsState]], location: str) -> str:
|
||||
"""Get the weather for a given location. Ensure location is fully spelled out."""
|
||||
return f"The weather in {location} is sunny."
|
||||
@@ -0,0 +1,23 @@
|
||||
from agent import ProverbsState, StateDeps, agent
|
||||
from starlette.applications import Starlette
|
||||
from starlette.responses import JSONResponse
|
||||
from starlette.routing import Mount, Route
|
||||
|
||||
agui_app = agent.to_ag_ui(deps=StateDeps(ProverbsState()))
|
||||
|
||||
|
||||
async def health(request):
|
||||
return JSONResponse({"status": "ok"})
|
||||
|
||||
|
||||
app = Starlette(
|
||||
routes=[
|
||||
Route("/health", health),
|
||||
Mount("/", app=agui_app),
|
||||
]
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
|
||||
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
|
||||
Reference in New Issue
Block a user