emailvenky's picture
Upload 27 files
4b19c49 verified
"""Configuration management for MythForge AI"""
import os
from dotenv import load_dotenv
# Load .env file with override=True to ensure .env values take precedence
load_dotenv(override=True)
class Config:
"""Application configuration"""
# OpenAI Configuration
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini") # Default to gpt-4o-mini, can use gpt-3.5-turbo or gpt-4
# HuggingFace Configuration (V2+)
HUGGINGFACE_TOKEN = os.getenv("HUGGINGFACE_TOKEN")
# ElevenLabs Configuration (V4+)
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
# Gemini Configuration (V6+)
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
# Optional Services
MODAL_TOKEN = os.getenv("MODAL_TOKEN")
SAMBANOVA_API_KEY = os.getenv("SAMBANOVA_API_KEY")
NEBIUS_API_KEY = os.getenv("NEBIUS_API_KEY")
BLAXEL_API_KEY = os.getenv("BLAXEL_API_KEY")
# Feature Flags for Comic Mode (Step 1)
ENABLE_COMIC_MODE = os.getenv("ENABLE_COMIC_MODE", "false").lower() == "true"
ENABLE_BLAXEL = os.getenv("ENABLE_BLAXEL", "false").lower() == "true"
ENABLE_MODAL = os.getenv("ENABLE_MODAL", "false").lower() == "true"
ENABLE_SAMBANOVA = os.getenv("ENABLE_SAMBANOVA", "false").lower() == "true"
# MCP Server Feature Flag (for backward compatibility)
ENABLE_MCP = os.getenv("ENABLE_MCP", "false").lower() == "true"
# New Sponsor Feature Flags (Hackathon)
ENABLE_LLAMAINDEX = os.getenv("ENABLE_LLAMAINDEX", "true").lower() == "true" # Default ON
ENABLE_GEMINI = os.getenv("ENABLE_GEMINI", "false").lower() == "true"
ENABLE_OPENAI_FALLBACK = os.getenv("ENABLE_OPENAI_FALLBACK", "true").lower() == "true" # Default ON
ENABLE_BLAXEL_WORKFLOW = os.getenv("ENABLE_BLAXEL_WORKFLOW", "false").lower() == "true" # Use Blaxel orchestration instead of direct calls
# Text Generation Priority (for prize optimization)
USE_OPENAI_PRIMARY = os.getenv("USE_OPENAI_PRIMARY", "true").lower() == "true" # true = OpenAI first ($1k prize), false = SambaNova first
# Nano Banana (Gemini Image) Configuration
ENABLE_NANO_BANANA = os.getenv("ENABLE_NANO_BANANA", "false").lower() == "true"
NANO_BANANA_MODEL = os.getenv("NANO_BANANA_MODEL", "gemini-2.5-flash-image") # Options: gemini-2.5-flash-image, gemini-3-pro-image-preview
NANO_BANANA_MAX_REFERENCES = int(os.getenv("NANO_BANANA_MAX_REFERENCES", "14")) # Up to 14 reference images
ENABLE_CHARACTER_LIBRARY = os.getenv("ENABLE_CHARACTER_LIBRARY", "false").lower() == "true" # Multimodal character persistence
# Character Consistency Fallback Configuration
NANO_BANANA_AUTO_FALLBACK = os.getenv("NANO_BANANA_AUTO_FALLBACK", "true").lower() == "true" # Auto fallback to legacy on error
NANO_BANANA_FALLBACK_ON_QUOTA = os.getenv("NANO_BANANA_FALLBACK_ON_QUOTA", "true").lower() == "true" # Fallback on quota exceeded
NANO_BANANA_MAX_RETRY = int(os.getenv("NANO_BANANA_MAX_RETRY", "2")) # Max retries before fallback
# Application Settings
MAX_STORY_LENGTH = 2000
DEFAULT_TEMPERATURE = 0.7
# Comic Mode Settings (Step 1)
COMIC_PANEL_COUNT = 6 # Manga style: 2x3 grid
COMIC_PANEL_WIDTH = 1024 # For SDXL
COMIC_PANEL_HEIGHT = 1024
@classmethod
def validate_v1(cls):
"""Validate V1 configuration"""
if not cls.OPENAI_API_KEY:
raise ValueError("OPENAI_API_KEY is required. Please set it in .env file")
return True