跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

SDK 来源引用

启用实验性引用元数据,按最终消息中的 UTF-16 区间关联来源。

Citations 为助手回答中的文本区间关联支持来源,可用于脚注、行内引用或来源列表。此能力仍属实验性,选项、事件字段及提供商覆盖范围可能变化,不在兼容性保证范围内。

启用并提供可引用材料

创建会话时设置 enableCitations: true;重启后恢复会话,也要在恢复选项中重新设置。仅打开选项不会强制每次回答都有引用,应用必须把 citations 当作可选数据。

来源可以是附件文档,或工具结果的实验性 citableSources 数组。工具来源项包含 id、content,以及可选 title、url、path;它们随工具结果持久化,可跨会话恢复,由 runtime 生成的引用标记为 client。

使用 Anthropic 提供商且启用引用时,文件附件作为开启 citations 的 document blocks 发送。例如应用可以通过 blob 附件提供 Base64 PDF、mimeType: "application/pdf" 和显示名称;附件基本形状见图片与附件输入。不要由此推断所有提供商对 PDF 或工具来源的支持相同。

等最终消息,再添加引用标记

引用出现在最终 assistant.message 的 data.citations,不出现在 assistant.message_delta。流式阶段可以先显示正文,完整消息到达后再按最终文本放置来源标记:

session.on((event) => {
  if (event.type !== "assistant.message" || !event.data.citations) return;
  const { sources, spans } = event.data.citations;
  const sourceById = new Map(sources.map((source) => [source.id, source]));
  for (const span of spans) {
    const text = event.data.content.slice(span.startIndex, span.endIndex);
    for (const reference of span.references) {
      const source = sourceById.get(reference.sourceId);
      console.log(text, source?.title ?? source?.url ?? source?.path ?? source?.id);
    }
  }
});

不要用增量字符串的局部位置解释最终 span,也不要因为没有引用就认定会话失败。

数据结构与偏移单位

sources 是去重的来源数组;spans 描述回答中的哪些区间引用了哪些来源。同一来源支持多段文字时,不必重复创建来源记录。

层级字段含义
来源id当前 turn 范围内的稳定标识
来源provideranthropic、openai 或 client
来源title、url、path可选显示标题、网页 URL、相对代理工作区根目录的文件路径
文本区间startIndex、endIndex最终 content 中从零开始、左含右不含的 UTF-16 code units 偏移
文本区间references支持该区间的引用项
引用项sourceId关联 sources 中的 id
引用项citedText、location可选原文及来源位置
引用项providerMetadata可选提供商原生关联数据,按不透明数据处理

TypeScript、Java、.NET 字符串使用 UTF-16,可按上述单位切片。Python 字符串按 Unicode code point 索引,Go 和 Rust 为 UTF-8,不能直接把这些偏移当本语言字符或字节位置。

来源位置 location.type 可为 char、page、block,分别使用 startIndex/endIndex、startPage/endPage、startBlock/endBlock。这里不把回答 span 的偏移规则未经核实地外推为所有来源位置类型的单位和边界约定。

能力边界

provider 记录引用来自 Anthropic、OpenAI,还是 runtime 从工具结果生成;枚举存在不代表每个模型均能返回引用。未支持的提供商可能没有 citations payload。公共代码匹配或 IP duplication 的引用也不属于这一接口,不能用它替代代码匹配策略。