Блоки содержимого с результатами поиска позволяют Claude цитировать ваш собственный контент так же, как он цитирует результаты веб-поиска: каждая цитата содержит источник и заголовок, которые вы предоставили. Используйте их в приложениях RAG (Retrieval-Augmented Generation — генерация с дополненной выборкой), где Claude должен указывать, из каких ваших документов взяты ответы.
Все активные модели поддерживают результаты поиска с цитатами, за исключением Claude Haiku 3. Бета-заголовок не требуется: результаты поиска являются частью стандартного Messages API.
Результаты поиска могут быть предоставлены двумя способами:
В обоих случаях Claude автоматически цитирует результаты поиска, когда цитаты включены. Никаких специальных подсказок не требуется: задайте свой вопрос, и цитаты появятся в текстовых блоках, которые опираются на ваш контент.
Результаты поиска используют следующую структуру:
{
"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
}
}| Поле | Тип | Описание |
|---|---|---|
type | string | Должно быть "search_result" |
source | string | Источник содержимого. Подойдёт любая стабильная строка: URL или внутренний идентификатор, такой как kb://article-1234 |
title | string | Описательный заголовок для результата поиска |
content | array | Массив текстовых блоков, содержащих фактическое содержимое |
| Поле | Тип | Описание |
|---|---|---|
citations | object | Конфигурация цитат с булевым полем enabled. Цитаты отключены по умолчанию; каждый пример на этой странице явно устанавливает "enabled": true. Все результаты поиска в запросе должны использовать одну и ту же настройку (см. Управление цитатами) |
cache_control | object | Настройки управления кэшем (например, {"type": "ephemeral"}) |
Каждый элемент в массиве content должен быть текстовым блоком с:
type: Должно быть "text"text: Фактическое текстовое содержимое (непустая строка)Результаты поиска содержат только текст. Изображения и другие медиафайлы не поддерживаются внутри массива content.
Возврат результатов поиска из ваших пользовательских инструментов позволяет создавать динамические RAG-приложения: инструменты получают контент во время выполнения, а Claude цитирует его в ответе. Следующий пример принудительно вызывает инструмент с помощью tool_choice, поэтому шаг извлечения выполняется каждый раз.
from anthropic.types import (
MessageParam,
TextBlockParam,
SearchResultBlockParam,
ToolResultBlockParam,
)
client = Anthropic()
# Определяем инструмент поиска по базе знаний
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"],
},
}
# Функция для обработки вызова инструмента
def search_knowledge_base(query):
# Здесь ваша логика поиска
# Возвращает результаты поиска в правильном формате
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},
),
]
# Формируем диалог в виде списка, начиная с вопроса пользователя
messages = [
MessageParam(role="user", content="How do I configure the timeout settings?")
]
# Создаём сообщение с инструментом
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
tools=[knowledge_base_tool],
tool_choice={"type": "tool", "name": "search_knowledge_base"},
messages=messages,
)
# Когда Claude вызывает инструмент, передаём результаты поиска.
# Блок tool_use не всегда идёт первым: ищем его перебором.
tool_use = next((block for block in response.content if block.type == "tool_use"), None)
if tool_use is not None:
tool_result = search_knowledge_base(tool_use.input["query"])
# Добавляем ход Claude, затем результат инструмента, к текущему диалогу
messages.append(MessageParam(role="assistant", content=response.content))
messages.append(
MessageParam(
role="user",
content=[
ToolResultBlockParam(
type="tool_result",
tool_use_id=tool_use.id,
content=tool_result, # Search results go here
)
],
)
)
# Отправляем результат инструмента обратно
final_response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=messages,
)
print(final_response)Вы также можете предоставлять результаты поиска непосредственно в сообщениях пользователя. Это полезно для:
from anthropic.types import MessageParam, TextBlockParam, SearchResultBlockParam
client = Anthropic()
# Предоставьте результаты поиска непосредственно в сообщении пользователя
response = client.messages.create(
model="claude-opus-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)Независимо от того, как предоставлены результаты поиска, Claude автоматически включает цитаты при использовании информации из них:
{
"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
}
]
}
]
}Каждая цитата включает:
| Поле | Тип | Описание |
|---|---|---|
type | string | Всегда "search_result_location" для цитат результатов поиска |
source | string | Источник из исходного результата поиска |
title | string или null | Заголовок из исходного результата поиска |
cited_text | string | Полный текст цитируемого блока (блоков), объединённый. Равен содержимому content[start_block_index:end_block_index], соединённому вместе. Не учитывается в output tokens. |
search_result_index | integer | Индекс (начиная с 0) цитируемого результата поиска среди всех блоков search_result в запросе, в порядке их появления (во всех сообщениях и результатах инструментов). |
start_block_index | integer | Индекс (начиная с 0) первого цитируемого блока в массиве content результата поиска. |
end_block_index | integer | Исключающий конечный индекс диапазона цитируемых блоков в массиве content результата поиска. Всегда больше, чем start_block_index. |
Индексы блоков определяют срез массива content результата поиска, а cited_text — это полный текст этого среза. Текстовый блок является минимальной цитируемой единицей: Claude цитирует целые блоки, а не подстроки внутри блока. Чтобы получить более детальные цитаты, разделите содержимое результата поиска на более мелкие блоки (см. Несколько блоков содержимого).
Результаты поиска могут содержать несколько текстовых блоков в массиве 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."
}
],
"citations": { "enabled": true }
}Цитата, ссылающаяся на блок об ограничениях скорости, выглядит так:
{
"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
}Когда этот результат поиска цитируется, start_block_index и end_block_index определяют, какие из этих блоков охватывает цитата, а cited_text содержит в точности текст этих блоков. Разделение содержимого на более мелкие, сфокусированные блоки даёт Claude более точные границы цитирования; объединение содержимого в один блок означает, что каждая цитата возвращает полный текст. Это та же модель, которая используется для документов с пользовательским содержимым в функции Citations.
Вы можете смешивать оба метода в одном разговоре. Claude цитирует из любого источника, а search_result_index подсчитывает все блоки search_result в порядке запроса, независимо от источника.
Следующий пример воспроизводит полный разговор. Первое сообщение пользователя содержит предварительно полученный результат поиска, ход ассистента вызывает инструмент базы знаний, а результат инструмента возвращает второй результат поиска. Ответ Claude цитирует оба источника:
from anthropic.types import (
MessageParam,
SearchResultBlockParam,
TextBlockParam,
ToolResultBlockParam,
ToolUseBlockParam,
)
client = Anthropic()
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"],
},
}
# Воспроизводим разговор, в котором результаты поиска передаются обоими способами: первое
# сообщение пользователя содержит заранее полученный результат, а результат инструмента возвращает ещё один
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
tools=[knowledge_base_tool],
messages=[
MessageParam(
role="user",
content=[
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/overview",
title="Product Overview",
content=[
TextBlockParam(
type="text",
text="Acme Dashboard is a monitoring tool for distributed systems. It supports real-time alerting and custom metric dashboards.",
)
],
citations={"enabled": True},
),
TextBlockParam(
type="text",
text="What does Acme Dashboard do, and what plans is it available on?",
),
],
),
MessageParam(
role="assistant",
content=[
TextBlockParam(
type="text", text="Let me check the pricing information."
),
ToolUseBlockParam(
type="tool_use",
id="toolu_01A09q90qw90lq917835lq9",
name="search_knowledge_base",
input={"query": "Acme Dashboard pricing plans"},
),
],
),
MessageParam(
role="user",
content=[
ToolResultBlockParam(
type="tool_result",
tool_use_id="toolu_01A09q90qw90lq917835lq9",
content=[
SearchResultBlockParam(
type="search_result",
source="https://docs.company.com/pricing",
title="Pricing Plans",
content=[
TextBlockParam(
type="text",
text="Acme Dashboard is available on the Starter plan at $10 per user per month and the Enterprise plan with custom pricing.",
)
],
citations={"enabled": True},
)
],
)
],
),
],
)
print(response)Ответ цитирует оба источника. Предварительно полученный результат — это search_result_index: 0, а результат, возвращённый инструментом, — search_result_index: 1, что соответствует порядку появления блоков search_result в разговоре:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Here's what I found about Acme Dashboard:\n\n**What it does:** "
},
{
"type": "text",
"text": "Acme Dashboard is a monitoring tool for distributed systems. It supports real-time alerting and custom metric dashboards.",
"citations": [
{
"type": "search_result_location",
"cited_text": "Acme Dashboard is a monitoring tool for distributed systems. It supports real-time alerting and custom metric dashboards.",
"source": "https://docs.company.com/overview",
"title": "Product Overview",
"search_result_index": 0,
"start_block_index": 0,
"end_block_index": 1
}
]
},
{
"type": "text",
"text": "\n\n**Available plans:** "
},
{
"type": "text",
"text": "Acme Dashboard is available on the Starter plan at $10 per user per month and the Enterprise plan with custom pricing.",
"citations": [
{
"type": "search_result_location",
"cited_text": "Acme Dashboard is available on the Starter plan at $10 per user per month and the Enterprise plan with custom pricing.",
"source": "https://docs.company.com/pricing",
"title": "Pricing Plans",
"search_result_index": 1,
"start_block_index": 0,
"end_block_index": 1
}
]
}
]
}В сообщениях пользователя блоки search_result могут находиться рядом с любым другим блоком содержимого. Пример Метода 2 сочетает результаты поиска с вопросом text, и блоки изображений или документов могут присоединяться к ним таким же образом.
Результаты инструментов строже: если какой-либо блок в массиве содержимого tool_result является search_result, все его блоки должны быть search_result. Смешивание результатов поиска с другими типами блоков в одном результате инструмента возвращает ошибку валидации. Чтобы вернуть вспомогательный текст вместе с результатами поиска, полученными от инструмента, включите его как текстовый блок внутри одного из массивов content результатов поиска, где он также становится цитируемым.
Добавьте cache_control в блок результата поиска, чтобы кэшировать его для повторного использования в разных запросах. Он находится рядом с citations в том же блоке:
{
"type": "search_result",
"source": "https://docs.company.com/guide",
"title": "User Guide",
"content": [{ "type": "text", "text": "..." }],
"citations": { "enabled": true },
"cache_control": { "type": "ephemeral" }
}См. Кэширование подсказок для минимальных кэшируемых длин и других требований.
По умолчанию цитаты для результатов поиска отключены. Вы можете включить цитаты, явно установив конфигурацию 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
}
}Когда citations.enabled установлено в true, Claude прикрепляет ссылки на цитаты к текстовым блокам, которые опираются на результат поиска.
Эффективно структурируйте результаты:
Поддерживайте согласованность:
Корректно обрабатывайте ошибки: когда поиск завершается неудачей или ничего не возвращает, верните простой текстовый блок, описывающий результат (например, {"type": "text", "text": "No results found."}), вместо того чтобы вызывать ошибку: Claude объяснит пользователю пустой результат, и разговор продолжится.
search_result могут появляться только в сообщениях пользователя (включая внутри результатов инструментов). Сообщения ассистента с результатами поиска отклоняются.search_result.Обнаруживайте и обрабатывайте причины остановки из-за отказа в потоковых ответах и повторяйте отклонённые запросы на резервной модели.
Обосновывайте ответы Claude вашими исходными документами. Цитаты возвращают точные отрывки, подтверждающие каждое утверждение, чтобы вы могли проверять ответы и показывать источники вашим пользователям.
Предоставьте Claude доступ к актуальному веб-контенту с цитируемыми источниками, необязательной динамической фильтрацией и управлением доменами.
Ознакомьтесь с полной документацией Messages API, включая типы блоков содержимого.
Кэшируйте результаты поиска с помощью cache_control, чтобы снизить стоимость и задержку при повторных запросах.
Was this page helpful?