--- search: exclude: true --- # 고급 SQLite 세션 `AdvancedSQLiteSession`은 기본 `SQLiteSession`의 향상된 버전으로, 대화 분기, 상세 사용량 분석, 구조화된 대화 쿼리 등 고급 대화 관리 기능을 제공합니다. ## 기능 - **대화 분기**: 모든 사용자 메시지에서 대체 대화 경로를 생성 - **사용량 추적**: 전체 JSON 세부 내역과 함께 턴별 상세 토큰 사용량 분석 - **구조화된 쿼리**: 턴별 대화, 도구 사용 통계 등을 조회 - **분기 관리**: 독립적인 분기 전환 및 관리 - **메시지 구조 메타데이터**: 메시지 유형, 도구 사용, 대화 흐름 추적 ## 빠른 시작 ```python from agents import Agent, Runner from agents.extensions.memory import AdvancedSQLiteSession # Create agent agent = Agent( name="Assistant", instructions="Reply very concisely.", ) # Create an advanced session session = AdvancedSQLiteSession( session_id="conversation_123", db_path="conversations.db", create_tables=True ) # First conversation turn result = await Runner.run( agent, "What city is the Golden Gate Bridge in?", session=session ) print(result.final_output) # "San Francisco" # IMPORTANT: Store usage data await session.store_run_usage(result) # Continue conversation result = await Runner.run( agent, "What state is it in?", session=session ) print(result.final_output) # "California" await session.store_run_usage(result) ``` ## 초기화 ```python from agents.extensions.memory import AdvancedSQLiteSession # Basic initialization session = AdvancedSQLiteSession( session_id="my_conversation", create_tables=True # Auto-create advanced tables ) # With persistent storage session = AdvancedSQLiteSession( session_id="user_123", db_path="path/to/conversations.db", create_tables=True ) # With custom logger import logging logger = 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): 고급 테이블을 자동으로 생성할지 여부. 기본값은 `False` - `logger` (logging.Logger | None): 세션용 사용자 지정 로거. 기본값은 모듈 로거 ## 사용량 추적 AdvancedSQLiteSession은 대화 턴별 토큰 사용량 데이터를 저장하여 상세한 사용량 분석을 제공합니다. **이는 각 에이전트 실행 후 `store_run_usage` 메서드가 호출되는지에 전적으로 의존합니다.** ### 사용량 데이터 저장 ```python # After each agent run, store the usage data result = await Runner.run(agent, "Hello", session=session) await session.store_run_usage(result) # This stores: # - Total tokens used # - Input/output token breakdown # - Request count # - Detailed JSON token information (if available) ``` ### 사용량 통계 조회 ```python # Get session-level usage (all branches) session_usage = await session.get_session_usage() if session_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 branch branch_usage = await session.get_session_usage(branch_id="main") # Get usage by turn turn_usage = await session.get_turn_usage() for turn_data in turn_usage: print(f"Turn {turn_data['user_turn_number']}: {turn_data['total_tokens']} tokens") if turn_data['input_tokens_details']: print(f" Input details: {turn_data['input_tokens_details']}") if turn_data['output_tokens_details']: print(f" Output details: {turn_data['output_tokens_details']}") # Get usage for specific turn turn_2_usage = await session.get_turn_usage(user_turn_number=2) ``` ## 대화 분기 AdvancedSQLiteSession의 핵심 기능 중 하나는 모든 사용자 메시지에서 대화 분기를 생성하여 대체 대화 경로를 탐색할 수 있는 기능입니다. ### 분기 생성 ```python # Get available turns for branching turns = await session.get_conversation_turns() for turn in turns: print(f"Turn {turn['turn']}: {turn['content']}") print(f"Can branch: {turn['can_branch']}") # Create a branch from turn 2 branch_id = await session.create_branch_from_turn(2) print(f"Created branch: {branch_id}") # Create a branch with custom name branch_id = await session.create_branch_from_turn( 2, branch_name="alternative_path" ) # Create branch by searching for content branch_id = await session.create_branch_from_content( "weather", branch_name="weather_focus" ) ``` ### 분기 관리 ```python # List all branches branches = await session.list_branches() for branch in branches: current = " (current)" if branch["is_current"] else "" print(f"{branch['branch_id']}: {branch['user_turns']} turns, {branch['message_count']} messages{current}") # Switch between branches await session.switch_to_branch("main") await session.switch_to_branch(branch_id) # Delete a branch await session.delete_branch(branch_id, force=True) # force=True allows deleting current branch ``` ### 분기 워크플로 예제 ```python # Original conversation result = await Runner.run(agent, "What's the capital of France?", session=session) await session.store_run_usage(result) result = await Runner.run(agent, "What's the weather like there?", session=session) await session.store_run_usage(result) # Create branch from turn 2 (weather question) branch_id = await session.create_branch_from_turn(2, "weather_focus") # Continue in new branch with different question result = await Runner.run( agent, "What are the main tourist attractions in Paris?", session=session ) await session.store_run_usage(result) # Switch back to main branch await session.switch_to_branch("main") # Continue original conversation result = await Runner.run( agent, "How expensive is it to visit?", session=session ) await session.store_run_usage(result) ``` ## 구조화된 쿼리 AdvancedSQLiteSession은 대화 구조와 내용을 분석하기 위한 여러 메서드를 제공합니다. ### 대화 분석 ```python # Get conversation organized by turns conversation_by_turns = await session.get_conversation_by_turns() for turn_num, items in conversation_by_turns.items(): print(f"Turn {turn_num}: {len(items)} items") for item in items: if item["tool_name"]: print(f" - {item['type']} (tool: {item['tool_name']})") else: print(f" - {item['type']}") # Get tool usage statistics tool_usage = await session.get_tool_usage() for tool_name, count, turn in tool_usage: print(f"{tool_name}: used {count} times in turn {turn}") # Find turns by content matching_turns = await session.find_turns_by_content("weather") for turn in matching_turns: print(f"Turn {turn['turn']}: {turn['content']}") ``` ### 메시지 구조 세션은 다음을 포함한 메시지 구조를 자동으로 추적합니다. - 메시지 유형(사용자, 어시스턴트, tool_call 등) - 도구 호출의 도구 이름 - 턴 번호 및 시퀀스 번호 - 분기 연결 - 타임스탬프 ## 데이터베이스 스키마 AdvancedSQLiteSession은 두 개의 추가 테이블로 기본 SQLite 스키마를 확장합니다. ### message_structure 테이블 ```sql CREATE TABLE message_structure ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, message_id INTEGER NOT NULL, branch_id TEXT NOT NULL DEFAULT 'main', message_type TEXT NOT NULL, sequence_number INTEGER NOT NULL, user_turn_number INTEGER, branch_turn_number INTEGER, tool_name TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (session_id) REFERENCES agent_sessions(session_id) ON DELETE CASCADE, FOREIGN KEY (message_id) REFERENCES agent_messages(id) ON DELETE CASCADE ); ``` ### turn_usage 테이블 ```sql CREATE TABLE turn_usage ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, branch_id TEXT NOT NULL DEFAULT 'main', user_turn_number INTEGER NOT NULL, requests INTEGER DEFAULT 0, input_tokens INTEGER DEFAULT 0, output_tokens INTEGER DEFAULT 0, total_tokens INTEGER DEFAULT 0, input_tokens_details JSON, output_tokens_details JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (session_id) REFERENCES agent_sessions(session_id) ON DELETE CASCADE, UNIQUE(session_id, branch_id, user_turn_number) ); ``` ## 전체 예제 모든 기능을 종합적으로 보여 주는 [전체 예제](https://github.com/openai/openai-agents-python/tree/main/examples/memory/advanced_sqlite_session_example.py)를 확인하세요. ## API 참조 - [`AdvancedSQLiteSession`][agents.extensions.memory.advanced_sqlite_session.AdvancedSQLiteSession] - 메인 클래스 - [`Session`][agents.memory.session.Session] - 기본 세션 프로토콜