Les blocs de contenu de résultats de recherche sont actuellement en version bêta. Utilisez l’en-tête bêta search-results-2025-06-09 pour activer cette fonctionnalité.

Les blocs de contenu de résultats de recherche permettent des citations naturelles avec une attribution de source appropriée, apportant des citations de qualité de recherche web à vos applications personnalisées. Cette fonctionnalité est particulièrement puissante pour les applications RAG (Génération Augmentée par Récupération) où vous avez besoin que Claude cite les sources avec précision.

La fonctionnalité de résultats de recherche est disponible sur les modèles suivants :

  • Claude 3.5 Haiku (claude-3-5-haiku-20241022)
  • Claude 3.5 Sonnet (claude-3-5-sonnet-20241022)
  • Claude 3.7 Sonnet (claude-3-7-sonnet-20250219)
  • Claude Opus 4 (claude-opus-4-20250514)
  • Claude Sonnet 4 (claude-sonnet-4-20250514)

Avantages clés

  • Citations naturelles - Obtenez la même qualité de citation que la recherche web pour tout contenu
  • Intégration flexible - Utilisez dans les retours d’outils pour un RAG dynamique ou comme contenu de niveau supérieur pour des données pré-récupérées
  • Attribution de source appropriée - Chaque résultat inclut des informations de source et de titre pour une attribution claire
  • Aucune solution de contournement de document nécessaire - Élimine le besoin de solutions de contournement basées sur des documents
  • Format de citation cohérent - Correspond à la qualité et au format de citation de la fonctionnalité de recherche web de Claude

Comment ça fonctionne

Les résultats de recherche peuvent être fournis de deux manières :

  1. À partir d’appels d’outils - Vos outils personnalisés retournent des résultats de recherche, permettant des applications RAG dynamiques
  2. Comme contenu de niveau supérieur - Vous fournissez des résultats de recherche directement dans les messages utilisateur pour du contenu pré-récupéré ou mis en cache

Dans les deux cas, Claude peut automatiquement citer des informations des résultats de recherche avec une attribution de source appropriée.

Schéma de résultat de recherche

Les résultats de recherche utilisent la structure suivante :

{
  "type": "search_result",
  "source": "https://example.com/article",  // Requis : URL source ou identifiant
  "title": "Titre de l'article",                  // Requis : Titre du résultat
  "content": [ // Requis : Tableau de blocs de texte
    {
      "type": "text",
      "text": "Le contenu réel du résultat de recherche..."
    }
  ],
  "citations": {                             // Optionnel : Configuration de citation
    "enabled": true                          // Activer/désactiver les citations pour ce résultat
  }
}

Champs requis

ChampTypeDescription
typestringDoit être "search_result"
sourcestringL’URL source ou l’identifiant pour le contenu
titlestringUn titre descriptif pour le résultat de recherche
contentarrayUn tableau de blocs de texte contenant le contenu réel

Champs optionnels

ChampTypeDescription
citationsobjectConfiguration de citation avec champ booléen enabled
cache_controlobjectParamètres de contrôle de cache (par ex., {"type": "ephemeral"})

Chaque élément dans le tableau content doit être un bloc de texte avec :

  • type : Doit être "text"
  • text : Le contenu textuel réel (chaîne non vide)

Méthode 1 : Résultats de recherche à partir d’appels d’outils

Le cas d’usage le plus puissant est de retourner des résultats de recherche à partir de vos outils personnalisés. Cela permet des applications RAG dynamiques où les outils récupèrent et retournent du contenu pertinent avec des citations automatiques.

Exemple : Outil de base de connaissances

from anthropic import Anthropic
from anthropic.types.beta import (
    BetaMessageParam,
    BetaTextBlockParam,
    BetaSearchResultBlockParam,
    BetaToolResultBlockParam
)

client = Anthropic()

# Définir un outil de recherche de base de connaissances
knowledge_base_tool = {
    "name": "search_knowledge_base",
    "description": "Rechercher dans la base de connaissances de l'entreprise pour des informations",
    "input_schema": {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "La requête de recherche"
            }
        },
        "required": ["query"]
    }
}

# Fonction pour gérer l'appel d'outil
def search_knowledge_base(query):
    # Votre logique de recherche ici
    # Retourne des résultats de recherche dans le format correct
    return [
        BetaSearchResultBlockParam(
            type="search_result",
            source="https://docs.company.com/product-guide",
            title="Guide de Configuration Produit",
            content=[
                BetaTextBlockParam(
                    type="text",
                    text="Pour configurer le produit, naviguez vers Paramètres > Configuration. Le délai d'attente par défaut est de 30 secondes, mais peut être ajusté entre 10-120 secondes selon vos besoins."
                )
            ],
            citations={"enabled": True}
        ),
        BetaSearchResultBlockParam(
            type="search_result",
            source="https://docs.company.com/troubleshooting",
            title="Guide de Dépannage",
            content=[
                BetaTextBlockParam(
                    type="text",
                    text="Si vous rencontrez des erreurs de délai d'attente, vérifiez d'abord les paramètres de configuration. Les causes communes incluent la latence réseau et des valeurs de délai d'attente incorrectes."
                )
            ],
            citations={"enabled": True}
        )
    ]

# Créer un message avec l'outil
response = client.beta.messages.create(
    model="claude-sonnet-4-20250514",  # Fonctionne avec tous les modèles supportés
    max_tokens=1024,
    betas=["search-results-2025-06-09"],
    tools=[knowledge_base_tool],
    messages=[
        BetaMessageParam(
            role="user",
            content="Comment configurer les paramètres de délai d'attente ?"
        )
    ]
)

# Quand Claude appelle l'outil, fournir les résultats de recherche
if response.content[0].type == "tool_use":
    tool_result = search_knowledge_base(response.content[0].input["query"])
    
    # Renvoyer le résultat de l'outil
    final_response = client.beta.messages.create(
        model="claude-sonnet-4-20250514",  # Fonctionne avec tous les modèles supportés
        max_tokens=1024,
        betas=["search-results-2025-06-09"],
        messages=[
            BetaMessageParam(role="user", content="Comment configurer les paramètres de délai d'attente ?"),
            BetaMessageParam(role="assistant", content=response.content),
            BetaMessageParam(
                role="user",
                content=[
                    BetaToolResultBlockParam(
                        type="tool_result",
                        tool_use_id=response.content[0].id,
                        content=tool_result  # Les résultats de recherche vont ici
                    )
                ]
            )
        ]
    )

Méthode 2 : Résultats de recherche comme contenu de niveau supérieur

Vous pouvez également fournir des résultats de recherche directement dans les messages utilisateur. Ceci est utile pour :

  • Contenu pré-récupéré de votre infrastructure de recherche
  • Résultats de recherche mis en cache de requêtes précédentes
  • Contenu de services de recherche externes
  • Tests et développement

Exemple : Résultats de recherche directs

from anthropic import Anthropic
from anthropic.types.beta import (
    BetaMessageParam,
    BetaTextBlockParam,
    BetaSearchResultBlockParam
)

client = Anthropic()

# Fournir des résultats de recherche directement dans le message utilisateur
response = client.beta.messages.create(
    model="claude-opus-4-20250514",
    max_tokens=1024,
    betas=["search-results-2025-06-09"],
    messages=[
        BetaMessageParam(
            role="user",
            content=[
                BetaSearchResultBlockParam(
                    type="search_result",
                    source="https://docs.company.com/api-reference",
                    title="Référence API - Authentification",
                    content=[
                        BetaTextBlockParam(
                            type="text",
                            text="Toutes les requêtes API doivent inclure une clé API dans l'en-tête Authorization. Les clés peuvent être générées depuis le tableau de bord. Limites de débit : 1000 requêtes par heure pour le niveau standard, 10000 pour le premium."
                        )
                    ],
                    citations={"enabled": True}
                ),
                BetaSearchResultBlockParam(
                    type="search_result",
                    source="https://docs.company.com/quickstart",
                    title="Guide de Démarrage",
                    content=[
                        BetaTextBlockParam(
                            type="text",
                            text="Pour commencer : 1) Créez un compte, 2) Générez une clé API depuis le tableau de bord, 3) Installez notre SDK en utilisant pip install company-sdk, 4) Initialisez le client avec votre clé API."
                        )
                    ],
                    citations={"enabled": True}
                ),
                BetaTextBlockParam(
                    type="text",
                    text="Basé sur ces résultats de recherche, comment authentifier les requêtes API et quelles sont les limites de débit ?"
                )
            ]
        )
    ]
)

print(response.model_dump_json(indent=2))

Réponse de Claude avec citations

Peu importe comment les résultats de recherche sont fournis, Claude inclut automatiquement des citations lors de l’utilisation d’informations de ceux-ci :

{
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "Pour authentifier les requêtes API, vous devez inclure une clé API dans l'en-tête Authorization",
      "citations": [
        {
          "type": "search_result_location",
          "source": "https://docs.company.com/api-reference",
          "title": "Référence API - Authentification",
          "cited_text": "Toutes les requêtes API doivent inclure une clé API dans l'en-tête Authorization",
          "search_result_index": 0,
          "start_block_index": 0,
          "end_block_index": 0
        }
      ]
    },
    {
      "type": "text",
      "text": ". Vous pouvez générer des clés API depuis votre tableau de bord",
      "citations": [
        {
          "type": "search_result_location",
          "source": "https://docs.company.com/api-reference",
          "title": "Référence API - Authentification",
          "cited_text": "Les clés peuvent être générées depuis le tableau de bord",
          "search_result_index": 0,
          "start_block_index": 0,
          "end_block_index": 0
        }
      ]
    },
    {
      "type": "text",
      "text": ". Les limites de débit sont de 1 000 requêtes par heure pour le niveau standard et 10 000 requêtes par heure pour le niveau premium.",
      "citations": [
        {
          "type": "search_result_location",
          "source": "https://docs.company.com/api-reference",
          "title": "Référence API - Authentification",
          "cited_text": "Limites de débit : 1000 requêtes par heure pour le niveau standard, 10000 pour le premium",
          "search_result_index": 0,
          "start_block_index": 0,
          "end_block_index": 0
        }
      ]
    }
  ]
}

Champs de citation

Chaque citation inclut :

ChampTypeDescription
typestringToujours "search_result_location" pour les citations de résultats de recherche
sourcestringLa source du résultat de recherche original
titlestring ou nullLe titre du résultat de recherche original
cited_textstringLe texte exact étant cité
search_result_indexintegerIndex du résultat de recherche (basé sur 0)
start_block_indexintegerPosition de début dans le tableau de contenu
end_block_indexintegerPosition de fin dans le tableau de contenu

Note : Le search_result_index fait référence à l’index du bloc de contenu de résultat de recherche (basé sur 0), peu importe comment les résultats de recherche ont été fournis (appel d’outil ou contenu de niveau supérieur).

Blocs de contenu multiples

Les résultats de recherche peuvent contenir plusieurs blocs de texte dans le tableau content :

{
  "type": "search_result",
  "source": "https://docs.company.com/api-guide",
  "title": "Documentation API",
  "content": [
    {
      "type": "text",
      "text": "Authentification : Toutes les requêtes API nécessitent une clé API."
    },
    {
      "type": "text",
      "text": "Limites de Débit : L'API permet 1000 requêtes par heure par clé."
    },
    {
      "type": "text",
      "text": "Gestion d'Erreurs : L'API retourne des codes de statut HTTP standard."
    }
  ]
}

Claude peut citer des blocs spécifiques en utilisant les champs start_block_index et end_block_index.

Usage avancé

Combiner les deux méthodes

Vous pouvez utiliser à la fois les résultats de recherche basés sur les outils et de niveau supérieur dans la même conversation :

# Premier message avec résultats de recherche de niveau supérieur
messages = [
    BetaMessageParam(
        role="user",
        content=[
            BetaSearchResultBlockParam(
                type="search_result",
                source="https://docs.company.com/overview",
                title="Aperçu du Produit",
                content=[
                    BetaTextBlockParam(type="text", text="Notre produit aide les équipes à collaborer...")
                ],
                citations={"enabled": True}
            ),
            BetaTextBlockParam(
                type="text",
                text="Parlez-moi de ce produit et recherchez des informations sur les prix"
            )
        ]
    )
]

# Claude pourrait répondre et appeler un outil pour rechercher les prix
# Ensuite vous fournissez des résultats d'outils avec plus de résultats de recherche

Combiner avec d’autres types de contenu

Les deux méthodes supportent le mélange de résultats de recherche avec d’autres contenus :

# Dans les résultats d'outils
tool_result = [
    BetaSearchResultBlockParam(
        type="search_result",
        source="https://docs.company.com/guide",
        title="Guide Utilisateur",
        content=[BetaTextBlockParam(type="text", text="Détails de configuration...")],
        citations={"enabled": True}
    ),
    BetaTextBlockParam(
        type="text",
        text="Contexte supplémentaire : Ceci s'applique à la version 2.0 et ultérieures."
    )
]

# Dans le contenu de niveau supérieur
user_content = [
    BetaSearchResultBlockParam(
        type="search_result",
        source="https://research.com/paper",
        title="Article de Recherche",
        content=[BetaTextBlockParam(type="text", text="Résultats clés...")],
        citations={"enabled": True}
    ),
    {
        "type": "image",
        "source": {"type": "url", "url": "https://example.com/chart.png"}
    },
    BetaTextBlockParam(
        type="text",
        text="Comment le graphique se rapporte-t-il aux résultats de recherche ?"
    )
]

Contrôle de cache

Ajoutez un contrôle de cache pour de meilleures performances :

{
  "type": "search_result",
  "source": "https://docs.company.com/guide",
  "title": "Guide Utilisateur",
  "content": [{"type": "text", "text": "..."}],
  "cache_control": {
    "type": "ephemeral"
  }
}

Contrôle de citation

Par défaut, les citations sont désactivées pour les résultats de recherche. Vous pouvez activer les citations en définissant explicitement la configuration citations :

{
  "type": "search_result",
  "source": "https://docs.company.com/guide",
  "title": "Guide Utilisateur",
  "content": [{"type": "text", "text": "Documentation importante..."}],
  "citations": {
    "enabled": true  // Activer les citations pour ce résultat
  }
}

Quand citations.enabled est défini sur true, Claude inclura des références de citation lors de l’utilisation d’informations du résultat de recherche. Cela permet :

  • Des citations naturelles pour vos applications RAG personnalisées
  • Attribution de source lors de l’interface avec des bases de connaissances propriétaires
  • Citations de qualité de recherche web pour tout outil personnalisé qui retourne des résultats de recherche

Si le champ citations est omis, les citations sont désactivées par défaut.

Les citations sont tout ou rien : soit tous les résultats de recherche dans une requête doivent avoir les citations activées, soit tous doivent les avoir désactivées. Mélanger des résultats de recherche avec différents paramètres de citation résultera en une erreur. Si vous devez désactiver les citations pour certaines sources, vous devez les désactiver pour tous les résultats de recherche dans cette requête.

Meilleures pratiques

Pour la recherche basée sur les outils (Méthode 1)

  • Contenu dynamique : Utilisez pour les recherches en temps réel et les applications RAG dynamiques
  • Gestion d’erreurs : Retournez des messages appropriés quand les recherches échouent
  • Limites de résultats : Retournez seulement les résultats les plus pertinents pour éviter le débordement de contexte

Pour la recherche de niveau supérieur (Méthode 2)

  • Contenu pré-récupéré : Utilisez quand vous avez déjà des résultats de recherche
  • Traitement par lots : Idéal pour traiter plusieurs résultats de recherche à la fois
  • Tests : Excellent pour tester le comportement de citation avec du contenu connu

Meilleures pratiques générales

  1. Structurez les résultats efficacement

    • Utilisez des URL sources claires et permanentes
    • Fournissez des titres descriptifs
    • Divisez le contenu long en blocs de texte logiques
  2. Maintenez la cohérence

    • Utilisez des formats de source cohérents dans votre application
    • Assurez-vous que les titres reflètent fidèlement le contenu
    • Gardez le formatage cohérent
  3. Gérez les erreurs gracieusement

    def search_with_fallback(query):
        try:
            results = perform_search(query)
            if not results:
                return {"type": "text", "text": "Aucun résultat trouvé."}
            return format_as_search_results(results)
        except Exception as e:
            return {"type": "text", "text": f"Erreur de recherche : {str(e)}"}
    

Limitations

  • Les blocs de contenu de résultats de recherche ne sont disponibles qu’avec l’en-tête bêta
  • Seul le contenu texte est supporté dans les résultats de recherche (pas d’images ou autres médias)
  • Le tableau content doit contenir au moins un bloc de texte