Replace hardcoded DEFAULT_MODEL and DEFAULT_SMALL_MODEL constants across all LLM clients with a centralized, configurable provider defaults system.
Key changes:
- Created provider_defaults.py with centralized configuration for all providers
- Added environment variable support for easy customization (e.g., GEMINI_DEFAULT_MODEL)
- Updated all LLM clients to use configurable defaults instead of hardcoded constants
- Made edge operations max_tokens configurable via EXTRACT_EDGES_MAX_TOKENS
- Updated cross-encoder reranker clients to use provider defaults
- Maintained full backward compatibility with existing configurations
This resolves the issue where Gemini's flash-lite model has location constraints in Vertex AI that differ from the regular flash model, and users couldn't easily override these without editing source code.
Environment variables now supported:
- {PROVIDER}_DEFAULT_MODEL
- {PROVIDER}_DEFAULT_SMALL_MODEL
- {PROVIDER}_DEFAULT_MAX_TOKENS
- {PROVIDER}_DEFAULT_TEMPERATURE
- {PROVIDER}_EXTRACT_EDGES_MAX_TOKENS
- EXTRACT_EDGES_MAX_TOKENS (global fallback)
Fixes #681
Co-authored-by: Daniel Chalef <danielchalef@users.noreply.github.com>
5.6 KiB
Provider Configuration System
This document describes the new provider configuration system that replaces hardcoded "ghost variables" with configurable defaults.
Overview
Previously, each LLM provider client had hardcoded model names and configuration values that could not be easily customized without modifying the source code. This created several issues:
- Maintenance burden: Updating to newer models required code changes
- Limited flexibility: Users couldn't easily switch to different models
- Provider constraints: Some models (like Gemini's flash-lite) have specific location constraints that differed from defaults
- Hidden configurations: Token limits and other operational parameters were buried in the code
New Configuration System
The new system introduces a centralized provider_defaults.py module that:
- Centralizes all provider defaults in a single location
- Supports environment variable overrides for easy customization
- Maintains backward compatibility with existing configurations
- Provides provider-specific configurations for different LLM providers
Environment Variables
You can now override any provider default using environment variables with the following pattern:
# For OpenAI
export OPENAI_DEFAULT_MODEL="gpt-4"
export OPENAI_DEFAULT_SMALL_MODEL="gpt-4-mini"
export OPENAI_DEFAULT_MAX_TOKENS="8192"
export OPENAI_DEFAULT_TEMPERATURE="0.0"
export OPENAI_EXTRACT_EDGES_MAX_TOKENS="16384"
# For Gemini
export GEMINI_DEFAULT_MODEL="gemini-2.5-flash"
export GEMINI_DEFAULT_SMALL_MODEL="gemini-2.5-flash-lite"
export GEMINI_DEFAULT_MAX_TOKENS="8192"
export GEMINI_DEFAULT_TEMPERATURE="0.0"
export GEMINI_EXTRACT_EDGES_MAX_TOKENS="16384"
# For Anthropic
export ANTHROPIC_DEFAULT_MODEL="claude-3-5-sonnet-latest"
export ANTHROPIC_DEFAULT_SMALL_MODEL="claude-3-5-haiku-latest"
export ANTHROPIC_DEFAULT_MAX_TOKENS="8192"
export ANTHROPIC_DEFAULT_TEMPERATURE="0.0"
export ANTHROPIC_EXTRACT_EDGES_MAX_TOKENS="16384"
# For Groq
export GROQ_DEFAULT_MODEL="llama-3.1-70b-versatile"
export GROQ_DEFAULT_SMALL_MODEL="llama-3.1-8b-instant"
export GROQ_DEFAULT_MAX_TOKENS="8192"
export GROQ_DEFAULT_TEMPERATURE="0.0"
export GROQ_EXTRACT_EDGES_MAX_TOKENS="16384"
# General configuration (for edge operations)
export EXTRACT_EDGES_MAX_TOKENS="16384"
Supported Providers
The system currently supports the following providers:
- openai: OpenAI GPT models
- gemini: Google Gemini models
- anthropic: Anthropic Claude models
- groq: Groq models
- azure_openai: Azure OpenAI models
Usage Examples
Basic Usage
The configuration system works transparently with existing code:
from graphiti_core.llm_client import OpenAIClient
from graphiti_core.llm_client.config import LLMConfig
# Uses default models (configurable via environment variables)
client = OpenAIClient()
# Or with explicit configuration (still uses provider defaults as fallback)
config = LLMConfig(model="gpt-4", small_model="gpt-4-mini")
client = OpenAIClient(config)
Customizing Model Defaults
Instead of hardcoding model names in your application, you can now use environment variables:
# Set up your preferred models
export OPENAI_DEFAULT_MODEL="gpt-4"
export OPENAI_DEFAULT_SMALL_MODEL="gpt-4-mini"
# Your application will automatically use these defaults
python your_app.py
Provider-Specific Configuration
Each provider can have different default models and configurations:
from graphiti_core.llm_client.provider_defaults import get_provider_defaults
# Get defaults for a specific provider
openai_defaults = get_provider_defaults('openai')
print(f"OpenAI default model: {openai_defaults.model}")
print(f"OpenAI small model: {openai_defaults.small_model}")
gemini_defaults = get_provider_defaults('gemini')
print(f"Gemini default model: {gemini_defaults.model}")
print(f"Gemini small model: {gemini_defaults.small_model}")
Migration Guide
Before (with ghost variables)
# In gemini_client.py
DEFAULT_MODEL = 'gemini-2.5-flash'
DEFAULT_SMALL_MODEL = 'models/gemini-2.5-flash-lite-preview-06-17'
def _get_model_for_size(self, model_size: ModelSize) -> str:
if model_size == ModelSize.small:
return self.small_model or DEFAULT_SMALL_MODEL
else:
return self.model or DEFAULT_MODEL
After (with configurable defaults)
# Configuration is now externalized
from .provider_defaults import get_model_for_size
def _get_model_for_size(self, model_size: ModelSize) -> str:
return get_model_for_size(
provider='gemini',
model_size=model_size.value,
user_model=self.model,
user_small_model=self.small_model
)
Benefits
- No More Ghost Variables: All defaults are now configurable
- Easy Model Updates: Update models via environment variables
- Provider Flexibility: Each provider can have optimized defaults
- Backward Compatibility: Existing code continues to work unchanged
- Environment-Specific Configuration: Different environments can use different models
- Reduced Maintenance: No need to modify source code for model updates
Implementation Details
The new system is implemented in graphiti_core/llm_client/provider_defaults.py and includes:
ProviderDefaultsdataclass for configuration structureget_provider_defaults()function with environment variable supportget_model_for_size()centralized model selection logicget_extract_edges_max_tokens_default()for operational parameters
All existing LLM client implementations have been updated to use this new system while maintaining full backward compatibility.