Lucas ARRIESSE
Fix off-by-one issue with requirement IDs + add /search_solutions_gemini endpoint
72683de
from pydantic import BaseModel, Field | |
from typing import List, Optional | |
# Shared model schemas | |
class RequirementInfo(BaseModel): | |
"""Represents an extracted requirement info""" | |
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 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 as string.") | |
Problem_Description: str = Field(..., alias="Problem Description", | |
description="Description of the problem being solved.") | |
Solution_Description: str = Field(..., alias="Solution Description", | |
description="Detailed description of the solution.") | |
References: list[str] = 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") | |
# =========================================================== 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] | |
# response format | |
class SolutionCriticism(BaseModel): | |
solution: SolutionModel | |
criticism: _SolutionCriticism | |
class CritiqueResponse(BaseModel): | |
critiques: List[SolutionCriticism] | |
# =================================================================== search solution response endpoint | |
class _SolutionSearchOutput(BaseModel): | |
solution: SolutionModel | |
class _SearchedSolutionModel(BaseModel): | |
""""Internal model used for solutions searched using gemini""" | |
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 SolutionSearchResponse(BaseModel): | |
"""Response model for solution search""" | |
solutions: list[SolutionModel] | |