@@ -307,4 +307,56 @@ describe('ChromeAdapter', () => {
307307 } ) ;
308308 } ) ;
309309 } ) ;
310+ describe ( 'countTokens' , ( ) => {
311+ it ( 'counts tokens from a singular input' , async ( ) => {
312+ const inputText = 'first' ;
313+ const expectedCount = 10 ;
314+ const onDeviceParams = {
315+ systemPrompt : 'be yourself'
316+ } as LanguageModelCreateOptions ;
317+
318+ // setting up stubs
319+ const languageModelProvider = {
320+ create : ( ) => Promise . resolve ( { } )
321+ } as LanguageModel ;
322+ const languageModel = {
323+ measureInputUsage : _i => Promise . resolve ( 123 )
324+ } as LanguageModel ;
325+ const createStub = stub ( languageModelProvider , 'create' ) . resolves (
326+ languageModel
327+ ) ;
328+ // overrides impl with stub method
329+ const measureInputUsageStub = stub (
330+ languageModel ,
331+ 'measureInputUsage'
332+ ) . resolves ( expectedCount ) ;
333+
334+ const adapter = new ChromeAdapter (
335+ languageModelProvider ,
336+ 'prefer_on_device' ,
337+ onDeviceParams
338+ ) ;
339+ const countTokenRequest = {
340+ contents : [ { role : 'user' , parts : [ { text : inputText } ] } ]
341+ } as GenerateContentRequest ;
342+ const response = await adapter . countTokens ( countTokenRequest ) ;
343+ // Asserts initialization params are proxied.
344+ expect ( createStub ) . to . have . been . calledOnceWith ( onDeviceParams ) ;
345+ // Asserts Vertex input type is mapped to Chrome type.
346+ expect ( measureInputUsageStub ) . to . have . been . calledOnceWith ( [
347+ {
348+ role : 'user' ,
349+ content : [
350+ {
351+ type : 'text' ,
352+ content : inputText
353+ }
354+ ]
355+ }
356+ ] ) ;
357+ expect ( await response . json ( ) ) . to . deep . equal ( {
358+ totalTokens : expectedCount
359+ } ) ;
360+ } ) ;
361+ } ) ;
310362} ) ;
0 commit comments