feat(brain): Stufe E — ARIA sieht Bilder ueber Claude Codes Read-Tool
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 <pfad>` 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) <noreply@anthropic.com>
This commit is contained in:
+20
-5
@@ -54,25 +54,40 @@ TYPE_HEADINGS = {
|
|||||||
|
|
||||||
def _attachments_line(p: MemoryPoint) -> str:
|
def _attachments_line(p: MemoryPoint) -> str:
|
||||||
"""Eine Zeile die ARIA verraet welche Dateien an einer Memory haengen.
|
"""Eine Zeile die ARIA verraet welche Dateien an einer Memory haengen.
|
||||||
Bilder/Files liegen physisch unter /shared/memory-attachments/<id>/<name>
|
Bilder/Files liegen physisch unter /shared/memory-attachments/<id>/<name>.
|
||||||
— ARIA kann sie via Bash anschauen (file, head, base64...) wenn relevant.
|
|
||||||
Sehen kann sie sie erst mit der Multi-Modal-Pipeline (Stufe E)."""
|
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/<id>/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 []
|
atts = getattr(p, "attachments", None) or []
|
||||||
if not atts:
|
if not atts:
|
||||||
return ""
|
return ""
|
||||||
|
base_dir = f"/shared/memory-attachments/{p.id}/" if p.id else ""
|
||||||
items = []
|
items = []
|
||||||
|
has_image = False
|
||||||
for a in atts:
|
for a in atts:
|
||||||
if not isinstance(a, dict):
|
if not isinstance(a, dict):
|
||||||
continue
|
continue
|
||||||
name = a.get("name", "?")
|
name = a.get("name", "?")
|
||||||
mime = a.get("mime", "")
|
mime = a.get("mime", "")
|
||||||
|
if mime.startswith("image/"):
|
||||||
|
has_image = True
|
||||||
size = a.get("size")
|
size = a.get("size")
|
||||||
size_part = f", {size // 1024} KB" if isinstance(size, int) and size else ""
|
size_part = f", {size // 1024} KB" if isinstance(size, int) and size else ""
|
||||||
items.append(f"{name} ({mime}{size_part})")
|
items.append(f"{name} ({mime}{size_part})")
|
||||||
if not items:
|
if not items:
|
||||||
return ""
|
return ""
|
||||||
base_dir = f"/shared/memory-attachments/{p.id}/" if p.id else ""
|
line = f"📎 Anhaenge: {', '.join(items)}"
|
||||||
return f"📎 Anhaenge: {', '.join(items)}" + (f" — Pfad: {base_dir}" if base_dir else "")
|
if base_dir:
|
||||||
|
line += f" — Pfad: {base_dir}"
|
||||||
|
if has_image and base_dir:
|
||||||
|
line += (" — Bilder kannst du via `Read <pfad>` direkt ansehen "
|
||||||
|
"(Claude Code Read ist multi-modal-faehig)")
|
||||||
|
return line
|
||||||
|
|
||||||
|
|
||||||
def build_hot_memory_section(pinned: List[MemoryPoint]) -> str:
|
def build_hot_memory_section(pinned: List[MemoryPoint]) -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user