[ blog · tutorial ]7 min read

Ajouter une Web Search temps réel à un agent OpenAI ou Claude en 4 étapes

Sarah ChoyPublié le 2 mai 2026Mis à jour le 3 mai 20267 min de lecture
Ajouter une Web Search temps réel à un agent OpenAI ou Claude en 4 étapes

Vous voulez que votre agent étaye ses réponses avec de l'info à jour ? Il vous faut exactement deux choses : une API de recherche qui rend des snippets prêts pour LLM, et une définition d'outil que le modèle peut appeler. Ce guide fait les deux en 4 étapes.

L'essentiel

  • Étape 1 : créer une clé API gratuite et tester l'endpoint avec curl.
  • Étape 2 : récupérer le tool schema OpenAI / Claude depuis l'API — pas d'écriture JSON manuelle.
  • Étape 3 : enregistrer l'outil dans l'agent (OpenAI Assistants, Anthropic Messages, LangChain, n8n).
  • Étape 4 : implémenter le handler qui appelle /api/search/web et renvoie les résultats au modèle.

Pourquoi cet article est court

La plupart des tutoriels 'ajoute une Web Search à ton LLM' sont longs parce qu'ils enseignent en réalité un SDK ou un framework lourd. Pas celui-ci. Le travail : choisir un endpoint, l'enregistrer comme outil, écrire un handler de 5 lignes.

1Obtenir une clé API gratuite et appeler l'endpoint

Inscrivez-vous sur apipick.com/dashboard/api-keys. Les nouveaux comptes reçoivent 100 crédits gratuits — pas de carte. Créez une clé puis :

curl -X POST https://www.apipick.com/api/search/web \
  -H "x-api-key: pk_yourkey" \
  -H "Content-Type: application/json" \
  -d '{"query": "what is retrieval augmented generation"}'

Vous recevrez une petite liste ranked avec titre, URL et snippet. Confirmer en curl économise du debug plus tard.

2Récupérer le tool schema (ne pas l'écrire à la main)

API Pick expose des tool schemas prêts à coller via GET /api/search/web/tool-schema. La réponse inclut une définition OpenAI function et une Claude tool use.

curl https://www.apipick.com/api/search/web/tool-schema

Cachez le résultat — il change peu. Écrire des function schemas à la main est la source de bugs la plus fréquente dans le code d'agent (mauvais type, required oublié, description manquante).

3Enregistrer l'outil dans l'agent

OpenAI Assistants

from openai import OpenAI
import requests

client = OpenAI()
schema = requests.get("https://www.apipick.com/api/search/web/tool-schema").json()

assistant = client.beta.assistants.create(
    name="Research Agent",
    model="gpt-4o",
    instructions="Use web_search whenever the user asks about current events or anything that changes after your training cutoff.",
    tools=[{"type": "function", "function": schema["openai"]}],
)

Anthropic Claude

import anthropic
import requests

schema = requests.get("https://www.apipick.com/api/search/web/tool-schema").json()
client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=[schema["claude"]],
    messages=[{"role": "user", "content": "Summarise this week's RAG research."}],
)

LangChain

from langchain.tools import tool
import requests

@tool
def web_search(query: str) -> dict:
    """Real-time web search. Use for any question that needs current information."""
    return requests.post(
        "https://www.apipick.com/api/search/web",
        headers={"x-api-key": "pk_yourkey"},
        json={"query": query},
    ).json()

n8n

Ajoutez un nœud HTTP Request : méthode POST, URL https://www.apipick.com/api/search/web, header x-api-key: pk_yourkey, body JSON {"query": "{{ $json.query }}"}. Connectez-le à votre nœud agent ou LLM Chain. Pas de SDK requis.

4Gérer l'appel à l'outil

Sur OpenAI Assistants, quand le run pause sur requires_action, exécutez la recherche et soumettez la sortie :

import json, time, requests
from openai import OpenAI

client = OpenAI()
KEY = "pk_yourkey"

def run_with_tool(thread_id: str, assistant_id: str):
    run = client.beta.threads.runs.create(thread_id=thread_id, assistant_id=assistant_id)
    while True:
        run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run.id)
        if run.status == "requires_action":
            outputs = []
            for call in run.required_action.submit_tool_outputs.tool_calls:
                if call.function.name == "web_search":
                    args = json.loads(call.function.arguments)
                    result = requests.post(
                        "https://www.apipick.com/api/search/web",
                        headers={"x-api-key": KEY},
                        json=args,
                    ).json()
                    outputs.append({"tool_call_id": call.id, "output": json.dumps(result)})
            client.beta.threads.runs.submit_tool_outputs(
                thread_id=thread_id, run_id=run.id, tool_outputs=outputs,
            )
        elif run.status in ("completed", "failed", "cancelled", "expired"):
            return run
        time.sleep(0.5)

La boucle Anthropic Messages est similaire — quand la réponse contient un bloc tool_use, appelez l'API et renvoyez le résultat comme bloc tool_result au tour suivant.

Optimiser la boucle

  • Rédigez la description côté modèle : 'Use this when the user asks about current events, breaking news, or anything that may have changed after your training cutoff.' Pas 'this is a web search API'.
  • Cachez dans le handler les requêtes répétées d'une même session. Les résultats sont stables à la minute ; inutile de payer 15 crédits deux fois dans la même conversation.
  • Ajoutez start_date quand la fraîcheur compte. 'Les news de cette semaine' sans filtre de date renvoie souvent des titres de l'an dernier.

Étape suivante

Une fois la recherche en place, l'étape naturelle est de lire les pages liées. Enregistrez URL Content Extract API comme deuxième outil — même auth, même JSON, jusqu'à 25 URL par appel. 'Search + Extract' = l'agent de recherche utile minimum.

Questions fréquentes

Compatible avec OpenAI Responses API plutôt qu'Assistants ?

Oui. Le même tool schema fonctionne dans client.responses.create() via tools=[{...}]. Le handler est identique : parser tool_calls, appeler POST /api/search/web, renvoyer le JSON.

Faut-il formater les résultats avant de les renvoyer au modèle ?

Non. POST /api/search/web renvoie déjà des title + URL + snippets adaptés au LLM ranked. Renvoyez le JSON brut comme tool result. Le modèle citera les snippets et liera les URL.

Combien coûte un tour d'agent ?

Chaque appel Web Search coûte 15 crédits (≈ $0.015 à $5 / 5 000). Un tour typique avec un seul appel d'outil reste largement sous le centime US — ce sont les tokens LLM qui dominent.

Et si le modèle n'appelle jamais l'outil ?

Rendez la description spécifique. 'Use this for any question that requires current or post-training information' marche bien mieux que 'web search'. Les modèles utilisent les outils dont ils comprennent l'usage.

Peut-on filtrer par pays ou plage de dates ?

Oui. Passez country_code (ISO 3166-1 alpha-2) et/ou start_date / end_date (YYYY-MM-DD). Pour laisser le modèle choisir, ajoutez-les aux paramètres du schema ; sinon hardcodez-les dans le handler si votre agent a un locale ou une fraîcheur fixes.

APIs utilisées dans cet article

Sarah Choy
Écrit par
Sarah Choy
CEO, API Pick

Sarah Choy est CEO d'API Pick. Elle écrit sur la création d'APIs prêtes pour la production destinées aux agents IA et aux workflows LLM.