Factory Functions
The factory module provides convenient functions for creating model providers with simplified configuration and automatic environment variable support.Functions
create_provider()
Create a model provider with automatic configuration from environment variables.Copy
def create_provider(
provider_type: str = "openai",
api_key: Optional[str] = None,
model: Optional[str] = None,
base_url: Optional[str] = None,
temperature: float = 0.7,
**kwargs
) -> BaseModelProvider:
"""Create a model provider with automatic configuration.
This factory function creates a model provider based on the specified type.
It supports environment variable fallbacks for common configuration options.
Args:
provider_type: Type of provider to create (openai, zhipu, qwen, etc.)
api_key: API key (falls back to environment variable)
model: Model name (falls back to environment variable)
base_url: Custom API endpoint (falls back to environment variable)
temperature: Sampling temperature
**kwargs: Additional provider-specific configuration
Returns:
BaseModelProvider: Configured model provider
Raises:
ValueError: If provider type is not supported or required config is missing
NotImplementedError: If provider is not yet implemented
"""
Supported Provider Types
openai: OpenAI and OpenAI-compatible APIs ✅zhipu: Zhipu AI (智谱AI) 🚧 Coming Soonqwen: Alibaba Qwen (通义千问) 🚧 Coming Soondeepseek: DeepSeek AI 🚧 Coming Soonanthropic: Anthropic Claude 🚧 Coming Soon
Environment Variables by Provider
OpenAI:Copy
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_TEMPERATURE=0.7
Examples
Using explicit configuration:Copy
from ag_kit_py.providers import create_provider
provider = create_provider(
provider_type="openai",
api_key="sk-...",
model="gpt-4o-mini",
temperature=0.7
)
Copy
import os
from ag_kit_py.providers import create_provider
# Set environment variables
os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["OPENAI_MODEL"] = "gpt-4o-mini"
# Create provider (automatically loads from environment)
provider = create_provider(provider_type="openai")
Copy
import os
from ag_kit_py.providers import create_provider
# API key from environment
os.environ["OPENAI_API_KEY"] = "sk-..."
# Override model explicitly
provider = create_provider(
provider_type="openai",
model="gpt-4o", # Override default
temperature=0.9
)
Copy
from ag_kit_py.providers import create_provider
provider = create_provider(
provider_type="openai",
api_key="sk-...",
model="gpt-4o-mini",
temperature=0.7,
timeout=60000, # 60 seconds
max_retries=5,
organization="org-..."
)
create_provider_from_env()
Create a model provider using only environment variables.Copy
def create_provider_from_env(
provider_type: str = "openai",
**kwargs
) -> BaseModelProvider:
"""Create a model provider using only environment variables.
This is a convenience function that creates a provider using environment
variables for all configuration. It's useful for deployment scenarios
where configuration is managed through environment variables.
Args:
provider_type: Type of provider to create
**kwargs: Additional configuration to override environment variables
Returns:
BaseModelProvider: Configured model provider
"""
Examples
Pure environment configuration:Copy
import os
from ag_kit_py.providers import create_provider_from_env
# Set all configuration via environment
os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["OPENAI_MODEL"] = "gpt-4o-mini"
os.environ["OPENAI_TEMPERATURE"] = "0.7"
# Create provider from environment
provider = create_provider_from_env("openai")
Copy
import os
from ag_kit_py.providers import create_provider_from_env
# Base configuration from environment
os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["OPENAI_MODEL"] = "gpt-4o-mini"
# Override specific settings
provider = create_provider_from_env(
"openai",
temperature=0.9 # Override environment temperature
)
create_openai_provider()
Convenience function specifically for creating OpenAI providers.Copy
def create_openai_provider(
api_key: str,
model: Optional[str] = None,
base_url: Optional[str] = None,
temperature: float = 0.7,
**kwargs
) -> OpenAIProvider:
"""Create an OpenAI provider with simplified configuration.
Args:
api_key: OpenAI API key
model: Model name (default: gpt-4o-mini)
base_url: Custom API endpoint
temperature: Sampling temperature
**kwargs: Additional configuration options
Returns:
OpenAIProvider: Configured OpenAI provider
"""
Examples
Basic usage:Copy
from ag_kit_py.providers import create_openai_provider
provider = create_openai_provider(
api_key="sk-...",
model="gpt-4o-mini",
temperature=0.7
)
Copy
from ag_kit_py.providers import create_openai_provider
# Azure OpenAI
provider = create_openai_provider(
api_key="your-azure-key",
base_url="https://your-resource.openai.azure.com/openai/deployments/your-deployment",
model="gpt-4o-mini"
)
# Local model (Ollama)
provider = create_openai_provider(
api_key="ollama",
base_url="http://localhost:11434/v1",
model="llama2"
)
Copy
from ag_kit_py.providers import create_openai_provider
provider = create_openai_provider(
api_key="sk-...",
model="gpt-4o-mini",
temperature=0.7,
timeout=60000,
max_retries=5,
organization="org-...",
project="proj-..."
)
Usage Patterns
Development vs Production
Development (explicit configuration):Copy
from ag_kit_py.providers import create_provider
# Explicit configuration for development
provider = create_provider(
provider_type="openai",
api_key="sk-...",
model="gpt-4o-mini",
temperature=0.7
)
Copy
from ag_kit_py.providers import create_provider_from_env
# All configuration from environment
provider = create_provider_from_env("openai")
Configuration Priority
When both explicit parameters and environment variables are provided, explicit parameters take precedence:Copy
import os
from ag_kit_py.providers import create_provider
# Environment variable
os.environ["OPENAI_MODEL"] = "gpt-4o-mini"
# Explicit parameter takes precedence
provider = create_provider(
provider_type="openai",
api_key="sk-...",
model="gpt-4o" # This overrides OPENAI_MODEL
)
# provider will use "gpt-4o", not "gpt-4o-mini"
Multi-Provider Setup
Copy
from ag_kit_py.providers import create_provider
import os
# Configure multiple providers
os.environ["OPENAI_API_KEY"] = "sk-..."
os.environ["OPENAI_MODEL"] = "gpt-4o-mini"
# Create providers for different use cases
fast_provider = create_provider(
"openai",
model="gpt-4o-mini",
temperature=0.5
)
creative_provider = create_provider(
"openai",
model="gpt-4o",
temperature=0.9
)
# Use appropriate provider for each task
quick_response = await fast_provider.create_completion(quick_params)
creative_response = await creative_provider.create_completion(creative_params)
Dynamic Provider Selection
Copy
from ag_kit_py.providers import create_provider
from typing import Dict, Any
def get_provider(config: Dict[str, Any]):
"""Dynamically create provider based on configuration."""
provider_type = config.get("provider", "openai")
return create_provider(
provider_type=provider_type,
api_key=config.get("api_key"),
model=config.get("model"),
temperature=config.get("temperature", 0.7),
base_url=config.get("base_url")
)
# Usage
config = {
"provider": "openai",
"api_key": "sk-...",
"model": "gpt-4o-mini",
"temperature": 0.7
}
provider = get_provider(config)
Environment Variable Management
Using .env Files
Copy
# .env file
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini
OPENAI_TEMPERATURE=0.7
OPENAI_BASE_URL=https://api.openai.com/v1
Copy
# Load from .env file
from dotenv import load_dotenv
from ag_kit_py.providers import create_provider_from_env
load_dotenv() # Load .env file
provider = create_provider_from_env("openai")
Environment-Specific Configuration
Copy
import os
from ag_kit_py.providers import create_provider_from_env
# Detect environment
env = os.getenv("ENVIRONMENT", "development")
if env == "production":
# Production uses environment variables
provider = create_provider_from_env("openai")
elif env == "staging":
# Staging might use different model
provider = create_provider_from_env(
"openai",
model="gpt-4o-mini" # Override for staging
)
else:
# Development uses explicit config
from ag_kit_py.providers import create_provider
provider = create_provider(
"openai",
api_key="sk-dev-...",
model="gpt-4o-mini"
)
Validation
Copy
import os
from ag_kit_py.providers import create_provider
def create_validated_provider(provider_type: str = "openai"):
"""Create provider with validation."""
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
raise ValueError(
"OPENAI_API_KEY environment variable is required. "
"Set it with: export OPENAI_API_KEY=sk-..."
)
if not api_key.startswith("sk-"):
raise ValueError("Invalid OpenAI API key format")
return create_provider(
provider_type=provider_type,
api_key=api_key
)
# Usage
try:
provider = create_validated_provider()
except ValueError as e:
print(f"Configuration error: {e}")
Error Handling
Missing Configuration
Copy
from ag_kit_py.providers import create_provider
try:
# Missing API key
provider = create_provider("openai")
except ValueError as e:
print(f"Configuration error: {e}")
# Output: "OpenAI API key is required. Set OPENAI_API_KEY environment variable..."
Unsupported Provider
Copy
from ag_kit_py.providers import create_provider
try:
provider = create_provider("unsupported_provider")
except ValueError as e:
print(f"Error: {e}")
# Output: "Unsupported provider type: unsupported_provider"
Not Yet Implemented
Copy
from ag_kit_py.providers import create_provider
try:
provider = create_provider("zhipu")
except NotImplementedError as e:
print(f"Error: {e}")
# Output: "Zhipu provider is not yet implemented"
Best Practices
1. Use Environment Variables in Production
Copy
# Good: Production configuration
from ag_kit_py.providers import create_provider_from_env
provider = create_provider_from_env("openai")
# Bad: Hardcoded credentials
from ag_kit_py.providers import create_provider
provider = create_provider("openai", api_key="sk-...") # Don't commit!
2. Validate Configuration Early
Copy
import os
from ag_kit_py.providers import create_provider
def setup_provider():
"""Setup provider with early validation."""
required_vars = ["OPENAI_API_KEY", "OPENAI_MODEL"]
missing = [var for var in required_vars if not os.getenv(var)]
if missing:
raise ValueError(f"Missing required environment variables: {missing}")
return create_provider("openai")
# Fail fast if configuration is invalid
provider = setup_provider()
3. Use Type Hints
Copy
from ag_kit_py.providers import BaseModelProvider, create_provider
from typing import Optional
def create_configured_provider(
provider_type: str = "openai",
model: Optional[str] = None
) -> BaseModelProvider:
"""Create provider with type hints."""
return create_provider(
provider_type=provider_type,
model=model
)
# Type-safe usage
provider: BaseModelProvider = create_configured_provider()
4. Document Required Environment Variables
Copy
"""
Application Configuration
Required Environment Variables:
OPENAI_API_KEY: OpenAI API key (required)
OPENAI_MODEL: Model name (default: gpt-4o-mini)
OPENAI_TEMPERATURE: Sampling temperature (default: 0.7)
OPENAI_BASE_URL: Custom API endpoint (optional)
Example:
export OPENAI_API_KEY=sk-...
export OPENAI_MODEL=gpt-4o-mini
python app.py
"""
from ag_kit_py.providers import create_provider_from_env
provider = create_provider_from_env("openai")
5. Provide Sensible Defaults
Copy
import os
from ag_kit_py.providers import create_provider
def create_app_provider():
"""Create provider with application defaults."""
return create_provider(
provider_type=os.getenv("PROVIDER_TYPE", "openai"),
model=os.getenv("MODEL_NAME", "gpt-4o-mini"),
temperature=float(os.getenv("TEMPERATURE", "0.7")),
timeout=int(os.getenv("TIMEOUT", "30000")),
max_retries=int(os.getenv("MAX_RETRIES", "3"))
)
provider = create_app_provider()
Complete Example
Copy
"""
Complete example of provider factory usage with best practices.
"""
import os
from typing import Optional
from dotenv import load_dotenv
from ag_kit_py.providers import (
BaseModelProvider,
create_provider,
create_provider_from_env,
ModelProviderError
)
# Load environment variables from .env file
load_dotenv()
def create_production_provider() -> BaseModelProvider:
"""Create provider for production environment."""
# Validate required environment variables
if not os.getenv("OPENAI_API_KEY"):
raise ValueError("OPENAI_API_KEY environment variable is required")
# Create from environment
return create_provider_from_env("openai")
def create_development_provider(
api_key: Optional[str] = None,
model: str = "gpt-4o-mini"
) -> BaseModelProvider:
"""Create provider for development environment."""
return create_provider(
provider_type="openai",
api_key=api_key or os.getenv("OPENAI_API_KEY"),
model=model,
temperature=0.7
)
def get_provider() -> BaseModelProvider:
"""Get provider based on environment."""
env = os.getenv("ENVIRONMENT", "development")
if env == "production":
return create_production_provider()
else:
return create_development_provider()
# Usage
if __name__ == "__main__":
try:
provider = get_provider()
print(f"Provider created: {provider.get_provider_name()}")
print(f"Default model: {provider.default_model}")
except ValueError as e:
print(f"Configuration error: {e}")
except ModelProviderError as e:
print(f"Provider error: {e.message}")
Related Documentation
- Providers Overview - Provider system overview
- Base Provider - Abstract base class
- OpenAI Provider - OpenAI implementation
- LangGraph Agent - Using providers with agents