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".` );