@@ -52,6 +52,59 @@ async function toStringArray(
5252}
5353
5454describe ( 'ChromeAdapter' , ( ) => {
55+ describe ( 'constructor' , ( ) => {
56+ it ( 'sets image as expected input type by default' , async ( ) => {
57+ const languageModelProvider = {
58+ availability : ( ) => Promise . resolve ( Availability . available )
59+ } as LanguageModel ;
60+ const availabilityStub = stub (
61+ languageModelProvider ,
62+ 'availability'
63+ ) . resolves ( Availability . available ) ;
64+ const adapter = new ChromeAdapter (
65+ languageModelProvider ,
66+ 'prefer_on_device'
67+ ) ;
68+ await adapter . isAvailable ( {
69+ contents : [
70+ {
71+ role : 'user' ,
72+ parts : [ { text : 'hi' } ]
73+ }
74+ ]
75+ } ) ;
76+ expect ( availabilityStub ) . to . have . been . calledWith ( {
77+ expectedInputs : [ { type : 'image' } ]
78+ } ) ;
79+ } ) ;
80+ it ( 'honors explicitly set expected inputs' , async ( ) => {
81+ const languageModelProvider = {
82+ availability : ( ) => Promise . resolve ( Availability . available )
83+ } as LanguageModel ;
84+ const availabilityStub = stub (
85+ languageModelProvider ,
86+ 'availability'
87+ ) . resolves ( Availability . available ) ;
88+ const onDeviceParams = {
89+ // Explicitly sets expected inputs.
90+ expectedInputs : [ { type : 'text' } ]
91+ } as LanguageModelCreateOptions ;
92+ const adapter = new ChromeAdapter (
93+ languageModelProvider ,
94+ 'prefer_on_device' ,
95+ onDeviceParams
96+ ) ;
97+ await adapter . isAvailable ( {
98+ contents : [
99+ {
100+ role : 'user' ,
101+ parts : [ { text : 'hi' } ]
102+ }
103+ ]
104+ } ) ;
105+ expect ( availabilityStub ) . to . have . been . calledWith ( onDeviceParams ) ;
106+ } ) ;
107+ } ) ;
55108 describe ( 'isAvailable' , ( ) => {
56109 it ( 'returns false if mode is only cloud' , async ( ) => {
57110 const adapter = new ChromeAdapter ( undefined , 'only_in_cloud' ) ;
@@ -100,6 +153,33 @@ describe('ChromeAdapter', () => {
100153 } )
101154 ) . to . be . false ;
102155 } ) ;
156+ it ( 'returns true if request has image with supported mime type' , async ( ) => {
157+ const adapter = new ChromeAdapter (
158+ {
159+ availability : async ( ) => Availability . available
160+ } as LanguageModel ,
161+ 'prefer_on_device'
162+ ) ;
163+ for ( const mimeType of ChromeAdapter . SUPPORTED_MIME_TYPES ) {
164+ expect (
165+ await adapter . isAvailable ( {
166+ contents : [
167+ {
168+ role : 'user' ,
169+ parts : [
170+ {
171+ inlineData : {
172+ mimeType,
173+ data : ''
174+ }
175+ }
176+ ]
177+ }
178+ ]
179+ } )
180+ ) . to . be . true ;
181+ }
182+ } ) ;
103183 it ( 'returns true if model is readily available' , async ( ) => {
104184 const languageModelProvider = {
105185 availability : ( ) => Promise . resolve ( Availability . available )
@@ -110,7 +190,15 @@ describe('ChromeAdapter', () => {
110190 ) ;
111191 expect (
112192 await adapter . isAvailable ( {
113- contents : [ { role : 'user' , parts : [ { text : 'hi' } ] } ]
193+ contents : [
194+ {
195+ role : 'user' ,
196+ parts : [
197+ { text : 'describe this image' } ,
198+ { inlineData : { mimeType : 'image/jpeg' , data : 'asd' } }
199+ ]
200+ }
201+ ]
114202 } )
115203 ) . to . be . true ;
116204 } ) ;
0 commit comments