From 933dd503674bedada7657cf3a5a78d026ed9537d Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 13 May 2026 02:49:09 +0200 Subject: [PATCH] =?UTF-8?q?feat(brain):=20Stufe=20E=20=E2=80=94=20ARIA=20s?= =?UTF-8?q?ieht=20Bilder=20ueber=20Claude=20Codes=20Read-Tool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wir mussten den Proxy nicht patchen. Claude Code's eingebautes Read-Tool ist multi-modal-faehig — uebergibt man eine Bilddatei, geht die durch das gleiche Vision-Modell wie via Anthropic-Vision-API. ARIA hat eh "Tool-Freigaben — Vollzugriff" pinned (inkl. Read), also muss sie nur wissen dass sie das nutzen darf. prompts._attachments_line erweitert: bei image/* im Anhang haengen wir den Hinweis an "Bilder kannst du via `Read ` direkt ansehen". ARIA ruft dann selbststaendig Read mit dem Memory-Anhang-Pfad, sieht das Bild und kann antworten was drauf ist. Heisst: Stefan sagt "schau dir mein Cessna-Foto an" → ARIA findet Memory via Cold-Search → sieht die Read-Anweisung → ruft Read auf → Vision-Modell beschreibt das Bild → ARIA antwortet im Chat. Co-Authored-By: Claude Opus 4.7 (1M context) --- aria-brain/prompts.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/aria-brain/prompts.py b/aria-brain/prompts.py index 5ba12df..5d21cc4 100644 --- a/aria-brain/prompts.py +++ b/aria-brain/prompts.py @@ -54,25 +54,40 @@ TYPE_HEADINGS = { def _attachments_line(p: MemoryPoint) -> str: """Eine Zeile die ARIA verraet welche Dateien an einer Memory haengen. - Bilder/Files liegen physisch unter /shared/memory-attachments// - — ARIA kann sie via Bash anschauen (file, head, base64...) wenn relevant. - Sehen kann sie sie erst mit der Multi-Modal-Pipeline (Stufe E).""" + Bilder/Files liegen physisch unter /shared/memory-attachments//. + + Multi-Modal-Hinweis: Claude Code's `Read`-Tool kann Bilder direkt + anschauen (PNG/JPG/GIF/WebP) — sie laufen dann durch das gleiche + Vision-Modell wie via Anthropic-Vision-API. Heisst: ARIA muss nur + `Read /shared/memory-attachments//foto.jpg` aufrufen und sieht + das Bild wirklich, ohne dass wir Multi-Modal-Messages durch den + Proxy schleusen muessen. Wir geben ihr den Hinweis in der Zeile mit. + """ atts = getattr(p, "attachments", None) or [] if not atts: return "" + base_dir = f"/shared/memory-attachments/{p.id}/" if p.id else "" items = [] + has_image = False for a in atts: if not isinstance(a, dict): continue name = a.get("name", "?") mime = a.get("mime", "") + if mime.startswith("image/"): + has_image = True size = a.get("size") size_part = f", {size // 1024} KB" if isinstance(size, int) and size else "" items.append(f"{name} ({mime}{size_part})") if not items: return "" - base_dir = f"/shared/memory-attachments/{p.id}/" if p.id else "" - return f"📎 Anhaenge: {', '.join(items)}" + (f" — Pfad: {base_dir}" if base_dir else "") + line = f"📎 Anhaenge: {', '.join(items)}" + if base_dir: + line += f" — Pfad: {base_dir}" + if has_image and base_dir: + line += (" — Bilder kannst du via `Read ` direkt ansehen " + "(Claude Code Read ist multi-modal-faehig)") + return line def build_hot_memory_section(pinned: List[MemoryPoint]) -> str: