Spaces:
Build error
Build error
| #!/usr/bin/env python3 | |
| """ | |
| Basic usage example for Headroom SDK. | |
| This example shows how to wrap an OpenAI client with Headroom | |
| and use both audit and optimize modes. | |
| Run: | |
| export OPENAI_API_KEY='sk-...' | |
| python examples/basic_usage.py | |
| """ | |
| import logging | |
| import os | |
| import tempfile | |
| from dotenv import load_dotenv | |
| from openai import OpenAI | |
| from headroom import HeadroomClient, OpenAIProvider | |
| # Enable logging to see what Headroom is doing | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format="%(name)s: %(message)s", | |
| ) | |
| # Load API key from .env.local | |
| load_dotenv(".env.local") | |
| # Create base OpenAI client | |
| base_client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "sk-...")) | |
| # Create provider for OpenAI models | |
| provider = OpenAIProvider() | |
| # Use temp directory for database | |
| db_path = os.path.join(tempfile.gettempdir(), "headroom_example.db") | |
| # Wrap with Headroom | |
| client = HeadroomClient( | |
| original_client=base_client, | |
| provider=provider, | |
| store_url=f"sqlite:///{db_path}", | |
| default_mode="audit", # Start with observation | |
| ) | |
| def example_audit_mode(): | |
| """Example using audit mode (observe only).""" | |
| print("=" * 50) | |
| print("AUDIT MODE EXAMPLE") | |
| print("=" * 50) | |
| messages = [ | |
| {"role": "system", "content": "You are a helpful assistant. Current Date: 2024-01-15"}, | |
| {"role": "user", "content": "What's the weather like?"}, | |
| ] | |
| # In audit mode, request passes through unchanged but metrics are logged | |
| response = client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| messages=messages, | |
| max_tokens=100, | |
| ) | |
| print(f"Response: {response.choices[0].message.content}") | |
| print() | |
| def example_optimize_mode(): | |
| """Example using optimize mode (apply transforms).""" | |
| print("=" * 50) | |
| print("OPTIMIZE MODE EXAMPLE") | |
| print("=" * 50) | |
| messages = [ | |
| {"role": "system", "content": "You are a helpful assistant. Current Date: 2024-01-15"}, | |
| {"role": "user", "content": "Search for information."}, | |
| { | |
| "role": "assistant", | |
| "content": None, | |
| "tool_calls": [ | |
| { | |
| "id": "call_1", | |
| "type": "function", | |
| "function": { | |
| "name": "search", | |
| "arguments": '{"query": "test"}', | |
| }, | |
| } | |
| ], | |
| }, | |
| { | |
| "role": "tool", | |
| "tool_call_id": "call_1", | |
| "content": '{"results": [' + ",".join([f'{{"id": {i}}}' for i in range(50)]) + "]}", | |
| }, | |
| {"role": "assistant", "content": "I found 50 results."}, | |
| {"role": "user", "content": "Summarize them."}, | |
| ] | |
| # In optimize mode, transforms are applied | |
| response = client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| messages=messages, | |
| headroom_mode="optimize", | |
| max_tokens=100, | |
| ) | |
| print(f"Response: {response.choices[0].message.content}") | |
| print() | |
| def example_simulate_mode(): | |
| """Example using simulate mode (preview without API call).""" | |
| print("=" * 50) | |
| print("SIMULATE MODE EXAMPLE") | |
| print("=" * 50) | |
| messages = [ | |
| {"role": "system", "content": "You are a helpful assistant. Current Date: 2024-01-15"}, | |
| {"role": "user", "content": "Search for information."}, | |
| { | |
| "role": "assistant", | |
| "content": None, | |
| "tool_calls": [ | |
| { | |
| "id": "call_1", | |
| "type": "function", | |
| "function": { | |
| "name": "search", | |
| "arguments": '{"query": "test"}', | |
| }, | |
| } | |
| ], | |
| }, | |
| { | |
| "role": "tool", | |
| "tool_call_id": "call_1", | |
| "content": '{"results": [' + ",".join([f'{{"id": {i}}}' for i in range(100)]) + "]}", | |
| }, | |
| {"role": "assistant", "content": "I found 100 results."}, | |
| {"role": "user", "content": "Summarize them."}, | |
| ] | |
| # Simulate without calling API | |
| plan = client.chat.completions.simulate( | |
| model="gpt-4o", | |
| messages=messages, | |
| ) | |
| print(f"Tokens before: {plan.tokens_before}") | |
| print(f"Tokens after: {plan.tokens_after}") | |
| print(f"Tokens saved: {plan.tokens_saved}") | |
| print(f"Transforms applied: {plan.transforms}") | |
| print(f"Estimated savings: {plan.estimated_savings}") | |
| print() | |
| def example_get_metrics(): | |
| """Example of accessing stored metrics.""" | |
| print("=" * 50) | |
| print("METRICS EXAMPLE") | |
| print("=" * 50) | |
| # Get summary statistics from database | |
| summary = client.get_summary() | |
| print(f"Total requests: {summary['total_requests']}") | |
| print(f"Total tokens saved: {summary['total_tokens_saved']}") | |
| print(f"Average tokens saved: {summary['avg_tokens_saved']:.0f}") | |
| print() | |
| def example_validate_setup(): | |
| """Example of validating Headroom setup.""" | |
| print("=" * 50) | |
| print("VALIDATE SETUP EXAMPLE") | |
| print("=" * 50) | |
| # Validate that everything is configured correctly | |
| result = client.validate_setup() | |
| if result["valid"]: | |
| print("Setup is valid!") | |
| print(f" Provider: {result['provider']['name']}") | |
| print(f" Storage: {result['storage']['url']}") | |
| print(f" Mode: {result['config']['mode']}") | |
| else: | |
| print("Setup issues detected:") | |
| for key, val in result.items(): | |
| if key != "valid" and not val.get("ok"): | |
| print(f" {key}: {val.get('error')}") | |
| print() | |
| def example_get_stats(): | |
| """Example of getting quick session stats.""" | |
| print("=" * 50) | |
| print("SESSION STATS EXAMPLE") | |
| print("=" * 50) | |
| # Get quick stats without database query | |
| stats = client.get_stats() | |
| print("Session stats:") | |
| print(f" Requests total: {stats['session']['requests_total']}") | |
| print(f" Requests optimized: {stats['session']['requests_optimized']}") | |
| print(f" Tokens saved: {stats['session']['tokens_saved_total']}") | |
| print("\nConfiguration:") | |
| print(f" Mode: {stats['config']['mode']}") | |
| print(f" Provider: {stats['config']['provider']}") | |
| print("\nTransforms enabled:") | |
| print(f" SmartCrusher: {stats['transforms']['smart_crusher_enabled']}") | |
| print(f" RollingWindow: {stats['transforms']['rolling_window_enabled']}") | |
| print(f" CacheAligner: {stats['transforms']['cache_aligner_enabled']}") | |
| print() | |
| if __name__ == "__main__": | |
| # First, validate the setup | |
| example_validate_setup() | |
| # Run all examples | |
| example_audit_mode() | |
| example_optimize_mode() | |
| example_simulate_mode() | |
| example_get_metrics() | |
| # Show session stats | |
| example_get_stats() | |
| # Clean up | |
| client.close() | |