本示例演示了如何在多用户环境中维护每个用户状态。

代码

cookbook/agent_concepts/state/session_state_user_id.py
import json

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.utils.log import log_info

# 用于存储用户购物列表的内存数据库
# 按用户 ID 和会话 ID 组织
shopping_list = {}


def add_item(agent: Agent, item: str) -> str:
    """向当前用户购物列表添加一个商品。"""
    current_user_id = agent.session_state["current_user_id"]
    current_session_id = agent.session_state["current_session_id"]
    shopping_list.setdefault(current_user_id, {}).setdefault(
        current_session_id, []
    ).append(item)
    return f"商品 {item} 已添加到购物列表"


def remove_item(agent: Agent, item: str) -> str:
    """从当前用户购物列表中移除一个商品。"""
    current_user_id = agent.session_state["current_user_id"]
    current_session_id = agent.session_state["current_session_id"]

    if (
        current_user_id not in shopping_list
        or current_session_id not in shopping_list[current_user_id]
    ):
        return f"未找到用户 {current_user_id} 和会话 {current_session_id} 的购物列表"

    if item not in shopping_list[current_user_id][current_session_id]:
        return f"未在用户 {current_user_id} 和会话 {current_session_id} 的购物列表中找到商品 '{item}'"

    shopping_list[current_user_id][current_session_id].remove(item)
    return f"商品 {item} 已从购物列表中移除"


def get_shopping_list(agent: Agent) -> str:
    """获取当前用户的购物列表。"""
    current_user_id = agent.session_state["current_user_id"]
    current_session_id = agent.session_state["current_session_id"]
    return f"用户 {current_user_id} 和会话 {current_session_id} 的购物列表: \n{json.dumps(shopping_list[current_user_id][current_session_id], indent=2)}"


# 创建一个维护状态的 Agent
agent = Agent(
    model=OpenAIChat(id="gpt-4o-mini"),
    tools=[add_item, remove_item, get_shopping_list],
    # 引用内存数据库
    instructions=[
        "当前用户 ID: {current_user_id}",
        "当前会话 ID: {current_session_id}",
    ],
    # 重要:在 instructions 中添加状态
    add_state_in_messages=True,
    markdown=True,
)

user_id_1 = "john_doe"
user_id_2 = "mark_smith"
user_id_3 = "carmen_sandiago"

# 示例用法
agent.print_response(
    "在购物列表中添加牛奶、鸡蛋和面包",
    stream=True,
    user_id=user_id_1,
    session_id="user_1_session_1",
)
agent.print_response(
    "添加玉米饼到购物列表",
    stream=True,
    user_id=user_id_2,
    session_id="user_2_session_1",
)
agent.print_response(
    "添加苹果和葡萄到购物列表",
    stream=True,
    user_id=user_id_3,
    session_id="user_3_session_1",
)
agent.print_response(
    "从购物列表中移除牛奶",
    stream=True,
    user_id=user_id_1,
    session_id="user_1_session_1",
)
agent.print_response(
    "添加碎牛肉到购物列表",
    stream=True,
    user_id=user_id_2,
    session_id="user_2_session_1",
)

# Mark Smith 的购物列表里有什么东西?
agent.print_response(
    "Mark Smith 的购物列表里有什么东西?",
    stream=True,
    user_id=user_id_2,
    session_id="user_2_session_1",
)

# 新会话,所以购物列表也新生成的
agent.print_response(
    "向我的列表添加鸡肉和汤。",
    stream=True,
    user_id=user_id_2,
    session_id="user_3_session_2",
)

print(f"最终购物列表: \n{json.dumps(shopping_list, indent=2)}")

使用方法

1

创建虚拟环境

打开 Terminal 并创建一个 python 虚拟环境。
python3 -m venv .venv
source .venv/bin/activate
2

设置您的 API 密钥

export OPENAI_API_KEY=xxx
3

安装库

pip install -U openai agno
4

运行示例

python cookbook/agent_concepts/state/session_state_user_id.py