From ec9d1bff5b46bd0df723cce78ba07b7ced48504c Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Mon, 29 Jun 2026 17:52:07 +0200 Subject: [PATCH] =?UTF-8?q?Perf:=20Bildschirm-Beschreibung=20knapper=20(B2?= =?UTF-8?q?)=20=E2=80=94=20schnellere=20Vision-Turns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit voice.py _describe_images: max_tokens 600->280 (env MC_VISION_MAX_TOKENS) + knapperer Prompt ('höchstens 5 kurze Sätze, keine Einleitung'). Schnellere VL-Generierung UND weniger Kontext-Bloat im anschließenden Hermes-Turn. Vision-Modell/Zwei-Schritt bleibt (volles Weglassen erst nach Bake-off, Stufe D). Co-Authored-By: Claude Opus 4.8 --- backend/routers/voice.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/routers/voice.py b/backend/routers/voice.py index 2a0bb63..4f49713 100644 --- a/backend/routers/voice.py +++ b/backend/routers/voice.py @@ -37,24 +37,27 @@ router = APIRouter(prefix="/api") # geht als TEXT an Hermes -> Lucy behält ihr volles Hirn/Gedächtnis UND nutzt das bessere VL-Modell # (statt der schwächeren Vision der fast-MoE). Per Env abschaltbar/umstellbar. VISION_MODEL = os.environ.get("MC_VISION_MODEL", "vision") +# Knappe Beschreibung = schnellere VL-Generierung UND weniger Hermes-Kontext-Bloat (B2). +VISION_MAX_TOKENS = int(os.environ.get("MC_VISION_MAX_TOKENS", "280")) async def _describe_images(image_urls: list[str], hint: str) -> str: """Lässt das Vision-Modell die Screenshots (1 je Monitor) knapp beschreiben (Deutsch). Mehrere Bilder gehen in EINER Nachricht ans VL-Modell. Leerer String bei Fehler.""" multi = len(image_urls) > 1 - intro = (f"Hier sind {len(image_urls)} Screenshots (je ein Monitor). Beschreibe knapp und präzise auf Deutsch, " - "was auf den Bildschirmen zu sehen ist (pro Monitor: App/Fenster, wichtige Inhalte, sichtbarer Text/Code). " + intro = (f"Hier sind {len(image_urls)} Screenshots (je ein Monitor). Beschreibe auf Deutsch in höchstens " + "5 kurzen Sätzen das Wesentliche (pro Monitor: App/Fenster, wichtige Inhalte, sichtbarer Text/Code). " + "Keine Einleitung, keine Wiederholung der Frage. " if multi else - "Beschreibe knapp und präzise auf Deutsch, was auf diesem Screenshot zu sehen ist " - "(App/Fenster, wichtige Inhalte, sichtbarer Text/Code). ") + "Beschreibe auf Deutsch in höchstens 5 kurzen Sätzen das Wesentliche auf diesem Screenshot " + "(App/Fenster, wichtige Inhalte, sichtbarer Text/Code). Keine Einleitung. ") content: list = [{"type": "text", "text": intro + "Frage des Nutzers dazu: " + hint}] for u in image_urls: content.append({"type": "image_url", "image_url": {"url": u}}) try: async with httpx.AsyncClient(timeout=httpx.Timeout(120.0, connect=5.0)) as client: r = await client.post(f"{LLAMA_SWAP_URL}/v1/chat/completions", json={ - "model": VISION_MODEL, "max_tokens": 600, "stream": False, + "model": VISION_MODEL, "max_tokens": VISION_MAX_TOKENS, "stream": False, "messages": [{"role": "user", "content": content}], }) r.raise_for_status()