| """ |
| Modèles Pydantic pour l'agent Researcher. |
| Définit les structures de données pour les requêtes de recherche et les résultats. |
| """ |
|
|
| from typing import List, Optional, Dict, Any |
| from datetime import datetime |
| from pydantic import BaseModel, Field, HttpUrl |
|
|
|
|
| |
| class ResearchQuery(BaseModel): |
| """ |
| Modèle pour une requête de recherche. |
| """ |
| topic: str = Field(..., description="Le sujet de recherche principal") |
| keywords: List[str] = Field(default_factory=list, description="Mots-clés spécifiques à rechercher") |
| max_results: int = Field(default=5, ge=1, le=20, description="Nombre maximum de résultats à retourner") |
| search_depth: str = Field(default="basic", description="Profondeur de la recherche: 'basic' ou 'advanced'") |
| date_range: Optional[str] = Field(default=None, description="Période de recherche (ex: 'last_year', 'last_month')") |
| |
| class Config: |
| json_schema_extra = { |
| "example": { |
| "topic": "impact de l'intelligence artificielle sur l'emploi", |
| "keywords": ["IA", "automatisation", "marché du travail"], |
| "max_results": 5, |
| "search_depth": "basic", |
| "date_range": "last_year" |
| } |
| } |
|
|
|
|
| class SearchResult(BaseModel): |
| """ |
| Modèle pour un résultat de recherche individuel. |
| """ |
| title: str = Field(..., description="Titre de l'article ou de la page") |
| url: HttpUrl = Field(..., description="URL de la source") |
| snippet: str = Field(..., description="Extrait ou résumé court du contenu") |
| published_date: Optional[datetime] = Field(default=None, description="Date de publication") |
| author: Optional[str] = Field(default=None, description="Auteur de l'article") |
| source: Optional[str] = Field(default=None, description="Site source (ex: 'lemonde.fr')") |
| score: Optional[float] = Field(default=None, ge=0, le=1, description="Score de pertinence (0-1)") |
| tags: List[str] = Field(default_factory=list, description="Tags ou catégories associées") |
| |
| class Config: |
| json_schema_extra = { |
| "example": { |
| "title": "L'IA transforme le marché de l'emploi", |
| "url": "https://example.com/article", |
| "snippet": "Une étude récente montre que l'intelligence artificielle...", |
| "published_date": "2024-01-15T10:00:00Z", |
| "author": "Jean Dupont", |
| "source": "example.com", |
| "score": 0.85, |
| "tags": ["technologie", "emploi"] |
| } |
| } |
|
|
|
|
| class ResearchOutput(BaseModel): |
| """ |
| Modèle pour l'output complet de l'agent Researcher. |
| """ |
| query: ResearchQuery = Field(..., description="La requête originale") |
| results: List[SearchResult] = Field(..., description="Liste des résultats trouvés") |
| total_found: int = Field(..., ge=0, description="Nombre total de résultats trouvés") |
| search_time: float = Field(..., ge=0, description="Temps de recherche en secondes") |
| search_engine: str = Field(..., description="Moteur de recherche utilisé (ex: 'tavily', 'serper')") |
| timestamp: datetime = Field(default_factory=datetime.now, description="Horodatage de la recherche") |
| |
| class Config: |
| json_schema_extra = { |
| "example": { |
| "query": { |
| "topic": "impact de l'IA sur l'emploi", |
| "max_results": 5 |
| }, |
| "results": [], |
| "total_found": 15, |
| "search_time": 2.3, |
| "search_engine": "tavily", |
| "timestamp": "2024-01-15T10:00:00Z" |
| } |
| } |