高级 SQLite 会话
AdvancedSQLiteSession 是基础SQLiteSession 的增强版本,提供包括会话分支、详细用量分析和结构化会话查询在内的高级对话管理能力。
功能
- 会话分支: 可从任意用户消息创建替代性的对话路径
- 用量跟踪: 每一轮的详细 token 用量分析,并提供完整的 JSON 明细
- 结构化查询: 按轮次获取会话、工具使用统计等
- 分支管理: 独立的分支切换与管理
- 消息结构元数据: 追踪消息类型、工具使用和会话流转
快速开始
fromagentsimportAgent,Runnerfromagents.extensions.memoryimportAdvancedSQLiteSession# Create agentagent=Agent(name="Assistant",instructions="Reply very concisely.",)# Create an advanced sessionsession=AdvancedSQLiteSession(session_id="conversation_123",db_path="conversations.db",create_tables=True)# First conversation turnresult=awaitRunner.run(agent,"What city is the Golden Gate Bridge in?",session=session)print(result.final_output)# "San Francisco"# IMPORTANT: Store usage dataawaitsession.store_run_usage(result)# Continue conversationresult=awaitRunner.run(agent,"What state is it in?",session=session)print(result.final_output)# "California"awaitsession.store_run_usage(result)初始化
fromagents.extensions.memoryimportAdvancedSQLiteSession# Basic initializationsession=AdvancedSQLiteSession(session_id="my_conversation",create_tables=True# Auto-create advanced tables)# With persistent storagesession=AdvancedSQLiteSession(session_id="user_123",db_path="path/to/conversations.db",create_tables=True)# With custom loggerimportlogginglogger=logging.getLogger("my_app")session=AdvancedSQLiteSession(session_id="session_456",create_tables=True,logger=logger)参数
session_id(str): 会话会话的唯一标识符db_path(str | Path): SQLite 数据库文件路径。默认为:memory:(内存存储)create_tables(bool): 是否自动创建高级表。默认Falselogger(logging.Logger | None): 会话的自定义日志记录器。默认使用模块级 logger
用量跟踪
AdvancedSQLiteSession 通过按对话轮次存储 token 用量数据提供详细的用量分析。这完全依赖于在每次智能体运行后调用store_run_usage 方法。
存储用量数据
# After each agent run, store the usage dataresult=awaitRunner.run(agent,"Hello",session=session)awaitsession.store_run_usage(result)# This stores:# - Total tokens used# - Input/output token breakdown# - Request count# - Detailed JSON token information (if available)获取用量统计
# Get session-level usage (all branches)session_usage=awaitsession.get_session_usage()ifsession_usage:print(f"Total requests:{session_usage['requests']}")print(f"Total tokens:{session_usage['total_tokens']}")print(f"Input tokens:{session_usage['input_tokens']}")print(f"Output tokens:{session_usage['output_tokens']}")print(f"Total turns:{session_usage['total_turns']}")# Get usage for specific branchbranch_usage=awaitsession.get_session_usage(branch_id="main")# Get usage by turnturn_usage=awaitsession.get_turn_usage()forturn_datainturn_usage:print(f"Turn{turn_data['user_turn_number']}:{turn_data['total_tokens']} tokens")ifturn_data['input_tokens_details']:print(f" Input details:{turn_data['input_tokens_details']}")ifturn_data['output_tokens_details']:print(f" Output details:{turn_data['output_tokens_details']}")# Get usage for specific turnturn_2_usage=awaitsession.get_turn_usage(user_turn_number=2)会话分支
AdvancedSQLiteSession 的一项关键功能是能够从任意用户消息创建会话分支,从而探索替代性的对话路径。
创建分支
# Get available turns for branchingturns=awaitsession.get_conversation_turns()forturninturns:print(f"Turn{turn['turn']}:{turn['content']}")print(f"Can branch:{turn['can_branch']}")# Create a branch from turn 2branch_id=awaitsession.create_branch_from_turn(2)print(f"Created branch:{branch_id}")# Create a branch with custom namebranch_id=awaitsession.create_branch_from_turn(2,branch_name="alternative_path")# Create branch by searching for contentbranch_id=awaitsession.create_branch_from_content("weather",branch_name="weather_focus")分支管理
# List all branchesbranches=awaitsession.list_branches()forbranchinbranches:current=" (current)"ifbranch["is_current"]else""print(f"{branch['branch_id']}:{branch['user_turns']} turns,{branch['message_count']} messages{current}")# Switch between branchesawaitsession.switch_to_branch("main")awaitsession.switch_to_branch(branch_id)# Delete a branchawaitsession.delete_branch(branch_id,force=True)# force=True allows deleting current branch分支工作流示例
# Original conversationresult=awaitRunner.run(agent,"What's the capital of France?",session=session)awaitsession.store_run_usage(result)result=awaitRunner.run(agent,"What's the weather like there?",session=session)awaitsession.store_run_usage(result)# Create branch from turn 2 (weather question)branch_id=awaitsession.create_branch_from_turn(2,"weather_focus")# Continue in new branch with different questionresult=awaitRunner.run(agent,"What are the main tourist attractions in Paris?",session=session)awaitsession.store_run_usage(result)# Switch back to main branchawaitsession.switch_to_branch("main")# Continue original conversationresult=awaitRunner.run(agent,"How expensive is it to visit?",session=session)awaitsession.store_run_usage(result)结构化查询
AdvancedSQLiteSession 提供多种方法来分析会话结构与内容。
会话分析
# Get conversation organized by turnsconversation_by_turns=awaitsession.get_conversation_by_turns()forturn_num,itemsinconversation_by_turns.items():print(f"Turn{turn_num}:{len(items)} items")foriteminitems:ifitem["tool_name"]:print(f" -{item['type']} (tool:{item['tool_name']})")else:print(f" -{item['type']}")# Get tool usage statisticstool_usage=awaitsession.get_tool_usage()fortool_name,count,turnintool_usage:print(f"{tool_name}: used{count} times in turn{turn}")# Find turns by contentmatching_turns=awaitsession.find_turns_by_content("weather")forturninmatching_turns:print(f"Turn{turn['turn']}:{turn['content']}")消息结构
会话会自动追踪以下消息结构信息:
- 消息类型(user、assistant、tool_call 等)
- 工具调用的工具名称
- 轮次编号与序列号
- 分支关联
- 时间戳
数据库模式
AdvancedSQLiteSession 在基础 SQLite 模式之上扩展了两个附加表:
message_structure 表
CREATETABLEmessage_structure(idINTEGERPRIMARYKEYAUTOINCREMENT,session_idTEXTNOTNULL,message_idINTEGERNOTNULL,branch_idTEXTNOTNULLDEFAULT'main',message_typeTEXTNOTNULL,sequence_numberINTEGERNOTNULL,user_turn_numberINTEGER,branch_turn_numberINTEGER,tool_nameTEXT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(session_id)REFERENCESagent_sessions(session_id)ONDELETECASCADE,FOREIGNKEY(message_id)REFERENCESagent_messages(id)ONDELETECASCADE);turn_usage 表
CREATETABLEturn_usage(idINTEGERPRIMARYKEYAUTOINCREMENT,session_idTEXTNOTNULL,branch_idTEXTNOTNULLDEFAULT'main',user_turn_numberINTEGERNOTNULL,requestsINTEGERDEFAULT0,input_tokensINTEGERDEFAULT0,output_tokensINTEGERDEFAULT0,total_tokensINTEGERDEFAULT0,input_tokens_detailsJSON,output_tokens_detailsJSON,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(session_id)REFERENCESagent_sessions(session_id)ONDELETECASCADE,UNIQUE(session_id,branch_id,user_turn_number));完整示例
查看完整示例,全面演示所有功能。
API 参考
AdvancedSQLiteSession- 主类Session- 基础会话协议