Los bloques de contenido de resultados de búsqueda permiten citas naturales con atribución de fuente adecuada, llevando citas de calidad de búsqueda web a tus aplicaciones personalizadas. Esta característica es particularmente poderosa para aplicaciones RAG (Generación Aumentada por Recuperación) donde necesitas que Claude cite fuentes con precisión.
La característica de resultados de búsqueda está disponible en los siguientes modelos:
claude-opus-4-5-20251101)claude-opus-4-1-20250805)claude-opus-4-20250514)claude-sonnet-4-5-20250929)claude-sonnet-4-20250514)claude-3-7-sonnet-20250219)claude-haiku-4-5-20251001)claude-3-5-haiku-20241022)Los resultados de búsqueda se pueden proporcionar de dos formas:
En ambos casos, Claude puede citar automáticamente información de los resultados de búsqueda con atribución de fuente adecuada.
Los resultados de búsqueda utilizan la siguiente estructura:
{
"type": "search_result",
"source": "https://example.com/article", // Requerido: URL de fuente o identificador
"title": "Article Title", // Requerido: Título del resultado
"content": [ // Requerido: Array de bloques de texto
{
"type": "text",
"text": "The actual content of the search result..."
}
],
"citations": { // Opcional: Configuración de citas
"enabled": true // Habilitar/deshabilitar citas para este resultado
}
}| Campo | Tipo | Descripción |
|---|---|---|
type | string | Debe ser "search_result" |
source | string | La URL de fuente o identificador del contenido |
title | string | Un título descriptivo para el resultado de búsqueda |
content | array | Un array de bloques de texto que contienen el contenido real |
| Campo | Tipo | Descripción |
|---|---|---|
citations | object | Configuración de citas con campo booleano enabled |
cache_control | object | Configuración de control de caché (por ejemplo, {"type": "ephemeral"}) |
Cada elemento en el array content debe ser un bloque de texto con:
type: Debe ser "text"text: El contenido de texto real (string no vacío)El caso de uso más poderoso es retornar resultados de búsqueda desde tus herramientas personalizadas. Esto habilita aplicaciones RAG dinámicas donde las herramientas obtienen y retornan contenido relevante con citas automáticas.
También puedes proporcionar resultados de búsqueda directamente en mensajes de usuario. Esto es útil para:
Independientemente de cómo se proporcionen los resultados de búsqueda, Claude incluye automáticamente citas cuando utiliza información de ellos:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "To authenticate API requests, you need to include an API key in the Authorization header",
"citations": [
{
"type": "search_result_location",
"source": "https://docs.company.com/api-reference",
"title": "API Reference - Authentication",
"cited_text": "All API requests must include an API key in the Authorization header",
"search_result_index": 0,
"start_block_index": 0,
"end_block_index": 0
}
]
},
{
"type": "text",
"text": ". You can generate API keys from your dashboard",
"citations": [
{
"type": "search_result_location",
"source": "https://docs.company.com/api-reference",
"title": "API Reference - Authentication",
"cited_text": "Keys can be generated from the dashboard",
"search_result_index": 0,
"start_block_index": 0,
"end_block_index": 0
}
]
},
{
"type": "text",
"text": ". The rate limits are 1,000 requests per hour for the standard tier and 10,000 requests per hour for the premium tier.",
"citations": [
{
"type": "search_result_location",
"source": "https://docs.company.com/api-reference",
"title": "API Reference - Authentication",
"cited_text": "Rate limits: 1000 requests per hour for standard tier, 10000 for premium",
"search_result_index": 0,
"start_block_index": 0,
"end_block_index": 0
}
]
}
]
}Cada cita incluye:
| Campo | Tipo | Descripción |
|---|---|---|
type | string | Siempre "search_result_location" para citas de resultados de búsqueda |
source | string | La fuente del resultado de búsqueda original |
title | string o null | El título del resultado de búsqueda original |
cited_text | string | El texto exacto siendo citado |
search_result_index | integer | Índice del resultado de búsqueda (basado en 0) |
start_block_index |
Nota: El search_result_index se refiere al índice del bloque de contenido del resultado de búsqueda (basado en 0), independientemente de cómo se proporcionaron los resultados de búsqueda (llamada de herramienta o contenido de nivel superior).
Los resultados de búsqueda pueden contener múltiples bloques de texto en el array 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."
}
]
}Claude puede citar bloques específicos usando los campos start_block_index y end_block_index.
Puedes usar resultados de búsqueda basados en herramientas y de nivel superior en la misma conversación:
# First message with top-level search results
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 might respond and call a tool to search for pricing
# Then you provide tool results with more search resultsAmbos métodos soportan mezclar resultados de búsqueda con otro contenido:
# In tool results
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 content
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?"
)
]Añade control de caché para mejor rendimiento:
{
"type": "search_result",
"source": "https://docs.company.com/guide",
"title": "User Guide",
"content": [{"type": "text", "text": "..."}],
"cache_control": {
"type": "ephemeral"
}
}Por defecto, las citas están deshabilitadas para los resultados de búsqueda. Puedes habilitar citas estableciendo explícitamente la configuración de 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
}
}Cuando citations.enabled se establece en true, Claude incluirá referencias de citas cuando use información del resultado de búsqueda. Esto habilita:
Si el campo citations se omite, las citas están deshabilitadas por defecto.
Las citas son todo o nada: o todos los resultados de búsqueda en una solicitud deben tener citas habilitadas, o todos deben tenerlas deshabilitadas. Mezclar resultados de búsqueda con diferentes configuraciones de citas resultará en un error. Si necesitas deshabilitar citas para algunas fuentes, debes deshabilitarlas para todos los resultados de búsqueda en esa solicitud.
Estructura los resultados efectivamente
Mantén consistencia
Maneja errores con elegancia
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 debe contener al menos un bloque de textofrom anthropic import Anthropic
from anthropic.types import (
MessageParam,
TextBlockParam,
SearchResultBlockParam,
ToolResultBlockParam
)
client = Anthropic()
# Define a knowledge base search tool
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"]
}
}
# Function to handle the tool call
def search_knowledge_base(query):
# Your search logic here
# Returns search results in the correct format
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}
)
]
# Create a message with the tool
response = client.messages.create(
model="claude-sonnet-4-5", # Works with all supported models
max_tokens=1024,
tools=[knowledge_base_tool],
messages=[
MessageParam(
role="user",
content="How do I configure the timeout settings?"
)
]
)
# When Claude calls the tool, provide the search results
if response.content[0].type == "tool_use":
tool_result = search_knowledge_base(response.content[0].input["query"])
# Send the tool result back
final_response = client.messages.create(
model="claude-sonnet-4-5", # 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
)
]
)
]
)from anthropic import Anthropic
from anthropic.types import (
MessageParam,
TextBlockParam,
SearchResultBlockParam
)
client = Anthropic()
# Provide search results directly in the user message
response = client.messages.create(
model="claude-sonnet-4-5",
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.model_dump_json(indent=2))| integer |
| Posición inicial en el array de contenido |
end_block_index | integer | Posición final en el array de contenido |