from pydantic import BaseModel, Field from typing import Any, List, Dict, Literal, Optional class MeetingsRequest(BaseModel): working_group: str class MeetingsResponse(BaseModel): meetings: Dict[str, str] # -------------------------------------- class DataRequest(BaseModel): working_group: str meeting: str class DataResponse(BaseModel): data: List[Dict[Any, Any]] # -------------------------------------- class DocInfo(BaseModel): document: str url: str class RequirementsRequest(BaseModel): documents: List[DocInfo] class DocRequirements(BaseModel): document: str context: str requirements: List[str] class RequirementsResponse(BaseModel): requirements: List[DocRequirements] # -------------------------------------- class RequirementInfo(BaseModel): req_id: int = Field(..., description="The ID of this requirement") context: str = Field(..., description="Context for the requirement.") requirement: str = Field(..., description="The requirement itself.") document: str = Field(..., description="The document the requirement is extracted from.") class ReqSearchLLMResponse(BaseModel): selected: List[int] class ReqSearchRequest(BaseModel): query: str requirements: List[RequirementInfo] class ReqSearchResponse(BaseModel): requirements: List[RequirementInfo] # -------------------------------------- class DownloadRequest(BaseModel): documents: List[str] = Field( description="List of document IDs to download") class ReqGroupingCategory(BaseModel): """Represents the category of requirements grouped together""" id: int = Field(..., description="ID of the grouping category") title: str = Field(..., description="Title given to the grouping category") requirements: List[RequirementInfo] = Field( ..., description="List of grouped requirements") class SolutionModel(BaseModel): context: str = Field(..., description="Full context provided for this category.") requirements: List[str] = Field(..., description="List of each requirement covered by the solution as a string.") problem_description: str = Field(..., description="Description of the problem being solved.") solution_description: str = Field(..., description="Detailed description of the solution.") references: list[dict] = Field( ..., description="References to documents used for the solution.") category_id: int = Field( ..., description="ID of the requirements category the solution is based on") # class Config: # validate_by_name = True # Enables alias handling on input/output # ============================================================= Categorize requirements endpoint class ReqGroupingRequest(BaseModel): """Request schema of a requirement grouping call.""" requirements: list[RequirementInfo] max_n_categories: Optional[int] = Field( default=None, description="Max number of categories to construct. Defaults to None") class ReqGroupingResponse(BaseModel): """Response of a requirement grouping call.""" categories: List[ReqGroupingCategory] # INFO: keep in sync with prompt class _ReqGroupingCategory(BaseModel): title: str = Field(..., description="Title given to the grouping category") items: list[int] = Field( ..., description="List of the IDs of the requirements belonging to the category.") class _ReqGroupingOutput(BaseModel): categories: list[_ReqGroupingCategory] = Field( ..., description="List of grouping categories") # =================================================================== bootstrap solution response # Helpers for integration with insights finder. class InsightFinderConstraintItem(BaseModel): title: str description: str class InsightFinderConstraintsList(BaseModel): constraints: list[InsightFinderConstraintItem] #TODO: aller voir la doc, breakage API class Technology(BaseModel): """Represents a single technology entry with its details.""" title: str = Field(..., alias="name") purpose: str advantages: str limitations: str class TechnologyData(BaseModel): """Represents the top-level object containing a list of technologies.""" technologies: List[Technology] class _SolutionBootstrapOutput(BaseModel): solution: SolutionModel class _BootstrappedSolutionModel(BaseModel): """"Internal model used for solutions bootstrapped using """ requirement_ids: List[int] = Field(..., description="List of each requirement ID addressed by the solution") problem_description: str = Field(..., description="Description of the problem being solved.") solution_description: str = Field(..., description="Detailed description of the solution.") class SolutionBootstrapResponse(BaseModel): """Response model for solution bootstrapping""" solutions: list[SolutionModel] class SolutionBootstrapRequest(BaseModel): categories: List[ReqGroupingCategory] user_constraints: Optional[str] = Field( default=None, description="Additional user constraints to respect when generating the solutions.") # =========================================================== Criticize solution endpoint class CriticizeSolutionsRequest(BaseModel): solutions: list[SolutionModel] class _SolutionCriticism(BaseModel): technical_challenges: List[str] = Field( ..., description="Technical challenges encountered by the solution") weaknesses: List[str] = Field(..., description="Identified weaknesses of the solution") limitations: List[str] = Field(..., description="Identified limitations of the solution") class _SolutionCriticismOutput(BaseModel): criticisms: List[_SolutionCriticism] class SolutionCriticism(BaseModel): solution: SolutionModel criticism: _SolutionCriticism class CritiqueResponse(BaseModel): critiques: List[SolutionCriticism] # ========================================================================== class _RefinedSolutionModel(BaseModel): """Internal model used for bootstrapped solution refining""" problem_description: str = Field(..., description="New description of the problem being solved.") solution_description: str = Field(..., description="New detailed description of the solution.") # =========================================================================== class PriorArtSearchRequest(BaseModel): topics: list[str] = Field( ..., description="The list of topics to search for to create an exhaustive prior art search for a problem draft.") mode: Literal['prior_art', 'fto'] = Field(default="fto", description="") class PriorArtSearchResponse(BaseModel): content: str references: list[dict] pass