本示例演示了如何构建一个能够跨多轮管理其状态的具有状态的代理。
from textwrap import dedent
from agno.agent import Agent
from agno.models.openai import OpenAIChat
# 定义管理购物列表的工具
def add_item(agent: Agent, item: str) -> str:
"""将商品添加到购物列表并返回确认信息。"""
# 如果商品不在列表中,则添加
if item.lower() not in [i.lower() for i in agent.session_state["shopping_list"]]:
agent.session_state["shopping_list"].append(item)
return f"已将 '{item}' 添加到购物列表"
else:
return f"'{item}' 已在购物列表中"
def remove_item(agent: Agent, item: str) -> str:
"""按名称从购物列表中移除商品。"""
# 忽略大小写搜索
for i, list_item in enumerate(agent.session_state["shopping_list"]):
if list_item.lower() == item.lower():
agent.session_state["shopping_list"].pop(i)
return f"已从购物列表中移除 '{list_item}'"
return f"在购物列表中未找到 '{item}'"
def list_items(agent: Agent) -> str:
"""列出购物列表中的所有商品。"""
shopping_list = agent.session_state["shopping_list"]
if not shopping_list:
return "购物列表为空。"
items_text = "\n".join([f"- {item}" for item in shopping_list])
return f"当前的购物列表:\n{items_text}"
# 创建一个维护状态的购物列表管理器代理
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
# 使用一个空的购物列表初始化会话状态
session_state={"shopping_list": []},
tools=[add_item, remove_item, list_items],
# 您可以使用来自会话状态的变量来编写指令
instructions=dedent("""\
你的工作是管理一个购物列表。
购物列表一开始是空的。你可以添加商品、按名称移除商品以及列出所有商品。
当前的购物列表: {shopping_list}
"""),
add_state_in_messages=True,
markdown=True,
)
# 示例用法
agent.print_response("在购物列表中添加牛奶、鸡蛋和面包", stream=True)
print(f"会话状态: {agent.session_state}")
agent.print_response("我买了面包", stream=True)
print(f"会话状态: {agent.session_state}")
agent.print_response("我需要苹果和橘子", stream=True)
print(f"会话状态: {agent.session_state}")
agent.print_response("我的列表里有什么?", stream=True)
print(f"会话状态: {agent.session_state}")
agent.print_response(
"清空我的列表,然后重新开始,只保留香蕉和酸奶",
stream=True,
)
print(f"会话状态: {agent.session_state}")
创建虚拟环境
打开 Terminal
并创建一个 python 虚拟环境。
python3 -m venv .venv
source .venv/bin/activate
设置你的 API 密钥
export OPENAI_API_KEY=xxx
安装库
pip install -U openai agno
运行示例
python cookbook/agent_concepts/state/shopping_list.py