Skip to content

Commit 3e8f634

Browse files
committed
Narrow Chrome prompt input type to seq<part>
1 parent 622916c commit 3e8f634

File tree

3 files changed

+34
-60
lines changed

3 files changed

+34
-60
lines changed

packages/vertexai/src/methods/chrome-adapter.test.ts

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import { ChromeAdapter } from './chrome-adapter';
2222
import {
2323
Availability,
2424
LanguageModel,
25-
LanguageModelCreateOptions
25+
LanguageModelCreateOptions,
26+
LanguageModelMessageContent
2627
} from '../types/language-model';
2728
import { stub } from 'sinon';
2829
import { GenerateContentRequest } from '../types';
@@ -281,7 +282,8 @@ describe('ChromeAdapter', () => {
281282
create: () => Promise.resolve({})
282283
} as LanguageModel;
283284
const languageModel = {
284-
prompt: i => Promise.resolve(i)
285+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
286+
prompt: (p: LanguageModelMessageContent[]) => Promise.resolve('')
285287
} as LanguageModel;
286288
const createStub = stub(languageModelProvider, 'create').resolves(
287289
languageModel
@@ -305,13 +307,8 @@ describe('ChromeAdapter', () => {
305307
// Asserts Vertex input type is mapped to Chrome type.
306308
expect(promptStub).to.have.been.calledOnceWith([
307309
{
308-
role: request.contents[0].role,
309-
content: [
310-
{
311-
type: 'text',
312-
content: request.contents[0].parts[0].text
313-
}
314-
]
310+
type: 'text',
311+
content: request.contents[0].parts[0].text
315312
}
316313
]);
317314
// Asserts expected output.
@@ -366,21 +363,16 @@ describe('ChromeAdapter', () => {
366363
// Asserts Vertex input type is mapped to Chrome type.
367364
expect(measureInputUsageStub).to.have.been.calledOnceWith([
368365
{
369-
role: 'user',
370-
content: [
371-
{
372-
type: 'text',
373-
content: inputText
374-
}
375-
]
366+
type: 'text',
367+
content: inputText
376368
}
377369
]);
378370
expect(await response.json()).to.deep.equal({
379371
totalTokens: expectedCount
380372
});
381373
});
382374
});
383-
describe('generateContentStreamOnDevice', () => {
375+
describe('generateContentStream', () => {
384376
it('generates content stream', async () => {
385377
const languageModelProvider = {
386378
create: () => Promise.resolve({})
@@ -413,13 +405,8 @@ describe('ChromeAdapter', () => {
413405
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
414406
expect(promptStub).to.have.been.calledOnceWith([
415407
{
416-
role: request.contents[0].role,
417-
content: [
418-
{
419-
type: 'text',
420-
content: request.contents[0].parts[0].text
421-
}
422-
]
408+
type: 'text',
409+
content: request.contents[0].parts[0].text
423410
}
424411
]);
425412
const actual = await toStringArray(response.body!);

packages/vertexai/src/methods/chrome-adapter.ts

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,15 @@
1616
*/
1717

1818
import {
19-
Content,
2019
CountTokensRequest,
2120
GenerateContentRequest,
2221
InferenceMode,
23-
Part,
24-
Role
22+
Part
2523
} from '../types';
2624
import {
2725
Availability,
2826
LanguageModel,
2927
LanguageModelCreateOptions,
30-
LanguageModelMessage,
31-
LanguageModelMessageRole,
3228
LanguageModelMessageContent
3329
} from '../types/language-model';
3430

@@ -100,8 +96,12 @@ export class ChromeAdapter {
10096
// TODO: normalize on-device params during construction.
10197
this.onDeviceParams || {}
10298
);
103-
const messages = ChromeAdapter.toLanguageModelMessages(request.contents);
104-
const text = await session.prompt(messages);
99+
// TODO: support multiple content objects when Chrome supports
100+
// sequence<LanguageModelMessage>
101+
const contents = request.contents[0].parts.map(
102+
ChromeAdapter.toLanguageModelMessageContent
103+
);
104+
const text = await session.prompt(contents);
105105
return ChromeAdapter.toResponse(text);
106106
}
107107

@@ -120,8 +120,12 @@ export class ChromeAdapter {
120120
// TODO: normalize on-device params during construction.
121121
this.onDeviceParams || {}
122122
);
123-
const messages = ChromeAdapter.toLanguageModelMessages(request.contents);
124-
const stream = await session.promptStreaming(messages);
123+
// TODO: support multiple content objects when Chrome supports
124+
// sequence<LanguageModelMessage>
125+
const contents = request.contents[0].parts.map(
126+
ChromeAdapter.toLanguageModelMessageContent
127+
);
128+
const stream = await session.promptStreaming(contents);
125129
return ChromeAdapter.toStreamResponse(stream);
126130
}
127131

@@ -131,8 +135,12 @@ export class ChromeAdapter {
131135
// TODO: normalize on-device params during construction.
132136
this.onDeviceParams || {}
133137
);
134-
const messages = ChromeAdapter.toLanguageModelMessages(request.contents);
135-
const tokenCount = await session.measureInputUsage(messages);
138+
// TODO: support multiple content objects when Chrome supports
139+
// sequence<LanguageModelMessage>
140+
const contents = request.contents[0].parts.map(
141+
ChromeAdapter.toLanguageModelMessageContent
142+
);
143+
const tokenCount = await session.measureInputUsage(contents);
136144
return {
137145
json: async () => ({
138146
totalTokens: tokenCount
@@ -188,25 +196,6 @@ export class ChromeAdapter {
188196
});
189197
}
190198

191-
/**
192-
* Converts a Vertex role string to a Chrome role string.
193-
*/
194-
private static toOnDeviceRole(role: Role): LanguageModelMessageRole {
195-
return role === 'model' ? 'assistant' : 'user';
196-
}
197-
198-
/**
199-
* Converts a Vertex Content object to a Chrome LanguageModelMessage object.
200-
*/
201-
private static toLanguageModelMessages(
202-
contents: Content[]
203-
): LanguageModelMessage[] {
204-
return contents.map(c => ({
205-
role: ChromeAdapter.toOnDeviceRole(c.role),
206-
content: c.parts.map(ChromeAdapter.toLanguageModelMessageContent)
207-
}));
208-
}
209-
210199
/**
211200
* Converts a Vertex Part object to a Chrome LanguageModelMessageContent object.
212201
*/

packages/vertexai/src/types/language-model.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,12 @@ interface LanguageModelExpectedInput {
5656
type: LanguageModelMessageType;
5757
languages?: string[];
5858
}
59-
export type LanguageModelPrompt =
60-
| LanguageModelMessage[]
61-
| LanguageModelMessageShorthand[]
62-
| string;
59+
// TODO: revert to type from Prompt API explainer once it's supported.
60+
export type LanguageModelPrompt = LanguageModelMessageContent[];
6361
type LanguageModelInitialPrompts =
6462
| LanguageModelMessage[]
6563
| LanguageModelMessageShorthand[];
66-
export interface LanguageModelMessage {
64+
interface LanguageModelMessage {
6765
role: LanguageModelMessageRole;
6866
content: LanguageModelMessageContent[];
6967
}
@@ -75,7 +73,7 @@ export interface LanguageModelMessageContent {
7573
type: LanguageModelMessageType;
7674
content: LanguageModelMessageContentValue;
7775
}
78-
export type LanguageModelMessageRole = 'system' | 'user' | 'assistant';
76+
type LanguageModelMessageRole = 'system' | 'user' | 'assistant';
7977
type LanguageModelMessageType = 'text' | 'image' | 'audio';
8078
type LanguageModelMessageContentValue =
8179
| ImageBitmapSource

0 commit comments

Comments
 (0)