claude-code-openai-wrapper/examples/session_continuity.py
2025-08-11 20:22:47 +05:30

202 lines
No EOL
7.4 KiB
Python

#!/usr/bin/env python3
"""
Example demonstrating session continuity with the Claude Code OpenAI API Wrapper.
This example shows how to use the optional session_id parameter to maintain
conversation context across multiple requests.
"""
import openai
# Configure OpenAI client to use the wrapper
client = openai.OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed" # The wrapper handles Claude authentication
)
def demo_session_continuity():
"""Demonstrate session continuity feature."""
print("🌟 Session Continuity Demo")
print("=" * 50)
# Define a session ID - this can be any string
session_id = "demo-conversation-123"
# First interaction - introduce context
print("\n📝 First Message (introducing context):")
response1 = client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[
{"role": "user", "content": "Hello! I'm working on a Python web API project using FastAPI. My name is Alex."}
],
# This is the key: include session_id for conversation continuity
extra_body={"session_id": session_id}
)
print(f"Claude: {response1.choices[0].message.content}")
# Second interaction - ask follow-up that requires memory
print("\n🔄 Second Message (testing memory):")
response2 = client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[
{"role": "user", "content": "What's my name and what type of project am I working on?"}
],
# Same session_id maintains the conversation context
extra_body={"session_id": session_id}
)
print(f"Claude: {response2.choices[0].message.content}")
# Third interaction - continue the conversation
print("\n🚀 Third Message (building on context):")
response3 = client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[
{"role": "user", "content": "Can you help me add authentication to my FastAPI project?"}
],
extra_body={"session_id": session_id}
)
print(f"Claude: {response3.choices[0].message.content}")
print("\n✨ Session continuity demo complete!")
print(f" Session ID used: {session_id}")
print(" All messages in this conversation were connected!")
def demo_stateless_vs_session():
"""Compare stateless vs session-based conversations."""
print("\n🔍 Stateless vs Session Comparison")
print("=" * 50)
# Stateless mode (traditional OpenAI behavior)
print("\n❌ Stateless Mode (no session_id):")
print("Message 1:")
client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": "My favorite programming language is Python."}]
# No session_id = stateless
)
print("Claude: [Responds to the message]")
print("\nMessage 2 (separate request):")
response_stateless = client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": "What's my favorite programming language?"}]
# No session_id = Claude has no memory of previous message
)
print(f"Claude: {response_stateless.choices[0].message.content[:100]}...")
# Session mode (with continuity)
print("\n✅ Session Mode (with session_id):")
session_id = "comparison-demo"
print("Message 1:")
client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": "My favorite programming language is JavaScript."}],
extra_body={"session_id": session_id}
)
print("Claude: [Responds and remembers]")
print("\nMessage 2 (same session):")
response_session = client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": "What's my favorite programming language?"}],
extra_body={"session_id": session_id}
)
print(f"Claude: {response_session.choices[0].message.content[:100]}...")
def demo_session_management():
"""Demonstrate session management endpoints."""
print("\n🛠 Session Management Demo")
print("=" * 50)
import requests
base_url = "http://localhost:8000"
# Create some sessions
session_ids = ["demo-session-1", "demo-session-2"]
for session_id in session_ids:
client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": f"Hello from {session_id}!"}],
extra_body={"session_id": session_id}
)
# List all sessions
print("\n📋 Active Sessions:")
sessions_response = requests.get(f"{base_url}/v1/sessions")
if sessions_response.status_code == 200:
sessions = sessions_response.json()
print(f" Total sessions: {sessions['total']}")
for session in sessions['sessions']:
print(f" - {session['session_id']}: {session['message_count']} messages")
# Get specific session info
print(f"\n🔍 Session Details for {session_ids[0]}:")
session_response = requests.get(f"{base_url}/v1/sessions/{session_ids[0]}")
if session_response.status_code == 200:
session_info = session_response.json()
print(f" Created: {session_info['created_at']}")
print(f" Messages: {session_info['message_count']}")
print(f" Expires: {session_info['expires_at']}")
# Session statistics
print("\n📊 Session Statistics:")
stats_response = requests.get(f"{base_url}/v1/sessions/stats")
if stats_response.status_code == 200:
stats = stats_response.json()
session_stats = stats['session_stats']
print(f" Active sessions: {session_stats['active_sessions']}")
print(f" Total messages: {session_stats['total_messages']}")
print(f" Cleanup interval: {stats['cleanup_interval_minutes']} minutes")
# Clean up demo sessions
print("\n🧹 Cleaning up demo sessions:")
for session_id in session_ids:
delete_response = requests.delete(f"{base_url}/v1/sessions/{session_id}")
if delete_response.status_code == 200:
print(f" ✅ Deleted {session_id}")
def main():
"""Run all session demos."""
print("🚀 Claude Code OpenAI Wrapper - Session Continuity Examples")
print("=" * 60)
try:
# Test server connection
health_response = client.chat.completions.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": "Hello!"}]
)
print("✅ Server connection successful!")
# Run demos
demo_session_continuity()
demo_stateless_vs_session()
demo_session_management()
print("\n" + "=" * 60)
print("🎉 All session demos completed successfully!")
print("\n💡 Key Takeaways:")
print(" • Use session_id in extra_body for conversation continuity")
print(" • Sessions automatically expire after 1 hour of inactivity")
print(" • Session management endpoints provide full control")
print(" • Stateless mode (no session_id) works like traditional OpenAI API")
except Exception as e:
print(f"❌ Error: {e}")
print("💡 Make sure the server is running: poetry run python main.py")
if __name__ == "__main__":
main()