92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
"""
|
|
CSV renderer for report generation.
|
|
"""
|
|
|
|
from .base_renderer import BaseRenderer
|
|
from typing import Dict, Any, Tuple, List
|
|
import csv
|
|
import io
|
|
|
|
class CsvRenderer(BaseRenderer):
|
|
"""Renders content to CSV format with format-specific extraction."""
|
|
|
|
@classmethod
|
|
def get_supported_formats(cls) -> List[str]:
|
|
"""Return supported CSV formats."""
|
|
return ['csv']
|
|
|
|
@classmethod
|
|
def get_format_aliases(cls) -> List[str]:
|
|
"""Return format aliases."""
|
|
return ['spreadsheet', 'table']
|
|
|
|
@classmethod
|
|
def get_priority(cls) -> int:
|
|
"""Return priority for CSV renderer."""
|
|
return 70
|
|
|
|
def getExtractionPrompt(self, user_prompt: str, title: str) -> str:
|
|
"""Get CSV-specific extraction prompt."""
|
|
return f"""
|
|
{user_prompt}
|
|
|
|
Generate a comprehensive CSV report with the title: "{title}"
|
|
|
|
CSV FORMAT REQUIREMENTS:
|
|
- Create structured data in CSV format
|
|
- Use proper CSV syntax with commas and quotes
|
|
- Include headers for all columns
|
|
- Structure data in rows and columns
|
|
- Include source document information
|
|
- Add metadata as additional rows
|
|
|
|
CSV STRUCTURE:
|
|
- First row: Headers (Section, Type, Heading, Content, Source)
|
|
- Data rows: One per section/item
|
|
- Use quotes around content that contains commas
|
|
- Escape quotes properly
|
|
- Include metadata rows at the end
|
|
|
|
FORMATTING RULES:
|
|
- Headers: Section, Type, Heading, Content, Source
|
|
- Content: Escape commas and quotes, limit length
|
|
- Source: Include document name and page if available
|
|
- Metadata: Add special rows for generation info
|
|
|
|
OUTPUT POLICY:
|
|
- Return ONLY CSV data
|
|
- No markdown, no code blocks, no additional text
|
|
- Properly formatted CSV
|
|
- Include all necessary information
|
|
- Valid CSV that can be imported
|
|
|
|
CRITICAL: Use the actual data from the source documents to create the content. Do not generate placeholder text or templates. Extract and use the real data provided in the source documents to create meaningful content.
|
|
|
|
Generate the complete CSV report using the actual data from the source documents:
|
|
"""
|
|
|
|
async def render(self, extracted_content: str, title: str) -> Tuple[str, str]:
|
|
"""Render extracted content to CSV format."""
|
|
try:
|
|
# The extracted content should already be CSV from the AI
|
|
# Just clean it up
|
|
csv_content = self._clean_csv_content(extracted_content, title)
|
|
|
|
return csv_content, "text/csv"
|
|
|
|
except Exception as e:
|
|
self.logger.error(f"Error rendering CSV: {str(e)}")
|
|
# Return minimal CSV fallback
|
|
return f"Title,Content\n{title},Error rendering report: {str(e)}", "text/csv"
|
|
|
|
def _clean_csv_content(self, content: str, title: str) -> str:
|
|
"""Clean and validate CSV content from AI."""
|
|
content = content.strip()
|
|
|
|
# Remove markdown code blocks if present
|
|
if content.startswith("```") and content.endswith("```"):
|
|
lines = content.split('\n')
|
|
if len(lines) > 2:
|
|
content = '\n'.join(lines[1:-1]).strip()
|
|
|
|
return content
|