1. Introduction
For now, see the explainer.
2. Shared AI APIs and infrastructure
partial interface WindowOrWorkerGlobalScope { [Replaceable ,SecureContext ]readonly attribute AI ai ; }; [Exposed =(Window ,Worker ),SecureContext ]interface {}; [
AI Exposed =(Window ,Worker ),SecureContext ]interface :
AICreateMonitor EventTarget {attribute EventHandler ondownloadprogress ; };callback =
AICreateMonitorCallback undefined (AICreateMonitor );
monitor enum {
AICapabilityAvailability ,
"readily" ,
"after-download" };
"no"
Each WindowOrWorkerGlobalScope
has an AI namespace, an AI
object. Upon creation of the WindowOrWorkerGlobalScope
object, its AI namespace must be set to a new AI
object created in the WindowOrWorkerGlobalScope
object’s relevant realm.
The ai
getter steps are to return this's AI namespace.
Tasks queued by this specification use the AI task source.
The following are the event handlers (and their corresponding event handler event types) that must be supported, as event handler IDL attributes, by all AICreateMonitor
objects:
Event handler | Event handler event type |
---|---|
ondownloadprogress
| downloadprogress
|
3. The summarizer API
partial interface AI {readonly attribute AISummarizerFactory summarizer ; }; [Exposed =(Window ,Worker ),SecureContext ]interface {
AISummarizerFactory Promise <AISummarizer >create (optional AISummarizerCreateOptions = {});
options Promise <AISummarizerCapabilities >capabilities (); }; [Exposed =(Window ,Worker ),SecureContext ]interface {
AISummarizer Promise <DOMString >(
summarize DOMString ,
input optional AISummarizerSummarizeOptions = {} );
options ReadableStream (
summarizeStreaming DOMString ,
input optional AISummarizerSummarizeOptions = {} );
options readonly attribute DOMString sharedContext ;readonly attribute AISummarizerType type ;readonly attribute AISummarizerFormat format ;readonly attribute AISummarizerLength length ;undefined destroy (); }; [Exposed =(Window ,Worker ),SecureContext ]interface {
AISummarizerCapabilities readonly attribute AICapabilityAvailability available ;AICapabilityAvailability createOptionsAvailable (optional AISummarizerCreateCoreOptions = {} );
options AICapabilityAvailability languageAvailable (DOMString ); };
languageTag dictionary {
AISummarizerCreateCoreOptions AISummarizerType = "key-points";
type AISummarizerFormat = "markdown";
format AISummarizerLength = "short"; };
length dictionary :
AISummarizerCreateOptions AISummarizerCreateCoreOptions {AbortSignal ;
signal AICreateMonitorCallback ;
monitor DOMString ; };
sharedContext dictionary {
AISummarizerSummarizeOptions AbortSignal ;
signal DOMString ; };
context enum {
AISummarizerType ,
"tl;dr" ,
"key-points" ,
"teaser" };
"headline" enum {
AISummarizerFormat ,
"plain-text" };
"markdown" enum {
AISummarizerLength ,
"short" ,
"medium" };
"long"
Each AI
has an summarizer factory, an AISummarizerFactory
object. Upon creation of the AI
object, its summarizer factory must be set to a new AISummarizerFactory
object created in the AI
object’s relevant realm.
The summarizer
getter steps are to return this's summarizer factory.
3.1. Creation
create(options)
method steps are:
-
If this's relevant global object is a
Window
whose associated Document is not fully active, then return a promise rejected with an "InvalidStateError
"DOMException
. -
If options["
signal
"] exists and is aborted, then return a promise rejected with options["signal
"]'s abort reason. -
Let fireProgressEvent be an algorithm taking two arguments that does nothing.
-
If options["
monitor
"] exists, then:-
Let monitor be a new
AICreateMonitor
created in this's relevant realm. -
Invoke options["
monitor
"] with « monitor » and "rethrow
".If an exception e is thrown, return a promise rejected with e.
-
Set fireProgressEvent to an algorithm taking arguments loaded and total, which performs the following steps:
-
Assert: this algorithm is running in parallel.
-
Queue a global task on the AI task source given this's relevant global object to perform the following steps:
-
Fire an event named
downloadprogress
at monitor, usingProgressEvent
, with theloaded
attribute initialized to loaded, thetotal
attribute initialized to total, and thelengthComputable
attribute initialized to true.
-
-
-
-
Let abortedDuringDownload be false.
This variable will be written to from the event loop, but read from in parallel.
-
If options["
signal
"] exists, then add the following abort steps to options["signal
"]:-
Set abortedDuringDownload to true.
-
-
Let promise be a new promise created in this's relevant realm.
-
-
Let availability be the current summarizer create options availability given options["
type
"], options["format
"], and options["length
"]. -
Switch on availability:
- null
-
-
Reject promise with an "
UnknownError
"DOMException
. -
Abort these steps.
-
- "
no
" -
-
Reject promise with a "
NotSupportedError
"DOMException
. -
Abort these steps.
-
- "
readily
" -
-
If initializing the summarization model given promise and options returns false, then abort these steps.
-
Let totalBytes be the total size of the previously-downloaded summarization capabilities, in bytes.
-
Assert: totalBytes is greater than 0.
-
Perform fireProgressEvent given 0 and totalBytes.
-
Perform fireProgressEvent given totalBytes and totalBytes.
-
Finalize summarizer creation given promise and options.
-
- "
after-download
" -
-
Initiate the download process for everything the user agent needs to summarize text according to options["
type
"], options["format
"], or options["length
"]. -
Run the following steps, by abort when abortedDuringDownload becomes true:
-
Wait for the total number of bytes to be downloaded to become determined, and let that number be totalBytes.
-
Let lastProgressTime be the monotonic clock's unsafe current time.
-
Perform fireProgressEvent given 0 and totalBytes.
-
While true:
-
If one or more bytes have been downloaded, then:
-
If the monotonic clock's unsafe current time minus lastProgressTime is greater than 50 ms, then:
-
Let bytesSoFar be the number of bytes downloaded so far.
-
Assert: bytesSoFar is greater than 0 and less than or equal to totalBytes.
-
Perform fireProgressEvent given bytesSoFar and totalBytes.
-
If bytesSoFar equals totalBytes, then break.
-
Set lastProgressTime to the monotonic clock's unsafe current time.
-
-
-
Otherwise, if downloading has failed and cannot continue, then:
-
Queue a global task on the AI task source given this's relevant global object to reject promise with a "
NetworkError
"DOMException
. -
Abort these steps.
-
-
-
-
If aborted, then:
-
Queue a global task on the AI task source given this's relevant global object to perform the following steps:
-
Abort these steps.
-
-
If initializing the summarization model given promise and options returns false, then abort these steps.
-
Finalize summarizer creation given promise and options.
-
-
-
Return promise.
Promise
promise and an AISummarizerCreateOptions
options:
-
Assert: these steps are running in parallel.
-
Perform any necessary initialization operations for the AI model backing the user agent's summarization capabilities.
This could include loading the model into memory, loading options["
sharedContext
"] into the model’s context window, or loading any fine-tunings necessary to support options["type
"], options["format
"], or options["length
"]. -
If initialization failed for any reason, then:
-
Queue a global task on the AI task source given promise’s relevant global object to reject promise with an "
OperationError
"DOMException
. -
Return false.
-
-
Return true.
Promise
promise and an AISummarizerCreateOptions
options:
-
Assert: these steps are running in parallel.
-
Assert: the current summarizer create options availability for options["
type
"], options["format
"], and options["length
"] is "readily
". -
Queue a global task on the AI task source given promise’s relevant global object to perform the following steps:
-
If options["
signal
"] exists and is aborted, then:-
Reject promise with options["
signal
"]'s abort reason. -
Abort these steps.
This check is necessary in case any code running on the event loop caused the
AbortSignal
to become aborted before this task ran. -
-
Let summarizer be a new
AISummarizer
object, created in promise’s relevant realm, with- shared context
-
options["
sharedContext
"] - summary type
-
options["
type
"] - summary format
-
options["
format
"] - summary length
-
options["
length
"]
-
If options["
signal
"] exists, then add the following abort steps to options["signal
"]:-
Destroy summarizer with options["
signal
"]'s abort reason.
-
-
Resolve promise with summarizer.
-
3.2. Capabilities
capabilities()
method steps are:
-
If this's relevant global object is a
Window
whose associated Document is not fully active, then return a promise rejected with an "InvalidStateError
"DOMException
. -
Let promise be a new promise created in this's relevant realm.
-
-
Let availableCreateOptions be a new map from tuples of (
AISummarizerType
,AISummarizerFormat
,AISummarizerLength
) values toAICapabilityAvailability
values, initially empty. -
For each type of
AISummarizerType
's enumeration values:-
For each format of
AISummarizerFormat
's enumeration values:-
For each length of
AISummarizerLength
's enumeration values:-
Set availableCreateOptions[(type, format, length)] to the current summarizer create options availability given type, format, and length.
-
-
-
-
Let availableLanguages be the current summarizer language availability map.
-
If availableLanguages is null, or availableCreateOptions’s values contains null, then queue a global task on the AI task source given this to perform the following steps:
-
Reject promise with an "
UnknownError
"DOMException
.
-
-
Otherwise, queue a global task on the AI task source given this to perform the following steps:
-
Let capabilitiesObject be a new
AISummarizerCapabilities
object, created in this's relevant realm, with- available create options
-
availableCreateOptions
- available languages
-
availableLanguages
-
Resolve promise with capabilitiesObject.
-
-
Every AISummarizerCapabilities
has an available create options, a map from tuples of (AISummarizerType
, AISummarizerFormat
, AISummarizerLength
) values to AICapabilityAvailability
values, set during creation.
Every AISummarizerCapabilities
has an available languages, a map of strings representing BCP 47 language tags to AICapabilityAvailability
values, set during creation. The values will never be "no
".
available
getter steps are:
-
If this's available languages are empty, then return "
no
". -
If this's all of this's available create options values are "
no
", then return "no
". -
If all of this's available create options's values or all of this's available languages's values are "
after-download
", then return "after-download
". -
Return "
readily
".
createOptionsAvailable(options)
method steps are:
-
Return this's available create options[(options["
type
"], options["format
"], options["length
"])].
languageAvailable(languageTag)
method steps are:
-
Return this's available languages[languageTag], or "
no
" if no such entry exists.
Per WICG/translation-api#11 it seems we’re supposed to do something more complex than just straight string comparison for language tags, but it’s not clear what.
AISummarizerType
type, AISummarizerFormat
format, and an AISummarizerLength
length, is given by the following steps. They return an AICapabilityAvailability
value or null.
-
Assert: this algorithm is running in parallel.
-
If the user agent supports summarizing text into the type of summary described by type, in the format described by format, and with the length guidance given by length without performing any downloading operations, then return "
readily
". -
If the user agent believes it can summarize text according to type, format, and length, but only after performing a download (e.g., of an AI model or fine-tuning), then return "
after-download
". -
If there is some error attempting to determine whether the user agent supports summarizing text, which the user agent believes to be transient (such that re-querying the current summarizer create options availability could stop producing such an error), then return null.
-
Otherwise, return "
no
".
AICapabilityAvailability
values, or null. [RFC5646]
-
Assert: this algorithm is running in parallel.
-
If there is some error attempting to determine whether the user agent supports summarizing text, which the user agent believes to be transient (such that re-querying the current summarizer create options availability could stop producing such an error), then return null.
-
Let availableLanguages be an empty map.
-
For each human language for which the user agent supports summarizing text written in that language, without performing any downloading operations:
-
Let languageTag be that language, represented as a BCP 47 language tag string. Describe how to handle subtags.
-
Set availableLanguages[languageTag] to "
readily
".
-
-
For each human language for which the user agent believes it can summarize text written in that language, but only after performing a download (e.g., of an AI model or fine-tuning):
-
Let languageTag be that language, represented as a BCP 47 language tag string. Describe how to handle subtags.
-
Set availableLanguages[languageTag] to "
after-download
".
-
-
Return availableLanguages.
3.3. Summarization
Every AISummarizer
has a shared context, a string, set during creation.
Every AISummarizer
has a summary type, an AISummarizerType
, set during creation.
Every AISummarizer
has a summary format, an AISummarizerFormat
, set during creation.
Every AISummarizer
has a summary length, an AISummarizerLength
, set during creation.
The sharedContext
getter steps are to return this's shared context.
The type
getter steps are to return this's summary type.
The format
getter steps are to return this's summary format.
The length
getter steps are to return this's summary length.
The destroy()
method steps are to destroy this given a new "AbortError
" DOMException
.
AISummarizer
summarizer, given a JavaScript value exception:
-
TODO use summarizer and exception.