ceca2ae8e3
LiteLLM baut auf Python 3.14 nicht (orjson-Pin ohne cp314-Wheel). Stattdessen eingebauter Gateway in MC2: routers/gateway_proxy.py (/v1/chat/completions, /completions, /models) + services/router_logic.py (Komplexitaets-Routing fast<->heavy, Streaming-Passthrough). gateway.py/routing.py/connect.py auf builtin umgestellt (Endpunkt = MC :PORT/v1). Gleicher OpenAI-Vertrag, spaeter gegen LiteLLM austauschbar. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
"""
|
|
Komplexitäts-Routing für `model: auto` (eingebauter Gateway).
|
|
Schnell im Alltag (fast), schwer bei Bedarf (heavy) — regelbasiert, sub-ms, ohne Cloud.
|
|
"""
|
|
|
|
import os
|
|
import re
|
|
|
|
FAST = os.environ.get("MC_ROUTE_FAST", "fast")
|
|
HEAVY = os.environ.get("MC_ROUTE_HEAVY", "heavy")
|
|
HEAVY_CHARS = int(os.environ.get("MC_GATEWAY_HEAVY_CHARS", "8000"))
|
|
|
|
_HEAVY_KW = re.compile(
|
|
r"\b(beweis|prove|theorem|refactor|architect|komplex|complex|schwierig|"
|
|
r"think\s*hard|reason\s*carefully|tief\s*nachdenk|optimi[sz]e|algorithm|"
|
|
r"root\s*cause|debug|analy[sz]e\s+deeply|step[-\s]?by[-\s]?step)\b",
|
|
re.IGNORECASE,
|
|
)
|
|
|
|
|
|
def choose_model(body: dict) -> tuple[str, str]:
|
|
"""Wählt fast|heavy für eine Chat-Anfrage. Gibt (alias, begründung) zurück."""
|
|
msgs = body.get("messages") or []
|
|
text = "\n".join(str(m.get("content") or "") for m in msgs)
|
|
n = len(text)
|
|
if n > HEAVY_CHARS:
|
|
return HEAVY, f"langer Kontext ({n} > {HEAVY_CHARS} Zeichen)"
|
|
if _HEAVY_KW.search(text):
|
|
return HEAVY, "Komplexitäts-Schlüsselwort erkannt"
|
|
return FAST, "Standard"
|