| """ |
| Model configuration and management for personalization features. |
| Supports Groq (primary content generation), HuggingFace (visualization), and Gemini (TTS). |
| """ |
|
|
| import os |
| import logging |
| from typing import Optional |
| from openai import OpenAI |
| from anthropic import Anthropic |
| from dotenv import load_dotenv |
|
|
| load_dotenv() |
| logger = logging.getLogger(__name__) |
|
|
| |
| |
| |
|
|
| OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") |
| ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY") |
| GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") |
| GROQ_API_KEY = os.getenv("GROQ_API_KEY") |
|
|
| |
| GROQ_CONTENT_MODELS = [ |
| "llama-3.3-70b-versatile", |
| "llama-3.1-70b-versatile", |
| "mixtral-8x7b-32768", |
| ] |
|
|
| USING_OPENAI = bool(OPENAI_API_KEY) |
| USING_ANTHROPIC = bool(ANTHROPIC_API_KEY) |
| USING_GROQ = bool(GROQ_API_KEY) |
| OPENAI_CLIENT = None |
| ANTHROPIC_CLIENT = None |
| GROQ_CLIENT = None |
|
|
| |
| OPENAI_CONTENT_MODEL = "gpt-4o-mini" |
| ANTHROPIC_VISUALIZATION_MODEL = "claude-sonnet-4-20250514" |
| GROQ_CONTENT_MODEL = GROQ_CONTENT_MODELS[0] |
|
|
| |
| LLM_CLIENT = None |
| PRIMARY_MODEL = None |
| LLM_SERVICE = None |
|
|
| |
| if USING_OPENAI: |
| logger.info(f"OPENAI_API_KEY present: {bool(OPENAI_API_KEY)}") |
| try: |
| OPENAI_CLIENT = OpenAI(api_key=OPENAI_API_KEY) |
| logger.info("✓ OpenAI client initialized successfully") |
| except Exception as e: |
| logger.warning(f"Failed to initialize OpenAI client: {e}") |
| OPENAI_CLIENT = None |
|
|
| |
| if USING_GROQ: |
| logger.info(f"GROQ_API_KEY present: {bool(GROQ_API_KEY)}") |
| try: |
| GROQ_CLIENT = OpenAI( |
| api_key=GROQ_API_KEY, |
| base_url="https://api.groq.com/openai/v1" |
| ) |
| logger.info("✓ Groq client initialized successfully") |
| except Exception as e: |
| logger.warning(f"Failed to initialize Groq client: {e}") |
| GROQ_CLIENT = None |
|
|
| |
| if USING_ANTHROPIC: |
| logger.info(f"ANTHROPIC_API_KEY present: {bool(ANTHROPIC_API_KEY)}") |
| try: |
| ANTHROPIC_CLIENT = Anthropic(api_key=ANTHROPIC_API_KEY) |
| logger.info("✓ Anthropic client initialized successfully") |
| except Exception as e: |
| logger.warning(f"Failed to initialize Anthropic client: {e}") |
| ANTHROPIC_CLIENT = None |
|
|
| |
| if OPENAI_CLIENT: |
| LLM_CLIENT = OPENAI_CLIENT |
| PRIMARY_MODEL = OPENAI_CONTENT_MODEL |
| LLM_SERVICE = "OpenAI" |
| logger.info(f"✓ Using OpenAI ({PRIMARY_MODEL}) as primary LLM") |
| elif GROQ_CLIENT: |
| LLM_CLIENT = GROQ_CLIENT |
| PRIMARY_MODEL = GROQ_CONTENT_MODEL |
| LLM_SERVICE = "Groq" |
| logger.info(f"✓ Using Groq ({PRIMARY_MODEL}) as primary LLM") |
| else: |
| LLM_CLIENT = None |
| PRIMARY_MODEL = None |
| LLM_SERVICE = None |
| logger.warning("No content generation LLM available (OpenAI/Groq) - Anthropic is visualization-only") |
|
|
|
|
|
|
| |
| |
| |
|
|
| def get_llm_client() -> Optional[OpenAI]: |
| """Get the LLM client.""" |
| return LLM_CLIENT |
|
|
| def get_primary_model() -> str: |
| """Get the primary model for reasoning tasks.""" |
| return PRIMARY_MODEL |
|
|
| def get_backup_model() -> str: |
| """Get the backup model for reasoning tasks.""" |
| return PRIMARY_MODEL |
|
|
| def get_llm_service() -> str: |
| """Get the name of the LLM service being used.""" |
| return LLM_SERVICE |
|
|
| def is_using_openrouter() -> bool: |
| """Check if OpenRouter is being used.""" |
| return False |
|
|
| def get_client_for_task(task_name: str): |
| """ |
| Get the appropriate LLM client for a specific task. |
| Task preferences: |
| - content_generation -> prefer OpenAI, then Groq |
| - visualization -> Anthropic only |
| Returns: Client object (OpenAI-compatible or Anthropic) |
| """ |
| t = (task_name or "").lower() |
| if t == "visualization": |
| return ANTHROPIC_CLIENT |
|
|
| |
| if OPENAI_CLIENT: |
| return OPENAI_CLIENT |
| if GROQ_CLIENT: |
| return GROQ_CLIENT |
| return None |
|
|
| def get_model_for_task(task_name: str) -> str: |
| """ |
| Get the appropriate model for a specific task. |
| Strategy: |
| - content_generation: prefer OpenAI, then Groq |
| - visualization: Anthropic only |
| """ |
| t = (task_name or "").lower() |
| if t == "visualization": |
| return ANTHROPIC_VISUALIZATION_MODEL |
|
|
| |
| if USING_OPENAI: |
| return OPENAI_CONTENT_MODEL |
| if USING_GROQ: |
| return GROQ_CONTENT_MODEL |
| return OPENAI_CONTENT_MODEL or GROQ_CONTENT_MODEL |
|
|
| def get_service_for_task(task_name: str) -> str: |
| """ |
| Get the service name for a specific task. |
| """ |
| t = (task_name or "").lower() |
| if t == "visualization": |
| return "Anthropic" |
|
|
| |
| if USING_OPENAI: |
| return "OpenAI" |
| if USING_GROQ: |
| return "Groq" |
| return "Unknown" |
|
|
| |
| |
| |
|
|
| AUDIO_PRIMARY_MODEL = "gemini-2.5-pro-preview-tts" |
| AUDIO_BACKUP_SERVICE = "regional_tts" |
| AUDIO_SERVICE = "Gemini" |
|
|
| NARRATION_PRIMARY_MODEL = PRIMARY_MODEL |
| NARRATION_BACKUP_MODEL = PRIMARY_MODEL |
|
|
| def get_audio_model() -> str: |
| """Get the primary audio generation model.""" |
| return AUDIO_PRIMARY_MODEL |
|
|
| def get_narration_model() -> str: |
| """Get the model for generating narration text.""" |
| return NARRATION_PRIMARY_MODEL |
|
|
| def get_narration_backup_model() -> str: |
| """Get the backup model for narration generation.""" |
| return NARRATION_BACKUP_MODEL |
|
|
| |
| |
| |
|
|
| PERSONALIZATION_CONFIG = { |
| "audio_generation": { |
| "primary_service": "Gemini", |
| "primary_model": AUDIO_PRIMARY_MODEL, |
| "backup_service": "regional_tts", |
| "supports_voice_customization": True, |
| }, |
| "reasoning": { |
| "service": LLM_SERVICE, |
| "primary_model": PRIMARY_MODEL, |
| "backup_model": PRIMARY_MODEL, |
| "backup_service": LLM_SERVICE, |
| "supports_personalization": True, |
| "supports_context_awareness": True, |
| }, |
| "narration": { |
| "service": LLM_SERVICE, |
| "model": NARRATION_PRIMARY_MODEL, |
| "backup_model": NARRATION_BACKUP_MODEL, |
| "max_tokens": 500, |
| "temperature": 0.6, |
| }, |
| } |
|
|
| |
| |
| |
|
|
| def log_model_configuration(): |
| """Log the current model configuration.""" |
| logger.info("=" * 70) |
| logger.info("MODEL CONFIGURATION") |
| logger.info("=" * 70) |
| logger.info(f"Primary: {LLM_SERVICE} ({PRIMARY_MODEL})") |
| logger.info(f"Visualization: Anthropic ({ANTHROPIC_VISUALIZATION_MODEL})") |
| logger.info("=" * 70) |
|
|