#!/usr/bin/env python3
"""
Genesis Multi-Model Orchestrator
==================================
Routes tasks to the optimal AI model based on cost, speed, capability, and quota.

ROUTING PRIORITY (cheapest to most capable):
  Jules (Google autonomous agent) → FREE, async, GitHub-integrated coding
  Gemini 2.0 Flash                → $0.10/$0.40 per MTok, ultra-fast bulk
  Gemini 2.5 Flash                → $0.30/$2.50 per MTok, fast workhorse
  MiniMax M2.1 NIM                → FREE via NVIDIA NIM (40 RPM), refactoring/extraction
  MiniMax M2.1 Direct             → $0.80/MTok, lightweight coding
  MiniMax M2.5                    → $1.00/MTok, SWE-Bench #2 (80.2%), code generation
  Kimi K2.5                       → $1.07/MTok, agentic #1 (HLE 50.2%), 256K context
  DeepSeek-R1                     → $0.55/MTok, o1-level reasoning
  Gemini 2.5 Pro                  → $1.25/$10.00 per MTok, deep analysis, 1M context
  Claude Sonnet                   → $9/MTok, ORCHESTRATION ONLY
  Claude Opus                     → $15/MTok, STRATEGIC DECISIONS ONLY

CRITICAL DOCTRINE:
  Claude = pure orchestrator. NEVER auto-routed to execution tasks.
  Jules = first choice for any async coding task (FREE on Ultra plan).
  Gemini = primary execution workhorse (90-95% of all execution).
  MiniMax M2.5 = best-value code generation (80.2% SWE-Bench, $1/MTok).
  MiniMax M2.1 NIM = free tier for bulk refactoring/extraction tasks.
  Kimi K2.5 = agentic swarms, long-context research (256K window).

MINIMAX ACCESS PATHS:
  1. Direct API:     MINIMAX_API_KEY   → https://api.minimax.io/v1
  2. NVIDIA NIM:     NVIDIA_NIM_API_KEY → https://api.nvidia.com/v1 (FREE M2.1/M2)
  3. OpenRouter:     OPENROUTER_API_KEY → https://openrouter.ai/api/v1 (verified working)

MINIMAX UNIQUE CAPABILITIES:
  - Text-to-Speech: Speech-02-HD, 10K chars/request, 7 emotions (happy/sad/angry/
    fearful/disgusted/surprised/neutral), MP3/PCM/FLAC/WAV output
  - Image Generation: text-to-image, image-to-image editing
  - Video Generation: Hailuo-02 (1080p, 10s), async task polling required
  - Music Generation: text-to-music

Author: Genesis System
Date: 2026-02-23
"""

import os
import json
import time
import logging
import threading
from dataclasses import dataclass, field, asdict
from datetime import datetime
from pathlib import Path
from typing import Dict, List, Optional, Any, Literal
from enum import Enum

logger = logging.getLogger(__name__)

# ─────────────────────────────────────────────────────────────────────────────
# MiniMax constants
# ─────────────────────────────────────────────────────────────────────────────

MINIMAX_BASE_URL_DIRECT     = "https://api.minimax.io/v1"
MINIMAX_BASE_URL_ANTHROPIC  = "https://api.minimax.io/anthropic/v1"
MINIMAX_BASE_URL_NVIDIA_NIM = "https://api.nvidia.com/v1"
MINIMAX_BASE_URL_OPENROUTER = "https://openrouter.ai/api/v1"

# Model identifiers per access path
MINIMAX_MODELS: Dict[str, str] = {
    # Direct MiniMax API
    "minimax-m2.5":           "minimax-m2.5",
    "minimax-m2.5-lightning": "minimax-m2.5-lightning",  # Same quality, 2x faster
    "minimax-m2.1-direct":    "minimax-m2.1",
    # NVIDIA NIM (FREE tier, 40 RPM limit)
    "minimax-m2.1-nim":       "minimaxai/minimax-m2.1",
    "minimax-m2-nim":         "minimaxai/minimax-m2",
    # OpenRouter (verified working as of 2026-02-15)
    "minimax-m2.5-or":        "minimax/minimax-m2.5",
    "minimax-m2.1-or":        "minimax/minimax-m2.1",
}

# Cost per million tokens (USD) — input and output
MINIMAX_PRICING: Dict[str, Dict[str, float]] = {
    "minimax-m2.5":           {"input": 1.00, "output": 1.00},
    "minimax-m2.5-lightning": {"input": 1.00, "output": 1.00},
    "minimax-m2.1-direct":    {"input": 0.80, "output": 0.80},
    "minimax-m2.1-nim":       {"input": 0.00, "output": 0.00},  # FREE via NIM
    "minimax-m2-nim":         {"input": 0.00, "output": 0.00},  # FREE via NIM
    "minimax-m2.5-or":        {"input": 1.00, "output": 1.00},
    "minimax-m2.1-or":        {"input": 0.80, "output": 0.80},
}

# Context windows
MINIMAX_CONTEXT_WINDOWS: Dict[str, int] = {
    "minimax-m2.5":           1_000_000,  # 1M tokens
    "minimax-m2.5-lightning": 1_000_000,
    "minimax-m2.1-direct":    256_000,
    "minimax-m2.1-nim":       128_000,
    "minimax-m2-nim":         128_000,
    "minimax-m2.5-or":        1_000_000,
    "minimax-m2.1-or":        256_000,
}

# Capabilities flags for routing decisions
MINIMAX_CAPABILITIES: Dict[str, Dict[str, Any]] = {
    "minimax-m2.5": {
        "code": True, "reasoning": True, "long_context": True,
        "vision": True, "multilingual": True,
        "swe_bench_score": 80.2,
        "benchmark_notes": "80.2% SWE-Bench Verified, #2 globally after Claude Opus (80.9%)",
    },
    "minimax-m2.5-lightning": {
        "code": True, "reasoning": True, "long_context": True,
        "benchmark_notes": "Same quality as M2.5 but ~2x throughput",
    },
    "minimax-m2.1-direct": {
        "code": True, "reasoning": True,
        "benchmark_notes": "Lightweight coding, fast, $0.80/MTok",
    },
    "minimax-m2.1-nim": {
        "code": True, "reasoning": True,
        "benchmark_notes": "FREE via NVIDIA NIM (40 RPM limit). Best free-tier coding model.",
    },
}

# MiniMax media generation capabilities (non-text)
MINIMAX_MEDIA_CAPABILITIES: Dict[str, Any] = {
    "tts": {
        "models":       ["speech-02-hd", "speech-02-turbo"],
        "max_chars":    10_000,
        "emotions":     ["happy", "sad", "angry", "fearful", "disgusted", "surprised", "neutral"],
        "formats":      ["mp3", "pcm", "flac", "wav"],
        "sample_rates": [8000, 16000, 22050, 24000, 32000, 44100],
        "voices":       ["Friendly_Person", "Calm_Woman", "Lively_Girl", "Patient_Man"],
    },
    "image_gen": {
        "models":       ["image-01"],
        "modes":        ["text-to-image", "image-to-image"],
        "resolutions":  ["1024x1024", "1280x720", "720x1280"],
    },
    "video_gen": {
        "models":       ["hailuo-02", "hailuo-2.3"],
        "max_duration": 10,       # seconds
        "resolution":   "1080p",
        "async":        True,     # Must poll for completion
        "poll_endpoint": "https://api.minimax.io/v1/query/video_generation",
    },
    "music_gen": {
        "models":       ["music-01"],
    },
}

