| from __future__ import annotations | |
| import re | |
| from app.storage.models import ConversationRecord, VisualAssetRecord | |
| def resolve_asset(text: str, conversation: ConversationRecord, assets: list[VisualAssetRecord], current_turn_assets: list[VisualAssetRecord]) -> VisualAssetRecord | None: | |
| if current_turn_assets and re.search(r"\b(this|current)\s+image\b", text, re.I): | |
| return current_turn_assets[-1] | |
| ordinal = re.search(r"\b(first|second|third|1st|2nd|3rd)\s+image\b", text, re.I) | |
| if ordinal: | |
| value = ordinal.group(1).lower() | |
| index = {"first": 0, "1st": 0, "second": 1, "2nd": 1, "third": 2, "3rd": 2}[value] | |
| return assets[index] if len(assets) > index else None | |
| if re.search(r"\b(previous)\s+image\b", text, re.I) and conversation.active_asset_id: | |
| ordered = assets | |
| for idx, asset in enumerate(ordered): | |
| if asset.id == conversation.active_asset_id and idx > 0: | |
| return ordered[idx - 1] | |
| if conversation.last_referenced_asset_id: | |
| return next((a for a in assets if a.id == conversation.last_referenced_asset_id), None) | |
| if conversation.active_asset_id: | |
| return next((a for a in assets if a.id == conversation.active_asset_id), None) | |
| return assets[-1] if assets else None | |
| def property_view_for_phrase(text: str, default_views: list[str]) -> str | None: | |
| lowered = text.lower() | |
| if "those colors" in lowered or "style" in lowered: | |
| return "presentation_theme" | |
| if "that chart" in lowered or "data" in lowered or "q3" in lowered: | |
| return "chart_ir" | |
| if "total" in lowered or "receipt" in lowered or "text" in lowered: | |
| return "ocr" | |
| return default_views[0] if default_views else None | |