From 478b4c3dfd434859074d9945bbf2b43f218371de Mon Sep 17 00:00:00 2001
From: Erik Eldridge
Date: Wed, 14 May 2025 17:29:36 -0700
Subject: [PATCH 1/3] Guard against undefined mode, ie the non-hybrid common
case
---
packages/ai/src/methods/chrome-adapter.test.ts | 18 ++++++++++++++++--
packages/ai/src/methods/chrome-adapter.ts | 17 +++++++++++------
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/packages/ai/src/methods/chrome-adapter.test.ts b/packages/ai/src/methods/chrome-adapter.test.ts
index fbe7ec1a5c5..adb9ae47d87 100644
--- a/packages/ai/src/methods/chrome-adapter.test.ts
+++ b/packages/ai/src/methods/chrome-adapter.test.ts
@@ -109,6 +109,14 @@ describe('ChromeAdapter', () => {
});
});
describe('isAvailable', () => {
+ it('returns false if mode is undefined', async () => {
+ const adapter = new ChromeAdapter();
+ expect(
+ await adapter.isAvailable({
+ contents: []
+ })
+ ).to.be.false;
+ });
it('returns false if mode is only cloud', async () => {
const adapter = new ChromeAdapter(undefined, 'only_in_cloud');
expect(
@@ -239,7 +247,10 @@ describe('ChromeAdapter', () => {
const createStub = stub(languageModelProvider, 'create').returns(
downloadPromise
);
- const adapter = new ChromeAdapter(languageModelProvider);
+ const adapter = new ChromeAdapter(
+ languageModelProvider,
+ 'prefer_on_device'
+ );
await adapter.isAvailable({
contents: [{ role: 'user', parts: [{ text: 'hi' }] }]
});
@@ -260,7 +271,10 @@ describe('ChromeAdapter', () => {
const createStub = stub(languageModelProvider, 'create').returns(
downloadPromise
);
- const adapter = new ChromeAdapter(languageModelProvider);
+ const adapter = new ChromeAdapter(
+ languageModelProvider,
+ 'prefer_on_device'
+ );
await adapter.isAvailable({
contents: [{ role: 'user', parts: [{ text: 'hi' }] }]
});
diff --git a/packages/ai/src/methods/chrome-adapter.ts b/packages/ai/src/methods/chrome-adapter.ts
index d6de108668d..40fa4883a4f 100644
--- a/packages/ai/src/methods/chrome-adapter.ts
+++ b/packages/ai/src/methods/chrome-adapter.ts
@@ -68,7 +68,7 @@ export class ChromeAdapter {
* separation of concerns.
*/
async isAvailable(request: GenerateContentRequest): Promise {
- if (this.mode === 'only_in_cloud') {
+ if (!this.mode || this.mode === 'only_in_cloud') {
logger.debug(
`On-device inference unavailable because mode is "only_in_cloud".`
);
@@ -83,20 +83,25 @@ export class ChromeAdapter {
}
// Applies prefer_on_device logic.
- if (availability !== Availability.available) {
+ const isAvailable = availability === Availability.available;
+ const isOnDeviceRequest = ChromeAdapter.isOnDeviceRequest(request);
+ if (isAvailable && isOnDeviceRequest) {
+ return true;
+ }
+
+ if (!isAvailable) {
logger.debug(
`On-device inference unavailable because availability is "${availability}".`
);
- return false;
}
- if (!ChromeAdapter.isOnDeviceRequest(request)) {
+
+ if (!isOnDeviceRequest) {
logger.debug(
`On-device inference unavailable because request is incompatible.`
);
- return false;
}
- return true;
+ return false;
}
/**
From 65de23cd563b3dfde1156f17d81e94a79f45cce9 Mon Sep 17 00:00:00 2001
From: Erik Eldridge
Date: Wed, 14 May 2025 17:42:13 -0700
Subject: [PATCH 2/3] Revert default value changes
---
packages/ai/src/methods/chrome-adapter.ts | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/packages/ai/src/methods/chrome-adapter.ts b/packages/ai/src/methods/chrome-adapter.ts
index 40fa4883a4f..16e0319b5fb 100644
--- a/packages/ai/src/methods/chrome-adapter.ts
+++ b/packages/ai/src/methods/chrome-adapter.ts
@@ -83,25 +83,20 @@ export class ChromeAdapter {
}
// Applies prefer_on_device logic.
- const isAvailable = availability === Availability.available;
- const isOnDeviceRequest = ChromeAdapter.isOnDeviceRequest(request);
- if (isAvailable && isOnDeviceRequest) {
- return true;
- }
-
- if (!isAvailable) {
+ if (availability !== Availability.available) {
logger.debug(
`On-device inference unavailable because availability is "${availability}".`
);
+ return false;
}
-
- if (!isOnDeviceRequest) {
+ if (!ChromeAdapter.isOnDeviceRequest(request)) {
logger.debug(
`On-device inference unavailable because request is incompatible.`
);
+ return false;
}
- return false;
+ return true;
}
/**
From 205a25b5629ae44593900f00617ff870aec5ad5e Mon Sep 17 00:00:00 2001
From: Erik Eldridge
Date: Thu, 15 May 2025 08:34:00 -0700
Subject: [PATCH 3/3] Use standalone guard for undefined mode for consistency
---
packages/ai/src/methods/chrome-adapter.ts | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/packages/ai/src/methods/chrome-adapter.ts b/packages/ai/src/methods/chrome-adapter.ts
index 16e0319b5fb..b61ad9b5f09 100644
--- a/packages/ai/src/methods/chrome-adapter.ts
+++ b/packages/ai/src/methods/chrome-adapter.ts
@@ -68,7 +68,13 @@ export class ChromeAdapter {
* separation of concerns.
*/
async isAvailable(request: GenerateContentRequest): Promise {
- if (!this.mode || this.mode === 'only_in_cloud') {
+ if (!this.mode) {
+ logger.debug(
+ `On-device inference unavailable because mode is undefined.`
+ );
+ return false;
+ }
+ if (this.mode === 'only_in_cloud') {
logger.debug(
`On-device inference unavailable because mode is "only_in_cloud".`
);