Implement optional single-image intake, Signal ingestion, and multimodal vision analysis

- Add image intake service with format validation (JPEG, PNG, WebP) and EXIF/GPS stripping
- Enforce strict single-image rule across Web and Signal attachment channels
- Implement token-optimized vision downscaling and JPEG compression
- Add IMAGE_CONTEXT pipeline stage with OmniRoute vision routing and resilient failover
- Seed and manage versioned idea-image-interpreter prompt in catalog
- Update Web UI with responsive image picker, preview chip, and Visual Context tab
- Add comprehensive automated test suite in test_image_intake.py
- Update README and Labyricorn devlog
This commit is contained in:
2026-08-23 01:40:22 -07:00
parent 94ff1e4408
commit 41e08611c9
30 changed files with 3784 additions and 278 deletions
+27 -1
View File
@@ -110,6 +110,32 @@ class Idea:
updated_at: str = ""
urls: List[IdeaURL] = field(default_factory=list)
relationships: List[Dict[str, Any]] = field(default_factory=list)
submission_image: Optional[Dict[str, Any]] = None
source_channel: str = "web"
source_sender_uuid: Optional[str] = None
source_group_id: Optional[str] = None
source_event_id: Optional[str] = None
@dataclass
class SubmittedImage:
raw_bytes: bytes
filename: str
content_type: str
source: str = "web" # "web" | "signal"
@dataclass
class IdeaSubmission:
text: str
source: str = "web" # "web" | "signal"
image: Optional[SubmittedImage] = None
sender_uuid: Optional[str] = None
sender_number: Optional[str] = None
sender_name: Optional[str] = None
group_id: Optional[str] = None
message_id: Optional[str] = None
event_id: Optional[str] = None
reply_to: Optional[str] = None
received_at: Optional[str] = None
@dataclass
class WorkTrackOutput:
@@ -129,7 +155,7 @@ class WorkTrackOutput:
class WorkTrack:
id: str # e.g. WT-0001
idea_id: str
work_type_id: str # ARTICLE, BLOG_ENTRY, CODING_PROJECT
work_type_id: str # ARTICLE, BLOG_ENTRY, CODING_PROJECT, YOUTUBE_VIDEO
name: str
state: WorkTrackState = WorkTrackState.PLANNED
workflow_id: str = ""