Skip to content

Commit eb8768b

Browse files
committed
Specify prompt validation and canonicalization
1 parent e91269e commit eb8768b

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

index.bs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,78 @@ typedef (
142142
) LanguageModelMessageValue;
143143
</xmp>
144144

145+
<h3 id="prompt-processing">Prompt processing</h3>
146+
147+
<p class="note">This will be incorporated into a proper part of the specification later. For now, we're just writing out this algorithm as a full spec, since it's complicated.</p>
148+
149+
<div algorithm>
150+
To <dfn>validate and canonicalize a prompt</dfn> given a {{LanguageModelPrompt}} |input|, a [=list=] of {{LanguageModelMessageType}}s |expectedTypes|, and a boolean |isInitial|, perform the following steps. The return value will be a non-empty [=list=] of {{LanguageModelMessage}}s in their "longhand" form.
151+
152+
1. [=Assert=]: |expectedTypes| [=list/contains=] "{{LanguageModelMessageType/text}}".
153+
154+
1. If |input| is a [=string=], then return <span style="white-space: pre-wrap">«
155+
«[
156+
"{{LanguageModelMessage/role}}" → "{{LanguageModelMessageRole/user}}",
157+
"{{LanguageModelMessage/content}}" → «
158+
«[
159+
"{{LanguageModelMessageContent/type}}" → "{{LanguageModelMessageType/text}}",
160+
"{{LanguageModelMessageContent/value}}" → |input|&nbsp;&nbsp;&nbsp;&nbsp;<!-- https://github.com/speced/bikeshed/issues/3118 -->
161+
162+
»
163+
164+
»</span>.
165+
166+
1. [=Assert=]: |input| is a [=list=] of {{LanguageModelMessage}}s.
167+
168+
1. Let |seenNonSystemRole| be false.
169+
170+
1. Let |messages| be an empty [=list=] of {{LanguageModelMessage}}s.
171+
172+
1. [=list/For each=] |message| of |input|:
173+
174+
1. If |message|["{{LanguageModelMessage/content}}"] is a [=string=], then set |message| to <span style="white-space: pre-wrap">«[
175+
"{{LanguageModelMessage/role}}" → |message|["{{LanguageModelMessage/role}}"],
176+
"{{LanguageModelMessage/content}}" → «
177+
«[
178+
"{{LanguageModelMessageContent/type}}" → "{{LanguageModelMessageType/text}}",
179+
"{{LanguageModelMessageContent/value}}" → |message|&nbsp;&nbsp;&nbsp;&nbsp;<!-- https://github.com/speced/bikeshed/issues/3118 -->
180+
181+
»
182+
</span> to |messages|.
183+
184+
1. [=list/For each=] |content| of |message|["{{LanguageModelMessage/content}}"]:
185+
186+
1. If |message|["{{LanguageModelMessage/role}}"] is "{{LanguageModelMessageRole/system}}", then:
187+
188+
1. If |isInitial| is false, then throw a "{{NotSupportedError}}" {{DOMException}}.
189+
190+
1. If |seenNonSystemRole| is true, then throw a "{{SyntaxError}}" {{DOMException}}.
191+
192+
1. If |message|["{{LanguageModelMessage/role}}"] is not "{{LanguageModelMessageRole/system}}", then set |seenNonSystemRole| to true.
193+
194+
1. If |message|["{{LanguageModelMessage/role}}"] is "{{LanguageModelMessageRole/assistant}}" and |content|["{{LanguageModelMessageContent/type}}"] is not "{{LanguageModelMessageType/text}}", then throw a "{{NotSupportedError}}" {{DOMException}}.
195+
196+
1. If |content|["{{LanguageModelMessageContent/type}}"] is "{{LanguageModelMessageType/text}}" and |content|["{{LanguageModelMessageContent/value}}"] is not a [=string=], then throw a {{TypeError}}.
197+
198+
1. If |content|["{{LanguageModelMessageContent/type}}"] is "{{LanguageModelMessageType/image}}", then:
199+
200+
1. If |expectedTypes| does not [=list/contain=] "{{LanguageModelMessageType/image}}", then throw a "{{NotSupportedError}}" {{DOMException}}.
201+
202+
1. If |content|["{{LanguageModelMessageContent/value}}"] is not an {{ImageBitmapSource}} or {{BufferSource}}, then throw a {{TypeError}}.
203+
204+
1. If |content|["{{LanguageModelMessageContent/type}}"] is "{{LanguageModelMessageType/audio}}", then:
205+
206+
1. If |expectedTypes| does not [=list/contain=] "{{LanguageModelMessageType/audio}}", then throw a "{{NotSupportedError}}" {{DOMException}}.
207+
208+
1. If |content|["{{LanguageModelMessageContent/value}}"] is not an {{AudioBuffer}}, {{BufferSource}}, or {{Blob}}, then throw a {{TypeError}}.
209+
210+
1. [=list/Append=] |message| to |messages|.
211+
212+
1. If |messages| [=list/is empty=], then throw a "{{SyntaxError}}" {{DOMException}}.
213+
214+
1. Return |messages|.
215+
</div>
216+
145217
<h3 id="permissions-policy">Permissions policy integration</h3>
146218

147219
Access to the prompt API is gated behind the [=policy-controlled feature=] "<dfn permission>language-model</dfn>", which has a [=policy-controlled feature/default allowlist=] of <code>[=default allowlist/'self'=]</code>.

0 commit comments

Comments
 (0)