Aller au contenu principal

Web Search API : recherche web programmatique

Web Search API : recherche web programmatique

L’outil Web Search permet au modele d’effectuer des recherches sur le web en temps reel directement depuis la Responses API. Plus besoin d’integrer une API de recherche tierce : le modele formule la requete, execute la recherche et synthetise les resultats.

L’activation est immediate : ajoutez web_search_preview dans le tableau tools :

from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-5.3",
    input="Quels sont les derniers resultats de la Ligue 1 ?",
    tools=[{"type": "web_search_preview"}]
)

print(response.output_text)

Le modele decide automatiquement quand chercher sur le web. Si la question porte sur des connaissances recentes ou des faits verifiables, il lance une recherche.

Structure de la reponse

La reponse contient des annotations avec les sources utilisees :

response = client.responses.create(
    model="gpt-5.3",
    input="Quel est le cours actuel de l'action LVMH ?",
    tools=[{"type": "web_search_preview"}]
)

# Texte synthetise
print(response.output_text)

# Examiner les sources
for item in response.output:
    if hasattr(item, "content"):
        for block in item.content:
            if hasattr(block, "annotations"):
                for annotation in block.annotations:
                    if annotation.type == "url_citation":
                        print(f"Source : {annotation.url}")
                        print(f"Titre  : {annotation.title}")

Contexte utilisateur pour la pertinence

Fournissez un contexte geographique et temporel pour ameliorer la pertinence :

response = client.responses.create(
    model="gpt-5.3",
    input="Quel restaurant japonais est ouvert ce soir ?",
    tools=[{
        "type": "web_search_preview",
        "user_location": {
            "type": "approximate",
            "city": "Paris",
            "country": "FR"
        }
    }]
)

Le parametre user_location accepte plusieurs niveaux de precision :

# Localisation approximative
"user_location": {
    "type": "approximate",
    "city": "Lyon",
    "region": "Auvergne-Rhone-Alpes",
    "country": "FR"
}

Combiner Web Search et fonctions personnalisees

Le vrai pouvoir apparait quand vous combinez la recherche web avec vos propres outils :

tools = [
    {"type": "web_search_preview"},
    {
        "type": "function",
        "name": "sauvegarder_veille",
        "description": "Sauvegarder un resultat de veille dans la base de donnees",
        "parameters": {
            "type": "object",
            "properties": {
                "titre": {"type": "string"},
                "resume": {"type": "string"},
                "url_source": {"type": "string"},
                "categorie": {
                    "type": "string",
                    "enum": ["concurrent", "marche", "reglementation", "technologie"]
                }
            },
            "required": ["titre", "resume", "categorie"],
            "additionalProperties": false
        },
        "strict": true
    }
]

response = client.responses.create(
    model="gpt-5.3",
    input="Cherche les dernieres actualites sur la reglementation IA en Europe "
          "et sauvegarde les resultats importants",
    tools=tools
)

Cas d’usage en production

Veille concurrentielle automatisee

def veille_quotidienne(entreprises: list[str]):
    """Lance une veille web pour chaque concurrent."""
    resultats = []
    for entreprise in entreprises:
        response = client.responses.create(
            model="gpt-5.3",
            input=f"Quelles sont les dernieres actualites concernant {entreprise} ? "
                  "Concentre-toi sur les annonces produit, levees de fonds "
                  "et partenariats des 7 derniers jours.",
            tools=[{"type": "web_search_preview"}]
        )
        resultats.append({
            "entreprise": entreprise,
            "synthese": response.output_text
        })
    return resultats

Verification de faits

def verifier_affirmation(affirmation: str) -> dict:
    """Verifie une affirmation en croisant plusieurs sources web."""
    response = client.responses.create(
        model="gpt-5.3",
        input=f"Verifie cette affirmation en cherchant des sources fiables : "
              f"'{affirmation}'. Indique si c'est vrai, faux ou incertain, "
              f"avec les sources qui appuient ta conclusion.",
        tools=[{"type": "web_search_preview"}]
    )

    # Extraire les citations
    sources = []
    for item in response.output:
        if hasattr(item, "content"):
            for block in item.content:
                if hasattr(block, "annotations"):
                    for ann in block.annotations:
                        if ann.type == "url_citation":
                            sources.append(ann.url)

    return {
        "analyse": response.output_text,
        "nombre_sources": len(sources),
        "sources": sources
    }

Limites a connaitre

  • Le modele peut ne pas trouver de resultats pertinents pour des sujets tres niches
  • Les resultats dependent de l’indexation web au moment de la requete
  • Le nombre de recherches par appel est limite : le modele optimise en formulant des requetes precises
  • Les contenus derriere un paywall ou un login ne sont pas accessibles

Points cles a retenir

  • web_search_preview s’ajoute en une ligne dans tools
  • Le modele decide seul quand chercher sur le web
  • user_location ameliore la pertinence des resultats locaux
  • Les annotations url_citation fournissent les sources
  • Combinez Web Search avec vos fonctions pour automatiser la veille