Cette fonctionnalité est éligible à la Zero Data Retention (ZDR). Lorsque votre organisation dispose d'un accord ZDR, les données envoyées via cette fonctionnalité ne sont pas stockées après le retour de la réponse de l'API.
Les blocs de contenu de résultats de recherche permettent des citations naturelles avec une attribution de source appropriée, apportant à vos applications personnalisées des citations de qualité équivalente à celles de la recherche web. Cette fonctionnalité est particulièrement puissante pour les applications « RAG » (Retrieval-Augmented Generation, ou génération augmentée par récupération) où vous avez besoin que Claude cite ses sources avec précision.
La fonctionnalité de résultats de recherche est disponible sur les modèles suivants :
claude-opus-4-7)claude-opus-4-6)claude-sonnet-4-6)claude-sonnet-4-5-20250929)claude-opus-4-5-20251101)claude-opus-4-1-20250805)claude-opus-4-20250514)claude-sonnet-4-20250514)claude-haiku-4-5-20251001)claude-3-5-haiku-20241022)Les résultats de recherche peuvent être fournis de deux manières :
Dans les deux cas, Claude peut automatiquement citer les informations provenant des résultats de recherche avec une attribution de source appropriée.
Les résultats de recherche utilisent la structure suivante :
{
"type": "search_result",
"source": "https://example.com/article", // Required: Source URL or identifier
"title": "Article Title", // Required: Title of the result
"content": [
// Required: Array of text blocks
{
"type": "text",
"text": "The actual content of the search result..."
}
],
"citations": {
// Optional: Citation configuration
"enabled": true // Enable/disable citations for this result
}
}| Champ | Type | Description |
|---|---|---|
type | string | Doit être "search_result" |
source | string | L'URL source ou l'identifiant du contenu |
title | string | Un titre descriptif pour le résultat de recherche |
content | array | Un tableau de blocs de texte contenant le contenu réel |
| Champ | Type | Description |
|---|---|---|
citations | object | Configuration des citations avec le champ booléen enabled |
cache_control | object | Paramètres de contrôle du cache (par exemple, {"type": "ephemeral"}) |
Chaque élément du tableau content doit être un bloc de texte avec :
type : Doit être "text"text : Le contenu textuel réel (chaîne non vide)Le cas d'usage le plus puissant consiste à renvoyer des résultats de recherche depuis vos outils personnalisés. Cela permet des applications RAG dynamiques où les outils récupèrent et renvoient du contenu pertinent avec des citations automatiques.
from anthropic.types import (
MessageParam,
TextBlockParam,
SearchResultBlockParam,
ToolResultBlockParam,
)
client = Anthropic()
# Définir un outil de recherche dans la base de connaissances
knowledge_base_tool = {
"name": "search_knowledge_base",
"description": "Search the company knowledge base for information",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string", "description": "The search query"}},
"required": ["query"],
},
}
# Fonction pour gérer l'appel d'outil
def search_knowledge_base(query):
# Votre logique de recherche ici
# Renvoie les résultats de recherche au format correct
return [
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/product-guide",
title="Product Configuration Guide",
content=[
TextBlockParam(
type="text",
text="To configure the product, navigate to Settings > Configuration. The default timeout is 30 seconds, but can be adjusted between 10-120 seconds based on your needs.",
)
],
citations={"enabled": True},
),
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/troubleshooting",
title="Troubleshooting Guide",
content=[
TextBlockParam(
type="text",
text="If you encounter timeout errors, first check the configuration settings. Common causes include network latency and incorrect timeout values.",
)
],
citations={"enabled": True},
),
]
# Créer un message avec l'outil
response = client.messages.create(
model="claude-opus-4-8", # Works with all supported models
max_tokens=1024,
tools=[knowledge_base_tool],
messages=[
MessageParam(role="user", content="How do I configure the timeout settings?")
],
)
# Lorsque Claude appelle l'outil, fournissez 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.messages.create(
model="claude-opus-4-8", # Works with all supported models
max_tokens=1024,
messages=[
MessageParam(
role="user", content="How do I configure the timeout settings?"
),
MessageParam(role="assistant", content=response.content),
MessageParam(
role="user",
content=[
ToolResultBlockParam(
type="tool_result",
tool_use_id=response.content[0].id,
content=tool_result, # Search results go here
)
],
),
],
)Vous pouvez également fournir des résultats de recherche directement dans les messages utilisateur. Ceci est utile pour :
from anthropic.types import MessageParam, TextBlockParam, SearchResultBlockParam
client = Anthropic()
# Fournissez les résultats de recherche directement dans le message utilisateur
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
MessageParam(
role="user",
content=[
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/api-reference",
title="API Reference - Authentication",
content=[
TextBlockParam(
type="text",
text="All API requests must include an API key in the Authorization header. Keys can be generated from the dashboard. Rate limits: 1000 requests per hour for standard tier, 10000 for premium.",
)
],
citations={"enabled": True},
),
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/quickstart",
title="Getting Started Guide",
content=[
TextBlockParam(
type="text",
text="To get started: 1) Sign up for an account, 2) Generate an API key from the dashboard, 3) Install our SDK using pip install company-sdk, 4) Initialize the client with your API key.",
)
],
citations={"enabled": True},
),
TextBlockParam(
type="text",
text="Based on these search results, how do I authenticate API requests and what are the rate limits?",
),
],
)
],
)
print(response)Quelle que soit la manière dont les résultats de recherche sont fournis, Claude inclut automatiquement des citations lorsqu'il utilise des informations qui en proviennent :
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "All API requests must include an API key in the Authorization header. Keys can be generated from the dashboard.",
"citations": [
{
"type": "search_result_location",
"cited_text": "All API requests must include an API key in the Authorization header. Keys can be generated from the dashboard. Rate limits: 1000 requests per hour for standard tier, 10000 for premium.",
"source": "https://docs.company.com/api-reference",
"title": "API Reference - Authentication",
"search_result_index": 0,
"start_block_index": 0,
"end_block_index": 1
}
]
},
{
"type": "text",
"text": "\n\nTo set this up from scratch, you'll need to "
},
{
"type": "text",
"text": "sign up for an account, generate an API key from the dashboard, install the SDK using `pip install company-sdk`, and initialize the client with your API key.",
"citations": [
{
"type": "search_result_location",
"cited_text": "To get started: 1) Sign up for an account, 2) Generate an API key from the dashboard, 3) Install our SDK using pip install company-sdk, 4) Initialize the client with your API key.",
"source": "https://docs.company.com/quickstart",
"title": "Getting Started Guide",
"search_result_index": 1,
"start_block_index": 0,
"end_block_index": 1
}
]
}
]
}Chaque citation inclut :
| Champ | Type | Description |
|---|---|---|
type | string | Toujours "search_result_location" pour les citations de résultats de recherche |
source | string | La source provenant du résultat de recherche d'origine |
title | string ou null | Le titre provenant du résultat de recherche d'origine |
cited_text | string | Le texte complet du ou des blocs cités, concaténé. Équivaut au contenu de content[start_block_index:end_block_index] joint ensemble. Non comptabilisé dans les tokens de sortie. |
search_result_index | integer | Index de base 0 du résultat de recherche cité parmi tous les blocs search_result de la requête, dans l'ordre où ils apparaissent (à travers tous les messages et résultats d'outils). |
start_block_index | integer | Index de base 0 du premier bloc cité dans le tableau content du résultat de recherche. |
end_block_index | integer | Index de fin exclusif de la plage de blocs cités dans le tableau content du résultat de recherche. Toujours supérieur à start_block_index. |
Les index de blocs identifient une tranche du tableau content du résultat de recherche, et cited_text est le texte complet de cette tranche. Le bloc de texte est l'unité citable minimale : Claude cite des blocs entiers, et non des sous-chaînes au sein d'un bloc. Pour obtenir des citations plus fines, divisez le contenu de votre résultat de recherche en blocs plus petits (voir 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": "API Documentation",
"content": [
{
"type": "text",
"text": "Authentication: All API requests require an API key."
},
{
"type": "text",
"text": "Rate Limits: The API allows 1000 requests per hour per key."
},
{
"type": "text",
"text": "Error Handling: The API returns standard HTTP status codes."
}
]
}Une citation référençant le bloc des limites de débit ressemble à ceci :
{
"type": "search_result_location",
"cited_text": "Rate Limits: The API allows 1000 requests per hour per key.",
"source": "https://docs.company.com/api-guide",
"title": "API Documentation",
"search_result_index": 0,
"start_block_index": 1,
"end_block_index": 2
}Lorsque ce résultat de recherche est cité, start_block_index et end_block_index identifient lesquels de ces blocs la citation couvre, et cited_text contient exactement le texte de ces blocs. Diviser le contenu en blocs plus petits et ciblés donne à Claude des limites de citation plus fines ; combiner le contenu en un seul bloc signifie que chaque citation renvoie le texte complet. C'est le même modèle que celui utilisé par les documents à contenu personnalisé dans la fonctionnalité Citations.
Vous pouvez utiliser à la fois des résultats de recherche basés sur des outils et de premier niveau dans la même conversation :
from anthropic.types import MessageParam, SearchResultBlockParam, TextBlockParam
# Premier message avec des résultats de recherche au niveau supérieur
messages = [
MessageParam(
role="user",
content=[
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/overview",
title="Product Overview",
content=[
TextBlockParam(
type="text", text="Our product helps teams collaborate..."
)
],
citations={"enabled": True},
),
TextBlockParam(
type="text",
text="Tell me about this product and search for pricing information",
),
],
)
]
# Claude pourrait répondre et appeler un outil pour rechercher les tarifs
# Ensuite, vous fournissez les résultats d'outil avec d'autres résultats de rechercheLes deux méthodes prennent en charge le mélange de résultats de recherche avec d'autres contenus :
from anthropic.types import SearchResultBlockParam, TextBlockParam
# Dans les résultats d'outils
tool_result = [
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/guide",
title="User Guide",
content=[TextBlockParam(type="text", text="Configuration details...")],
citations={"enabled": True},
),
TextBlockParam(
type="text", text="Additional context: This applies to version 2.0 and later."
),
]
# Dans le contenu de niveau supérieur
user_content = [
SearchResultBlockParam(
type="search_result",
source="https://research.com/paper",
title="Research Paper",
content=[TextBlockParam(type="text", text="Key findings...")],
citations={"enabled": True},
),
{
"type": "image",
"source": {"type": "url", "url": "https://example.com/chart.png"},
},
TextBlockParam(
type="text", text="How does the chart relate to the research findings?"
),
]Ajoutez un contrôle du cache pour de meilleures performances :
{
"type": "search_result",
"source": "https://docs.company.com/guide",
"title": "User Guide",
"content": [{ "type": "text", "text": "..." }],
"cache_control": {
"type": "ephemeral"
}
}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": "User Guide",
"content": [{ "type": "text", "text": "Important documentation..." }],
"citations": {
"enabled": true // Enable citations for this result
}
}Lorsque citations.enabled est défini sur true, Claude inclut des références de citation lorsqu'il utilise des informations provenant du résultat de recherche. Cela permet :
Les citations fonctionnent selon le principe du tout ou rien : soit tous les résultats de recherche d'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 des paramètres de citation différents entraîne une erreur.
Structurez les résultats efficacement :
Maintenez la cohérence :
Gérez les erreurs avec élégance :
def search_with_fallback(query):
try:
results = perform_search(query)
if not results:
return {"type": "text", "text": "No results found."}
return format_as_search_results(results)
except Exception as e:
return {"type": "text", "text": f"Search error: {str(e)}"}content doit contenir au moins un bloc de texteWas this page helpful?