| """ |
| Frox AI — Image Analysis Tool |
| |
| Deliberately thin: this just calls MorphInferenceEngine.understand_image(), |
| which runs Morph's own vision encoder + LLM (see |
| multimodal/vision/encoder.py and inference/engine/morph_engine.py). |
| No external vision API — "image analysis" here means Morph looking at |
| the image itself, not a wrapper around someone else's vision model. |
| """ |
| from __future__ import annotations |
|
|
| from tools.registry import tool, ToolContext |
|
|
|
|
| @tool( |
| name="image_analysis", |
| description="Analyze an image and answer a question about it", |
| timeout=30.0, |
| ) |
| def image_analysis(ctx: ToolContext, image_path: str, question: str = "Describe this image.") -> dict: |
| """ |
| Args: |
| image_path: Path to the image file on disk. |
| question: What to ask about the image. |
| |
| Plain `def`, not `async def`: engine.understand_image() is a |
| synchronous, GPU-bound call — thread-offloaded by the registry |
| rather than blocking the event loop for the duration of inference. |
| """ |
| if ctx.engine is None: |
| raise RuntimeError("No engine configured in ToolContext (needed for vision)") |
|
|
| answer = ctx.engine.understand_image(image_path, question) |
| return {"image_path": image_path, "question": question, "answer": answer} |
|
|