85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
|
|
DEFAULT_MODEL_NAME_MAP = {
|
|
"org_auto": "Auto",
|
|
"dashscope_qmodel": "qwen3.6-plus",
|
|
"dashscope_qwen3_coder": "qwen3-coder",
|
|
"dashscope_qwen_plus_20250428_thinking": "qwen3-thinking",
|
|
"dashscope_qwen_max_latest": "qwen3-max",
|
|
}
|
|
|
|
|
|
def build_model_name_map(models: dict) -> dict[str, str]:
|
|
name_map = dict(DEFAULT_MODEL_NAME_MAP)
|
|
if not isinstance(models, dict):
|
|
return name_map
|
|
for group in ("chat", "assistant", "developer", "inline"):
|
|
items = models.get(group) or []
|
|
if not isinstance(items, list):
|
|
continue
|
|
for item in items:
|
|
if not isinstance(item, dict):
|
|
continue
|
|
key = item.get("key")
|
|
if not isinstance(key, str) or not key:
|
|
continue
|
|
display_name = item.get("displayName") or item.get("name")
|
|
if isinstance(display_name, str) and display_name.strip():
|
|
name_map[key] = display_name.strip()
|
|
return name_map
|
|
|
|
|
|
def reverse_name_map(name_map: dict[str, str]) -> dict[str, str]:
|
|
rev: dict[str, str] = {}
|
|
for key, name in name_map.items():
|
|
if not isinstance(name, str) or not name:
|
|
continue
|
|
rev[name] = key
|
|
rev[name.lower()] = key
|
|
return rev
|
|
|
|
|
|
def flatten_model_keys(models: dict) -> list[str]:
|
|
keys: list[str] = []
|
|
if not isinstance(models, dict):
|
|
return keys
|
|
for group in ("chat", "assistant", "developer", "inline"):
|
|
items = models.get(group) or []
|
|
if not isinstance(items, list):
|
|
continue
|
|
for item in items:
|
|
if not isinstance(item, dict):
|
|
continue
|
|
key = item.get("key")
|
|
if isinstance(key, str) and key and key not in keys:
|
|
keys.append(key)
|
|
return keys
|
|
|
|
|
|
def resolve_model(
|
|
request_model: str,
|
|
available_keys: list[str],
|
|
default_model: str,
|
|
model_name_map: dict[str, str] | None = None,
|
|
) -> str:
|
|
model_name_map = model_name_map or {}
|
|
rev_map = reverse_name_map(model_name_map)
|
|
|
|
if request_model in available_keys:
|
|
return request_model
|
|
if request_model in rev_map and rev_map[request_model] in available_keys:
|
|
return rev_map[request_model]
|
|
if request_model.lower() in rev_map and rev_map[request_model.lower()] in available_keys:
|
|
return rev_map[request_model.lower()]
|
|
if request_model in {"gpt-4o-mini", "gpt-4o", "gpt-4.1", "gpt-3.5-turbo"}:
|
|
if default_model in available_keys:
|
|
return default_model
|
|
if available_keys:
|
|
return available_keys[0]
|
|
if default_model in available_keys:
|
|
return default_model
|
|
if available_keys:
|
|
return available_keys[0]
|
|
return request_model or default_model
|