고급 SQLite 세션
AdvancedSQLiteSession은 기본SQLiteSession을 확장한 버전으로, 대화 분기, 상세 사용량 분석, 구조화된 대화 쿼리 등 고급 대화 관리 기능을 제공합니다.
기능
- 대화 분기: 임의의 사용자 메시지에서 대체 대화 경로 생성
- 사용량 추적: 각 턴별 토큰 사용량을 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): 세션에 사용할 커스텀 로거. 모듈 로거가 기본값
사용량 추적
AdvancedSQLiteSession은 대화의 각 턴별 토큰 사용 데이터를 저장하여 상세 사용량 분석을 제공합니다.이는 각 에이전트 실행 후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- 기본 세션 프로토콜