提示 API

社区组报告草案,

关于本文档的更多详细信息
本版本:
https://webmachinelearning.github.io/prompt-api
问题跟踪:
GitHub
编辑:
(Google)
前任编辑:
Domenic Denicola (Google)

摘要

提示 API 使网页能够直接向语言模型发出提示

本文档状态

本规范由 Web Machine Learning Community Group 发布。 它不是 W3C 标准,也不在 W3C 标准轨道上。 请注意,根据 W3C 社区贡献者许可协议 (CLA) 适用有限的退出选择及其他条件。 了解更多关于 W3C 社区和业务组 的信息。

1. 简介

Prompt API 使网页能够直接提示由浏览器提供的语言模型。它提供了统一的 JavaScript API,抽象掉底层模型的具体细节(例如模板化或分词)。通过利用内置语言模型,它提供了本地处理敏感数据、离线使用、模型共享,以及与基于云或自带模型的方法相比降低成本等好处。

2. 依赖项

本规范依赖于 Infra 标准。[INFRA]

与 Web 平台的其余部分一样,在这些 API 中,人类语言通过 BCP 47 语言标签来标识, 例如 "ja"、"en-US"、"sr-Cyrl" 或 "de-CH-1901-x-phonebk-extended"。用于验证、规范化和语言标签匹配的具体算法来自 ECMAScript 国际化 API 规范, 而该规范又将其部分处理委托给 Unicode 区域设置数据标记语言(LDML)[BCP47] [ECMA-402] [UTS35]

这些 API 是预期由机器学习模型驱动的一系列 API 的一部分,它们共享通用的 API 表面习惯用法和规范模式。目前,这些共享部分的规范文本位于 Writing Assistance APIs § 5 共享基础设施,通用的隐私和安全考虑事项在 Writing Assistance APIs § 6 隐私考虑事项Writing Assistance APIs § 7 安全考虑事项 中讨论。实现这些 API 需要实现该共享基础设施,并符合这些隐私和安全考虑事项。但它不要求实现或暴露实际的写作辅助 API。[WRITING-ASSISTANCE-APIS]

3. API

[Exposed=Window, SecureContext]
interface LanguageModel : EventTarget {
  static Promise<LanguageModel> create(optional LanguageModelCreateOptions options = {});
  static Promise<Availability> availability(optional LanguageModelCreateCoreOptions options = {});
  // **EXPERIMENTAL**: 仅在扩展和实验性上下文中可用。
  static Promise<LanguageModelParams?> params();

  // 如果 role = "system",这些将抛出 "NotSupportedError" DOMException
  Promise<DOMString> prompt(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  ReadableStream promptStreaming(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  Promise<undefined> append(
    LanguageModelPrompt input,
    optional LanguageModelAppendOptions options = {}
  );


  Promise<double> measureContextUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  readonly attribute double contextUsage;
  readonly attribute unrestricted double contextWindow;
  attribute EventHandler oncontextoverflow;

  // **DEPRECATED**: 此方法仅在扩展上下文中可用。
  Promise<double> measureInputUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  // **DEPRECATED**: 此属性仅在扩展上下文中可用。
  readonly attribute double inputUsage;
  // **DEPRECATED**: 此属性仅在扩展上下文中可用。
  readonly attribute unrestricted double inputQuota;
  // **DEPRECATED**: 此属性仅在扩展上下文中可用。
  attribute EventHandler onquotaoverflow;

  // **EXPERIMENTAL**: 仅在扩展和实验性上下文中可用。
  readonly attribute unsigned long topK;
  // **EXPERIMENTAL**: 仅在扩展和实验性上下文中可用。
  readonly attribute float temperature;

  Promise<LanguageModel> clone(optional LanguageModelCloneOptions options = {});
};
LanguageModel includes DestroyableModel;

// **EXPERIMENTAL**: 仅在扩展和实验性上下文中可用。
[Exposed=Window, SecureContext]
interface LanguageModelParams {
  readonly attribute unsigned long defaultTopK;
  readonly attribute unsigned long maxTopK;
  readonly attribute float defaultTemperature;
  readonly attribute float maxTemperature;
};


callback LanguageModelToolFunction = Promise<DOMString> (any... arguments);

// 语言模型可以调用的工具调用描述。
dictionary LanguageModelTool {
  required DOMString name;
  required DOMString description;
  // 输入参数的 JSON schema。
  required object inputSchema;
  // 由用户代理代表语言模型调用的函数。
  required LanguageModelToolFunction execute;
};

dictionary LanguageModelCreateCoreOptions {
  // 注:这两个具有自定义的越界处理行为,不在 IDL 层。
  // 它们是 unrestricted double,以便允许 +Infinity 而不失败。
  // **EXPERIMENTAL**: 仅在扩展和实验性上下文中可用。
  unrestricted double topK;
  // **EXPERIMENTAL**: 仅在扩展和实验性上下文中可用。
  unrestricted double temperature;

  sequence<LanguageModelExpected> expectedInputs;
  sequence<LanguageModelExpected> expectedOutputs;
  sequence<LanguageModelTool> tools;
};

dictionary LanguageModelCreateOptions : LanguageModelCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;

  sequence<LanguageModelMessage> initialPrompts;
};

dictionary LanguageModelPromptOptions {
  object responseConstraint;
  boolean omitResponseConstraintInput = false;
  AbortSignal signal;
};

dictionary LanguageModelAppendOptions {
  AbortSignal signal;
};

dictionary LanguageModelCloneOptions {
  AbortSignal signal;
};

dictionary LanguageModelExpected {
  required LanguageModelMessageType type;
  sequence<DOMString> languages;
};

// prompt() 方法及其他类似方法的参数

typedef (
  sequence<LanguageModelMessage>
  // `[{ role: "user", content: [{ type: "text", value: providedValue }] }]` 的简写
  or DOMString
) LanguageModelPrompt;

dictionary LanguageModelMessage {
  required LanguageModelMessageRole role;

  // DOMString 分支是 `[{ type: "text", value: providedValue }]` 的简写
  required (DOMString or sequence<LanguageModelMessageContent>) content;

  boolean prefix = false;
};

dictionary LanguageModelMessageContent {
  required LanguageModelMessageType type;
  required LanguageModelMessageValue value;
};

enum LanguageModelMessageRole { "system", "user", "assistant" };

enum LanguageModelMessageType { "text", "image", "audio", "tool-call", "tool-response" };

typedef (
  ImageBitmapSource
  or AudioBuffer
  or BufferSource
  or DOMString
) LanguageModelMessageValue;

3.1. 创建

静态 create(options) 方法步骤为:
  1. 返回在给定 options、"language-model"、 验证并规范化语言模型选项计算语言模型选项可用性下载语言模型初始化语言模型创建语言模型对象 和 false 时,创建 AI 模型对象的结果。

要在给定 LanguageModelCreateCoreOptions options 时,验证并规范化语言模型选项,执行以下步骤。它们会就地改变 options,以规范化并去重语言标签;如果任何语言标签无效,则抛出异常。
  1. 如果 options["expectedInputs"] 存在,则对 options["expectedInputs"] 的每个 expected 执行以下操作

    1. 如果 expected["languages"] 存在,则在给定 expected 和 "languages" 时,验证并规范化语言标签

  2. 如果 options["expectedOutputs"] 存在,则对 options["expectedOutputs"] 的每个 expected 执行以下操作

    1. 如果 expected["languages"] 存在,则在给定 expected 和 "languages" 时,验证并规范化语言标签

  3. 如果 options["initialPrompts"] 存在,则:

    1. expectedInputsoptions["expectedInputs"], 如果它存在;否则为一个空列表

    2. expectedInputTypes 为在给定 expectedInputs 时,获取预期内容类型的结果。

    3. 在给定 options["initialPrompts"]、 expectedInputTypes 和 false 时,执行验证并规范化提示

要在给定 LanguageModelCreateCoreOptions options 时,下载语言模型
  1. 断言:这些步骤正在并行运行。

  2. 根据 options,为用户代理提示语言模型所需的一切启动下载过程。这可能包括基础 AI 模型、用于特定语言或选项值的微调,或其他资源。

  3. 如果由于任何原因无法启动下载过程,则返回 false。

  4. 返回 true。

要在给定 LanguageModelCreateOptions options 时,初始化语言模型
  1. 断言:这些步骤正在并行运行。

  2. availability 为在给定 options 时,计算语言模型选项可用性的结果。

    1. 如果 availability 为 null 或 unavailable, 则返回一个 DOMException 错误信息,其 name 为 "NotSupportedError", 并且其 details 包含适当的详细信息。

  3. 对支撑用户代理提示能力的 AI 模型执行任何必要的初始化操作。

    这可能包括将适当的模型以及支持 options 所需的任何微调加载到内存中。

    1. 如果 options["initialPrompts"] 存在,则:

      1. expectedInputsoptions["expectedInputs"], 如果它存在;否则为一个空列表

      2. expectedInputTypes 为在给定 expectedInputs 时,获取预期内容类型的结果。

      3. initialMessages 为在给定 options["initialPrompts"]、 expectedInputTypes 和 false 时,验证并规范化提示的结果。

      4. initialMessages 加载到模型的上下文窗口中。

    2. 如果 options["tools"] 存在,则将 options["tools"] 加载到模型的上下文窗口中。

  4. 如果初始化失败是因为加载 options 的过程用尽了模型的上下文窗口,则:

    1. requested 为编码 options 所需的上下文窗口量。将 options 编码为输入的方式是实现定义的

    2. maximum 为用户代理支持的最大上下文窗口大小。

    3. 断言requested 大于 maximum。(这就是我们到达此错误分支的方式。)

    4. 返回一个 配额超出错误信息,其 requestedrequested,且 quotamaximum

  5. 如果初始化因任何其他原因失败,则返回一个 DOMException 错误信息,其 name 为 "OperationError", 并且其 details 包含适当的详细信息。

  6. 返回 null。

要在给定一个 realm realm 和一个 LanguageModelCreateOptions options 时,创建语言模型对象
  1. 断言:这些步骤正在 realm周围 agent事件循环上运行。

  2. contextWindowSize 为用户代理可用于此模型的上下文窗口量。(该值是实现定义的,并且如果除了例如用户内存限制或 JavaScript 字符串限制之外没有特定限制,则可以为 +∞。)

  3. initialMessages 为空的 LanguageModelMessage 列表

  4. initialMessagesUsage 为 0。

  5. 如果 options["initialPrompts"] 存在,则:

    1. expectedInputsoptions["expectedInputs"], 如果它存在;否则为一个空列表

    2. expectedInputTypes 为在给定 expectedInputs 时,获取预期内容类型的结果。

    3. initialMessages 设置为在给定 options["initialPrompts"]、 expectedInputTypes 和 false 时,验证并规范化提示的结果。

    4. initialMessagesUsage 设置为在给定 initialMessagesoptions["signal"] 时,测量语言模型上下文使用量的结果。

  6. 返回一个新的 LanguageModel 对象,该对象在 realm 中创建,并具有

    初始消息

    initialMessages

    top K

    options["topK"], 如果它存在;否则为一个实现定义的

    temperature

    options["temperature"], 如果它存在;否则为一个实现定义的

    预期输入

    options["expectedInputs"], 如果它存在;否则为一个空列表

    预期输出

    options["expectedOutputs"], 如果它存在;否则为一个空列表

    工具

    options["tools"], 如果它存在;否则为一个空列表

    上下文窗口大小

    contextWindowSize

    当前上下文使用量

    initialMessagesUsage

3.2. 可用性

静态 availability(options) 方法步骤为:
  1. 返回在给定 options、"language-model"、 验证并规范化语言模型选项,以及 计算语言模型选项可用性时,计算 AI 模型可用性的结果。

要在给定 一个 LanguageModelCreateCoreOptions options 时,计算语言模型选项可用性,执行以下步骤。它们返回一个 Availability 值或 null,并且它们会就地改变 options,以将语言标签更新为其最佳匹配。
  1. 断言:此算法正在并行运行。

  2. availability语言模型非选项可用性

  3. 如果 availability 为 null,则返回 null。

  4. availabilities 为一个包含 availability列表

  5. inputPartition 为在给定以该语言提示语言模型这一目的时,获取语言可用性分区的结果。

  6. outputPartition 为在给定以该语言生成语言模型输出这一目的时,获取语言可用性分区的结果。

  7. 如果 options["expectedInputs"] 存在,则对 options["expectedInputs"] 的每个 expected 执行以下操作

    1. 如果 expected["languages"] 存在,则:

      1. inputLanguageAvailability 为在给定 expected["languages"] 和 inputPartition 时,计算语言可用性的结果。

      2. inputLanguageAvailability 追加availabilities

    2. inputTypeAvailability 为在给定 expected["type"] 和 true 时的语言模型内容类型可用性

    3. inputTypeAvailability 追加availabilities

  8. 如果 options["expectedOutputs"] 存在,则对 options["expectedOutputs"] 的每个 expected 执行以下操作

    1. 如果 expected["languages"] 存在,则:

      1. outputLanguageAvailability 为在给定 expected["languages"] 和 outputPartition 时,计算语言可用性的结果。

      2. outputLanguageAvailability 追加availabilities

    2. outputTypeAvailability 为在给定 expected["type"] 和 false 时的语言模型内容类型可用性

    3. outputTypeAvailability 追加availabilities

  9. 返回在给定 availabilities 时的最小可用性

语言模型非选项可用性由以下步骤给出。它们返回一个 Availability 值或 null。
  1. 断言:此算法正在并行运行。

  2. 如果在尝试确定用户代理是否能够支持提示语言模型时出现某些错误,而用户代理认为该错误是暂时性的(因此重新查询可能会停止产生此类错误),则返回 null。

  3. 如果用户代理当前支持提示语言模型,则返回 "available"。

  4. 如果用户代理认为它将能够支持提示语言模型,但只能在完成已经进行中的下载之后,则返回 "downloading"。

  5. 如果用户代理认为它将能够支持提示语言模型,但只能在执行当前未进行的下载之后,则返回 "downloadable"。

  6. 否则,返回 "unavailable"。

在给定一个 LanguageModelMessageType type 和一个 boolean isInput 时,语言模型内容类型可用性由以下步骤给出。它们返回一个 Availability 值。
  1. 断言:此算法正在并行运行。

  2. 如果用户代理当前支持 typeisInput 为 true 时作为输入,或在 isInput 为 false 时作为输出,则返回 "available"。

  3. 如果用户代理认为它将能够支持 type 作为这种形式,但只能在完成已经进行中的下载之后,则返回 "downloading"。

  4. 如果用户代理认为它将能够支持 type 作为这种形式,但只能在执行当前未进行的下载之后,则返回 "downloadable"。

  5. 否则,返回 "unavailable"。

3.3. LanguageModel

每个 LanguageModel 都有一个初始消息,即一个 LanguageModelMessage 列表, 在创建期间设置。

每个 LanguageModel 都有一个 top K,即一个 unsigned long,在创建期间设置。

每个 LanguageModel 都有一个 temperature,即一个 float,在创建期间设置。

每个 LanguageModel 都有一个预期输入,即一个 LanguageModelExpected 列表, 在创建期间设置。

每个 LanguageModel 都有一个预期输出,即一个 LanguageModelExpected 列表, 在创建期间设置。

每个 LanguageModel 都有一个 tools,即一个 LanguageModelTool 列表, 在创建期间设置。

每个 LanguageModel 都有一个上下文窗口大小,即一个 unrestricted double,在创建期间 设置。

每个 LanguageModel 都有一个当前上下文使用量,即一个 double,初始为 0。


contextUsage getter 步骤是返回 this当前上下文使用量

inputUsage getter 步骤是返回 this当前上下文使用量

contextWindow getter 步骤是返回 this上下文窗口大小

inputQuota getter 步骤是返回 this上下文窗口大小

topK getter 步骤是返回 thistop K

temperature getter 步骤是返回 thistemperature


以下是必须作为事件处理器 IDL 属性,由所有 LanguageModel 对象支持的事件处理器(及其对应的事件处理器事件类型):

事件处理器 事件处理器事件类型
oncontextoverflow contextoverflow
onquotaoverflow quotaoverflow

prompt(input, options) 方法步骤为:
  1. responseConstraintoptions["responseConstraint"], 如果它存在;否则为 null。

  2. omitResponseConstraintInputoptions["omitResponseConstraintInput"]。

  3. operation 为一个算法步骤,它接受参数 chunkProduceddoneerrorstopProducing,并执行以下 步骤:

    1. prefillSuccess 为在给定 thisinputomitResponseConstraintInputresponseConstrainterrorstopProducing 时,预填充的结果。

    2. 如果 prefillSuccess 为 true,则在给定 thisresponseConstraintchunkProduceddoneerrorstopProducing生成

  4. 返回在给定 thisoptionsoperation 时,获取聚合的 AI 模型结果的结果。

promptStreaming(input, options) 方法步骤为:
  1. responseConstraintoptions["responseConstraint"], 如果它存在;否则为 null。

  2. omitResponseConstraintInputoptions["omitResponseConstraintInput"]。

  3. operation 为一个算法步骤,它接受参数 chunkProduceddoneerrorstopProducing,并执行以下 步骤:

    1. prefillSuccess 为在给定 thisinputomitResponseConstraintInputresponseConstrainterrorstopProducing 时,预填充的结果。

    2. 如果 prefillSuccess 为 true,则在给定 thisresponseConstraintchunkProduceddoneerrorstopProducing生成

  4. 返回在给定 thisoptionsoperation 时,获取流式 AI 模型结果的结果。

append(input, options) 方法 步骤为:
  1. operation 为一个算法步骤,它接受参数 chunkProduceddoneerrorstopProducing,并执行以下 步骤:

    chunkProduced 从不会被调用,因为预填充算法不会 生成块。

    1. prefillSuccess 为在给定 thisinput、false、null、errorstopProducing 时,预填充的结果。

    2. 如果 prefillSuccess 为 true 且 done 不为 null,则执行 done

  2. 返回在给定 thisoptionsoperation 时,获取聚合的 AI 模型结果的结果。

measureContextUsage(input, options) 方法步骤为:
  1. 如果 options["omitResponseConstraintInput"] 为 true,且 options["responseConstraint"] 不存在,则抛出一个 "TypeError" DOMException

  2. expectedInputTypes 为在给定 this预期输入时,获取 预期内容类型的结果。

  3. messages 为在给定 inputexpectedInputTypes 和 false 时,验证并规范化提示的结果。

  4. 如果 options["responseConstraint"] 存在且不为 null,并且 options["omitResponseConstraintInput"] 为 false,则实现可以向 messages 插入一个实现定义的 LanguageModelMessage 来引导模型的行为。

  5. measureUsage 为一个算法步骤,它接受参数 stopMeasuring, 并返回在给定 messagesstopMeasuring 时,测量语言模型上下文 使用量的结果。

  6. 返回在给定 thisoptionsmeasureUsage 时,测量 AI 模型输入使用量的结果。

measureInputUsage(input, options) 方法步骤为:
  1. 返回在给定 inputoptions 时,运行 measureContextUsage() 方法步骤的结果。

clone(options) 方法步骤为:
  1. 返回在给定 thisoptions 时,克隆语言模型的结果。

3.3.1. 预填充和生成

要在给定以下内容时预填充

执行以下步骤:

  1. 断言:此算法正在并行运行。

  2. messages 为在给定 inputexpectedInputTypes,以及当 model当前上下文使用量大于 0 时为 true、否则为 false 时,验证并规范化提示的结果。

    如果这抛出异常 e,则:

    1. 如果 error 不为 null,则在给定一个 DOMException 错误信息时执行 error,该错误信息的 nameename,且其 details 包含适当的详细信息。

    2. 返回 false。

  3. 如果 responseConstraint 不为 null 且 omitResponseConstraintInput 为 false, 则实现可以向 messages 插入一个实现定义的 LanguageModelMessage 来引导模型的行为。

  4. requested 为在给定 messagesstopPrefilling 时,测量语言模型上下文使用量的结果。

  5. 如果 requested 为 null,则返回 false。

  6. 如果 requested错误信息,则:

    1. 如果 error 不为 null,则在给定 requested 时执行 error

    2. 返回 false。

  7. 断言requested 是一个数字。

  8. 如果 model当前上下文使用量 + requested 大于 model上下文窗口大小,则:

    1. 如果 error 不为 null,则:

      1. errorInfo 为一个配额超出错误 信息,其 requestedmodel当前上下文使用量 + requested,且 quotamodel上下文窗口大小

      2. 在给定 errorInfo 时执行 error

    2. 返回 false。

  9. expectedInputTypes 为在给定 model预期 输入时,获取 预期内容类型的结果。

  10. 实现定义的方式,更新底层模型的内部状态以包含 messages

    该过程应使用 model初始 消息modeltop Kmodeltemperaturemodel预期输入model预期输出,以及 modeltools 来引导状态如何更新。

    该过程必须符合 § 4 隐私考虑事项§ 5 安全考虑事项 中给出的指导。

    如果在此过程中 stopPrefilling 返回 true,则返回 false。

    如果预填充期间发生错误:

    1. 令该错误按照 § 3.3.4 错误 中的指导表示为错误信息 errorInfo

    2. 如果 error 不为 null,则在给定 errorInfo 时执行 error

    3. 返回 false。

  11. model当前上下文使用量设置为 model当前上下文使用量 + requested

  12. 返回 true。

要在给定以下内容时生成

执行以下步骤:

  1. 断言:此算法正在并行运行。

  2. 实现定义的方式,在遵循以下准则的前提下,开始基于语言模型 当前内部状态生成响应的过程。

    该过程应使用 model初始 消息modeltop Kmodeltemperaturemodel预期输入model预期输出modeltools,以及 responseConstraint 来引导 模型的行为。

    提示过程必须符合 § 4 隐私 考虑事项§ 5 安全考虑事项 中给出的指导。

    如果 modeltools 非空,则模型可以通过调用其 execute 函数来使用所提供的 工具。

  3. 当 true 时循环:

    1. 等待下一个响应数据块被生成,等待过程完成,或等待调用 stopProducing 的结果变为 true。

    2. 如果成功生成了这样的块:

      1. 令其表示为一个字符串 chunk

      2. 如果 chunkProduced 不为 null,则在给定 chunk 时执行 chunkProduced

    3. 否则,如果过程已经完成:

      1. 如果 done 不为 null,则执行 done

      2. 中断

    4. 否则,如果 stopProducing 返回 true,则中断

    5. 否则,如果提示期间发生错误:

      1. 令该错误按照 § 3.3.4 错误 中的指导表示为错误信息 errorInfo

      2. 如果 error 不为 null,则在给定 errorInfo 时执行 error

      3. 中断

3.3.2. 使用量

要在给定以下内容时测量语言模型上下文使用量

执行以下步骤:

  1. 断言:此算法正在并行运行。

  2. inputToModel 为为了在给定 messages 时进行预填充而会发送到底层模型的实现定义的输入。

    这通常会由所有输入的编码组成,可能还带有提示工程或其他实现定义的包装。

    如果在此过程中 stopMeasuring 开始返回 true,则返回 null。

    如果在此过程中发生错误,则按照 § 3.3.4 错误 中的指导返回适当的 DOMException 错误信息

  3. 返回在将 inputToModel 提供给底层模型时表示它所需的上下文使用量。确切的计算过程是实现定义的,但受以下约束限制。

    返回的上下文使用量必须是非负且有限的。它应大致与 inputToModel 中的数据量成比例。

    这可能是在语言模型分词方案中表示输入所需的 token 数,也可能 与数据的字节大小相关。

    如果在此过程中 stopMeasuring 开始返回 true,则改为返回 null。

    如果在此过程中发生错误,则改为按照 § 3.3.4 错误 中的指导返回适当的DOMException 错误信息

3.3.3. 选项

要在给定一个由 LanguageModelExpected expectedContents 组成的列表时,获取 预期内容类型
  1. expectedTypes 为一个空的 LanguageModelMessageType 列表

  2. expectedContents 的每个 expected 执行以下操作

    1. 如果 expectedTypes包含 expected["type"], 则将 expected["type"] 追加expectedTypes

  3. 如果 expectedTypes包含 "text", 则将 "text" 追加expectedTypes

  4. 返回 expectedTypes

要在给定一个 LanguageModelPrompt input、一个由 LanguageModelMessageType expectedTypes 组成的列表,以及一个 boolean hasAppendedInput 时,验证并规范化提示,执行以下步骤。返回 值将是一个非空的、处于“完整形式”的 LanguageModelMessage 列表
  1. 断言expectedTypes 包含 "text"。

  2. 如果 input 是一个字符串,则返回 « «[ "role" → "user", "content" → « «[ "type" → "text", "value" → input ]» », "prefix" → false ]» »

  3. 断言input 是一个由 LanguageModelMessage 组成的列表

  4. 如果 input 是一个空列表,则返回 « «[ "role" → "user", "content" → « «[ "type" → "text", "value" → "" ]» », "prefix" → false ]» »

  5. messages 为一个空的 LanguageModelMessage 列表

  6. input 的每个 message 执行以下操作

    1. 如果 message["content"] 是一个字符串,则将 message 设置为 «[ "role" → message["role"], "content" → « «[ "type" → "text", "value" → message["content"] ]» », "prefix" → message["prefix"] ]»

    2. 如果 message["prefix"] 为 true,则:

      1. 如果 message["role"] 不是 "assistant", 则抛出一个 "SyntaxError" DOMException

      2. 如果 message 不是 messages 中的最后一项,则抛出一个 "SyntaxError" DOMException

    3. 如果 message["role"] 是 "system", 则:

      1. 如果 hasAppendedInput 为 true,则抛出一个 "TypeError" DOMException

    4. 如果 message["content"] 是一个空列表,则:

      1. emptyContent 为一个新的 LanguageModelMessageContent, 其初始化为 «[ "type" → "text", "value" → "" ]»

      2. emptyContent 追加message["content"]。

    5. message["content"] 的每个 content 执行以下操作

      1. 如果 message["role"] 是 "assistant" 且 content["type"] 不是 "text", 则抛出一个 "NotSupportedError" DOMException

      2. 如果 content["type"] 是 "text" 且 content["value"] 不是一个字符串,则抛出一个 "TypeError" DOMException

      3. 如果 content["type"] 是 "image", 则:

        1. 如果 expectedTypes包含 "image", 则抛出一个 "NotSupportedError" DOMException

        2. 如果 content["value"] 既不是 ImageBitmapSource 也不是 BufferSource, 则抛出一个 "TypeError" DOMException

      4. 如果 content["type"] 是 "audio", 则:

        1. 如果 expectedTypes包含 "audio", 则抛出一个 "NotSupportedError" DOMException

        2. 如果 content["value"] 不是 AudioBufferBufferSourceBlob, 则抛出一个 "TypeError" DOMException

    6. contentWithContiguousTextCollapsed 为空的 LanguageModelMessageContent 列表

    7. lastTextContent 为 null。

    8. message["content"] 的每个 content 执行以下操作

      1. 如果 content["type"] 是 "text":

        1. 如果 lastTextContent 为 null:

          1. content 追加contentWithContiguousTextCollapsed

          2. lastTextContent 设置为 content

        2. 否则,将 lastTextContent["value"] 设置为 lastTextContent["value"] 与 content["value"] 的连接。

          不会添加空格或其他字符。因此,« «[ "type" → "text", "foo" ]», «[ "type" → "text", "bar" ]» » 被规范化为 « «[ "type" → "text", "foobar" ]»。

      2. 否则:

        1. content 追加contentWithContiguousTextCollapsed

        2. lastTextContent 设置为 null。

      3. message["content"] 设置为 contentWithContiguousTextCollapsed

    9. message 追加messages

    10. hasAppendedInput 设置为 true。

  7. 如果 messages 为空, 则抛出一个 "SyntaxError" DOMException

  8. 返回 messages

3.3.4. 错误

当提示失败时,以下可能的原因可以暴露给 Web 开发者。此表列出了可能的 DOMException name,以及实现应使用它们的情形:

DOMException name 场景
"NotAllowedError"

提示被用户选择或用户代理策略禁用。

"NotReadableError"

模型输出被用户代理过滤,例如因为它被检测为有害、不准确或无意义。

"NotSupportedError"

要处理的输入使用的是用户代理不支持的语言,或在调用 create() 时未被正确提供。

模型输出最终使用了用户代理不支持的语言(例如,因为用户代理尚未对该输出 语言执行足够的质量控制测试)。

"UnknownError"

所有其他场景,包括用户代理认为它无法提示模型,同时也无法满足 § 4 隐私考虑事项§ 5 安全考虑事项 中给出的要求。或者,如果用户代理不愿披露失败原因。

此表没有给出 prompt API 可以暴露的完整异常列表。它只包含那些可能来自某些实现定义的步骤的异常。

要在给定一个 LanguageModel model 和一个 LanguageModelCloneOptions options 时,克隆语言 模型
  1. globalmodel相关全局对象

  2. 断言global 是一个 Window 对象。

  3. 如果 global关联 Document 不是完全活动的,则返回一个被拒绝的 promise,其拒绝原因为一个 "InvalidStateError" DOMException

  4. signals 为 « model销毁中止 控制器signal »。

  5. 如果 options["signal"] 存在,则 将其追加signals

  6. compositeSignal 为在给定 signals 并使用 AbortSignalmodel相关 realm 时,创建依赖中止信号的结果。

  7. 如果 compositeSignal中止,则返回一个被拒绝的 promise,其拒绝原因为 compositeSignal中止原因

  8. signaloptions["signal"], 如果它存在;否则为 null。

  9. 如果 signal 不为 null 且已中止,则返回一个以 signal中止原因拒绝的 promise。

  10. promise 为在 model相关 realm中创建的新 promise

  11. abortedDuringOperation 为 false。

    此变量将从事件循环写入,但从并行读取。

  12. compositeSignal 添加以下中止步骤

    1. abortedDuringOperation 设置为 true。

    2. compositeSignal中止原因拒绝 promise

  13. 并行

    1. AI 任务源排入一个全局任务,以执行以下步骤:

      1. 如果 abortedDuringOperation 为 true,则返回。

      2. clonedModel 为一个新的 LanguageModel 对象,其具有:

      3. 实现定义的方式, 将任何其他状态从 model 复制到 clonedModel

      4. 如果复制操作失败:

        1. 以一个 "OperationError" DOMException 拒绝 promise

        2. 返回。

      5. clonedModel 解决 promise

  14. 返回 promise

3.4. 权限策略集成

对 prompt API 的访问受策略控制特性 "language-model" 限制,该特性具有 'self'默认允许列表

4. 隐私考虑事项

有关 prompt API 的隐私考虑事项的讨论,请参见 Writing Assistance APIs § 6 隐私考虑事项。如 § 2 依赖项 所述,该文本是为适用于共享相同基础设施的所有 API 而编写的。

5. 安全考虑事项

有关 prompt API 的安全考虑事项的讨论,请参见 Writing Assistance APIs § 7 安全考虑事项。如 § 2 依赖项 所述,该文本是为适用于共享相同基础设施的所有 API 而编写的。

索引

由本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[DOM]
Anne van Kesteren。DOM Standard。现行标准。 URL:https://dom.spec.whatwg.org/
[ECMA-402]
ECMAScript Internationalization API Specification。URL: https://tc39.es/ecma402/
[ECMASCRIPT]
ECMAScript Language Specification。URL:https://tc39.es/ecma262/multipage/
[FileAPI]
Marijn Kruisselbrink。File API。URL:https://w3c.github.io/FileAPI/
[HTML]
Anne van Kesteren;等。HTML Standard。 现行标准。URL:https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren;Domenic Denicola。Infra Standard。现行标准。URL:https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland。Permissions Policy。URL:https://w3c.github.io/webappsec-permissions-policy/
[STREAMS]
Adam Rice;等。Streams Standard。现行标准。URL:https://streams.spec.whatwg.org/
[WEBAUDIO-1.0]
Paul Adenot;Hongchan Choi。Web Audio API。URL:https://webaudio.github.io/web-audio-api/
[WEBIDL]
Edgar Chen;Timothy Gu。Web IDL Standard。现行标准。URL:https://webidl.spec.whatwg.org/
[WRITING-ASSISTANCE-APIS]
Writing Assistance APIs。社区组报告草案。URL:https://webmachinelearning.github.io/writing-assistance-apis/

资料性参考文献

[BCP47]
A. Phillips,编;M. Davis,编。Tags for Identifying Languages。2009 年 9 月。当前最佳实践。URL:https://www.rfc-editor.org/rfc/rfc5646
[UTS35]
Mark Davis;等。Unicode Locale Data Markup Language (LDML)。2020 年 10 月 23 日。Unicode 技术标准 #35。URL:https://www.unicode.org/reports/tr35/tr35-61/tr35.html

IDL 索引

[Exposed=Window, SecureContext]
interface LanguageModel : EventTarget {
  static Promise<LanguageModel> create(optional LanguageModelCreateOptions options = {});
  static Promise<Availability> availability(optional LanguageModelCreateCoreOptions options = {});
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  static Promise<LanguageModelParams?> params();

  // These will throw "NotSupportedError" DOMExceptions if role = "system"
  Promise<DOMString> prompt(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  ReadableStream promptStreaming(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  Promise<undefined> append(
    LanguageModelPrompt input,
    optional LanguageModelAppendOptions options = {}
  );


  Promise<double> measureContextUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  readonly attribute double contextUsage;
  readonly attribute unrestricted double contextWindow;
  attribute EventHandler oncontextoverflow;

  // **DEPRECATED**: This method is only available in extension contexts.
  Promise<double> measureInputUsage(
    LanguageModelPrompt input,
    optional LanguageModelPromptOptions options = {}
  );
  // **DEPRECATED**: This attribute is only available in extension contexts.
  readonly attribute double inputUsage;
  // **DEPRECATED**: This attribute is only available in extension contexts.
  readonly attribute unrestricted double inputQuota;
  // **DEPRECATED**: This attribute is only available in extension contexts.
  attribute EventHandler onquotaoverflow;

  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  readonly attribute unsigned long topK;
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  readonly attribute float temperature;

  Promise<LanguageModel> clone(optional LanguageModelCloneOptions options = {});
};
LanguageModel includes DestroyableModel;

// **EXPERIMENTAL**: Only available in extension and experimental contexts.
[Exposed=Window, SecureContext]
interface LanguageModelParams {
  readonly attribute unsigned long defaultTopK;
  readonly attribute unsigned long maxTopK;
  readonly attribute float defaultTemperature;
  readonly attribute float maxTemperature;
};


callback LanguageModelToolFunction = Promise<DOMString> (any... arguments);

// A description of a tool call that a language model can invoke.
dictionary LanguageModelTool {
  required DOMString name;
  required DOMString description;
  // JSON schema for the input parameters.
  required object inputSchema;
  // The function to be invoked by user agent on behalf of language model.
  required LanguageModelToolFunction execute;
};

dictionary LanguageModelCreateCoreOptions {
  // Note: these two have custom out-of-range handling behavior, not in the IDL layer.
  // They are unrestricted double so as to allow +Infinity without failing.
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  unrestricted double topK;
  // **EXPERIMENTAL**: Only available in extension and experimental contexts.
  unrestricted double temperature;

  sequence<LanguageModelExpected> expectedInputs;
  sequence<LanguageModelExpected> expectedOutputs;
  sequence<LanguageModelTool> tools;
};

dictionary LanguageModelCreateOptions : LanguageModelCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;

  sequence<LanguageModelMessage> initialPrompts;
};

dictionary LanguageModelPromptOptions {
  object responseConstraint;
  boolean omitResponseConstraintInput = false;
  AbortSignal signal;
};

dictionary LanguageModelAppendOptions {
  AbortSignal signal;
};

dictionary LanguageModelCloneOptions {
  AbortSignal signal;
};

dictionary LanguageModelExpected {
  required LanguageModelMessageType type;
  sequence<DOMString> languages;
};

// The argument to the prompt() method and others like it

typedef (
  sequence<LanguageModelMessage>
  // Shorthand for `[{ role: "user", content: [{ type: "text", value: providedValue }] }]`
  or DOMString
) LanguageModelPrompt;

dictionary LanguageModelMessage {
  required LanguageModelMessageRole role;

  // The DOMString branch is shorthand for `[{ type: "text", value: providedValue }]`
  required (DOMString or sequence<LanguageModelMessageContent>) content;

  boolean prefix = false;
};

dictionary LanguageModelMessageContent {
  required LanguageModelMessageType type;
  required LanguageModelMessageValue value;
};

enum LanguageModelMessageRole { "system", "user", "assistant" };

enum LanguageModelMessageType { "text", "image", "audio", "tool-call", "tool-response" };

typedef (
  ImageBitmapSource
  or AudioBuffer
  or BufferSource
  or DOMString
) LanguageModelMessageValue;