Skip to content

Commit debab07

Browse files
Mike Wassermanchromium-wpt-export-bot
authored andcommitted
Prompt API: Normalize empty message sequences in append()
Align empty message sequence handling with prompt(); refine tests. Bug: 490181853 Change-Id: Iaa4d228029eb37edb327ebdda9831bd0d69a35ae Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7703522 Reviewed-by: Jingyun Liu <jingyun@google.com> Commit-Queue: Jingyun Liu <jingyun@google.com> Auto-Submit: Mike Wasserman <msw@chromium.org> Cr-Commit-Position: refs/heads/main@{#1606451}
1 parent a5e556c commit debab07

5 files changed

Lines changed: 51 additions & 89 deletions

ai/language-model/language-model-append.tentative.https.window.js

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,6 @@ promise_test(async () => {
2323
assert_equals(session.contextUsage, promptUsage);
2424
}, 'Check contextUsage increases from a simple LanguageModel.append() call');
2525

26-
promise_test(async (t) => {
27-
await ensureLanguageModel();
28-
const session = await createLanguageModel();
29-
assert_equals(session.contextUsage, 0);
30-
await session.append([]);
31-
assert_equals(session.contextUsage, 0);
32-
// Invalid input should be stringified.
33-
await session.append({});
34-
assert_greater_than(session.contextUsage, 0);
35-
}, 'Check empty Object input for LanguageModel.append()');
36-
3726
promise_test(async t => {
3827
await ensureLanguageModel();
3928
const session = await createLanguageModel();
@@ -63,3 +52,17 @@ promise_test(async t => {
6352
t, TypeError, session.append([{role: 'system', content: 'bar'}]));
6453
await result3;
6554
}, 'append() should reject system role messages after other messages');
55+
56+
promise_test(async (t) => {
57+
await ensureLanguageModel();
58+
const model = await createLanguageModel();
59+
60+
// null, undefined, and objects are coerced to strings.
61+
await model.append(null);
62+
await model.append(undefined);
63+
await model.append({});
64+
await model.append('');
65+
await model.append([]);
66+
await model.append([{ role: 'user', content: [] }]);
67+
await model.append([{role: 'user', content: [{type: 'text', value: ''}]}]);
68+
}, 'LanguageModel.append() allows empty and coerced inputs');

ai/language-model/language-model-prompt-empty-input.tentative.https.window.js

Lines changed: 0 additions & 53 deletions
This file was deleted.

ai/language-model/language-model-prompt-streaming-gc.tentative.https.window.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ promise_test(async t => {
1616
session.promptStreaming(kTestPrompt);
1717
// Run GC.
1818
gc();
19-
assert_equals(
20-
Object.prototype.toString.call(streamingResponse),
21-
"[object ReadableStream]"
22-
);
19+
assert_true(streamingResponse instanceof ReadableStream);
2320
let result = "";
2421
for await (const value of streamingResponse) {
2522
result += value;

ai/language-model/language-model-prompt-streaming.tentative.https.window.js

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,23 @@
88

99
promise_test(async t => {
1010
await ensureLanguageModel();
11-
12-
// Start a new session.
1311
const session = await createLanguageModel();
14-
// Test the streaming prompt API.
15-
const streamingResponse =
16-
session.promptStreaming(kTestPrompt);
17-
assert_equals(
18-
Object.prototype.toString.call(streamingResponse),
19-
"[object ReadableStream]"
20-
);
21-
const reader = streamingResponse.getReader();
22-
let result = "";
23-
while (true) {
24-
const { value, done } = await reader.read();
25-
if (done) {
26-
break;
27-
}
28-
if (value) {
29-
result += value;
30-
}
31-
}
32-
assert_greater_than(result.length, 0, "The result should not be empty.");
12+
const streamingResponse = session.promptStreaming(kTestPrompt);
13+
assert_true(streamingResponse instanceof ReadableStream);
14+
const result = (await Array.fromAsync(streamingResponse)).join('');
15+
assert_greater_than(result.length, 0, 'The result should not be empty.');
3316
});
17+
18+
promise_test(async (t) => {
19+
await ensureLanguageModel();
20+
const model = await createLanguageModel();
21+
22+
// null, undefined, and objects are coerced to strings.
23+
for await (const _ of model.promptStreaming(null)) { }
24+
for await (const _ of model.promptStreaming(undefined)) { }
25+
for await (const _ of model.promptStreaming({})) { }
26+
for await (const _ of model.promptStreaming('')) { }
27+
for await (const _ of model.promptStreaming([])) { }
28+
for await (const _ of model.promptStreaming([{ role: 'user', content: [] }])) { }
29+
for await (const _ of model.promptStreaming([{ role: 'user', content: [{ type: 'text', value: '' }] }])) { }
30+
}, 'LanguageModel.promptStreaming() allows empty and coerced inputs');

ai/language-model/language-model-prompt.tentative.https.window.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,24 @@ promise_test(async (t) => {
3333
assert_regexp_match(await session.prompt({}), /\[object Object\]/);
3434
}, 'Check empty Object input');
3535

36+
promise_test(async (t) => {
37+
await ensureLanguageModel();
38+
const model = await createLanguageModel();
39+
40+
// null, undefined, and objects are coerced to strings.
41+
assert_regexp_match(await model.prompt(null), /null/);
42+
assert_regexp_match(await model.prompt(undefined), /undefined/);
43+
assert_equals(typeof await model.prompt({}), 'string');
44+
assert_equals(typeof await model.prompt(''), 'string');
45+
assert_equals(typeof await model.prompt([]), 'string');
46+
assert_equals(
47+
typeof await model.prompt([{role: 'user', content: []}]), 'string');
48+
assert_equals(
49+
typeof await model.prompt(
50+
[{role: 'user', content: [{type: 'text', value: ''}]}]),
51+
'string');
52+
}, 'LanguageModel.prompt() allows empty and coerced inputs');
53+
3654
promise_test(async (t) => {
3755
await ensureLanguageModel();
3856
const session = await createLanguageModel();

0 commit comments

Comments
 (0)