Skip to content

Commit 16f54f0

Browse files
authored
Merge 78d1cc2 into 9968791
2 parents 9968791 + 78d1cc2 commit 16f54f0

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

e2e/sample-apps/modular.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -314,13 +314,22 @@ async function callVertexAI(app) {
314314
console.log('[VERTEXAI] start');
315315
const vertexAI = getVertexAI(app);
316316
const model = getGenerativeModel(vertexAI, {
317-
mode: 'only_on_device'
317+
mode: 'prefer_on_device'
318318
});
319319
const singleResult = await model.generateContent([
320-
{ text: 'describe the following:' },
321-
{ text: 'the mojave desert' }
320+
{ text: 'describe this 20 x 20 px image in two words' },
321+
{
322+
inlineData: {
323+
mimeType: 'image/heic',
324+
data: 'AAAAGGZ0eXBoZWljAAAAAGhlaWNtaWYxAAAB7G1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAADnBpdG0AAAAAAAEAAAA4aWluZgAAAAAAAgAAABVpbmZlAgAAAAABAABodmMxAAAAABVpbmZlAgAAAQACAABFeGlmAAAAABppcmVmAAAAAAAAAA5jZHNjAAIAAQABAAABD2lwcnAAAADtaXBjbwAAABNjb2xybmNseAACAAIABoAAAAAMY2xsaQDLAEAAAAAUaXNwZQAAAAAAAAAUAAAADgAAAChjbGFwAAAAFAAAAAEAAAANAAAAAQAAAAAAAAAB/8AAAACAAAAAAAAJaXJvdAAAAAAQcGl4aQAAAAADCAgIAAAAcWh2Y0MBA3AAAACwAAAAAAAe8AD8/fj4AAALA6AAAQAXQAEMAf//A3AAAAMAsAAAAwAAAwAecCShAAEAI0IBAQNwAAADALAAAAMAAAMAHqAUIEHAjw1iHuRZVNwICBgCogABAAlEAcBhcshAUyQAAAAaaXBtYQAAAAAAAAABAAEHgQIDhIUGhwAAACxpbG9jAAAAAEQAAAIAAQAAAAEAAAJsAAABDAACAAAAAQAAAhQAAABYAAAAAW1kYXQAAAAAAAABdAAAAAZFeGlmAABNTQAqAAAACAAEARIAAwAAAAEAAQAAARoABQAAAAEAAAA+ARsABQAAAAEAAABGASgAAwAAAAEAAgAAAAAAAAAAAEgAAAABAAAASAAAAAEAAAEIKAGvoR8wDimTiRYUbALiHkU3ZdZ8DXAcSrRB9GARtVQHvnCE0LEyBGAyb5P4eYr6JAK5UxNX10WNlARq3ZpcGeVD+Xom6LodYasuZKKtDHCz/xnswOtC/ksZzVKhtWQqGvkXcsJnLYqWevNkacnccQ95jbHJBg9nXub69jAAN3xhNOXxjGSxaG9QvES5R7sYICEojRjLF5OB5K3v+okQAwfgWpz/u21ayideOgOZQLAyBkKOv7ymLNCagiPWTlHAuy/3qR1Q7m2ERFaxKIAbLSkIVO/P8m8+anKxhzhC//L8NMAUoF+Sf3aEH9O41fwLc+PlcbrDrjgY2EboD3cn9DyN32Rum2Ym'
325+
}
326+
}
322327
]);
323328
console.log(`Generated text: ${singleResult.response.text()}`);
329+
const chat = model.startChat();
330+
let chatResult = await chat.sendMessage('describe red in two words');
331+
chatResult = await chat.sendMessage('describe blue');
332+
console.log('Chat history:', await chat.getHistory());
324333
console.log(`[VERTEXAI] end`);
325334
}
326335

@@ -345,7 +354,7 @@ function callDataConnect(app) {
345354
async function main() {
346355
console.log('FIREBASE VERSION', SDK_VERSION);
347356
const app = initializeApp(config);
348-
setLogLevel('warn');
357+
setLogLevel('debug');
349358

350359
// callAppCheck(app);
351360
// await authLogin(app);

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

+25-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import { AIError } from '../errors';
19+
import { logger } from '../logger';
1920
import {
2021
CountTokensRequest,
2122
GenerateContentRequest,
@@ -65,6 +66,9 @@ export class ChromeAdapter {
6566
*/
6667
async isAvailable(request: GenerateContentRequest): Promise<boolean> {
6768
if (this.mode === 'only_in_cloud') {
69+
logger.debug(
70+
`On-device inference unavailable because mode is "only_in_cloud".`
71+
);
6872
return false;
6973
}
7074

@@ -76,10 +80,20 @@ export class ChromeAdapter {
7680
}
7781

7882
// Applies prefer_on_device logic.
79-
return (
80-
availability === Availability.available &&
81-
ChromeAdapter.isOnDeviceRequest(request)
82-
);
83+
if (availability !== Availability.available) {
84+
logger.debug(
85+
`On-device inference unavailable because availability is "${availability}".`
86+
);
87+
return false;
88+
}
89+
if (!ChromeAdapter.isOnDeviceRequest(request)) {
90+
logger.debug(
91+
`On-device inference unavailable because request is incompatible.`
92+
);
93+
return false;
94+
}
95+
96+
return true;
8397
}
8498

8599
/**
@@ -141,13 +155,17 @@ export class ChromeAdapter {
141155
private static isOnDeviceRequest(request: GenerateContentRequest): boolean {
142156
// Returns false if the prompt is empty.
143157
if (request.contents.length === 0) {
158+
logger.debug('Empty prompt rejected for on-device inference.');
144159
return false;
145160
}
146161

147162
for (const content of request.contents) {
148163
// Returns false if the request contains multiple roles, eg a chat history.
149164
// TODO: remove this guard once LanguageModelMessage is supported.
150165
if (content.role !== 'user') {
166+
logger.debug(
167+
`Non-user role "${content.role}" rejected for on-device inference.`
168+
);
151169
return false;
152170
}
153171

@@ -159,6 +177,9 @@ export class ChromeAdapter {
159177
part.inlineData.mimeType
160178
) === -1
161179
) {
180+
logger.debug(
181+
`Unsupported mime type "${part.inlineData.mimeType}" rejected for on-device inference.`
182+
);
162183
return false;
163184
}
164185
}

0 commit comments

Comments
 (0)