"""Task A: document relevance. Decides whether a collected document is actually about the target company and matches the user's stated focus, before it's used as evidence for anything else.""" from __future__ import annotations from pydantic import BaseModel, Field from app.analysis.llm.base import LLMProvider from app.prompts.base import build_user_prompt SYSTEM_PROMPT = ( "You are a competitive intelligence analyst. Given a single document and a company " "profile, judge only whether the document is genuinely about that company and whether " "it relates to the user's stated monitoring focus. Do not summarize the document's " "content here - a later task does that. Be conservative: if the document could be about " "a different company with a similar name, say so." ) class RelevanceAssessment(BaseModel): is_relevant: bool = Field(description="Is this document genuinely about the target company?") matches_focus: bool = Field(description="Does it relate to the user's stated monitoring focus?") topic_categories: list[str] = Field(default_factory=list) source_reliability: float = Field(ge=0.0, le=1.0) reasoning: str async def assess_relevance( llm: LLMProvider, *, company_name: str, company_aliases: list[str], monitoring_focus: str | None, document_title: str | None, document_text: str, document_url: str, ) -> RelevanceAssessment: evidence = { "company_name": company_name, "company_aliases": company_aliases, "monitoring_focus": monitoring_focus, "document_title": document_title, "document_url": document_url, "document_text": document_text[:4000], } user_prompt = build_user_prompt( "Assess whether this document is about the target company and matches its monitoring focus.", evidence, ) return await llm.generate_structured(SYSTEM_PROMPT, user_prompt, RelevanceAssessment)