Claude 在回答有关文档的问题时可以提供详细的 “citations”(引用),帮助您追踪和验证每个回答背后的来源。
所有活跃模型均支持引用功能。
提示
请使用引用功能反馈表单分享您对引用功能的反馈和建议。
以下示例展示了如何通过 Messages API 在纯文本文档上启用引用:
cURL
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "The grass is green. The sky is blue."
},
"title": "My Document",
"context": "This is a trustworthy document.",
"citations": {"enabled": true}
},
{
"type": "text",
"text": "What color is the grass and sky?"
}
]
}
]
}'
CLI
ant messages create <<'YAML'
model: claude-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: document
source:
type: text
media_type: text/plain
data: The grass is green. The sky is blue.
title: My Document
context: This is a trustworthy document.
citations:
enabled: true
- type: text
text: What color is the grass and sky?
YAML
Python
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "The grass is green. The sky is blue.",
},
"title": "My Document",
"context": "This is a trustworthy document.",
"citations": {"enabled": True},
},
{"type": "text", "text": "What color is the grass and sky?"},
],
}
],
)
print(response)
TypeScript
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "text",
media_type: "text/plain",
data: "The grass is green. The sky is blue."
},
title: "My Document",
context: "This is a trustworthy document.",
citations: { enabled: true }
},
{
type: "text",
text: "What color is the grass and sky?"
}
]
}
]
});
console.log(response);
C#
var client = new AnthropicClient();
var response = await client.Messages.Create(
new()
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new ContentBlockParam(new DocumentBlockParam(
new DocumentBlockParamSource(new PlainTextSource()
{
Data = "The grass is green. The sky is blue.",
})
)
{
Title = "My Document",
Context = "This is a trustworthy document.",
Citations = new CitationsConfigParam { Enabled = true },
}),
new ContentBlockParam(new TextBlockParam("What color is the grass and sky?")),
},
},
],
}
);
Console.WriteLine(response);
Go
client := anthropic.NewClient()
response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfText: &anthropic.PlainTextSourceParam{
Data: "The grass is green. The sky is blue.",
},
},
Title: anthropic.String("My Document"),
Context: anthropic.String("This is a trustworthy document."),
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
},
},
anthropic.NewTextBlock("What color is the grass and sky?"),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
Java
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
PlainTextSource source = PlainTextSource.builder()
.data("The grass is green. The sky is blue.")
.build();
DocumentBlockParam documentParam = DocumentBlockParam.builder()
.source(source)
.title("My Document")
.context("This is a trustworthy document.")
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.build();
TextBlockParam textBlockParam = TextBlockParam.builder()
.text("What color is the grass and sky?")
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(
List.of(
ContentBlockParam.ofDocument(documentParam),
ContentBlockParam.ofText(textBlockParam)
)
)
.build();
Message message = client.messages().create(params);
System.out.println(message);
PHP
$client = new Client();
$response = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => [
'type' => 'text',
'media_type' => 'text/plain',
'data' => 'The grass is green. The sky is blue.',
],
'title' => 'My Document',
'context' => 'This is a trustworthy document.',
'citations' => ['enabled' => true],
],
[
'type' => 'text',
'text' => 'What color is the grass and sky?',
],
],
],
],
model: Model::CLAUDE_OPUS_5_5,
);
echo json_encode($response, JSON_PRETTY_PRINT);
Ruby
client = Anthropic::Client.new
response = client.messages.create(
model: Anthropic::Model::CLAUDE_OPUS_5_5,
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "text",
media_type: "text/plain",
data: "The grass is green. The sky is blue."
},
title: "My Document",
context: "This is a trustworthy document.",
citations: { enabled: true }
},
{
type: "text",
text: "What color is the grass and sky?"
}
]
}
]
)
puts response
提示
与基于提示的方法的比较
与通过提示让 Claude 引用来源相比,引用功能具有以下优势:
- 节省成本: 如果您基于提示的方法要求 Claude 输出直接引语,您可能会节省成本,因为
cited_text不计入您的输出令牌。- 更高的引用可靠性: 由于 API 会将引用解析为以下各节所述的响应格式并直接提取
cited_text,因此可以保证引用包含指向所提供文档的有效指针。- 更高的引用质量: 在 Anthropic 的评估中,与纯粹基于提示的方法相比,引用功能引用文档中最相关引文的可能性显著更高。
引用的工作原理
按以下步骤将引用功能与 Claude 集成:
-
提供文档并启用引用
-
文档被处理
-
文档内容会被 “chunked”(分块),以定义可能引用的最小粒度。例如,句子分块允许 Claude 引用单个句子,或将多个连续句子串联起来以引用一个段落或更长的篇幅。
- 对于 PDF: 按照 PDF 支持中所述提取文本,并将内容分块为句子。目前不支持引用 PDF 中的图像。
- 对于纯文本文档: 内容被分块为可供引用的句子。
- 对于自定义内容文档: 您提供的内容块按原样使用,不做进一步分块。
-
-
Claude 提供带引用的回答
-
回答现在可能包含多个文本块,每个文本块可以包含 Claude 提出的陈述以及支持该陈述的引用列表。
-
引用指向源文档中的特定位置。这些引用的格式取决于被引用文档的类型。
- 对于 PDF: 引用包含页码范围(从 1 开始索引)。
- 对于纯文本文档: 引用包含字符索引范围(从 0 开始索引)。
- 对于自定义内容文档: 引用包含与所提供的原始内容列表相对应的内容块索引范围(从 0 开始索引)。
-
提供文档索引以指示引用来源,该索引根据您原始请求中所有文档的列表从 0 开始编号。
-
提示
自动分块与自定义内容
默认情况下,纯文本和 PDF 文档会自动分块为句子。如果您需要对引用粒度进行更多控制(例如,针对项目符号列表或转录文本),请改用自定义内容文档。有关更多详细信息,请参阅文档类型。
例如,如果您希望 Claude 能够引用 RAG 块中的特定句子,则应将每个 RAG 块放入一个纯文本文档中。否则,如果您不希望进行任何进一步的分块,或者希望自定义任何额外的分块,则可以将 RAG 块放入自定义内容文档中。
可引用与不可引用的内容
- 文档
source内容中的文本可以被引用。 title和context是可选字段,会传递给模型,但不用于被引用的内容。title有长度限制,因此context字段可用于以文本或字符串化 JSON 的形式存储文档元数据。
引用索引
- 文档索引根据请求中所有文档内容块的列表(跨越所有消息)从 0 开始编号。
- 字符索引从 0 开始,结束索引为不包含(exclusive)。
- 页码从 1 开始,结束页码为不包含。
- 内容块索引根据自定义内容文档中提供的
content列表从 0 开始编号,结束索引为不包含。
令牌成本
- 由于系统提示的附加内容和文档分块,启用引用会导致输入令牌略有增加。
- 不过,引用功能在输出令牌方面非常高效。在内部,模型以标准化格式输出引用,然后这些引用被解析为被引用文本和文档位置索引。
cited_text字段是为方便起见而提供的,不计入输出令牌。 - 在后续对话轮次中传回时,
cited_text也不计入输入令牌。
功能兼容性
引用功能可与其他 API 功能配合使用,包括 “prompt caching”(提示缓存)、令牌计数和批处理。有关提示缓存的详细信息,请参阅提示缓存。
警告
引用与结构化输出不兼容
引用不能与结构化输出一起使用。如果您在任何用户提供的文档(
document块或search_result块)上启用了引用,同时又包含了output_config.format参数(或已弃用的output_format参数),API 将返回 400 错误。这是因为引用需要将引用块与文本输出交错排列,这与结构化输出的严格 JSON schema 约束不兼容。
获取带引用的结构化数据
要为每个提取的值获取引用,请提示 Claude 每个字段输出一行作为回答。然后在您的代码中将这些行解析为结构化数据。
避免使用仅要求输出 JSON 的用户提示或系统提示,例如 “只返回一个 JSON 对象,不要输出其他文本”。使用此类提示的请求会成功,但响应中可能只包含很少的引用,甚至没有引用。
以下提示要求从本页顶部示例中的纯文本文档中提取两个字段。请用它替换该示例中的问题进行发送:
Extract these fields from the document: grass_color, sky_color.
Answer with one line per field in the form "field: value", and cite the document for each line. After the colon, write only the value, with no explanation or quotation.
在以下响应中,每个值都有各自的引用:
{
"content": [
{ "type": "text", "text": "grass_color: " },
{
"type": "text",
"text": "green",
"citations": [
{
"type": "char_location",
"cited_text": "The grass is green. ",
"document_index": 0,
"document_title": "My Document",
"start_char_index": 0,
"end_char_index": 20
}
]
},
{ "type": "text", "text": "\nsky_color: " },
{
"type": "text",
"text": "blue",
"citations": [
{
"type": "char_location",
"cited_text": "The sky is blue.",
"document_index": 0,
"document_title": "My Document",
"start_char_index": 20,
"end_char_index": 36
}
]
}
]
}
要解析响应,请按照以下步骤操作:
- 按顺序读取
text块,并将每个块的文本添加到当前行。在每个换行符处开始新的一行。 - 将每个块的
citations附加到包含该块部分文本的每一行。一个带引用的块可以只包含一个值(如本示例所示),也可以包含整行。 - 跳过不含冒号的行。将其余每一行在第一个冒号处拆分为字段名和值,并去除两者的首尾空格。跳过名称不属于您的字段的行,例如结尾说明。
- 检查每个字段是否都有值且至少有一个引用。API 不保证这两点。
将提示缓存与引用结合使用
引用和提示缓存可以有效地结合使用。
响应中生成的引用块无法直接缓存,但它们所引用的源文档可以被缓存。为了优化性能,请将 cache_control 应用于您的顶层文档内容块。
cURL
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "This is a very long document with thousands of words..."
},
"citations": {"enabled": true},
"cache_control": {"type": "ephemeral"}
},
{
"type": "text",
"text": "What does this document say about API features?"
}
]
}
]
}'
CLI
ant messages create --model claude-opus-5-5 --max-tokens 1024 <<'YAML'
messages:
- role: user
content:
- type: document
source:
type: text
media_type: text/plain
data: This is a very long document with thousands of words...
citations:
enabled: true
cache_control:
type: ephemeral
- type: text
text: What does this document say about API features?
YAML
Python
client = anthropic.Anthropic()
# 长文档内容(例如技术文档)
long_document = (
"This is a very long document with thousands of words..." + " ... " * 1000
) # Minimum cacheable length
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": long_document,
},
"citations": {"enabled": True},
"cache_control": {
"type": "ephemeral"
}, # Cache the document content
},
{
"type": "text",
"text": "What does this document say about API features?",
},
],
}
],
)
print(response)
TypeScript
const client = new Anthropic();
// 长文档内容(例如技术文档)
const longDocument =
"This is a very long document with thousands of words..." + " ... ".repeat(1000); // Minimum cacheable length
const response = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "text",
media_type: "text/plain",
data: longDocument
},
citations: { enabled: true },
cache_control: { type: "ephemeral" } // Cache the document content
},
{
type: "text",
text: "What does this document say about API features?"
}
]
}
]
});
console.log(response);
C#
var client = new AnthropicClient();
// 长文档内容(例如技术文档)
var longDocument =
"This is a very long document with thousands of words..."
+ string.Concat(Enumerable.Repeat(" ... ", 1000)); // Minimum cacheable length
var response = await client.Messages.Create(
new()
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new ContentBlockParam(new DocumentBlockParam(
new DocumentBlockParamSource(new PlainTextSource() { Data = longDocument })
)
{
Citations = new CitationsConfigParam { Enabled = true },
CacheControl = new CacheControlEphemeral(), // Cache the document content
}),
new ContentBlockParam(new TextBlockParam("What does this document say about API features?")),
},
},
],
}
);
Console.WriteLine(response);
Go
client := anthropic.NewClient()
// 长文档内容(例如技术文档)
longDocument := "This is a very long document with thousands of words..." +
strings.Repeat(" ... ", 1000) // Minimum cacheable length
response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfText: &anthropic.PlainTextSourceParam{Data: longDocument},
},
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
CacheControl: anthropic.NewCacheControlEphemeralParam(), // Cache the document content
},
},
anthropic.NewTextBlock("What does this document say about API features?"),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
Java
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 长文档内容(例如技术文档)
String longDocument =
"This is a very long document with thousands of words..."
+ " ... ".repeat(1000); // Minimum cacheable length
DocumentBlockParam documentParam = DocumentBlockParam.builder()
.source(PlainTextSource.builder()
.data(longDocument)
.build())
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.cacheControl(CacheControlEphemeral.builder().build()) // Cache the document content
.build();
TextBlockParam textBlockParam = TextBlockParam.builder()
.text("What does this document say about API features?")
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(
List.of(
ContentBlockParam.ofDocument(documentParam),
ContentBlockParam.ofText(textBlockParam)
)
)
.build();
Message message = client.messages().create(params);
System.out.println(message);
PHP
$client = new Client();
// 长文档内容(例如技术文档)
$longDocument =
'This is a very long document with thousands of words...'
. str_repeat(' ... ', 1000); // Minimum cacheable length
$response = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => [
'type' => 'text',
'media_type' => 'text/plain',
'data' => $longDocument,
],
'citations' => ['enabled' => true],
'cache_control' => ['type' => 'ephemeral'], // Cache the document content
],
[
'type' => 'text',
'text' => 'What does this document say about API features?',
],
],
],
],
model: Model::CLAUDE_OPUS_5_5,
);
echo json_encode($response, JSON_PRETTY_PRINT);
Ruby
client = Anthropic::Client.new
# 长文档内容(例如技术文档)
long_document =
"This is a very long document with thousands of words..." +
" ... " * 1000 # Minimum cacheable length
response = client.messages.create(
model: Anthropic::Model::CLAUDE_OPUS_5_5,
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "text",
media_type: "text/plain",
data: long_document
},
citations: { enabled: true },
cache_control: { type: "ephemeral" } # Cache the document content
},
{
type: "text",
text: "What does this document say about API features?"
}
]
}
]
)
puts response
在此示例中:
- 文档内容通过文档块上的
cache_control进行缓存。 - 文档上启用了引用。
- Claude 可以在受益于已缓存文档内容的同时生成带引用的响应。
- 使用同一文档的后续请求将受益于已缓存的内容。
文档类型
选择文档类型
引用功能支持三种文档类型。文档可以直接在消息中提供(base64、文本或 URL),也可以通过 Files API 上传并通过 file_id 引用:
| 类型 | 最适用于 | 分块方式 | 引用格式 |
|---|---|---|---|
| 纯文本 | 简单文本文档、散文 | 句子 | 字符索引(从 0 开始) |
| 包含文本内容的 PDF 文件 | 句子 | 页码(从 1 开始) | |
| 自定义内容 | 列表、转录文本、特殊格式、更细粒度的引用 | 无额外分块 | 块索引(从 0 开始) |
注意
对于
document块不支持的文件类型(例如 .docx 和 .xlsx),请将文件转换为纯文本,并将内容直接包含在消息内容中。已经是纯文本的文件(例如 .csv 和 .md 文件)也可以使用显式的text/plain内容类型上传。请参阅处理其他文件格式。
纯文本文档
纯文本文档会自动分块为句子。您可以内联提供它们,也可以通过其 file_id 引用它们:
内联文本
本页顶部的入门示例展示了每种 SDK 中完整的纯文本请求。文档块使用 text 源:
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "Plain text content..."
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": { "enabled": true }
}
Files API
这些示例将通过 Files API 上传的文件作为 document 源进行引用。
cURL
curl -X POST https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {"type": "file", "file_id": "'"$FILE_ID"'"},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": true}
},
{
"type": "text",
"text": "Summarize this document."
}
]
}
]
}'
CLI
ant messages create <<YAML
model: claude-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: document
source:
type: file
file_id: $FILE_ID
title: Document Title
context: Context about the document that will not be cited from
citations:
enabled: true
- type: text
text: Summarize this document.
YAML
Python
cited_response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {"type": "file", "file_id": file_id},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": True},
},
{"type": "text", "text": "Summarize this document."},
],
}
],
)
print(cited_response)
TypeScript
const citedResponse = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: { type: "file", file_id: uploaded.id },
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
});
console.log(citedResponse);
C#
var citedResponse = await client.Messages.Create(
new MessageCreateParams
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new DocumentBlockParam
{
Source = new FileDocumentSource { FileID = fileId },
Title = "Document Title",
Context = "Context about the document that will not be cited from",
Citations = new CitationsConfigParam { Enabled = true },
},
new TextBlockParam { Text = "Summarize this document." },
}
}
]
});
Console.WriteLine(citedResponse);
Go
citedMsg, err := client.Messages.New(context.Background(),
anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfFile: &anthropic.FileDocumentSourceParam{FileID: fileID},
},
Title: anthropic.String("Document Title"),
Context: anthropic.String("Context about the document that will not be cited from"),
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
},
},
anthropic.NewTextBlock("Summarize this document."),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(citedMsg)
Java
MessageCreateParams citedParams = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(List.of(
ContentBlockParam.ofDocument(DocumentBlockParam.builder()
.fileSource(fileId)
.title("Document Title")
.context("Context about the document that will not be cited from")
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.build()),
ContentBlockParam.ofText(TextBlockParam.builder()
.text("Summarize this document.")
.build())
))
.build();
Message citedMessage = client.messages().create(citedParams);
System.out.println(citedMessage);
PHP
$citedResponse = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => ['type' => 'file', 'fileID' => $fileId],
'title' => 'Document Title',
'context' => 'Context about the document that will not be cited from',
'citations' => ['enabled' => true],
],
['type' => 'text', 'text' => 'Summarize this document.'],
],
],
],
model: 'claude-opus-5-5',
);
echo $citedResponse;
Ruby
cited_response = client.messages.create(
model: Anthropic::Model::CLAUDE_OPUS_5_5,
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: { type: "file", file_id: file_id },
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
)
puts cited_response
纯文本引用示例
{
"type": "char_location",
"cited_text": "The exact text being cited", // not counted toward output tokens
"document_index": 0,
"document_title": "Document Title",
"start_char_index": 0, // 0-indexed
"end_char_index": 50 // exclusive
}
PDF 文档
PDF 文档可以以 base64 编码数据、URL 或 file_id 的形式提供。PDF 文本会被提取并分块为句子。由于尚不支持图像引用,因此作为文档扫描件且不包含可提取文本的 PDF 无法被引用。
Base64
cURL
PDF_BASE64=$(base64 /path/to/document.pdf | tr -d '\n')
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": "'"$PDF_BASE64"'"
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": true}
},
{
"type": "text",
"text": "Summarize this document."
}
]
}
]
}'
CLI
ant messages create <<'YAML'
model: claude-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: document
source:
type: base64
media_type: application/pdf
data: "@/path/to/document.pdf"
title: Document Title
context: Context about the document that will not be cited from
citations:
enabled: true
- type: text
text: Summarize this document.
YAML
Python
client = anthropic.Anthropic()
pdf_base64 = base64.standard_b64encode(
pathlib.Path("/path/to/document.pdf").read_bytes()
).decode()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": pdf_base64,
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": True},
},
{"type": "text", "text": "Summarize this document."},
],
}
],
)
print(response)
TypeScript
const client = new Anthropic();
const pdfBase64 = Buffer.from(await readFile("/path/to/document.pdf")).toString("base64");
const response = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "base64",
media_type: "application/pdf",
data: pdfBase64
},
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
});
console.log(response);
C#
var client = new AnthropicClient();
var pdfBase64 = Convert.ToBase64String(await File.ReadAllBytesAsync("/path/to/document.pdf"));
var response = await client.Messages.Create(
new()
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new ContentBlockParam(new DocumentBlockParam(
new DocumentBlockParamSource(new Base64PdfSource() { Data = pdfBase64 })
)
{
Title = "Document Title",
Context = "Context about the document that will not be cited from",
Citations = new CitationsConfigParam { Enabled = true },
}),
new ContentBlockParam(new TextBlockParam("Summarize this document.")),
},
},
],
}
);
Console.WriteLine(response);
Go
client := anthropic.NewClient()
pdfBytes, err := os.ReadFile("/path/to/document.pdf")
if err != nil {
log.Fatal(err)
}
pdfBase64 := base64.StdEncoding.EncodeToString(pdfBytes)
response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfBase64: &anthropic.Base64PDFSourceParam{
Data: pdfBase64,
},
},
Title: anthropic.String("Document Title"),
Context: anthropic.String("Context about the document that will not be cited from"),
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
},
},
anthropic.NewTextBlock("Summarize this document."),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
Java
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
byte[] pdfBytes = Files.readAllBytes(Path.of("/path/to/document.pdf"));
String pdfBase64 = Base64.getEncoder().encodeToString(pdfBytes);
DocumentBlockParam documentParam = DocumentBlockParam.builder()
.source(Base64PdfSource.builder()
.data(pdfBase64)
.build())
.title("Document Title")
.context("Context about the document that will not be cited from")
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(
List.of(
ContentBlockParam.ofDocument(documentParam),
ContentBlockParam.ofText(TextBlockParam.builder()
.text("Summarize this document.")
.build())
)
)
.build();
Message message = client.messages().create(params);
System.out.println(message);
PHP
$client = new Client();
$pdfBase64 = base64_encode(file_get_contents('/path/to/document.pdf'));
$response = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => [
'type' => 'base64',
'media_type' => 'application/pdf',
'data' => $pdfBase64,
],
'title' => 'Document Title',
'context' => 'Context about the document that will not be cited from',
'citations' => ['enabled' => true],
],
[
'type' => 'text',
'text' => 'Summarize this document.',
],
],
],
],
model: 'claude-opus-5-5',
);
echo json_encode($response, JSON_PRETTY_PRINT);
Ruby
client = Anthropic::Client.new
pdf_base64 = Base64.strict_encode64(File.binread("/path/to/document.pdf"))
response = client.messages.create(
model: Anthropic::Model::CLAUDE_OPUS_5_5,
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "base64",
media_type: "application/pdf",
data: pdf_base64
},
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
)
puts response
URL
cURL
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "url",
"url": "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf"
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": true}
},
{
"type": "text",
"text": "Summarize this document."
}
]
}
]
}'
CLI
ant messages create <<'YAML'
model: claude-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: document
source:
type: url
url: https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf
title: Document Title
context: Context about the document that will not be cited from
citations:
enabled: true
- type: text
text: Summarize this document.
YAML
Python
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "url",
"url": "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf",
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": True},
},
{"type": "text", "text": "Summarize this document."},
],
}
],
)
print(response)
TypeScript
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "url",
url: "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf"
},
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
});
console.log(response);
C#
var client = new AnthropicClient();
var response = await client.Messages.Create(
new()
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new ContentBlockParam(new DocumentBlockParam(
new DocumentBlockParamSource(new UrlPdfSource()
{
Url = "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf",
})
)
{
Title = "Document Title",
Context = "Context about the document that will not be cited from",
Citations = new CitationsConfigParam { Enabled = true },
}),
new ContentBlockParam(new TextBlockParam("Summarize this document.")),
},
},
],
}
);
Console.WriteLine(response);
Go
client := anthropic.NewClient()
response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfURL: &anthropic.URLPDFSourceParam{
URL: "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf",
},
},
Title: anthropic.String("Document Title"),
Context: anthropic.String("Context about the document that will not be cited from"),
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
},
},
anthropic.NewTextBlock("Summarize this document."),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
Java
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
DocumentBlockParam documentParam = DocumentBlockParam.builder()
.source(UrlPdfSource.builder()
.url("https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf")
.build())
.title("Document Title")
.context("Context about the document that will not be cited from")
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(
List.of(
ContentBlockParam.ofDocument(documentParam),
ContentBlockParam.ofText(TextBlockParam.builder()
.text("Summarize this document.")
.build())
)
)
.build();
Message message = client.messages().create(params);
System.out.println(message);
PHP
$client = new Client();
$response = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => [
'type' => 'url',
'url' => 'https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf',
],
'title' => 'Document Title',
'context' => 'Context about the document that will not be cited from',
'citations' => ['enabled' => true],
],
[
'type' => 'text',
'text' => 'Summarize this document.',
],
],
],
],
model: 'claude-opus-5-5',
);
echo json_encode($response, JSON_PRETTY_PRINT);
Ruby
client = Anthropic::Client.new
response = client.messages.create(
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "url",
url: "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf"
},
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
)
puts response
Files API
这些示例将通过 Files API 上传的文件作为 document 源进行引用。
cURL
curl -X POST https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {"type": "file", "file_id": "'"$FILE_ID"'"},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": true}
},
{
"type": "text",
"text": "Summarize this document."
}
]
}
]
}'
CLI
ant messages create <<YAML
model: claude-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: document
source:
type: file
file_id: $FILE_ID
title: Document Title
context: Context about the document that will not be cited from
citations:
enabled: true
- type: text
text: Summarize this document.
YAML
Python
cited_response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {"type": "file", "file_id": file_id},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": True},
},
{"type": "text", "text": "Summarize this document."},
],
}
],
)
print(cited_response)
TypeScript
const citedResponse = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: { type: "file", file_id: uploaded.id },
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
});
console.log(citedResponse);
C#
var citedResponse = await client.Messages.Create(
new MessageCreateParams
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new DocumentBlockParam
{
Source = new FileDocumentSource { FileID = fileId },
Title = "Document Title",
Context = "Context about the document that will not be cited from",
Citations = new CitationsConfigParam { Enabled = true },
},
new TextBlockParam { Text = "Summarize this document." },
}
}
]
});
Console.WriteLine(citedResponse);
Go
citedMsg, err := client.Messages.New(context.Background(),
anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfFile: &anthropic.FileDocumentSourceParam{FileID: fileID},
},
Title: anthropic.String("Document Title"),
Context: anthropic.String("Context about the document that will not be cited from"),
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
},
},
anthropic.NewTextBlock("Summarize this document."),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(citedMsg)
Java
MessageCreateParams citedParams = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(List.of(
ContentBlockParam.ofDocument(DocumentBlockParam.builder()
.fileSource(fileId)
.title("Document Title")
.context("Context about the document that will not be cited from")
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.build()),
ContentBlockParam.ofText(TextBlockParam.builder()
.text("Summarize this document.")
.build())
))
.build();
Message citedMessage = client.messages().create(citedParams);
System.out.println(citedMessage);
PHP
$citedResponse = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => ['type' => 'file', 'fileID' => $fileId],
'title' => 'Document Title',
'context' => 'Context about the document that will not be cited from',
'citations' => ['enabled' => true],
],
['type' => 'text', 'text' => 'Summarize this document.'],
],
],
],
model: 'claude-opus-5-5',
);
echo $citedResponse;
Ruby
cited_response = client.messages.create(
model: Anthropic::Model::CLAUDE_OPUS_5_5,
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: { type: "file", file_id: file_id },
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
)
puts cited_response
PDF 引用示例
{
"type": "page_location",
"cited_text": "The exact text being cited", // not counted toward output tokens
"document_index": 0,
"document_title": "Document Title",
"start_page_number": 1, // 1-indexed
"end_page_number": 2 // exclusive
}
自定义内容文档
自定义内容文档让您可以控制引用粒度。不会进行额外的分块,各块将按照所提供的内容块提供给模型。
cURL
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "content",
"content": [
{"type": "text", "text": "First chunk"},
{"type": "text", "text": "Second chunk"}
]
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": true}
},
{
"type": "text",
"text": "Summarize this document."
}
]
}
]
}'
CLI
ant messages create <<'YAML'
model: claude-opus-5-5
max_tokens: 1024
messages:
- role: user
content:
- type: document
source:
type: content
content:
- type: text
text: First chunk
- type: text
text: Second chunk
title: Document Title
context: Context about the document that will not be cited from
citations:
enabled: true
- type: text
text: Summarize this document.
YAML
Python
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "content",
"content": [
{"type": "text", "text": "First chunk"},
{"type": "text", "text": "Second chunk"},
],
},
"title": "Document Title",
"context": "Context about the document that will not be cited from",
"citations": {"enabled": True},
},
{"type": "text", "text": "Summarize this document."},
],
}
],
)
print(response)
TypeScript
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-opus-5-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "content",
content: [
{ type: "text", text: "First chunk" },
{ type: "text", text: "Second chunk" }
]
},
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
});
console.log(response);
C#
var client = new AnthropicClient();
var response = await client.Messages.Create(
new()
{
Model = Model.ClaudeOpus5_5,
MaxTokens = 1024,
Messages =
[
new UserMessageParam
{
Content = new List<ContentBlockParam>
{
new ContentBlockParam(new DocumentBlockParam(
new DocumentBlockParamSource(new ContentBlockSource()
{
Content = new ContentBlockSourceContent(new List<MessageContentBlockSourceContent>
{
new TextBlockParam("First chunk"),
new TextBlockParam("Second chunk"),
}),
})
)
{
Title = "Document Title",
Context = "Context about the document that will not be cited from",
Citations = new CitationsConfigParam { Enabled = true },
}),
new ContentBlockParam(new TextBlockParam("Summarize this document.")),
},
},
],
}
);
Console.WriteLine(response);
Go
client := anthropic.NewClient()
response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeOpus5_5,
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.ContentBlockParamUnion{
OfDocument: &anthropic.DocumentBlockParam{
Source: anthropic.DocumentBlockParamSourceUnion{
OfContent: &anthropic.ContentBlockSourceParam{
Content: anthropic.ContentBlockSourceContentUnionParam{
OfContentBlockSourceContent: []anthropic.ContentBlockSourceContentItemUnionParam{
{OfText: &anthropic.TextBlockParam{Text: "First chunk"}},
{OfText: &anthropic.TextBlockParam{Text: "Second chunk"}},
},
},
},
},
Title: anthropic.String("Document Title"),
Context: anthropic.String("Context about the document that will not be cited from"),
Citations: anthropic.CitationsConfigParam{Enabled: anthropic.Bool(true)},
},
},
anthropic.NewTextBlock("Summarize this document."),
),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
Java
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
DocumentBlockParam documentParam = DocumentBlockParam.builder()
.source(ContentBlockSource.builder()
.contentOfBlockSource(
List.of(
ContentBlockSourceContent.ofText(TextBlockParam.builder()
.text("First chunk")
.build()),
ContentBlockSourceContent.ofText(TextBlockParam.builder()
.text("Second chunk")
.build())
)
)
.build())
.title("Document Title")
.context("Context about the document that will not be cited from")
.citations(CitationsConfigParam.builder()
.enabled(true)
.build())
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_OPUS_5_5)
.maxTokens(1024)
.addUserMessageOfContentBlockParams(
List.of(
ContentBlockParam.ofDocument(documentParam),
ContentBlockParam.ofText(TextBlockParam.builder()
.text("Summarize this document.")
.build())
)
)
.build();
Message message = client.messages().create(params);
System.out.println(message);
PHP
$client = new Client();
$response = $client->messages->create(
maxTokens: 1024,
messages: [
[
'role' => 'user',
'content' => [
[
'type' => 'document',
'source' => [
'type' => 'content',
'content' => [
['type' => 'text', 'text' => 'First chunk'],
['type' => 'text', 'text' => 'Second chunk'],
],
],
'title' => 'Document Title',
'context' => 'Context about the document that will not be cited from',
'citations' => ['enabled' => true],
],
[
'type' => 'text',
'text' => 'Summarize this document.',
],
],
],
],
model: Model::CLAUDE_OPUS_5_5,
);
echo json_encode($response, JSON_PRETTY_PRINT);
Ruby
client = Anthropic::Client.new
response = client.messages.create(
model: Anthropic::Model::CLAUDE_OPUS_5_5,
max_tokens: 1024,
messages: [
{
role: "user",
content: [
{
type: "document",
source: {
type: "content",
content: [
{ type: "text", text: "First chunk" },
{ type: "text", text: "Second chunk" }
]
},
title: "Document Title",
context: "Context about the document that will not be cited from",
citations: { enabled: true }
},
{
type: "text",
text: "Summarize this document."
}
]
}
]
)
puts response
引用示例
{
"type": "content_block_location",
"cited_text": "The exact text being cited", // not counted toward output tokens
"document_index": 0,
"document_title": "Document Title",
"start_block_index": 0, // 0-indexed
"end_block_index": 1 // exclusive
}
响应结构
启用引用后,响应将包含多个带有引用的文本块:
{
"content": [
{ "type": "text", "text": "According to the document, " },
{
"type": "text",
"text": "the grass is green",
"citations": [
{
"type": "char_location",
"cited_text": "The grass is green. ",
"document_index": 0,
"document_title": "Example Document",
"start_char_index": 0,
"end_char_index": 20
}
]
},
{ "type": "text", "text": " and " },
{
"type": "text",
"text": "the sky is blue",
"citations": [
{
"type": "char_location",
"cited_text": "The sky is blue.",
"document_index": 0,
"document_title": "Example Document",
"start_char_index": 20,
"end_char_index": 36
}
]
},
{
"type": "text",
"text": ". Information from page 5 states that "
},
{
"type": "text",
"text": "water is essential",
"citations": [
{
"type": "page_location",
"cited_text": "Water is essential for life.",
"document_index": 1,
"document_title": "PDF Document",
"start_page_number": 5,
"end_page_number": 6
}
]
},
{
"type": "text",
"text": ". The custom document mentions "
},
{
"type": "text",
"text": "important findings",
"citations": [
{
"type": "content_block_location",
"cited_text": "These are important findings.",
"document_index": 2,
"document_title": "Custom Content Document",
"start_block_index": 0,
"end_block_index": 1
}
]
}
]
}
流式传输支持
对于 “streaming”(流式传输)响应,引用以 content_block_delta 事件中的 citations_delta 增量类型到达。每个增量包含一条引用,用于添加到当前 text 内容块的 citations 列表中。
流式传输事件示例
event: message_start
data: {"type": "message_start", ...}
event: content_block_start
data: {"type": "content_block_start", "index": 0, ...}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0,
"delta": {"type": "text_delta", "text": "According to..."}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0,
"delta": {"type": "citations_delta",
"citation": {
"type": "char_location",
"cited_text": "...",
"document_index": 0,
...
}}}
event: content_block_stop
data: {"type": "content_block_stop", "index": 0}
event: message_stop
data: {"type": "message_stop"}
后续步骤
-
流式传输消息:在处理文本增量的同时处理
citations_delta增量类型,以便在流式传输过程中渲染带引用的响应。 -
搜索结果:将 RAG 管道中的搜索结果作为具有内置引用支持的一等内容块传入。
-
PDF 支持:了解 Claude 如何从 PDF 中提取文本,以及基于页码的引用如何映射回您的源文件。
-
Files API:一次上传文档,即可在多个引用请求中通过
file_id引用它们。
可用性
引用在所有模型上可用,并具备零数据保留和HIPAA 就绪资格。
API 支持
Messages API
- 可用性:可用
| 状态 | 云平台 |
|---|---|
| 可用 | Claude API, Claude Platform on AWS, Amazon Bedrock, Amazon Bedrock (InvokeModel), Claude Models on Google Cloud (Google managed), Microsoft Foundry |
Managed Agents
- 可用性:不可用
数据处理
| 项目 | 零数据保留 | HIPAA |
|---|---|---|
| 状态 | 具备资格(不包括 涵盖的模型) | 具备资格 |
适用的端点:
/v1/messages