mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-08-17 18:25:42 +02:00
43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""Which model a workflow runs on when nobody picked one.
|
|
|
|
`DEFAULT_MODEL` is `opus-5`, and that is Anthropic's API-KEY lane: the Claude subscription lane is a
|
|
separate id (`opus-5-cc`). Defaulting every workflow to the literal therefore billed an API key a
|
|
subscriber may not even have, and named a model a Codex or Gemini subscriber cannot run at all.
|
|
Lives in its own module because both the routes and the executor need it, and importing one from the
|
|
other is a cycle.
|
|
"""
|
|
|
|
import logging
|
|
from typing import Optional
|
|
|
|
from typeguard import typechecked
|
|
|
|
from backend.apps.settings.models import DEFAULT_MODEL
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@typechecked
|
|
def user_default_model() -> str:
|
|
"""The model this user actually configured, never a vendor literal."""
|
|
try:
|
|
from backend.apps.settings.settings import load_settings
|
|
chosen = (getattr(load_settings(), "default_model", "") or "").strip()
|
|
return chosen or DEFAULT_MODEL
|
|
except Exception:
|
|
logger.debug("could not read the user's default model", exc_info=True)
|
|
return DEFAULT_MODEL
|
|
|
|
|
|
@typechecked
|
|
def provider_for_model(model: Optional[str]) -> str:
|
|
"""Derive the provider from the model instead of assuming Anthropic."""
|
|
if not model:
|
|
return "anthropic"
|
|
try:
|
|
from backend.apps.agents.providers.registry import get_api_type
|
|
return get_api_type(model) or "anthropic"
|
|
except Exception:
|
|
logger.debug("could not derive a provider for %s", model, exc_info=True)
|
|
return "anthropic"
|