@@ -24,7 +24,7 @@ import {
2424 Availability ,
2525 LanguageModel ,
2626 LanguageModelCreateOptions ,
27- LanguageModelMessageContent
27+ LanguageModelMessage
2828} from '../types/language-model' ;
2929import { match , stub } from 'sinon' ;
3030import { GenerateContentRequest , AIErrorCode } from '../types' ;
@@ -146,7 +146,7 @@ describe('ChromeAdapter', () => {
146146 } )
147147 ) . to . be . false ;
148148 } ) ;
149- it ( 'returns false if request content has non-user role' , async ( ) => {
149+ it ( 'returns false if request content has "function" role' , async ( ) => {
150150 const adapter = new ChromeAdapter (
151151 {
152152 availability : async ( ) => Availability . available
@@ -157,7 +157,7 @@ describe('ChromeAdapter', () => {
157157 await adapter . isAvailable ( {
158158 contents : [
159159 {
160- role : 'model ' ,
160+ role : 'function ' ,
161161 parts : [ ]
162162 }
163163 ]
@@ -320,7 +320,7 @@ describe('ChromeAdapter', () => {
320320 } as LanguageModel ;
321321 const languageModel = {
322322 // eslint-disable-next-line @typescript-eslint/no-unused-vars
323- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
323+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
324324 } as LanguageModel ;
325325 const createStub = stub ( languageModelProvider , 'create' ) . resolves (
326326 languageModel
@@ -345,8 +345,13 @@ describe('ChromeAdapter', () => {
345345 // Asserts Vertex input type is mapped to Chrome type.
346346 expect ( promptStub ) . to . have . been . calledOnceWith ( [
347347 {
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+ ]
350355 }
351356 ] ) ;
352357 // Asserts expected output.
@@ -366,7 +371,7 @@ describe('ChromeAdapter', () => {
366371 } as LanguageModel ;
367372 const languageModel = {
368373 // eslint-disable-next-line @typescript-eslint/no-unused-vars
369- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
374+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
370375 } as LanguageModel ;
371376 const createStub = stub ( languageModelProvider , 'create' ) . resolves (
372377 languageModel
@@ -404,12 +409,17 @@ describe('ChromeAdapter', () => {
404409 // Asserts Vertex input type is mapped to Chrome type.
405410 expect ( promptStub ) . to . have . been . calledOnceWith ( [
406411 {
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+ ]
413423 }
414424 ] ) ;
415425 // Asserts expected output.
@@ -426,7 +436,7 @@ describe('ChromeAdapter', () => {
426436 it ( 'honors prompt options' , async ( ) => {
427437 const languageModel = {
428438 // eslint-disable-next-line @typescript-eslint/no-unused-vars
429- prompt : ( p : LanguageModelMessageContent [ ] ) => Promise . resolve ( '' )
439+ prompt : ( p : LanguageModelMessage [ ] ) => Promise . resolve ( '' )
430440 } as LanguageModel ;
431441 const languageModelProvider = {
432442 create : ( ) => Promise . resolve ( languageModel )
@@ -450,13 +460,48 @@ describe('ChromeAdapter', () => {
450460 expect ( promptStub ) . to . have . been . calledOnceWith (
451461 [
452462 {
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+ ]
455470 }
456471 ] ,
457472 promptOptions
458473 ) ;
459474 } ) ;
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+ } ) ;
460505 } ) ;
461506 describe ( 'countTokens' , ( ) => {
462507 it ( 'counts tokens is not yet available' , async ( ) => {
@@ -528,8 +573,13 @@ describe('ChromeAdapter', () => {
528573 expect ( createStub ) . to . have . been . calledOnceWith ( createOptions ) ;
529574 expect ( promptStub ) . to . have . been . calledOnceWith ( [
530575 {
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+ ]
533583 }
534584 ] ) ;
535585 const actual = await toStringArray ( response . body ! ) ;
@@ -584,12 +634,17 @@ describe('ChromeAdapter', () => {
584634 expect ( createStub ) . to . have . been . calledOnceWith ( createOptions ) ;
585635 expect ( promptStub ) . to . have . been . calledOnceWith ( [
586636 {
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+ ]
593648 }
594649 ] ) ;
595650 const actual = await toStringArray ( response . body ! ) ;
@@ -625,13 +680,50 @@ describe('ChromeAdapter', () => {
625680 expect ( promptStub ) . to . have . been . calledOnceWith (
626681 [
627682 {
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+ ]
630690 }
631691 ] ,
632692 promptOptions
633693 ) ;
634694 } ) ;
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+ } ) ;
635727 } ) ;
636728} ) ;
637729
0 commit comments