scientific-backend / app /models /schemas.py
Dama12's picture
Initial clean backend deployment
0bd4ab4
Raw
History Blame
4.92 kB
"""
Pydantic schemas pour AI Scientific Co-Investigator
"""
from typing import List, Optional, Dict, Any
from pydantic import BaseModel, Field
from enum import Enum
class DocumentType(str, Enum):
"""Types de documents supportés"""
PDF = "pdf"
ARXIV = "arxiv"
PUBMED = "pubmed"
CUSTOM = "custom"
class ScientificDocument(BaseModel):
"""Représentation d'un document scientifique"""
id: str
title: str
authors: List[str]
abstract: str
content: str
document_type: DocumentType
doi: Optional[str] = None
arxiv_id: Optional[str] = None
publication_date: Optional[str] = None
citations_count: Optional[int] = None
class ExtractedHypothesis(BaseModel):
"""Hypothèse extraite d'un document"""
text: str
confidence: float = Field(ge=0, le=1)
source_document: str
paragraph_reference: str
class Methodology(BaseModel):
"""Méthodologie d'étude"""
name: str
description: str
variables: List[str]
controls: List[str]
statistical_methods: List[str]
sample_size: Optional[int] = None
study_type: str # "experimental", "observational", etc.
class ResearchGap(BaseModel):
"""Gap de recherche identifié"""
gap_description: str
importance_score: float = Field(ge=0, le=1)
related_variables: List[str]
suggested_investigation: str
source_documents: List[str]
citations: List[str] = Field(default_factory=list, description="Citations au format (Auteur, Année)")
class ComparativeAnalysis(BaseModel):
"""Analyse comparative multi-documents"""
document_ids: List[str]
divergences: List[Dict[str, Any]]
contradictions: List[Dict[str, Any]]
common_findings: List[str]
research_gaps: List[ResearchGap]
confidence_score: float = Field(ge=0, le=1)
class CounterHypothesis(BaseModel):
"""Contre-hypothèse générée par le stress tester"""
hypothesis: str
rationale: str
potential_bias: str
validation_experiment: str
confidence_against: float = Field(ge=0, le=1)
citations: List[str] = Field(default_factory=list, description="Citations au format (Auteur, Année)")
class ExperimentalVariable(BaseModel):
"""Variable expérimentale"""
name: str
type: str # "independent", "dependent", "control", "confounding"
measurement_unit: Optional[str] = None
measurement_method: str
possible_values: Optional[List[Any]] = None
class ExperimentalStep(BaseModel):
"""Étape d'un protocole expérimental"""
step_number: int
description: str
duration_hours: Optional[float] = None
materials: List[str] = []
critical_parameters: List[str] = []
validation_criteria: str = "Standard validation"
risk_level: str = "low" # "low", "medium", "high"
contingency_plan: Optional[str] = None
class ExperimentalProtocol(BaseModel):
"""Protocole expérimental complet"""
title: str
hypothesis: str
objective: str
variables: List[ExperimentalVariable]
steps: List[ExperimentalStep]
expected_outcomes: str
statistical_analysis_plan: str
success_criteria: List[str]
estimated_duration_days: float
estimated_budget_usd: Optional[float] = None
material_constraints: Optional[List[str]] = None
alternative_approaches: List[str]
risk_assessment: Dict[str, Any]
class AnalysisRequest(BaseModel):
"""Requête d'analyse scientifique"""
documents: List[ScientificDocument]
analysis_type: str = "comprehensive" # "comparative", "gap-detection", "protocol-design"
focus_area: Optional[str] = None
constraints: Optional[Dict[str, Any]] = None
user_notes: Optional[str] = None
class AnalysisResult(BaseModel):
"""Résultat d'analyse complet"""
request_id: str
documents_analyzed: int
reasoning_summary: Optional[str] = None
comparative_analysis: Optional[ComparativeAnalysis] = None
research_gaps: List[ResearchGap]
counter_hypotheses: List[CounterHypothesis]
proposed_protocol: Optional[ExperimentalProtocol] = None
strategic_recommendations: List[str]
reasoning_trace: List[Dict[str, Any]]
confidence_overall: float = Field(ge=0, le=1)
class AuditLog(BaseModel):
"""Log d'audit pour traçabilité"""
timestamp: str
step: str
decision: str
reasoning: str
intermediate_results: Optional[Dict[str, Any]] = None
model_used: str
model_config = {
"protected_namespaces": ()
}
input_tokens: Optional[int] = None
output_tokens: Optional[int] = None
class ChatRequest(BaseModel):
"""Requête de chat scientifique"""
message: str
history: Optional[List[Dict[str, str]]] = []
analysis_context: Optional[Dict[str, Any]] = None
class ChatResponse(BaseModel):
"""Réponse du chat scientifique"""
answer: str
reasoning_log: Optional[str] = None
suggested_actions: Optional[List[str]] = []