| from PIL import Image |
| from typing import Dict, Any |
| from .base_agent import LLMAgent, AgentResponse |
|
|
|
|
| class LayoutAnalysisAgent(LLMAgent): |
| name = "layout_analysis_agent" |
| description = "Analyzes document layout structure - identifies columns, headers, footers, margins, and reading order" |
|
|
| def build_prompt(self, pil_image: Image.Image) -> str: |
| width, height = pil_image.size |
| return f"""Analyze the layout of this PDF page (dimensions: {width}x{height}). |
| |
| Describe the layout structure: |
| 1. Is it single or multi-column? |
| 2. Where are the margins and gutters? |
| 3. Are there headers, footers, or page numbers? |
| 4. What is the reading order of content blocks? |
| 5. Are there any sidebars, footnotes, or margin notes? |
| 6. What type of document is this (letter, report, form, etc.)? |
| |
| Provide specific coordinates for key layout elements if visible.""" |
|
|
| def execute(self, pil_image: Image.Image, reasoning: str) -> Dict[str, Any]: |
| width, height = pil_image.size |
| return { |
| "layout_type": self._classify_layout(reasoning), |
| "width": width, |
| "height": height, |
| "blocks": self._extract_blocks(reasoning), |
| "reading_order": self._extract_reading_order(reasoning), |
| "reasoning": reasoning, |
| } |
|
|
| def _classify_layout(self, reasoning: str) -> str: |
| reasoning_lower = reasoning.lower() |
| if "column" in reasoning_lower: |
| return "multi_column" |
| return "single_column" |
|
|
| def _extract_blocks(self, reasoning: str) -> list: |
| return [] |
|
|
| def _extract_reading_order(self, reasoning: str) -> list: |
| return [] |
|
|