|
|
""" |
|
|
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" |
|
|
} |
|
|
} |