@@ -52,6 +52,59 @@ async function toStringArray(
52
52
}
53
53
54
54
describe ( '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
+ } ) ;
55
108
describe ( 'isAvailable' , ( ) => {
56
109
it ( 'returns false if mode is only cloud' , async ( ) => {
57
110
const adapter = new ChromeAdapter ( undefined , 'only_in_cloud' ) ;
@@ -100,6 +153,33 @@ describe('ChromeAdapter', () => {
100
153
} )
101
154
) . to . be . false ;
102
155
} ) ;
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
+ } ) ;
103
183
it ( 'returns true if model is readily available' , async ( ) => {
104
184
const languageModelProvider = {
105
185
availability : ( ) => Promise . resolve ( Availability . available )
@@ -110,7 +190,15 @@ describe('ChromeAdapter', () => {
110
190
) ;
111
191
expect (
112
192
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
+ ]
114
202
} )
115
203
) . to . be . true ;
116
204
} ) ;
0 commit comments