modcomms/backend/app/agents/channel_tech_specs_agent.py
michael 404ba6868b Restructure agent system: remove Tone, split Channel, implement Legal
- Remove Tone Agent (tone is now part of Brand specs)
- Split Channel Agent into Channel Best Practices Agent and Channel Tech Specs Agent
- Convert Legal Agent from stub to full Gemini-powered implementation
- Add new prompt files for channel_best_practices.md, channel_tech_specs.md, legal.md
- Update ReferenceDocsService with new methods for loading specs
- Update schemas and analysis service to use new agent structure
- Update all frontend components to use new agent names and properties
- Update mock data in Projects.tsx and Campaigns.tsx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 11:58:17 -06:00

101 lines
3.9 KiB
Python

from typing import List, Tuple
from app.agents.base_agent import BaseAgent
from app.models.schemas import SubReview
from app.services.gemini_service import GeminiService
from app.services.reference_docs import ReferenceDocsService
class ChannelTechSpecsAgent(BaseAgent):
"""Channel Tech Specs Agent - analyzes proofs for technical specifications and format requirements using Gemini."""
name = "Channel Tech Specs Agent"
def __init__(self, gemini_service: GeminiService, reference_docs: ReferenceDocsService):
"""
Initialize the Channel Tech Specs Agent.
Args:
gemini_service: Service for making Gemini API calls
reference_docs: Service for loading reference documents
"""
self.gemini = gemini_service
self.reference_docs = reference_docs
async def analyze(self, images: List[Tuple[bytes, str]]) -> SubReview:
"""
Analyze the proof for technical specifications compliance.
Args:
images: List of (file_data, mime_type) tuples representing the proof
Returns:
SubReview with technical specifications assessment
"""
# Get the channel tech specs specification
tech_specs_context = self.reference_docs.get_channel_tech_specs_spec()
prompt = f"""You are a digital channel technical specifications specialist for Barclays Bank. Your role is to analyze marketing proofs for technical compliance with platform specifications, dimensions, file formats, and character limits.
Here are the channel technical specifications to use for your analysis:
{tech_specs_context}
---
Analyze the uploaded proof for technical specification compliance, checking:
1. **Dimensions & Resolution**:
- Does the asset meet the required dimensions for the target platform?
- Is the resolution appropriate (DPI/PPI requirements)?
- Are aspect ratios correct for the intended placement?
2. **File Format Requirements**:
- Is the file format suitable for the platform?
- Are file size limits being respected?
- Is compression appropriate for quality vs. performance?
3. **Typography Specifications**:
- Are minimum font sizes met for the platform?
- Character counts within platform limits (headlines, body, etc.)?
- Is text readable at the intended display size?
4. **Digital Grid System**:
- Desktop: 12-column grid compliance
- Tablet: 12-column grid compliance
- Mobile: 6-column grid compliance
- 8px baseline grid adherence
5. **Accessibility Requirements**:
- Color contrast meets WCAG requirements?
- Only documented color pairings are used?
- Text is legible at intended display sizes?
6. **Platform-Specific Technical Requirements**:
- Safe zone compliance for interactive elements
- Video/animation format requirements (if applicable)
- Frame rate and duration limits (if applicable)
Provide your analysis as a JSON object. Be specific about any technical issues and reference the relevant specification.
RAG Status Guidelines:
- **Green**: Fully compliant with all technical specifications
- **Amber**: Minor technical adjustments needed but content is deployable
- **Red**: Significant technical issues that will prevent proper display or deployment
If the proof is nonsensical, not a marketing material, or cannot be analyzed, set analysisStatus to 'low_confidence'.
**Response Format:**
- Keep feedback brief and scannable
- Use bullet points for each finding
- Each bullet should be one actionable sentence
- Start with the issue, then the specification requirement
- Example: "Image resolution 72dpi - increase to minimum 150dpi for print quality"
"""
# Use single-image or multi-image analysis depending on input
if len(images) == 1:
file_data, file_type = images[0]
return await self.gemini.analyze_with_image(prompt, file_data, file_type)
else:
return await self.gemini.analyze_with_images(prompt, images)