1- import { generateObject , generateText } from 'ai' ;
1+ import { generateObject , generateText , jsonSchema } from 'ai' ;
22
33import { VercelProvider } from '../src/VercelProvider' ;
44
55// Mock Vercel AI SDK
66jest . mock ( 'ai' , ( ) => ( {
77 generateText : jest . fn ( ) ,
88 generateObject : jest . fn ( ) ,
9+ jsonSchema : jest . fn ( ( schema ) => schema ) ,
910} ) ) ;
1011
1112describe ( 'VercelProvider' , ( ) => {
@@ -15,6 +16,7 @@ describe('VercelProvider', () => {
1516 beforeEach ( ( ) => {
1617 mockModel = { name : 'test-model' } ;
1718 provider = new VercelProvider ( mockModel , { } ) ;
19+ jest . clearAllMocks ( ) ;
1820 } ) ;
1921
2022 describe ( 'createAIMetrics' , ( ) => {
@@ -117,76 +119,6 @@ describe('VercelProvider', () => {
117119 } ) ;
118120 } ) ;
119121
120- describe ( 'convertToZodSchema' , ( ) => {
121- it ( 'converts simple object structure to Zod schema' , ( ) => {
122- const responseStructure = {
123- name : 'string' ,
124- age : 0 ,
125- isActive : true ,
126- } ;
127-
128- const schema = VercelProvider . convertToZodSchema ( responseStructure ) ;
129-
130- expect ( schema ) . toBeDefined ( ) ;
131- expect ( typeof schema . parse ) . toBe ( 'function' ) ;
132- } ) ;
133-
134- it ( 'converts nested object structure to Zod schema' , ( ) => {
135- const responseStructure = {
136- user : {
137- name : 'string' ,
138- age : 0 ,
139- } ,
140- settings : {
141- theme : 'string' ,
142- notifications : true ,
143- } ,
144- } ;
145-
146- const schema = VercelProvider . convertToZodSchema ( responseStructure ) ;
147-
148- expect ( schema ) . toBeDefined ( ) ;
149- expect ( typeof schema . parse ) . toBe ( 'function' ) ;
150- } ) ;
151-
152- it ( 'converts array structure to Zod schema' , ( ) => {
153- const responseStructure = {
154- items : [ 'string' ] ,
155- numbers : [ 0 ] ,
156- booleans : [ true ] ,
157- } ;
158-
159- const schema = VercelProvider . convertToZodSchema ( responseStructure ) ;
160-
161- expect ( schema ) . toBeDefined ( ) ;
162- expect ( typeof schema . parse ) . toBe ( 'function' ) ;
163- } ) ;
164-
165- it ( 'handles empty array structure' , ( ) => {
166- const responseStructure = {
167- items : [ ] ,
168- } ;
169-
170- const schema = VercelProvider . convertToZodSchema ( responseStructure ) ;
171-
172- expect ( schema ) . toBeDefined ( ) ;
173- expect ( typeof schema . parse ) . toBe ( 'function' ) ;
174- } ) ;
175-
176- it ( 'handles null and undefined values' , ( ) => {
177- const responseStructure = {
178- nullable : null ,
179- undefined,
180- string : 'string' ,
181- } ;
182-
183- const schema = VercelProvider . convertToZodSchema ( responseStructure ) ;
184-
185- expect ( schema ) . toBeDefined ( ) ;
186- expect ( typeof schema . parse ) . toBe ( 'function' ) ;
187- } ) ;
188- } ) ;
189-
190122 describe ( 'invokeModel' , ( ) => {
191123 it ( 'invokes Vercel AI generateText and returns response' , async ( ) => {
192124 const mockResponse = {
@@ -247,6 +179,30 @@ describe('VercelProvider', () => {
247179 } ,
248180 } ) ;
249181 } ) ;
182+
183+ it ( 'handles errors and returns failure metrics' , async ( ) => {
184+ const mockError = new Error ( 'API call failed' ) ;
185+ ( generateText as jest . Mock ) . mockRejectedValue ( mockError ) ;
186+
187+ const mockLogger = {
188+ warn : jest . fn ( ) ,
189+ } ;
190+ provider = new VercelProvider ( mockModel , { } , mockLogger as any ) ;
191+
192+ const messages = [ { role : 'user' as const , content : 'Hello!' } ] ;
193+ const result = await provider . invokeModel ( messages ) ;
194+
195+ expect ( mockLogger . warn ) . toHaveBeenCalledWith ( 'Vercel AI model invocation failed:' , mockError ) ;
196+ expect ( result ) . toEqual ( {
197+ message : {
198+ role : 'assistant' ,
199+ content : '' ,
200+ } ,
201+ metrics : {
202+ success : false ,
203+ } ,
204+ } ) ;
205+ } ) ;
250206 } ) ;
251207
252208 describe ( 'invokeStructuredModel' , ( ) => {
@@ -278,8 +234,9 @@ describe('VercelProvider', () => {
278234 expect ( generateObject ) . toHaveBeenCalledWith ( {
279235 model : mockModel ,
280236 messages : [ { role : 'user' , content : 'Generate user data' } ] ,
281- schema : expect . any ( Object ) , // Zod schema
237+ schema : responseStructure ,
282238 } ) ;
239+ expect ( jsonSchema ) . toHaveBeenCalledWith ( responseStructure ) ;
283240
284241 expect ( result ) . toEqual ( {
285242 data : {
@@ -332,6 +289,35 @@ describe('VercelProvider', () => {
332289 } ,
333290 } ) ;
334291 } ) ;
292+
293+ it ( 'handles errors and returns failure metrics' , async ( ) => {
294+ const mockError = new Error ( 'API call failed' ) ;
295+ ( generateObject as jest . Mock ) . mockRejectedValue ( mockError ) ;
296+
297+ const mockLogger = {
298+ warn : jest . fn ( ) ,
299+ } ;
300+ provider = new VercelProvider ( mockModel , { } , mockLogger as any ) ;
301+
302+ const messages = [ { role : 'user' as const , content : 'Generate result' } ] ;
303+ const responseStructure = {
304+ result : 'string' ,
305+ } ;
306+
307+ const result = await provider . invokeStructuredModel ( messages , responseStructure ) ;
308+
309+ expect ( mockLogger . warn ) . toHaveBeenCalledWith (
310+ 'Vercel AI structured model invocation failed:' ,
311+ mockError ,
312+ ) ;
313+ expect ( result ) . toEqual ( {
314+ data : { } ,
315+ rawResponse : '' ,
316+ metrics : {
317+ success : false ,
318+ } ,
319+ } ) ;
320+ } ) ;
335321 } ) ;
336322
337323 describe ( 'getModel' , ( ) => {
0 commit comments