Docxtract / schemas.py
Lucas ARRIESSE
Add ability to bulk download files sorted by agenda item or not
730ea19
raw
history blame
8.09 kB
from pydantic import BaseModel, Field
from typing import Any, List, Dict, Literal, Optional
# --------------------------------------- Document related endpoints ---------------------------------------
class GetMeetingsRequest(BaseModel):
working_group: Literal["SA1", "SA2", "SA3", "SA4", "SA5", "SA6",
"CT1", "CT2", "CT3", "CT4", "CT5", "CT6", "RAN1", "RAN2"]
class GetMeetingsResponse(BaseModel):
meetings: Dict[str, str] = Field(
..., description="Mapping of meetings with as key their display name and value the FTP meeting name.")
class GetMeetingDocsRequest(BaseModel):
working_group: str
meeting: str
class GetMeetingDocsResponse(BaseModel):
data: List[Dict[Any, Any]]
class DocInfo(BaseModel):
"""
Schema for describing a document to download.
"""
# Document name
document: str
# Document URL
url: str
# Document type
type: str
# Agenda item this document belongs to.
agenda_item: str
class DownloadDocsRequest(BaseModel):
documents: List[DocInfo] = Field(
description="List of documents to download")
sort_by_agenda_item: bool = Field(default=False, description="Whether to sort the files by their agenda item.")
# --------------------------------------
class ExtractRequirementsRequest(BaseModel):
documents: List[DocInfo]
class DocRequirements(BaseModel):
document: str
context: str
requirements: List[str]
class ExtractRequirementsResponse(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 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")
disable_sort_checks: bool = Field(default=False, description="Disable sort checks when grouping requirements")
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):
# Final consolidation report contents
content: str
# Individual search topic contents
topic_contents: list[dict]
pass