"""
Provider preset system for ViMax chat model configuration.
Supports auto-detection and resolution of LLM provider settings,
allowing users to specify a provider name (e.g., ``minimax``) instead
of manually configuring base_url and model details.
"""
import os
import logging
from typing import Dict, Any, Optional
logger = logging.getLogger(__name__)
PROVIDER_PRESETS: Dict[str, Dict[str, Any]] = {
"minimax": {
"base_url": "https://api.minimax.io/v1",
"env_key": "MINIMAX_API_KEY",
"default_model": "MiniMax-M2.7",
"models": [
"MiniMax-M2.7",
"MiniMax-M2.7-highspeed",
"MiniMax-M2.5",
"MiniMax-M2.5-highspeed",
],
"temperature_range": (0.0, 1.0),
},
}
def resolve_chat_model_config(init_args: Dict[str, Any]) -> Dict[str, Any]:
"""Resolve provider presets and return final ``init_chat_model`` kwargs.
If ``model_provider`` matches a known preset (e.g. ``minimax``), the
returned dict will have:
* ``model_provider`` rewritten to ``"openai"`` (OpenAI-compatible API)
* ``base_url`` filled in from the preset when not already set
* ``api_key`` sourced from the environment when not already set
* ``model`` defaulted to the preset's default model when not already set
* ``temperature`` clamped to the provider's supported range
For unknown providers the dict is returned unchanged.
"""
args = dict(init_args)
provider = args.get("model_provider", "openai")
preset = PROVIDER_PRESETS.get(provider)
if preset is None:
return args
if not args.get("base_url"):
args["base_url"] = preset["base_url"]
if not args.get("api_key"):
env_key = preset.get("env_key", "")
env_val = os.environ.get(env_key, "")
if env_val:
args["api_key"] = env_val
logger.info("Using %s API key from environment variable %s", provider, env_key)
if not args.get("model"):
args["model"] = preset["default_model"]
logger.info("Defaulting to model %s for provider %s", args["model"], provider)
temp_range = preset.get("temperature_range")
if temp_range and "temperature" in args and args["temperature"] is not None:
lo, hi = temp_range
original = args["temperature"]
args["temperature"] = max(lo, min(hi, original))
if args["temperature"] != original:
logger.warning(
"Clamped temperature %.2f -> %.2f for provider %s",
original, args["temperature"], provider,
)
args["model_provider"] = "openai"
return args
def detect_provider_from_env() -> Optional[str]:
"""Return the name of a provider whose API key is found in the environment.
Checks ``PROVIDER_PRESETS`` in definition order and returns the first
match, or ``None`` if no key is set.
"""
for name, preset in PROVIDER_PRESETS.items():
env_key = preset.get("env_key", "")
if env_key and os.environ.get(env_key):
return name
return None