@@ -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' ;
@@ -146,7 +146,7 @@ describe('ChromeAdapter', () => {
146
146
} )
147
147
) . to . be . false ;
148
148
} ) ;
149
- it ( 'returns false if request content has non-user role' , async ( ) => {
149
+ it ( 'returns false if request content has "function" role' , async ( ) => {
150
150
const adapter = new ChromeAdapter (
151
151
{
152
152
availability : async ( ) => Availability . available
@@ -157,7 +157,7 @@ describe('ChromeAdapter', () => {
157
157
await adapter . isAvailable ( {
158
158
contents : [
159
159
{
160
- role : 'model ' ,
160
+ role : 'function ' ,
161
161
parts : [ ]
162
162
}
163
163
]
@@ -320,7 +320,7 @@ describe('ChromeAdapter', () => {
320
320
} as LanguageModel ;
321
321
const languageModel = {
322
322
// eslint-disable-next-line @typescript-eslint/no-unused-vars
323
- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
323
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
324
324
} as LanguageModel ;
325
325
const createStub = stub ( languageModelProvider , 'create' ) . resolves (
326
326
languageModel
@@ -345,8 +345,13 @@ describe('ChromeAdapter', () => {
345
345
// Asserts Vertex input type is mapped to Chrome type.
346
346
expect ( promptStub ) . to . have . been . calledOnceWith ( [
347
347
{
348
- type : 'text' ,
349
- content : request . contents [ 0 ] . parts [ 0 ] . text
348
+ role : request . contents [ 0 ] . role ,
349
+ content : [
350
+ {
351
+ type : 'text' ,
352
+ value : request . contents [ 0 ] . parts [ 0 ] . text
353
+ }
354
+ ]
350
355
}
351
356
] ) ;
352
357
// Asserts expected output.
@@ -366,7 +371,7 @@ describe('ChromeAdapter', () => {
366
371
} as LanguageModel ;
367
372
const languageModel = {
368
373
// eslint-disable-next-line @typescript-eslint/no-unused-vars
369
- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
374
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
370
375
} as LanguageModel ;
371
376
const createStub = stub ( languageModelProvider , 'create' ) . resolves (
372
377
languageModel
@@ -404,12 +409,17 @@ describe('ChromeAdapter', () => {
404
409
// Asserts Vertex input type is mapped to Chrome type.
405
410
expect ( promptStub ) . to . have . been . calledOnceWith ( [
406
411
{
407
- type : 'text' ,
408
- content : request . contents [ 0 ] . parts [ 0 ] . text
409
- } ,
410
- {
411
- type : 'image' ,
412
- content : match . instanceOf ( ImageBitmap )
412
+ role : request . contents [ 0 ] . role ,
413
+ content : [
414
+ {
415
+ type : 'text' ,
416
+ value : request . contents [ 0 ] . parts [ 0 ] . text
417
+ } ,
418
+ {
419
+ type : 'image' ,
420
+ value : match . instanceOf ( ImageBitmap )
421
+ }
422
+ ]
413
423
}
414
424
] ) ;
415
425
// Asserts expected output.
@@ -426,7 +436,7 @@ describe('ChromeAdapter', () => {
426
436
it ( 'honors prompt options' , async ( ) => {
427
437
const languageModel = {
428
438
// eslint-disable-next-line @typescript-eslint/no-unused-vars
429
- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
439
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
430
440
} as LanguageModel ;
431
441
const languageModelProvider = {
432
442
create : ( ) => Promise . resolve ( languageModel )
@@ -450,13 +460,48 @@ describe('ChromeAdapter', () => {
450
460
expect ( promptStub ) . to . have . been . calledOnceWith (
451
461
[
452
462
{
453
- type : 'text' ,
454
- content : request . contents [ 0 ] . parts [ 0 ] . text
463
+ role : request . contents [ 0 ] . role ,
464
+ content : [
465
+ {
466
+ type : 'text' ,
467
+ value : request . contents [ 0 ] . parts [ 0 ] . text
468
+ }
469
+ ]
455
470
}
456
471
] ,
457
472
promptOptions
458
473
) ;
459
474
} ) ;
475
+ it ( 'normalizes roles' , async ( ) => {
476
+ const languageModel = {
477
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
478
+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( 'unused' )
479
+ } as LanguageModel ;
480
+ const promptStub = stub ( languageModel , 'prompt' ) . resolves ( 'unused' ) ;
481
+ const languageModelProvider = {
482
+ create : ( ) => Promise . resolve ( languageModel )
483
+ } as LanguageModel ;
484
+ const adapter = new ChromeAdapter (
485
+ languageModelProvider ,
486
+ 'prefer_on_device'
487
+ ) ;
488
+ const request = {
489
+ contents : [ { role : 'model' , parts : [ { text : 'unused' } ] } ]
490
+ } as GenerateContentRequest ;
491
+ await adapter . generateContent ( request ) ;
492
+ expect ( promptStub ) . to . have . been . calledOnceWith ( [
493
+ {
494
+ // Asserts Vertex's "model" role normalized to Chrome's "assistant" role.
495
+ role : 'assistant' ,
496
+ content : [
497
+ {
498
+ type : 'text' ,
499
+ value : request . contents [ 0 ] . parts [ 0 ] . text
500
+ }
501
+ ]
502
+ }
503
+ ] ) ;
504
+ } ) ;
460
505
} ) ;
461
506
describe ( 'countTokens' , ( ) => {
462
507
it ( 'counts tokens is not yet available' , async ( ) => {
@@ -528,8 +573,13 @@ describe('ChromeAdapter', () => {
528
573
expect ( createStub ) . to . have . been . calledOnceWith ( createOptions ) ;
529
574
expect ( promptStub ) . to . have . been . calledOnceWith ( [
530
575
{
531
- type : 'text' ,
532
- content : request . contents [ 0 ] . parts [ 0 ] . text
576
+ role : request . contents [ 0 ] . role ,
577
+ content : [
578
+ {
579
+ type : 'text' ,
580
+ value : request . contents [ 0 ] . parts [ 0 ] . text
581
+ }
582
+ ]
533
583
}
534
584
] ) ;
535
585
const actual = await toStringArray ( response . body ! ) ;
@@ -584,12 +634,17 @@ describe('ChromeAdapter', () => {
584
634
expect ( createStub ) . to . have . been . calledOnceWith ( createOptions ) ;
585
635
expect ( promptStub ) . to . have . been . calledOnceWith ( [
586
636
{
587
- type : 'text' ,
588
- content : request . contents [ 0 ] . parts [ 0 ] . text
589
- } ,
590
- {
591
- type : 'image' ,
592
- content : match . instanceOf ( ImageBitmap )
637
+ role : request . contents [ 0 ] . role ,
638
+ content : [
639
+ {
640
+ type : 'text' ,
641
+ value : request . contents [ 0 ] . parts [ 0 ] . text
642
+ } ,
643
+ {
644
+ type : 'image' ,
645
+ value : match . instanceOf ( ImageBitmap )
646
+ }
647
+ ]
593
648
}
594
649
] ) ;
595
650
const actual = await toStringArray ( response . body ! ) ;
@@ -625,13 +680,50 @@ describe('ChromeAdapter', () => {
625
680
expect ( promptStub ) . to . have . been . calledOnceWith (
626
681
[
627
682
{
628
- type : 'text' ,
629
- content : request . contents [ 0 ] . parts [ 0 ] . text
683
+ role : request . contents [ 0 ] . role ,
684
+ content : [
685
+ {
686
+ type : 'text' ,
687
+ value : request . contents [ 0 ] . parts [ 0 ] . text
688
+ }
689
+ ]
630
690
}
631
691
] ,
632
692
promptOptions
633
693
) ;
634
694
} ) ;
695
+ it ( 'normalizes roles' , async ( ) => {
696
+ const languageModel = {
697
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
698
+ promptStreaming : p => new ReadableStream ( )
699
+ } as LanguageModel ;
700
+ const promptStub = stub ( languageModel , 'promptStreaming' ) . returns (
701
+ new ReadableStream ( )
702
+ ) ;
703
+ const languageModelProvider = {
704
+ create : ( ) => Promise . resolve ( languageModel )
705
+ } as LanguageModel ;
706
+ const adapter = new ChromeAdapter (
707
+ languageModelProvider ,
708
+ 'prefer_on_device'
709
+ ) ;
710
+ const request = {
711
+ contents : [ { role : 'model' , parts : [ { text : 'unused' } ] } ]
712
+ } as GenerateContentRequest ;
713
+ await adapter . generateContentStream ( request ) ;
714
+ expect ( promptStub ) . to . have . been . calledOnceWith ( [
715
+ {
716
+ // Asserts Vertex's "model" role normalized to Chrome's "assistant" role.
717
+ role : 'assistant' ,
718
+ content : [
719
+ {
720
+ type : 'text' ,
721
+ value : request . contents [ 0 ] . parts [ 0 ] . text
722
+ }
723
+ ]
724
+ }
725
+ ] ) ;
726
+ } ) ;
635
727
} ) ;
636
728
} ) ;
637
729
0 commit comments