Spaces:
Running
Running
""" | |
Basic lab setup module for easy initialization of LLM clients across labs. | |
Handles API key checking and client creation for various providers. | |
""" | |
import os | |
from dotenv import load_dotenv | |
from openai import OpenAI | |
from anthropic import Anthropic | |
from IPython.display import Markdown, display | |
# Global client objects | |
openai_client = None | |
anthropic_client = None | |
ollama_client = None | |
google_client = None | |
deepseek_client = None | |
groq_client = None | |
# Default models for each provider | |
DEFAULT_MODELS = { | |
'openai': 'gpt-4o-mini', | |
'anthropic': 'claude-3-5-sonnet-20241022', | |
'ollama': 'llama3.2', | |
'google': 'gemini-2.0-flash-exp', | |
'deepseek': 'deepseek-chat', | |
'groq': 'llama-3.3-70b-versatile' | |
} | |
def setup(): | |
""" | |
Initialize the lab setup by loading environment variables and creating client objects. | |
Uses load_dotenv(override=True) for safe handling of API keys. | |
""" | |
global openai_client, anthropic_client, ollama_client, google_client, deepseek_client, groq_client | |
# Load environment variables safely | |
load_dotenv(override=True) | |
# Check and create OpenAI client | |
openai_api_key = os.getenv('OPENAI_API_KEY') | |
if openai_api_key: | |
openai_client = OpenAI(api_key=openai_api_key) | |
print(f"β OpenAI client initialized (key starts with {openai_api_key[:8]}...)") | |
else: | |
print("β OpenAI API Key not set") | |
# Check and create Anthropic client | |
anthropic_api_key = os.getenv('ANTHROPIC_API_KEY') | |
if anthropic_api_key: | |
anthropic_client = Anthropic(api_key=anthropic_api_key) | |
print(f"β Anthropic client initialized (key starts with {anthropic_api_key[:7]}...)") | |
else: | |
print("β Anthropic API Key not set (optional)") | |
# Create Ollama client (local, no API key needed) | |
ollama_client = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama') | |
print("β Ollama client initialized (localhost)") | |
# Check and create Google client | |
google_api_key = os.getenv('GOOGLE_API_KEY') | |
if google_api_key: | |
google_client = OpenAI( | |
api_key=google_api_key, | |
base_url="https://generativelanguage.googleapis.com/v1beta/openai/" | |
) | |
print(f"β Google client initialized (key starts with {google_api_key[:2]}...)") | |
else: | |
print("β Google API Key not set (optional)") | |
# Check and create DeepSeek client | |
deepseek_api_key = os.getenv('DEEPSEEK_API_KEY') | |
if deepseek_api_key: | |
deepseek_client = OpenAI( | |
api_key=deepseek_api_key, | |
base_url="https://api.deepseek.com/v1" | |
) | |
print(f"β DeepSeek client initialized (key starts with {deepseek_api_key[:3]}...)") | |
else: | |
print("β DeepSeek API Key not set (optional)") | |
# Check and create Groq client | |
groq_api_key = os.getenv('GROQ_API_KEY') | |
if groq_api_key: | |
groq_client = OpenAI( | |
api_key=groq_api_key, | |
base_url="https://api.groq.com/openai/v1" | |
) | |
print(f"β Groq client initialized (key starts with {groq_api_key[:4]}...)") | |
else: | |
print("β Groq API Key not set (optional)") | |
print("\nSetup complete! Available clients:") | |
available_clients = [] | |
if openai_client: | |
available_clients.append("OpenAI") | |
if anthropic_client: | |
available_clients.append("Anthropic") | |
if ollama_client: | |
available_clients.append("Ollama") | |
if google_client: | |
available_clients.append("Google") | |
if deepseek_client: | |
available_clients.append("DeepSeek") | |
if groq_client: | |
available_clients.append("Groq") | |
print(f" {', '.join(available_clients)}") | |
def get_available_clients(): | |
""" | |
Return a dictionary of available clients and their default models. | |
""" | |
clients = {} | |
if openai_client: | |
clients['openai'] = {'client': openai_client, 'model': DEFAULT_MODELS['openai']} | |
if anthropic_client: | |
clients['anthropic'] = {'client': anthropic_client, 'model': DEFAULT_MODELS['anthropic']} | |
if ollama_client: | |
clients['ollama'] = {'client': ollama_client, 'model': DEFAULT_MODELS['ollama']} | |
if google_client: | |
clients['google'] = {'client': google_client, 'model': DEFAULT_MODELS['google']} | |
if deepseek_client: | |
clients['deepseek'] = {'client': deepseek_client, 'model': DEFAULT_MODELS['deepseek']} | |
if groq_client: | |
clients['groq'] = {'client': groq_client, 'model': DEFAULT_MODELS['groq']} | |
return clients | |
def get_client(provider): | |
""" | |
Get a specific client by provider name. | |
Args: | |
provider (str): Provider name ('openai', 'anthropic', 'ollama', 'google', 'deepseek', 'groq') | |
Returns: | |
Client object or None if not available | |
""" | |
clients = get_available_clients() | |
return clients.get(provider, {}).get('client') | |
def get_default_model(provider): | |
""" | |
Get the default model for a specific provider. | |
Args: | |
provider (str): Provider name | |
Returns: | |
str: Default model name or None if provider not available | |
""" | |
clients = get_available_clients() | |
return clients.get(provider, {}).get('model') | |
# Convenience functions for common operations | |
def create_completion(provider, messages, model=None, **kwargs): | |
""" | |
Create a completion using the specified provider. | |
Args: | |
provider (str): Provider name | |
messages (list): List of message dictionaries | |
model (str, optional): Model name (uses default if not specified) | |
**kwargs: Additional arguments to pass to the completion call | |
Returns: | |
Completion response or None if provider not available | |
""" | |
client = get_client(provider) | |
if not client: | |
print(f"Provider '{provider}' not available") | |
return None | |
if not model: | |
model = get_default_model(provider) | |
try: | |
if provider == 'anthropic': | |
# Anthropic has a different API structure | |
response = client.messages.create( | |
model=model, | |
messages=messages, | |
max_tokens=kwargs.get('max_tokens', 1000), | |
**kwargs | |
) | |
return response.content[0].text | |
else: | |
# OpenAI-compatible APIs | |
response = client.chat.completions.create( | |
model=model, | |
messages=messages, | |
**kwargs | |
) | |
return response.choices[0].message.content | |
except Exception as e: | |
print(f"Error with {provider}: {e}") | |
return None |