diff --git a/backend/services/connect.py b/backend/services/connect.py index 900a54f..bf5467d 100644 --- a/backend/services/connect.py +++ b/backend/services/connect.py @@ -1,7 +1,7 @@ """ Connect: erzeugt saubere, getestete Konfig-Snippets für IDEs/Agenten auf dem LOKALEN PC (separate Maschine im LAN). Alle zeigen auf den **Gateway** der Box -(Lanes `coding`/`chat`, Cockpit-Port :9001/v1) + den **Shared-Memory-MCP** (MC :9001). +(reale Modelle coder/heavy/vision, Cockpit-Port :9001/v1) + den **Shared-Memory-MCP** (MC :9001). Wichtig: Host ist die LAN-IP der Box (NICHT eine Proxy-Domain) — das war in v1 die häufigste Fehlerquelle. Der Aufrufer übergibt den Host explizit. @@ -15,9 +15,24 @@ from config import LLAMA_SWAP_URL, MEM0_SERVICE_URL, PORT DEFAULT_HOST = "192.168.178.151" -# IDEs bekommen NUR die 'coding'-Lane zu sehen — die Lane routet intern selbst auf das -# passende Modell (Coder/Heavy/…). Ein einziger Eintrag, kein manuelles Modell-Wählen mehr. -IDE_MODEL = "coding" +# IDEs bekommen die ECHTEN Box-Modelle direkt (kein Lane-Routing): Coder (bauen), Planer (denken), +# Augen (Bilder, Vision). Der User wechselt im Modellwähler — spiegelt das reale Zed-Setup 1:1. +PRIMARY_MODEL = "coder" + + +def _caps(tools: bool = True, images: bool = False) -> dict: + """Volle 7-Feld-Capabilities — Zed braucht sie KOMPLETT, sonst greift die Modellwahl nicht.""" + return {"tools": tools, "images": images, "parallel_tool_calls": False, + "prompt_cache_key": False, "chat_completions": True, + "interleaved_reasoning": False, "max_tokens_parameter": False} + + +# Reale Box-Modelle für die IDE-Welt (getrennt von Lucy): bauen · denken · sehen. +IDE_MODELS = [ + {"name": "coder", "display_name": "Box / Coder (bauen)", "max_tokens": 131072, "capabilities": _caps(True, False)}, + {"name": "heavy", "display_name": "Box / Planer (denken)", "max_tokens": 32768, "capabilities": _caps(True, False)}, + {"name": "vision", "display_name": "Box / Augen (Bilder)", "max_tokens": 32768, "capabilities": _caps(False, True)}, +] def _gw(host: str) -> str: @@ -37,7 +52,7 @@ def build_snippets(host: str = DEFAULT_HOST, "apiProvider": "openai", "openAiBaseUrl": gw, "openAiApiKey": "local", - "openAiModelId": "coding", + "openAiModelId": PRIMARY_MODEL, }, indent=2) # Zed = Rust-nativ, ~16x leichter als VS Code, Agent Panel mit parallelen Agenten, @@ -47,15 +62,12 @@ def build_snippets(host: str = DEFAULT_HOST, "openai_compatible": { "bosgame": { "api_url": gw, - "available_models": [ - {"name": IDE_MODEL, "display_name": "Box / coding", "max_tokens": 131072, - "capabilities": {"tools": True}} - ], + "available_models": IDE_MODELS, } } }, "agent": { - "default_model": {"provider": "openai_compatible", "model": IDE_MODEL} + "default_model": {"provider": "bosgame", "model": PRIMARY_MODEL} } }, indent=2) @@ -67,12 +79,12 @@ def build_snippets(host: str = DEFAULT_HOST, f"# und hat kein /v1/messages. Dazwischen muss ein Übersetzer (Anthropic ⇄ OpenAI) laufen:\n" f"# • claude-code-router (leichtgewichtig, npm)\n" f"# • oder LiteLLM mit /v1/messages-Bridge\n" - f"# Den Übersetzer auf den Gateway zeigen lassen: baseURL={gw}, model=coding, apiKey=local.\n" + f"# Den Übersetzer auf den Gateway zeigen lassen: baseURL={gw}, model=coder, apiKey=local.\n" f"# Dann Claude Code auf den lokalen Übersetzer richten (Beispiel-Port 3456):\n" f"\n" f'export ANTHROPIC_BASE_URL="http://localhost:3456"\n' f'export ANTHROPIC_AUTH_TOKEN="local"\n' - f'export ANTHROPIC_MODEL="coding"' + f'export ANTHROPIC_MODEL="coder"' ) memory_mcp = json.dumps({ @@ -97,10 +109,11 @@ def build_snippets(host: str = DEFAULT_HOST, "tools": { "zed": {"label": "Zed (empfohlen)", "lang": "json", "snippet": zed, "note": "Leichtgewicht-Editor (Rust, ~16x weniger RAM als VS Code). settings.json → " - "language_models.openai_compatible; Agent Panel nutzt dann die Box. Lane 'coding' routet intern."}, + "language_models.openai_compatible; Agent Panel nutzt dann die Box. Drei Modelle: " + "Coder (bauen) · Planer (denken) · Augen (Bilder) — oben im Wähler umschalten."}, "kilo": {"label": "Kilo Code", "lang": "json", "snippet": kilo, "note": "VS Code/JetBrains (schwergewichtiger). OpenAI-Provider → Gateway. " - "API-Profile je Modus: Code→coding · Architect/Orchestrator→heavy · Ask/Debug→chat."}, + "API-Profile je Modus: Code→coder · Architect/Orchestrator→heavy · Ask/Debug→chat."}, "claude_code": {"label": "Claude Code", "lang": "bash", "snippet": claude_code, "note": "Für die starken Sessions. Lokal-Betrieb bräuchte einen Anthropic⇄OpenAI-Übersetzer vor dem Gateway; Gedächtnis-Anbindung via Memory-MCP unten."}, },