@@ -24,7 +24,7 @@ import {
24
24
Availability ,
25
25
LanguageModel ,
26
26
LanguageModelCreateOptions ,
27
- LanguageModelMessageContent
27
+ LanguageModelMessage
28
28
} from '../types/language-model' ;
29
29
import { match , stub } from 'sinon' ;
30
30
import { GenerateContentRequest , AIErrorCode } from '../types' ;
@@ -138,7 +138,7 @@ describe('ChromeAdapter', () => {
138
138
} )
139
139
) . to . be . false ;
140
140
} ) ;
141
- it ( 'returns false if request content has non-user role' , async ( ) => {
141
+ it ( 'returns false if request content has "function" role' , async ( ) => {
142
142
const adapter = new ChromeAdapter (
143
143
{
144
144
availability : async ( ) => Availability . available
@@ -149,7 +149,7 @@ describe('ChromeAdapter', () => {
149
149
await adapter . isAvailable ( {
150
150
contents : [
151
151
{
152
- role : 'model ' ,
152
+ role : 'function ' ,
153
153
parts : [ ]
154
154
}
155
155
]
@@ -306,7 +306,7 @@ describe('ChromeAdapter', () => {
306
306
} as LanguageModel ;
307
307
const languageModel = {
308
308
// eslint-disable-next-line @typescript-eslint/no-unused-vars
309
- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
309
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
310
310
} as LanguageModel ;
311
311
const createStub = stub ( languageModelProvider , 'create' ) . resolves (
312
312
languageModel
@@ -331,8 +331,13 @@ describe('ChromeAdapter', () => {
331
331
// Asserts Vertex input type is mapped to Chrome type.
332
332
expect ( promptStub ) . to . have . been . calledOnceWith ( [
333
333
{
334
- type : 'text' ,
335
- content : request . contents [ 0 ] . parts [ 0 ] . text
334
+ role : request . contents [ 0 ] . role ,
335
+ content : [
336
+ {
337
+ type : 'text' ,
338
+ content : request . contents [ 0 ] . parts [ 0 ] . text
339
+ }
340
+ ]
336
341
}
337
342
] ) ;
338
343
// Asserts expected output.
@@ -352,7 +357,7 @@ describe('ChromeAdapter', () => {
352
357
} as LanguageModel ;
353
358
const languageModel = {
354
359
// eslint-disable-next-line @typescript-eslint/no-unused-vars
355
- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
360
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
356
361
} as LanguageModel ;
357
362
const createStub = stub ( languageModelProvider , 'create' ) . resolves (
358
363
languageModel
@@ -390,12 +395,17 @@ describe('ChromeAdapter', () => {
390
395
// Asserts Vertex input type is mapped to Chrome type.
391
396
expect ( promptStub ) . to . have . been . calledOnceWith ( [
392
397
{
393
- type : 'text' ,
394
- content : request . contents [ 0 ] . parts [ 0 ] . text
395
- } ,
396
- {
397
- type : 'image' ,
398
- content : match . instanceOf ( ImageBitmap )
398
+ role : request . contents [ 0 ] . role ,
399
+ content : [
400
+ {
401
+ type : 'text' ,
402
+ content : request . contents [ 0 ] . parts [ 0 ] . text
403
+ } ,
404
+ {
405
+ type : 'image' ,
406
+ content : match . instanceOf ( ImageBitmap )
407
+ }
408
+ ]
399
409
}
400
410
] ) ;
401
411
// Asserts expected output.
@@ -412,7 +422,7 @@ describe('ChromeAdapter', () => {
412
422
it ( 'honors prompt options' , async ( ) => {
413
423
const languageModel = {
414
424
// eslint-disable-next-line @typescript-eslint/no-unused-vars
415
- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
425
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
416
426
} as LanguageModel ;
417
427
const languageModelProvider = {
418
428
create : ( ) => Promise . resolve ( languageModel )
@@ -436,13 +446,48 @@ describe('ChromeAdapter', () => {
436
446
expect ( promptStub ) . to . have . been . calledOnceWith (
437
447
[
438
448
{
439
- type : 'text' ,
440
- content : request . contents [ 0 ] . parts [ 0 ] . text
449
+ role : request . contents [ 0 ] . role ,
450
+ content : [
451
+ {
452
+ type : 'text' ,
453
+ content : request . contents [ 0 ] . parts [ 0 ] . text
454
+ }
455
+ ]
441
456
}
442
457
] ,
443
458
promptOptions
444
459
) ;
445
460
} ) ;
461
+ it ( 'normalizes roles' , async ( ) => {
462
+ const languageModel = {
463
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
464
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( 'unused' )
465
+ } as LanguageModel ;
466
+ const promptStub = stub ( languageModel , 'prompt' ) . resolves ( 'unused' ) ;
467
+ const languageModelProvider = {
468
+ create : ( ) => Promise . resolve ( languageModel )
469
+ } as LanguageModel ;
470
+ const adapter = new ChromeAdapter (
471
+ languageModelProvider ,
472
+ 'prefer_on_device'
473
+ ) ;
474
+ const request = {
475
+ contents : [ { role : 'model' , parts : [ { text : 'unused' } ] } ]
476
+ } as GenerateContentRequest ;
477
+ await adapter . generateContent ( request ) ;
478
+ expect ( promptStub ) . to . have . been . calledOnceWith ( [
479
+ {
480
+ // Asserts Vertex's "model" role normalized to Chrome's "assistant" role.
481
+ role : 'assistant' ,
482
+ content : [
483
+ {
484
+ type : 'text' ,
485
+ content : request . contents [ 0 ] . parts [ 0 ] . text
486
+ }
487
+ ]
488
+ }
489
+ ] ) ;
490
+ } ) ;
446
491
} ) ;
447
492
describe ( 'countTokens' , ( ) => {
448
493
it ( 'counts tokens is not yet available' , async ( ) => {
@@ -514,8 +559,13 @@ describe('ChromeAdapter', () => {
514
559
expect ( createStub ) . to . have . been . calledOnceWith ( createOptions ) ;
515
560
expect ( promptStub ) . to . have . been . calledOnceWith ( [
516
561
{
517
- type : 'text' ,
518
- content : request . contents [ 0 ] . parts [ 0 ] . text
562
+ role : request . contents [ 0 ] . role ,
563
+ content : [
564
+ {
565
+ type : 'text' ,
566
+ content : request . contents [ 0 ] . parts [ 0 ] . text
567
+ }
568
+ ]
519
569
}
520
570
] ) ;
521
571
const actual = await toStringArray ( response . body ! ) ;
@@ -570,12 +620,17 @@ describe('ChromeAdapter', () => {
570
620
expect ( createStub ) . to . have . been . calledOnceWith ( createOptions ) ;
571
621
expect ( promptStub ) . to . have . been . calledOnceWith ( [
572
622
{
573
- type : 'text' ,
574
- content : request . contents [ 0 ] . parts [ 0 ] . text
575
- } ,
576
- {
577
- type : 'image' ,
578
- content : match . instanceOf ( ImageBitmap )
623
+ role : request . contents [ 0 ] . role ,
624
+ content : [
625
+ {
626
+ type : 'text' ,
627
+ content : request . contents [ 0 ] . parts [ 0 ] . text
628
+ } ,
629
+ {
630
+ type : 'image' ,
631
+ content : match . instanceOf ( ImageBitmap )
632
+ }
633
+ ]
579
634
}
580
635
] ) ;
581
636
const actual = await toStringArray ( response . body ! ) ;
@@ -611,13 +666,50 @@ describe('ChromeAdapter', () => {
611
666
expect ( promptStub ) . to . have . been . calledOnceWith (
612
667
[
613
668
{
614
- type : 'text' ,
615
- content : request . contents [ 0 ] . parts [ 0 ] . text
669
+ role : request . contents [ 0 ] . role ,
670
+ content : [
671
+ {
672
+ type : 'text' ,
673
+ content : request . contents [ 0 ] . parts [ 0 ] . text
674
+ }
675
+ ]
616
676
}
617
677
] ,
618
678
promptOptions
619
679
) ;
620
680
} ) ;
681
+ it ( 'normalizes roles' , async ( ) => {
682
+ const languageModel = {
683
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
684
+ promptStreaming : p => new ReadableStream ( )
685
+ } as LanguageModel ;
686
+ const promptStub = stub ( languageModel , 'promptStreaming' ) . returns (
687
+ new ReadableStream ( )
688
+ ) ;
689
+ const languageModelProvider = {
690
+ create : ( ) => Promise . resolve ( languageModel )
691
+ } as LanguageModel ;
692
+ const adapter = new ChromeAdapter (
693
+ languageModelProvider ,
694
+ 'prefer_on_device'
695
+ ) ;
696
+ const request = {
697
+ contents : [ { role : 'model' , parts : [ { text : 'unused' } ] } ]
698
+ } as GenerateContentRequest ;
699
+ await adapter . generateContentStream ( request ) ;
700
+ expect ( promptStub ) . to . have . been . calledOnceWith ( [
701
+ {
702
+ // Asserts Vertex's "model" role normalized to Chrome's "assistant" role.
703
+ role : 'assistant' ,
704
+ content : [
705
+ {
706
+ type : 'text' ,
707
+ content : request . contents [ 0 ] . parts [ 0 ] . text
708
+ }
709
+ ]
710
+ }
711
+ ] ) ;
712
+ } ) ;
621
713
} ) ;
622
714
} ) ;
623
715
0 commit comments