Orienter / approach /config.py
stereoid's picture
Add files using upload-large-folder tool
3f3265f verified
Raw
History Blame Contribute Delete
5.03 kB
import json
import os
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, Dict, Mapping, Optional
OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1"
@dataclass(frozen=True)
class ProviderConfig:
name: str
provider: str
model: str
base_url: str
api_key_env: str
router_options: Dict[str, Any] = field(default_factory=dict)
@property
def api_key(self) -> str:
return os.environ.get(self.api_key_env, "")
DEFAULT_PROFILES: Dict[str, ProviderConfig] = {
"default": ProviderConfig(
name="default",
provider="openrouter",
model=os.environ.get("OPENROUTER_MODEL", "openai/gpt-5.6-sol"),
base_url=OPENROUTER_BASE_URL,
api_key_env="OPENROUTER_API_KEY",
),
"best_value": ProviderConfig(
name="best_value",
provider="openrouter",
model=os.environ.get("OPENROUTER_BEST_VALUE_MODEL", "openai/gpt-5.6-terra"),
base_url=OPENROUTER_BASE_URL,
api_key_env="OPENROUTER_API_KEY",
),
"paper_openai": ProviderConfig(
name="paper_openai",
provider="openrouter",
model="openai/gpt-4o-2024-08-06",
base_url=OPENROUTER_BASE_URL,
api_key_env="OPENROUTER_API_KEY",
),
"paper_claude": ProviderConfig(
name="paper_claude",
provider="openrouter",
model="anthropic/claude-3.5-sonnet",
base_url=OPENROUTER_BASE_URL,
api_key_env="OPENROUTER_API_KEY",
),
"paper_gemini": ProviderConfig(
name="paper_gemini",
provider="openrouter",
model="google/gemini-pro-1.5",
base_url=OPENROUTER_BASE_URL,
api_key_env="OPENROUTER_API_KEY",
),
"fastuse_experimental": ProviderConfig(
name="fastuse_experimental",
provider="openrouter",
model=os.environ.get("OPENROUTER_FASTUSE_MODEL", "google/gemini-3.1-pro-preview"),
base_url=OPENROUTER_BASE_URL,
api_key_env="OPENROUTER_API_KEY",
),
}
PROFILE_ALIASES = {
"openrouter": "default",
"gpt4v": "paper_openai",
"gpt4v_abl": "paper_openai",
"claude35sonnet": "paper_claude",
"gemini15pro": "paper_gemini",
"gemini31pro": "fastuse_experimental",
"gemini-3-flash-preview-nothinking": "default",
"gemini-3-flash-preview-nothinking_abl": "default",
}
def _load_yaml_or_json(path: Path) -> Mapping[str, Any]:
text = path.read_text()
if path.suffix.lower() == ".json":
return json.loads(text)
try:
import yaml
except ImportError as exc:
raise RuntimeError("Install PyYAML or use a JSON config file.") from exc
loaded = yaml.safe_load(text)
return loaded or {}
def _profile_from_mapping(name: str, values: Mapping[str, Any]) -> ProviderConfig:
return ProviderConfig(
name=name,
provider=values["provider"],
model=values["model"],
base_url=values.get("base_url", OPENROUTER_BASE_URL),
api_key_env=values.get("api_key_env", "OPENROUTER_API_KEY"),
router_options=dict(values.get("router_options", {})),
)
def load_profiles(path: Optional[str] = None) -> Dict[str, ProviderConfig]:
profiles = dict(DEFAULT_PROFILES)
if not path:
return profiles
raw = _load_yaml_or_json(Path(path))
raw_profiles = raw.get("profiles", raw)
for name, values in raw_profiles.items():
profiles[name] = _profile_from_mapping(name, values)
return profiles
def get_model_profile(name: str = "default", config_path: Optional[str] = None) -> ProviderConfig:
profile_name = PROFILE_ALIASES.get(name, name)
profiles = load_profiles(config_path)
if profile_name not in profiles:
valid = ", ".join(sorted(profiles))
raise ValueError(f"Unknown model profile '{name}'. Valid profiles: {valid}")
return profiles[profile_name]
def validate_model_available(profile: ProviderConfig, models_catalog: Optional[Any] = None) -> bool:
if models_catalog is None:
return True
if isinstance(models_catalog, Mapping):
models_catalog = models_catalog.get("data", models_catalog.keys())
model_ids = {
entry.get("id") if isinstance(entry, Mapping) else str(entry)
for entry in models_catalog
}
if profile.model not in model_ids:
raise ValueError(f"Model {profile.model!r} was not found in the supplied catalog.")
return True
def sanitize_manifest(
profile: ProviderConfig,
request_payload: Mapping[str, Any],
response_payload: Optional[Mapping[str, Any]] = None,
) -> Dict[str, Any]:
response_payload = response_payload or {}
return {
"provider": profile.provider,
"profile": profile.name,
"request_model": request_payload.get("model"),
"response_model": response_payload.get("model"),
"base_url": profile.base_url,
"api_key_env": profile.api_key_env,
"router_options": dict(profile.router_options),
"usage": response_payload.get("usage", {}),
}