Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.ag-kit.dev/llms.txt

Use this file to discover all available pages before exploring further.

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.
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 Soon
  • qwen: Alibaba Qwen (通义千问) 🚧 Coming Soon
  • deepseek: DeepSeek AI 🚧 Coming Soon
  • anthropic: Anthropic Claude 🚧 Coming Soon

Environment Variables by Provider

OpenAI:
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:
from ag_kit_py.providers import create_provider

provider = create_provider(
    provider_type="openai",
    api_key="sk-...",
    model="gpt-4o-mini",
    temperature=0.7
)
Using environment variables:
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")
Mixing explicit and environment configuration:
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
)
With additional configuration:
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.
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:
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")
With selective overrides:
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.
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:
from ag_kit_py.providers import create_openai_provider

provider = create_openai_provider(
    api_key="sk-...",
    model="gpt-4o-mini",
    temperature=0.7
)
With custom endpoint:
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"
)
With advanced configuration:
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):
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
)
Production (environment variables):
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:
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

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

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

# .env file
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini
OPENAI_TEMPERATURE=0.7
OPENAI_BASE_URL=https://api.openai.com/v1
# 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

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

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

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

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

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

# 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

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

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

"""
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

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

"""
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}")