feat(2.0): Phase 6c — eingebauter OpenAI-Gateway (model:auto) statt LiteLLM

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>
This commit is contained in:
Hitonabi
2026-06-25 12:54:19 +02:00
parent db1f62227b
commit ceca2ae8e3
10 changed files with 143 additions and 99 deletions
+30
View File
@@ -0,0 +1,30 @@
"""
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"