Skip to content

Commit b911d5d

Browse files
committed
Support image input by default
1 parent dc3794a commit b911d5d

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

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

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,59 @@ async function toStringArray(
5252
}
5353

5454
describe('ChromeAdapter', () => {
55+
describe('constructor', () => {
56+
it('sets image as expected input type by default', async () => {
57+
const languageModelProvider = {
58+
availability: () => Promise.resolve(Availability.available)
59+
} as LanguageModel;
60+
const availabilityStub = stub(
61+
languageModelProvider,
62+
'availability'
63+
).resolves(Availability.available);
64+
const adapter = new ChromeAdapter(
65+
languageModelProvider,
66+
'prefer_on_device'
67+
);
68+
await adapter.isAvailable({
69+
contents: [
70+
{
71+
role: 'user',
72+
parts: [{ text: 'hi' }]
73+
}
74+
]
75+
});
76+
expect(availabilityStub).to.have.been.calledWith({
77+
expectedInputs: [{ type: 'image' }]
78+
});
79+
});
80+
it('honors explicitly set expected inputs', async () => {
81+
const languageModelProvider = {
82+
availability: () => Promise.resolve(Availability.available)
83+
} as LanguageModel;
84+
const availabilityStub = stub(
85+
languageModelProvider,
86+
'availability'
87+
).resolves(Availability.available);
88+
const onDeviceParams = {
89+
// Explicitly sets expected inputs.
90+
expectedInputs: [{ type: 'text' }]
91+
} as LanguageModelCreateOptions;
92+
const adapter = new ChromeAdapter(
93+
languageModelProvider,
94+
'prefer_on_device',
95+
onDeviceParams
96+
);
97+
await adapter.isAvailable({
98+
contents: [
99+
{
100+
role: 'user',
101+
parts: [{ text: 'hi' }]
102+
}
103+
]
104+
});
105+
expect(availabilityStub).to.have.been.calledWith(onDeviceParams);
106+
});
107+
});
55108
describe('isAvailable', () => {
56109
it('returns false if mode is only cloud', async () => {
57110
const adapter = new ChromeAdapter(undefined, 'only_in_cloud');
@@ -110,7 +163,15 @@ describe('ChromeAdapter', () => {
110163
);
111164
expect(
112165
await adapter.isAvailable({
113-
contents: [{ role: 'user', parts: [{ text: 'hi' }] }]
166+
contents: [
167+
{
168+
role: 'user',
169+
parts: [
170+
{ text: 'describe this image' },
171+
{ inlineData: { mimeType: 'image/jpeg', data: 'asd' } }
172+
]
173+
}
174+
]
114175
})
115176
).to.be.true;
116177
});

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ export class ChromeAdapter {
4242
private languageModelProvider?: LanguageModel,
4343
private mode?: InferenceMode,
4444
private onDeviceParams: LanguageModelCreateOptions = {}
45-
) {}
45+
) {
46+
this.addImageTypeAsExpectedInput();
47+
}
4648

4749
/**
4850
* Checks if a given request can be made on-device.
@@ -236,6 +238,11 @@ export class ChromeAdapter {
236238
return newSession;
237239
}
238240

241+
private addImageTypeAsExpectedInput(): void {
242+
// Defaults to support image inputs for convenience.
243+
this.onDeviceParams.expectedInputs ??= [{ type: 'image' }];
244+
}
245+
239246
/**
240247
* Formats string returned by Chrome as a {@link Response} returned by Vertex.
241248
*/

0 commit comments

Comments
 (0)