Skip to content

Commit 8cdb35c

Browse files
committed
adding image as input to create language model object
1 parent 60b50a1 commit 8cdb35c

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

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

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,18 +173,19 @@ describe('ChromeAdapter', () => {
173173
const createStub = stub(languageModelProvider, 'create').resolves(
174174
{} as LanguageModel
175175
);
176-
const onDeviceParams = {} as LanguageModelCreateOptions;
177176
const adapter = new ChromeAdapter(
178177
languageModelProvider,
179-
'prefer_on_device',
180-
onDeviceParams
178+
'prefer_on_device'
181179
);
180+
const expectedOnDeviceParams = {
181+
expectedInputs: [{ type: 'image' }]
182+
} as LanguageModelCreateOptions;
182183
expect(
183184
await adapter.isAvailable({
184185
contents: [{ role: 'user', parts: [{ text: 'hi' }] }]
185186
})
186187
).to.be.false;
187-
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
188+
expect(createStub).to.have.been.calledOnceWith(expectedOnDeviceParams);
188189
});
189190
it('avoids redundant downloads', async () => {
190191
const languageModelProvider = {
@@ -261,6 +262,10 @@ describe('ChromeAdapter', () => {
261262
const onDeviceParams = {
262263
systemPrompt: 'be yourself'
263264
} as LanguageModelCreateOptions;
265+
const expectedOnDeviceParams = {
266+
systemPrompt: 'be yourself',
267+
expectedInputs: [{ type: 'image' }]
268+
} as LanguageModelCreateOptions;
264269
const adapter = new ChromeAdapter(
265270
languageModelProvider,
266271
'prefer_on_device',
@@ -271,7 +276,7 @@ describe('ChromeAdapter', () => {
271276
} as GenerateContentRequest;
272277
const response = await adapter.generateContent(request);
273278
// Asserts initialization params are proxied.
274-
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
279+
expect(createStub).to.have.been.calledOnceWith(expectedOnDeviceParams);
275280
// Asserts Vertex input type is mapped to Chrome type.
276281
expect(promptStub).to.have.been.calledOnceWith([
277282
{
@@ -306,6 +311,10 @@ describe('ChromeAdapter', () => {
306311
const onDeviceParams = {
307312
systemPrompt: 'be yourself'
308313
} as LanguageModelCreateOptions;
314+
const expectedOnDeviceParams = {
315+
systemPrompt: 'be yourself',
316+
expectedInputs: [{ type: 'image' }]
317+
} as LanguageModelCreateOptions;
309318
const adapter = new ChromeAdapter(
310319
languageModelProvider,
311320
'prefer_on_device',
@@ -329,7 +338,7 @@ describe('ChromeAdapter', () => {
329338
} as GenerateContentRequest;
330339
const response = await adapter.generateContent(request);
331340
// Asserts initialization params are proxied.
332-
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
341+
expect(createStub).to.have.been.calledOnceWith(expectedOnDeviceParams);
333342
// Asserts Vertex input type is mapped to Chrome type.
334343
expect(promptStub).to.have.been.calledOnceWith([
335344
{
@@ -360,6 +369,10 @@ describe('ChromeAdapter', () => {
360369
const onDeviceParams = {
361370
systemPrompt: 'be yourself'
362371
} as LanguageModelCreateOptions;
372+
const expectedOnDeviceParams = {
373+
systemPrompt: 'be yourself',
374+
expectedInputs: [{ type: 'image' }]
375+
} as LanguageModelCreateOptions;
363376

364377
// setting up stubs
365378
const languageModelProvider = {
@@ -389,7 +402,7 @@ describe('ChromeAdapter', () => {
389402
} as GenerateContentRequest;
390403
const response = await adapter.countTokens(countTokenRequest);
391404
// Asserts initialization params are proxied.
392-
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
405+
expect(createStub).to.have.been.calledOnceWith(expectedOnDeviceParams);
393406
// Asserts Vertex input type is mapped to Chrome type.
394407
expect(measureInputUsageStub).to.have.been.calledOnceWith([
395408
{
@@ -423,6 +436,9 @@ describe('ChromeAdapter', () => {
423436
})
424437
);
425438
const onDeviceParams = {} as LanguageModelCreateOptions;
439+
const expectedOnDeviceParams = {
440+
expectedInputs: [{ type: 'image' }]
441+
} as LanguageModelCreateOptions;
426442
const adapter = new ChromeAdapter(
427443
languageModelProvider,
428444
'prefer_on_device',
@@ -432,7 +448,7 @@ describe('ChromeAdapter', () => {
432448
contents: [{ role: 'user', parts: [{ text: 'anything' }] }]
433449
} as GenerateContentRequest;
434450
const response = await adapter.generateContentStream(request);
435-
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
451+
expect(createStub).to.have.been.calledOnceWith(expectedOnDeviceParams);
436452
expect(promptStub).to.have.been.calledOnceWith([
437453
{
438454
type: 'text',
@@ -464,6 +480,9 @@ describe('ChromeAdapter', () => {
464480
})
465481
);
466482
const onDeviceParams = {} as LanguageModelCreateOptions;
483+
const expectedOnDeviceParams = {
484+
expectedInputs: [{ type: 'image' }]
485+
} as LanguageModelCreateOptions;
467486
const adapter = new ChromeAdapter(
468487
languageModelProvider,
469488
'prefer_on_device',
@@ -486,7 +505,7 @@ describe('ChromeAdapter', () => {
486505
]
487506
} as GenerateContentRequest;
488507
const response = await adapter.generateContentStream(request);
489-
expect(createStub).to.have.been.calledOnceWith(onDeviceParams);
508+
expect(createStub).to.have.been.calledOnceWith(expectedOnDeviceParams);
490509
expect(promptStub).to.have.been.calledOnceWith([
491510
{
492511
type: 'text',

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,6 @@ export class ChromeAdapter {
162162
if (content.role === 'function') {
163163
return false;
164164
}
165-
166-
if (!content.parts[0].text) {
167-
return false;
168-
}
169165
}
170166

171167
return true;
@@ -185,8 +181,10 @@ export class ChromeAdapter {
185181
return;
186182
}
187183
this.isDownloading = true;
184+
const options = this.onDeviceParams || {};
185+
ChromeAdapter.addImageTypeAsExpectedInput(options);
188186
this.downloadPromise = this.languageModelProvider
189-
?.create(this.onDeviceParams)
187+
?.create(options)
190188
.then(() => {
191189
this.isDownloading = false;
192190
});
@@ -204,7 +202,6 @@ export class ChromeAdapter {
204202
content: part.text
205203
};
206204
} else if (part.inlineData) {
207-
// this is for the image type
208205
const formattedImageContent = await fetch(
209206
`data:${part.inlineData.mimeType};base64,${part.inlineData.data}`
210207
);
@@ -235,6 +232,7 @@ export class ChromeAdapter {
235232
options: LanguageModelCreateOptions
236233
): Promise<LanguageModel> {
237234
// TODO: could we use this.onDeviceParams instead of passing in options?
235+
ChromeAdapter.addImageTypeAsExpectedInput(options);
238236
const newSession = await this.languageModelProvider!.create(options);
239237
if (this.oldSession) {
240238
this.oldSession.destroy();
@@ -244,6 +242,13 @@ export class ChromeAdapter {
244242
return newSession;
245243
}
246244

245+
private static addImageTypeAsExpectedInput(
246+
options: LanguageModelCreateOptions
247+
): void {
248+
options.expectedInputs = options.expectedInputs || [];
249+
options.expectedInputs.push({ type: 'image' });
250+
}
251+
247252
/**
248253
* Formats string returned by Chrome as a {@link Response} returned by Vertex.
249254
*/

0 commit comments

Comments
 (0)