@@ -173,13 +173,18 @@ describe('ChromeAdapter', () => {
173
173
const createStub = stub ( aiProvider . languageModel , 'create' ) . resolves (
174
174
{ } as AILanguageModel
175
175
) ;
176
- const adapter = new ChromeAdapter ( aiProvider , 'prefer_on_device' ) ;
176
+ const onDeviceParams = { } as AILanguageModelCreateOptionsWithSystemPrompt ;
177
+ const adapter = new ChromeAdapter (
178
+ aiProvider ,
179
+ 'prefer_on_device' ,
180
+ onDeviceParams
181
+ ) ;
177
182
expect (
178
183
await adapter . isAvailable ( {
179
184
contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
180
185
} )
181
186
) . to . be . false ;
182
- expect ( createStub ) . to . have . been . calledOnce ;
187
+ expect ( createStub ) . to . have . been . calledOnceWith ( onDeviceParams ) ;
183
188
} ) ;
184
189
it ( 'avoids redundant downloads' , async ( ) => {
185
190
const aiProvider = {
@@ -250,4 +255,67 @@ describe('ChromeAdapter', () => {
250
255
) . to . be . false ;
251
256
} ) ;
252
257
} ) ;
258
+ describe ( 'generateContentOnDevice' , ( ) => {
259
+ it ( 'Extracts and concats initial prompts' , async ( ) => {
260
+ const aiProvider = {
261
+ languageModel : {
262
+ create : ( ) => Promise . resolve ( { } )
263
+ }
264
+ } as AI ;
265
+ const factoryStub = stub ( aiProvider . languageModel , 'create' ) . resolves ( {
266
+ prompt : s => Promise . resolve ( s )
267
+ } as AILanguageModel ) ;
268
+ const text = [ 'first' , 'second' , 'third' ] ;
269
+ const onDeviceParams = {
270
+ initialPrompts : [ { role : 'user' , content : text [ 0 ] } ]
271
+ } as AILanguageModelCreateOptionsWithSystemPrompt ;
272
+ const adapter = new ChromeAdapter (
273
+ aiProvider ,
274
+ 'prefer_on_device' ,
275
+ onDeviceParams
276
+ ) ;
277
+ const response = await adapter . generateContentOnDevice ( {
278
+ contents : [
279
+ { role : 'model' , parts : [ { text : text [ 1 ] } ] } ,
280
+ { role : 'user' , parts : [ { text : text [ 2 ] } ] }
281
+ ]
282
+ } ) ;
283
+ expect ( factoryStub ) . to . have . been . calledOnceWith ( {
284
+ initialPrompts : [
285
+ { role : 'user' , content : text [ 0 ] } ,
286
+ // Asserts tail is passed as initial prompts, and
287
+ // role is normalized from model to assistant.
288
+ { role : 'assistant' , content : text [ 1 ] }
289
+ ]
290
+ } ) ;
291
+ expect ( response . text ( ) ) . to . equal ( text [ 2 ] ) ;
292
+ } ) ;
293
+ it ( 'Extracts system prompt' , async ( ) => {
294
+ const aiProvider = {
295
+ languageModel : {
296
+ create : ( ) => Promise . resolve ( { } )
297
+ }
298
+ } as AI ;
299
+ const factoryStub = stub ( aiProvider . languageModel , 'create' ) . resolves ( {
300
+ prompt : s => Promise . resolve ( s )
301
+ } as AILanguageModel ) ;
302
+ const onDeviceParams = {
303
+ systemPrompt : 'be yourself'
304
+ } as AILanguageModelCreateOptionsWithSystemPrompt ;
305
+ const adapter = new ChromeAdapter (
306
+ aiProvider ,
307
+ 'prefer_on_device' ,
308
+ onDeviceParams
309
+ ) ;
310
+ const text = 'hi' ;
311
+ const response = await adapter . generateContentOnDevice ( {
312
+ contents : [ { role : 'user' , parts : [ { text } ] } ]
313
+ } ) ;
314
+ expect ( factoryStub ) . to . have . been . calledOnceWith ( {
315
+ initialPrompts : [ ] ,
316
+ systemPrompt : onDeviceParams . systemPrompt
317
+ } ) ;
318
+ expect ( response . text ( ) ) . to . equal ( text ) ;
319
+ } ) ;
320
+ } ) ;
253
321
} ) ;
0 commit comments