Advanced SQLite sessions
Advanced SQLite sessions (고급 SQLite 세션)
AdvancedSQLiteSession은 기본 SQLiteSession의 향상된 버전으로, 대화 분기(branching), 상세 사용량 분석, 구조화된 대화 조회를 포함한 고급 대화 관리 기능을 제공해요.
출처: 문서
본문
기능
- 대화 분기: 어떤 사용자 메시지에서든 대체 대화 경로를 만들 수 있어요.
- 사용량 추적: 완전한 JSON 세부 정보와 함께 턴별 상세 토큰 사용량 분석.
- 구조화된 조회: 턴별 대화, 도구 사용 통계 등을 얻을 수 있어요.
- 분기 관리: 독립적 분기 전환·관리.
- 메시지 구조 메타데이터: 메시지 타입·도구 사용·대화 흐름 추적.
빨리 시작하기
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)
초기화
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="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 메서드를 호출하는 것에 달려 있어요.
사용량 데이터 저장
# 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)
사용량 통계 검색
# 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의 핵심 기능 중 하나는 어떤 사용자 메시지에서든 대화 분기를 만들어 대체 대화 경로를 탐색하는 거예요.
분기 만들기
# 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"
)
분기 ID는 세션 ID의 수명 동안 고유해요. 분기를 삭제하거나 세션을 지워도 그 대화 데이터는 제거되지만, 이전에 사용한 분기 ID를 다시 사용 가능하게 만들지는 않아요. 새 분기를 만들 때는 새 이름을 쓰세요.
분기 관리
# 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
분기 워크플로 예제
# 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은 대화 구조와 콘텐츠를 분석하는 여러 메서드를 제공해요.
대화 분석
# 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']}")
메시지 구조
세션은 자동으로 메시지 구조를 추적해요.
- 메시지 타입 값(user, assistant, tool_call 등)
- 도구 호출의 도구 이름
- 턴 번호와 시퀀스 번호
- 분기 연관
- 타임스탬프
데이터베이스 스키마
AdvancedSQLiteSession은 기본 SQLite 스키마를 세 개의 추가 테이블로 확장해요.
message_structure 테이블
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
);
branch_reservations 테이블
CREATE TABLE branch_reservations (
session_id TEXT NOT NULL,
branch_id TEXT NOT NULL,
PRIMARY KEY (session_id, branch_id)
);
이 테이블은 복사된 프리픽스가 빈 분기를 포함해 분기 ID를 원자적으로 예약해요. 예약 행은 분기가 삭제될 때와 세션이 지워질 때 둘 다 유지되므로, 오래된 세션 인스턴스가 같은 ID를 재사용한 이후 분기로 기록을 병합하지 못해요.
turn_usage 테이블
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)
);
완전한 예제
모든 기능의 종합적인 데모는 완전한 예제를 참고하세요.
API 레퍼런스
AdvancedSQLiteSession— 메인 클래스Session— 기본 세션 프로토콜
더 알아보기 (Learn more)
- OpenAI Agents SDK 문서에서 더 많은 가이드를 확인하세요.