Diese Funktion ist für Zero Data Retention (ZDR) qualifiziert. Wenn deine Organisation eine ZDR-Vereinbarung hat, werden Daten, die über diese Funktion gesendet werden, nicht gespeichert, nachdem die API-Antwort zurückgegeben wurde.
Suchergebnis-Inhaltsblöcke ermöglichen natürliche Zitate mit korrekter Quellenangabe und bringen Zitate in Websuche-Qualität in deine eigenen Anwendungen. Diese Funktion ist besonders leistungsstark für RAG-Anwendungen („Retrieval-Augmented Generation", abrufgestützte Generierung), bei denen Claude Quellen präzise zitieren soll.
Die Suchergebnis-Funktion ist für die folgenden Modelle verfügbar:
claude-opus-4-7)claude-opus-4-6)claude-sonnet-5)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)Suchergebnisse können auf zwei Arten bereitgestellt werden:
In beiden Fällen kann Claude Informationen aus den Suchergebnissen automatisch mit korrekter Quellenangabe zitieren.
Suchergebnisse verwenden die folgende Struktur:
{
"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
}
}| Feld | Typ | Beschreibung |
|---|---|---|
type | string | Muss "search_result" sein |
source | string | Die Quell-URL oder der Bezeichner für den Inhalt |
title | string | Ein beschreibender Titel für das Suchergebnis |
content | array | Ein Array von Textblöcken, die den eigentlichen Inhalt enthalten |
| Feld | Typ | Beschreibung |
|---|---|---|
citations | object | Zitatkonfiguration mit dem booleschen Feld enabled |
cache_control | object | Cache-Control-Einstellungen (z. B. {"type": "ephemeral"}) |
Jedes Element im content-Array muss ein Textblock sein mit:
type: Muss "text" seintext: Der eigentliche Textinhalt (nicht-leerer String)Der leistungsstärkste Anwendungsfall ist die Rückgabe von Suchergebnissen aus deinen eigenen Tools. Dies ermöglicht dynamische RAG-Anwendungen, bei denen Tools relevante Inhalte abrufen und mit automatischen Zitaten zurückgeben.
from anthropic.types import (
MessageParam,
TextBlockParam,
SearchResultBlockParam,
ToolResultBlockParam,
)
client = Anthropic()
# Definiere ein Tool zur Wissensdatenbank-Suche
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"],
},
}
# Funktion zum Verarbeiten des Tool-Aufrufs
def search_knowledge_base(query):
# Deine Suchlogik hier
# Gibt Suchergebnisse im korrekten Format zurück
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},
),
]
# Erstelle eine Nachricht mit dem Tool
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?")
],
)
# Wenn Claude das Tool aufruft, stelle die Suchergebnisse bereit
if response.content[0].type == "tool_use":
tool_result = search_knowledge_base(response.content[0].input["query"])
# Sende das Tool-Ergebnis zurück
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
)
],
),
],
)Du kannst Suchergebnisse auch direkt in Benutzernachrichten bereitstellen. Dies ist nützlich für:
from anthropic.types import MessageParam, TextBlockParam, SearchResultBlockParam
client = Anthropic()
# Stelle Suchergebnisse direkt in der Benutzernachricht bereit
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)Unabhängig davon, wie Suchergebnisse bereitgestellt werden, fügt Claude automatisch Zitate hinzu, wenn Informationen daraus verwendet werden:
{
"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
}
]
}
]
}Jedes Zitat enthält:
| Feld | Typ | Beschreibung |
|---|---|---|
type | string | Immer "search_result_location" für Suchergebnis-Zitate |
source | string | Die Quelle aus dem ursprünglichen Suchergebnis |
title | string oder null | Der Titel aus dem ursprünglichen Suchergebnis |
cited_text | string | Der vollständige Text der zitierten Blöcke, aneinandergereiht. Entspricht dem Inhalt von content[start_block_index:end_block_index] zusammengefügt. Wird nicht auf die Output-Token angerechnet. |
search_result_index | integer | 0-basierter Index des zitierten Suchergebnisses unter allen search_result-Blöcken in der Anfrage, in der Reihenfolge ihres Auftretens (über alle Nachrichten und Tool-Ergebnisse hinweg). |
start_block_index | integer | 0-basierter Index des ersten zitierten Blocks im content-Array des Suchergebnisses. |
end_block_index | integer | Exklusiver End-Index des zitierten Blockbereichs im content-Array des Suchergebnisses. Immer größer als start_block_index. |
Die Block-Indizes identifizieren einen Ausschnitt des content-Arrays des Suchergebnisses, und cited_text ist der vollständige Text dieses Ausschnitts. Der Textblock ist die kleinste zitierbare Einheit: Claude zitiert ganze Blöcke, keine Teilstrings innerhalb eines Blocks. Um feinere Zitate zu erhalten, teile den Inhalt deines Suchergebnisses in kleinere Blöcke auf (siehe Mehrere Inhaltsblöcke).
Suchergebnisse können mehrere Textblöcke im content-Array enthalten:
{
"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."
}
]
}Ein Zitat, das auf den Ratenlimit-Block verweist, sieht so aus:
{
"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
}Wenn dieses Suchergebnis zitiert wird, geben start_block_index und end_block_index an, welche dieser Blöcke das Zitat abdeckt, und cited_text enthält genau den Text dieser Blöcke. Das Aufteilen von Inhalten in kleinere, fokussierte Blöcke gibt Claude feinere Zitatgrenzen; das Zusammenfassen von Inhalten in einem Block bedeutet, dass jedes Zitat den vollständigen Text zurückgibt. Dies ist dasselbe Modell, das von Dokumenten mit benutzerdefiniertem Inhalt in der Zitat-Funktion verwendet wird.
Du kannst sowohl tool-basierte als auch Top-Level-Suchergebnisse in derselben Konversation verwenden:
from anthropic.types import MessageParam, SearchResultBlockParam, TextBlockParam
# Erste Nachricht mit Suchergebnissen auf oberster Ebene
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 könnte antworten und ein Tool aufrufen, um nach Preisen zu suchen
# Dann stellst du Tool-Ergebnisse mit weiteren Suchergebnissen bereitBeide Methoden unterstützen das Mischen von Suchergebnissen mit anderen Inhalten:
from anthropic.types import SearchResultBlockParam, TextBlockParam
# In Tool-Ergebnissen
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."
),
]
# In Top-Level-Inhalten
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?"
),
]Füge Cache-Control für bessere Performance hinzu:
{
"type": "search_result",
"source": "https://docs.company.com/guide",
"title": "User Guide",
"content": [{ "type": "text", "text": "..." }],
"cache_control": {
"type": "ephemeral"
}
}Standardmäßig sind Zitate für Suchergebnisse deaktiviert. Du kannst Zitate aktivieren, indem du die citations-Konfiguration explizit setzt:
{
"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
}
}Wenn citations.enabled auf true gesetzt ist, fügt Claude Zitatverweise hinzu, wenn Informationen aus dem Suchergebnis verwendet werden. Dies ermöglicht:
Zitate sind alles oder nichts: Entweder müssen alle Suchergebnisse in einer Anfrage Zitate aktiviert haben, oder alle müssen sie deaktiviert haben. Das Mischen von Suchergebnissen mit unterschiedlichen Zitat-Einstellungen führt zu einem Fehler.
Strukturiere Ergebnisse effektiv:
Sorge für Konsistenz:
Behandle Fehler elegant:
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-Array muss mindestens einen Textblock enthaltenErfahre, wie Zitate über Dokumente, benutzerdefinierte Inhalte und Suchergebnisse hinweg funktionieren.
Lass Claude das Web durchsuchen und Quellen automatisch mit einem Server-Tool zitieren.
Sieh dir die vollständige Messages-API-Dokumentation an, einschließlich der Inhaltsblock-Typen.
Cache Suchergebnisse mit cache_control, um Kosten und Latenz bei wiederholten Anfragen zu reduzieren.
Was this page helpful?