spark_colony / models /model_manager.py
diwash-barla1's picture
refactor: decompose app into modular domain packages for v2.5
0f336cf
Raw
History Blame Contribute Delete
2.65 kB
import asyncio
import os
import random
from typing import Any, Dict, Optional
from schemas.enums import LogicalModel
from models.key_rotator import APIKeyRotationEngine
from telemetry.resource_manager import ColonyResourceManager
class ModelManager:
"""Universal Model Gateway mapping logical models (mdl_fst, mdl_adv) to dynamic physical models."""
def __init__(self, key_rotator: APIKeyRotationEngine, resource_manager: ColonyResourceManager):
self.key_rotator = key_rotator
self.resource_manager = resource_manager
# Model mappings loaded from environment variable with fallbacks
self.logical_models = {
LogicalModel.MDL_FST.value: os.getenv("MDL_FST", "gemini-2.5-flash"),
LogicalModel.MDL_ADV.value: os.getenv("MDL_ADV", "llama-3.3-70b-versatile"),
}
self.total_calls = 0
async def generate_response(
self,
logical_model: LogicalModel,
prompt: str,
system_prompt: Optional[str] = None,
vision_input: Optional[str] = None,
) -> Dict[str, Any]:
self.total_calls += 1
physical_model = self.logical_models.get(logical_model.value, "gemini-2.5-flash")
provider = "groq" if "llama" in physical_model.lower() or "groq" in physical_model.lower() else "gemini"
key = self.key_rotator.acquire_key(provider)
if not key:
# Fallback to any provider if primary unavailable
provider = "gemini" if provider == "groq" else "groq"
key = self.key_rotator.acquire_key(provider)
try:
await asyncio.sleep(0.05) # Simulated LLM latency execution
tokens_used = len(prompt.split()) + random.randint(50, 150)
if provider == "gemini":
self.resource_manager.record_gemini_tokens(tokens_used)
else:
self.resource_manager.record_groq_tokens(tokens_used)
response_text = f"Synthesized Response via [{logical_model.value} -> {physical_model}]: Processed input prompt ({len(prompt)} chars)."
if key:
self.key_rotator.release_key(key, success=True)
return {
"logical_model": logical_model.value,
"physical_model": physical_model,
"provider": provider,
"key_used": key.key_id if key else "unauthenticated",
"tokens_used": tokens_used,
"content": response_text,
}
except Exception as e:
if key:
self.key_rotator.release_key(key, success=False, error_msg=str(e))
raise e