@livekit/agents 1.0.16 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/inference/llm.cjs +35 -13
  2. package/dist/inference/llm.cjs.map +1 -1
  3. package/dist/inference/llm.d.cts +10 -5
  4. package/dist/inference/llm.d.ts +10 -5
  5. package/dist/inference/llm.d.ts.map +1 -1
  6. package/dist/inference/llm.js +35 -13
  7. package/dist/inference/llm.js.map +1 -1
  8. package/dist/llm/chat_context.d.cts +1 -1
  9. package/dist/llm/chat_context.d.ts +1 -1
  10. package/dist/llm/llm.cjs.map +1 -1
  11. package/dist/llm/llm.d.cts +1 -1
  12. package/dist/llm/llm.d.ts +1 -1
  13. package/dist/llm/llm.d.ts.map +1 -1
  14. package/dist/llm/llm.js.map +1 -1
  15. package/dist/llm/provider_format/google.cjs.map +1 -1
  16. package/dist/llm/provider_format/google.d.cts +1 -1
  17. package/dist/llm/provider_format/google.d.ts +1 -1
  18. package/dist/llm/provider_format/google.d.ts.map +1 -1
  19. package/dist/llm/provider_format/google.js.map +1 -1
  20. package/dist/llm/provider_format/index.d.cts +1 -1
  21. package/dist/llm/provider_format/index.d.ts +1 -1
  22. package/dist/llm/provider_format/index.d.ts.map +1 -1
  23. package/dist/llm/realtime.cjs.map +1 -1
  24. package/dist/llm/realtime.d.cts +4 -0
  25. package/dist/llm/realtime.d.ts +4 -0
  26. package/dist/llm/realtime.d.ts.map +1 -1
  27. package/dist/llm/realtime.js.map +1 -1
  28. package/dist/llm/utils.cjs +2 -2
  29. package/dist/llm/utils.cjs.map +1 -1
  30. package/dist/llm/utils.d.cts +1 -1
  31. package/dist/llm/utils.d.ts +1 -1
  32. package/dist/llm/utils.d.ts.map +1 -1
  33. package/dist/llm/utils.js +2 -2
  34. package/dist/llm/utils.js.map +1 -1
  35. package/dist/llm/zod-utils.cjs +6 -3
  36. package/dist/llm/zod-utils.cjs.map +1 -1
  37. package/dist/llm/zod-utils.d.cts +1 -1
  38. package/dist/llm/zod-utils.d.ts +1 -1
  39. package/dist/llm/zod-utils.d.ts.map +1 -1
  40. package/dist/llm/zod-utils.js +6 -3
  41. package/dist/llm/zod-utils.js.map +1 -1
  42. package/dist/llm/zod-utils.test.cjs +83 -0
  43. package/dist/llm/zod-utils.test.cjs.map +1 -1
  44. package/dist/llm/zod-utils.test.js +83 -0
  45. package/dist/llm/zod-utils.test.js.map +1 -1
  46. package/dist/stt/stt.cjs +0 -1
  47. package/dist/stt/stt.cjs.map +1 -1
  48. package/dist/stt/stt.d.ts.map +1 -1
  49. package/dist/stt/stt.js +0 -1
  50. package/dist/stt/stt.js.map +1 -1
  51. package/dist/tts/tts.cjs +2 -4
  52. package/dist/tts/tts.cjs.map +1 -1
  53. package/dist/tts/tts.d.ts.map +1 -1
  54. package/dist/tts/tts.js +3 -5
  55. package/dist/tts/tts.js.map +1 -1
  56. package/dist/utils.cjs.map +1 -1
  57. package/dist/utils.d.cts +7 -0
  58. package/dist/utils.d.ts +7 -0
  59. package/dist/utils.d.ts.map +1 -1
  60. package/dist/utils.js.map +1 -1
  61. package/dist/voice/agent_activity.cjs +69 -20
  62. package/dist/voice/agent_activity.cjs.map +1 -1
  63. package/dist/voice/agent_activity.d.ts.map +1 -1
  64. package/dist/voice/agent_activity.js +69 -20
  65. package/dist/voice/agent_activity.js.map +1 -1
  66. package/dist/voice/agent_session.cjs +40 -1
  67. package/dist/voice/agent_session.cjs.map +1 -1
  68. package/dist/voice/agent_session.d.cts +5 -0
  69. package/dist/voice/agent_session.d.ts +5 -0
  70. package/dist/voice/agent_session.d.ts.map +1 -1
  71. package/dist/voice/agent_session.js +40 -1
  72. package/dist/voice/agent_session.js.map +1 -1
  73. package/dist/voice/interruption_detection.test.cjs +114 -0
  74. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  75. package/dist/voice/interruption_detection.test.js +113 -0
  76. package/dist/voice/interruption_detection.test.js.map +1 -0
  77. package/dist/voice/room_io/room_io.cjs +3 -0
  78. package/dist/voice/room_io/room_io.cjs.map +1 -1
  79. package/dist/voice/room_io/room_io.d.cts +1 -0
  80. package/dist/voice/room_io/room_io.d.ts +1 -0
  81. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  82. package/dist/voice/room_io/room_io.js +3 -0
  83. package/dist/voice/room_io/room_io.js.map +1 -1
  84. package/package.json +3 -3
  85. package/src/inference/llm.ts +53 -21
  86. package/src/llm/__snapshots__/zod-utils.test.ts.snap +218 -0
  87. package/src/llm/llm.ts +1 -1
  88. package/src/llm/provider_format/google.ts +4 -4
  89. package/src/llm/realtime.ts +8 -1
  90. package/src/llm/utils.ts +7 -2
  91. package/src/llm/zod-utils.test.ts +101 -0
  92. package/src/llm/zod-utils.ts +12 -3
  93. package/src/stt/stt.ts +2 -1
  94. package/src/tts/tts.ts +7 -5
  95. package/src/utils.ts +17 -0
  96. package/src/voice/agent_activity.ts +96 -24
  97. package/src/voice/agent_session.ts +54 -0
  98. package/src/voice/interruption_detection.test.ts +151 -0
  99. package/src/voice/room_io/room_io.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/llm/zod-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { zodToJsonSchema as zodToJsonSchemaV3 } from 'zod-to-json-schema';\nimport type * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\n\n/**\n * Result type from Zod schema parsing.\n */\nexport type ZodParseResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; error: unknown };\n\n/**\n * Type definition for Zod schemas that works with both v3 and v4.\n * Uses a union type of both Zod v3 and v4 schema types.\n *\n * Adapted from Vercel AI SDK's zodSchema function signature.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;\n\n/**\n * Detects if a schema is a Zod v4 schema.\n * Zod v4 schemas have a `_zod` property that v3 schemas don't have.\n *\n * @param schema - The schema to check\n * @returns True if the schema is a Zod v4 schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Required to match Zod v4's type signature\nexport function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in schema;\n}\n\n/**\n * Checks if a value is a Zod schema (either v3 or v4).\n *\n * @param value - The value to check\n * @returns True if the value is a Zod schema\n */\nexport function isZodSchema(value: unknown): value is ZodSchema {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n // Check for v4 schema (_zod property)\n if ('_zod' in value) {\n return true;\n }\n\n // Check for v3 schema (_def property with typeName)\n if ('_def' in value && typeof value._def === 'object' && value._def !== null) {\n const def = value._def as Record<string, unknown>;\n if ('typeName' in def) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Checks if a Zod schema is an object schema.\n *\n * @param schema - The schema to check\n * @returns True if the schema is an object schema\n */\nexport function isZodObjectSchema(schema: ZodSchema): boolean {\n // Need to access internal Zod properties to check schema type\n const schemaWithInternals = schema as {\n _def?: { type?: string; typeName?: string };\n _zod?: { traits?: Set<string> };\n };\n\n // Check for v4 schema first\n if (isZod4Schema(schema)) {\n // v4 uses _def.type and _zod.traits\n return (\n schemaWithInternals._def?.type === 'object' ||\n schemaWithInternals._zod?.traits?.has('ZodObject') ||\n false\n );\n }\n\n // v3 uses _def.typeName\n return schemaWithInternals._def?.typeName === 'ZodObject';\n}\n\n/**\n * Converts a Zod schema to JSON Schema format.\n * Handles both Zod v3 and v4 schemas automatically.\n *\n * Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269\n *\n * @param schema - The Zod schema to convert\n * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)\n * @returns A JSON Schema representation of the Zod schema\n */\nexport function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai: boolean = true): JSONSchema7 {\n if (isZod4Schema(schema)) {\n // Zod v4 has native toJSONSchema support\n // Configuration adapted from Vercel AI SDK to support OpenAPI conversion for Google\n // Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L255-L258\n return z4.toJSONSchema(schema, {\n target: 'draft-7',\n io: 'output',\n reused: 'inline', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n } else {\n // Zod v3 requires the zod-to-json-schema library\n // Configuration adapted from Vercel AI SDK\n // $refStrategy: 'none' is equivalent to v4's reused: 'inline'\n return zodToJsonSchemaV3(schema, {\n target: isOpenai ? 'openAi' : 'jsonSchema7',\n $refStrategy: 'none', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n }\n}\n\n/**\n * Parses a value against a Zod schema.\n * Handles both Zod v3 and v4 parse APIs automatically.\n *\n * @param schema - The Zod schema to parse against\n * @param value - The value to parse\n * @returns A promise that resolves to the parse result\n */\nexport async function parseZodSchema<T = unknown>(\n schema: ZodSchema,\n value: unknown,\n): Promise<ZodParseResult<T>> {\n if (isZod4Schema(schema)) {\n const result = await z4.safeParseAsync(schema, value);\n return result as ZodParseResult<T>;\n } else {\n const result = await schema.safeParseAsync(value);\n return result as ZodParseResult<T>;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,gCAAqD;AAErD,SAAoB;AA2Bb,SAAS,aAAa,QAAyD;AAEpF,SAAO,UAAU;AACnB;AAQO,SAAS,YAAY,OAAoC;AAC9D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,MAAM;AAC5E,UAAM,MAAM,MAAM;AAClB,QAAI,cAAc,KAAK;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,kBAAkB,QAA4B;AAvE9D;AAyEE,QAAM,sBAAsB;AAM5B,MAAI,aAAa,MAAM,GAAG;AAExB,aACE,yBAAoB,SAApB,mBAA0B,UAAS,cACnC,+BAAoB,SAApB,mBAA0B,WAA1B,mBAAkC,IAAI,iBACtC;AAAA,EAEJ;AAGA,WAAO,yBAAoB,SAApB,mBAA0B,cAAa;AAChD;AAaO,SAAS,sBAAsB,QAAmB,WAAoB,MAAmB;AAC9F,MAAI,aAAa,MAAM,GAAG;AAIxB,WAAO,GAAG,aAAa,QAAQ;AAAA,MAC7B,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AAIL,eAAO,0BAAAA,iBAAkB,QAAQ;AAAA,MAC/B,QAAQ,WAAW,WAAW;AAAA,MAC9B,cAAc;AAAA;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AAUA,eAAsB,eACpB,QACA,OAC4B;AAC5B,MAAI,aAAa,MAAM,GAAG;AACxB,UAAM,SAAS,MAAM,GAAG,eAAe,QAAQ,KAAK;AACpD,WAAO;AAAA,EACT,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,eAAe,KAAK;AAChD,WAAO;AAAA,EACT;AACF;","names":["zodToJsonSchemaV3"]}
1
+ {"version":3,"sources":["../../src/llm/zod-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { toStrictJsonSchema } from 'openai/lib/transform';\nimport { zodToJsonSchema as zodToJsonSchemaV3 } from 'zod-to-json-schema';\nimport type * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\n\n/**\n * Result type from Zod schema parsing.\n */\nexport type ZodParseResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; error: unknown };\n\n/**\n * Type definition for Zod schemas that works with both v3 and v4.\n * Uses a union type of both Zod v3 and v4 schema types.\n *\n * Adapted from Vercel AI SDK's zodSchema function signature.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;\n\n/**\n * Detects if a schema is a Zod v4 schema.\n * Zod v4 schemas have a `_zod` property that v3 schemas don't have.\n *\n * @param schema - The schema to check\n * @returns True if the schema is a Zod v4 schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Required to match Zod v4's type signature\nexport function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in schema;\n}\n\n/**\n * Checks if a value is a Zod schema (either v3 or v4).\n *\n * @param value - The value to check\n * @returns True if the value is a Zod schema\n */\nexport function isZodSchema(value: unknown): value is ZodSchema {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n // Check for v4 schema (_zod property)\n if ('_zod' in value) {\n return true;\n }\n\n // Check for v3 schema (_def property with typeName)\n if ('_def' in value && typeof value._def === 'object' && value._def !== null) {\n const def = value._def as Record<string, unknown>;\n if ('typeName' in def) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Checks if a Zod schema is an object schema.\n *\n * @param schema - The schema to check\n * @returns True if the schema is an object schema\n */\nexport function isZodObjectSchema(schema: ZodSchema): boolean {\n // Need to access internal Zod properties to check schema type\n const schemaWithInternals = schema as {\n _def?: { type?: string; typeName?: string };\n _zod?: { traits?: Set<string> };\n };\n\n // Check for v4 schema first\n if (isZod4Schema(schema)) {\n // v4 uses _def.type and _zod.traits\n return (\n schemaWithInternals._def?.type === 'object' ||\n schemaWithInternals._zod?.traits?.has('ZodObject') ||\n false\n );\n }\n\n // v3 uses _def.typeName\n return schemaWithInternals._def?.typeName === 'ZodObject';\n}\n\n/**\n * Converts a Zod schema to JSON Schema format.\n * Handles both Zod v3 and v4 schemas automatically.\n *\n * Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269\n *\n * @param schema - The Zod schema to convert\n * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)\n * @returns A JSON Schema representation of the Zod schema\n */\nexport function zodSchemaToJsonSchema(\n schema: ZodSchema,\n isOpenai: boolean = true,\n strict: boolean = false,\n): JSONSchema7 {\n let result: JSONSchema7;\n\n if (isZod4Schema(schema)) {\n // Zod v4 has native toJSONSchema support\n // Configuration adapted from Vercel AI SDK to support OpenAPI conversion for Google\n // Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L255-L258\n result = z4.toJSONSchema(schema, {\n target: 'draft-7',\n io: 'output',\n reused: 'inline', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n } else {\n // Zod v3 requires the zod-to-json-schema library\n // Configuration adapted from Vercel AI SDK\n // $refStrategy: 'none' is equivalent to v4's reused: 'inline'\n result = zodToJsonSchemaV3(schema, {\n target: isOpenai ? 'openAi' : 'jsonSchema7',\n $refStrategy: 'none', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n }\n\n return strict ? (toStrictJsonSchema(result) as JSONSchema7) : result;\n}\n\n/**\n * Parses a value against a Zod schema.\n * Handles both Zod v3 and v4 parse APIs automatically.\n *\n * @param schema - The Zod schema to parse against\n * @param value - The value to parse\n * @returns A promise that resolves to the parse result\n */\nexport async function parseZodSchema<T = unknown>(\n schema: ZodSchema,\n value: unknown,\n): Promise<ZodParseResult<T>> {\n if (isZod4Schema(schema)) {\n const result = await z4.safeParseAsync(schema, value);\n return result as ZodParseResult<T>;\n } else {\n const result = await schema.safeParseAsync(value);\n return result as ZodParseResult<T>;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,uBAAmC;AACnC,gCAAqD;AAErD,SAAoB;AA2Bb,SAAS,aAAa,QAAyD;AAEpF,SAAO,UAAU;AACnB;AAQO,SAAS,YAAY,OAAoC;AAC9D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,MAAM;AAC5E,UAAM,MAAM,MAAM;AAClB,QAAI,cAAc,KAAK;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,kBAAkB,QAA4B;AAxE9D;AA0EE,QAAM,sBAAsB;AAM5B,MAAI,aAAa,MAAM,GAAG;AAExB,aACE,yBAAoB,SAApB,mBAA0B,UAAS,cACnC,+BAAoB,SAApB,mBAA0B,WAA1B,mBAAkC,IAAI,iBACtC;AAAA,EAEJ;AAGA,WAAO,yBAAoB,SAApB,mBAA0B,cAAa;AAChD;AAaO,SAAS,sBACd,QACA,WAAoB,MACpB,SAAkB,OACL;AACb,MAAI;AAEJ,MAAI,aAAa,MAAM,GAAG;AAIxB,aAAS,GAAG,aAAa,QAAQ;AAAA,MAC/B,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AAIL,iBAAS,0BAAAA,iBAAkB,QAAQ;AAAA,MACjC,QAAQ,WAAW,WAAW;AAAA,MAC9B,cAAc;AAAA;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO,aAAU,qCAAmB,MAAM,IAAoB;AAChE;AAUA,eAAsB,eACpB,QACA,OAC4B;AAC5B,MAAI,aAAa,MAAM,GAAG;AACxB,UAAM,SAAS,MAAM,GAAG,eAAe,QAAQ,KAAK;AACpD,WAAO;AAAA,EACT,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,eAAe,KAAK;AAChD,WAAO;AAAA,EACT;AACF;","names":["zodToJsonSchemaV3"]}
@@ -52,7 +52,7 @@ export declare function isZodObjectSchema(schema: ZodSchema): boolean;
52
52
  * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)
53
53
  * @returns A JSON Schema representation of the Zod schema
54
54
  */
55
- export declare function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai?: boolean): JSONSchema7;
55
+ export declare function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai?: boolean, strict?: boolean): JSONSchema7;
56
56
  /**
57
57
  * Parses a value against a Zod schema.
58
58
  * Handles both Zod v3 and v4 parse APIs automatically.
@@ -52,7 +52,7 @@ export declare function isZodObjectSchema(schema: ZodSchema): boolean;
52
52
  * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)
53
53
  * @returns A JSON Schema representation of the Zod schema
54
54
  */
55
- export declare function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai?: boolean): JSONSchema7;
55
+ export declare function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai?: boolean, strict?: boolean): JSONSchema7;
56
56
  /**
57
57
  * Parses a value against a Zod schema.
58
58
  * Handles both Zod v3 and v4 parse APIs automatically.
@@ -1 +1 @@
1
- {"version":3,"file":"zod-utils.d.ts","sourceRoot":"","sources":["../../src/llm/zod-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAClC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvC;;;;;;GAMG;AAEH,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAExF;;;;;;GAMG;AAEH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAGpF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAmB9D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAmB5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAE,OAAc,GAAG,WAAW,CAmB9F;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAQ5B"}
1
+ {"version":3,"file":"zod-utils.d.ts","sourceRoot":"","sources":["../../src/llm/zod-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAClC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvC;;;;;;GAMG;AAEH,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAExF;;;;;;GAMG;AAEH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAGpF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAmB9D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAmB5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,QAAQ,GAAE,OAAc,EACxB,MAAM,GAAE,OAAe,GACtB,WAAW,CAuBb;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAQ5B"}
@@ -1,3 +1,4 @@
1
+ import { toStrictJsonSchema } from "openai/lib/transform";
1
2
  import { zodToJsonSchema as zodToJsonSchemaV3 } from "zod-to-json-schema";
2
3
  import * as z4 from "zod/v4";
3
4
  function isZod4Schema(schema) {
@@ -26,21 +27,23 @@ function isZodObjectSchema(schema) {
26
27
  }
27
28
  return ((_d = schemaWithInternals._def) == null ? void 0 : _d.typeName) === "ZodObject";
28
29
  }
29
- function zodSchemaToJsonSchema(schema, isOpenai = true) {
30
+ function zodSchemaToJsonSchema(schema, isOpenai = true, strict = false) {
31
+ let result;
30
32
  if (isZod4Schema(schema)) {
31
- return z4.toJSONSchema(schema, {
33
+ result = z4.toJSONSchema(schema, {
32
34
  target: "draft-7",
33
35
  io: "output",
34
36
  reused: "inline"
35
37
  // Don't use references by default (to support openapi conversion for google)
36
38
  });
37
39
  } else {
38
- return zodToJsonSchemaV3(schema, {
40
+ result = zodToJsonSchemaV3(schema, {
39
41
  target: isOpenai ? "openAi" : "jsonSchema7",
40
42
  $refStrategy: "none"
41
43
  // Don't use references by default (to support openapi conversion for google)
42
44
  });
43
45
  }
46
+ return strict ? toStrictJsonSchema(result) : result;
44
47
  }
45
48
  async function parseZodSchema(schema, value) {
46
49
  if (isZod4Schema(schema)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/llm/zod-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { zodToJsonSchema as zodToJsonSchemaV3 } from 'zod-to-json-schema';\nimport type * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\n\n/**\n * Result type from Zod schema parsing.\n */\nexport type ZodParseResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; error: unknown };\n\n/**\n * Type definition for Zod schemas that works with both v3 and v4.\n * Uses a union type of both Zod v3 and v4 schema types.\n *\n * Adapted from Vercel AI SDK's zodSchema function signature.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;\n\n/**\n * Detects if a schema is a Zod v4 schema.\n * Zod v4 schemas have a `_zod` property that v3 schemas don't have.\n *\n * @param schema - The schema to check\n * @returns True if the schema is a Zod v4 schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Required to match Zod v4's type signature\nexport function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in schema;\n}\n\n/**\n * Checks if a value is a Zod schema (either v3 or v4).\n *\n * @param value - The value to check\n * @returns True if the value is a Zod schema\n */\nexport function isZodSchema(value: unknown): value is ZodSchema {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n // Check for v4 schema (_zod property)\n if ('_zod' in value) {\n return true;\n }\n\n // Check for v3 schema (_def property with typeName)\n if ('_def' in value && typeof value._def === 'object' && value._def !== null) {\n const def = value._def as Record<string, unknown>;\n if ('typeName' in def) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Checks if a Zod schema is an object schema.\n *\n * @param schema - The schema to check\n * @returns True if the schema is an object schema\n */\nexport function isZodObjectSchema(schema: ZodSchema): boolean {\n // Need to access internal Zod properties to check schema type\n const schemaWithInternals = schema as {\n _def?: { type?: string; typeName?: string };\n _zod?: { traits?: Set<string> };\n };\n\n // Check for v4 schema first\n if (isZod4Schema(schema)) {\n // v4 uses _def.type and _zod.traits\n return (\n schemaWithInternals._def?.type === 'object' ||\n schemaWithInternals._zod?.traits?.has('ZodObject') ||\n false\n );\n }\n\n // v3 uses _def.typeName\n return schemaWithInternals._def?.typeName === 'ZodObject';\n}\n\n/**\n * Converts a Zod schema to JSON Schema format.\n * Handles both Zod v3 and v4 schemas automatically.\n *\n * Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269\n *\n * @param schema - The Zod schema to convert\n * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)\n * @returns A JSON Schema representation of the Zod schema\n */\nexport function zodSchemaToJsonSchema(schema: ZodSchema, isOpenai: boolean = true): JSONSchema7 {\n if (isZod4Schema(schema)) {\n // Zod v4 has native toJSONSchema support\n // Configuration adapted from Vercel AI SDK to support OpenAPI conversion for Google\n // Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L255-L258\n return z4.toJSONSchema(schema, {\n target: 'draft-7',\n io: 'output',\n reused: 'inline', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n } else {\n // Zod v3 requires the zod-to-json-schema library\n // Configuration adapted from Vercel AI SDK\n // $refStrategy: 'none' is equivalent to v4's reused: 'inline'\n return zodToJsonSchemaV3(schema, {\n target: isOpenai ? 'openAi' : 'jsonSchema7',\n $refStrategy: 'none', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n }\n}\n\n/**\n * Parses a value against a Zod schema.\n * Handles both Zod v3 and v4 parse APIs automatically.\n *\n * @param schema - The Zod schema to parse against\n * @param value - The value to parse\n * @returns A promise that resolves to the parse result\n */\nexport async function parseZodSchema<T = unknown>(\n schema: ZodSchema,\n value: unknown,\n): Promise<ZodParseResult<T>> {\n if (isZod4Schema(schema)) {\n const result = await z4.safeParseAsync(schema, value);\n return result as ZodParseResult<T>;\n } else {\n const result = await schema.safeParseAsync(value);\n return result as ZodParseResult<T>;\n }\n}\n"],"mappings":"AAIA,SAAS,mBAAmB,yBAAyB;AAErD,YAAY,QAAQ;AA2Bb,SAAS,aAAa,QAAyD;AAEpF,SAAO,UAAU;AACnB;AAQO,SAAS,YAAY,OAAoC;AAC9D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,MAAM;AAC5E,UAAM,MAAM,MAAM;AAClB,QAAI,cAAc,KAAK;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,kBAAkB,QAA4B;AAvE9D;AAyEE,QAAM,sBAAsB;AAM5B,MAAI,aAAa,MAAM,GAAG;AAExB,aACE,yBAAoB,SAApB,mBAA0B,UAAS,cACnC,+BAAoB,SAApB,mBAA0B,WAA1B,mBAAkC,IAAI,iBACtC;AAAA,EAEJ;AAGA,WAAO,yBAAoB,SAApB,mBAA0B,cAAa;AAChD;AAaO,SAAS,sBAAsB,QAAmB,WAAoB,MAAmB;AAC9F,MAAI,aAAa,MAAM,GAAG;AAIxB,WAAO,GAAG,aAAa,QAAQ;AAAA,MAC7B,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AAIL,WAAO,kBAAkB,QAAQ;AAAA,MAC/B,QAAQ,WAAW,WAAW;AAAA,MAC9B,cAAc;AAAA;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AAUA,eAAsB,eACpB,QACA,OAC4B;AAC5B,MAAI,aAAa,MAAM,GAAG;AACxB,UAAM,SAAS,MAAM,GAAG,eAAe,QAAQ,KAAK;AACpD,WAAO;AAAA,EACT,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,eAAe,KAAK;AAChD,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/llm/zod-utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JSONSchema7 } from 'json-schema';\nimport { toStrictJsonSchema } from 'openai/lib/transform';\nimport { zodToJsonSchema as zodToJsonSchemaV3 } from 'zod-to-json-schema';\nimport type * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\n\n/**\n * Result type from Zod schema parsing.\n */\nexport type ZodParseResult<T = unknown> =\n | { success: true; data: T }\n | { success: false; error: unknown };\n\n/**\n * Type definition for Zod schemas that works with both v3 and v4.\n * Uses a union type of both Zod v3 and v4 schema types.\n *\n * Adapted from Vercel AI SDK's zodSchema function signature.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L278-L281\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ZodSchema = z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>;\n\n/**\n * Detects if a schema is a Zod v4 schema.\n * Zod v4 schemas have a `_zod` property that v3 schemas don't have.\n *\n * @param schema - The schema to check\n * @returns True if the schema is a Zod v4 schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Required to match Zod v4's type signature\nexport function isZod4Schema(schema: ZodSchema): schema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in schema;\n}\n\n/**\n * Checks if a value is a Zod schema (either v3 or v4).\n *\n * @param value - The value to check\n * @returns True if the value is a Zod schema\n */\nexport function isZodSchema(value: unknown): value is ZodSchema {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n // Check for v4 schema (_zod property)\n if ('_zod' in value) {\n return true;\n }\n\n // Check for v3 schema (_def property with typeName)\n if ('_def' in value && typeof value._def === 'object' && value._def !== null) {\n const def = value._def as Record<string, unknown>;\n if ('typeName' in def) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Checks if a Zod schema is an object schema.\n *\n * @param schema - The schema to check\n * @returns True if the schema is an object schema\n */\nexport function isZodObjectSchema(schema: ZodSchema): boolean {\n // Need to access internal Zod properties to check schema type\n const schemaWithInternals = schema as {\n _def?: { type?: string; typeName?: string };\n _zod?: { traits?: Set<string> };\n };\n\n // Check for v4 schema first\n if (isZod4Schema(schema)) {\n // v4 uses _def.type and _zod.traits\n return (\n schemaWithInternals._def?.type === 'object' ||\n schemaWithInternals._zod?.traits?.has('ZodObject') ||\n false\n );\n }\n\n // v3 uses _def.typeName\n return schemaWithInternals._def?.typeName === 'ZodObject';\n}\n\n/**\n * Converts a Zod schema to JSON Schema format.\n * Handles both Zod v3 and v4 schemas automatically.\n *\n * Adapted from Vercel AI SDK's zod3Schema and zod4Schema functions.\n * Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L237-L269\n *\n * @param schema - The Zod schema to convert\n * @param isOpenai - Whether to use OpenAI-specific formatting (default: true)\n * @returns A JSON Schema representation of the Zod schema\n */\nexport function zodSchemaToJsonSchema(\n schema: ZodSchema,\n isOpenai: boolean = true,\n strict: boolean = false,\n): JSONSchema7 {\n let result: JSONSchema7;\n\n if (isZod4Schema(schema)) {\n // Zod v4 has native toJSONSchema support\n // Configuration adapted from Vercel AI SDK to support OpenAPI conversion for Google\n // Source: https://github.com/vercel/ai/blob/main/packages/provider-utils/src/schema.ts#L255-L258\n result = z4.toJSONSchema(schema, {\n target: 'draft-7',\n io: 'output',\n reused: 'inline', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n } else {\n // Zod v3 requires the zod-to-json-schema library\n // Configuration adapted from Vercel AI SDK\n // $refStrategy: 'none' is equivalent to v4's reused: 'inline'\n result = zodToJsonSchemaV3(schema, {\n target: isOpenai ? 'openAi' : 'jsonSchema7',\n $refStrategy: 'none', // Don't use references by default (to support openapi conversion for google)\n }) as JSONSchema7;\n }\n\n return strict ? (toStrictJsonSchema(result) as JSONSchema7) : result;\n}\n\n/**\n * Parses a value against a Zod schema.\n * Handles both Zod v3 and v4 parse APIs automatically.\n *\n * @param schema - The Zod schema to parse against\n * @param value - The value to parse\n * @returns A promise that resolves to the parse result\n */\nexport async function parseZodSchema<T = unknown>(\n schema: ZodSchema,\n value: unknown,\n): Promise<ZodParseResult<T>> {\n if (isZod4Schema(schema)) {\n const result = await z4.safeParseAsync(schema, value);\n return result as ZodParseResult<T>;\n } else {\n const result = await schema.safeParseAsync(value);\n return result as ZodParseResult<T>;\n }\n}\n"],"mappings":"AAIA,SAAS,0BAA0B;AACnC,SAAS,mBAAmB,yBAAyB;AAErD,YAAY,QAAQ;AA2Bb,SAAS,aAAa,QAAyD;AAEpF,SAAO,UAAU;AACnB;AAQO,SAAS,YAAY,OAAoC;AAC9D,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS,MAAM;AAC5E,UAAM,MAAM,MAAM;AAClB,QAAI,cAAc,KAAK;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,kBAAkB,QAA4B;AAxE9D;AA0EE,QAAM,sBAAsB;AAM5B,MAAI,aAAa,MAAM,GAAG;AAExB,aACE,yBAAoB,SAApB,mBAA0B,UAAS,cACnC,+BAAoB,SAApB,mBAA0B,WAA1B,mBAAkC,IAAI,iBACtC;AAAA,EAEJ;AAGA,WAAO,yBAAoB,SAApB,mBAA0B,cAAa;AAChD;AAaO,SAAS,sBACd,QACA,WAAoB,MACpB,SAAkB,OACL;AACb,MAAI;AAEJ,MAAI,aAAa,MAAM,GAAG;AAIxB,aAAS,GAAG,aAAa,QAAQ;AAAA,MAC/B,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH,OAAO;AAIL,aAAS,kBAAkB,QAAQ;AAAA,MACjC,QAAQ,WAAW,WAAW;AAAA,MAC9B,cAAc;AAAA;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO,SAAU,mBAAmB,MAAM,IAAoB;AAChE;AAUA,eAAsB,eACpB,QACA,OAC4B;AAC5B,MAAI,aAAa,MAAM,GAAG;AACxB,UAAM,SAAS,MAAM,GAAG,eAAe,QAAQ,KAAK;AACpD,WAAO;AAAA,EACT,OAAO;AACL,UAAM,SAAS,MAAM,OAAO,eAAe,KAAK;AAChD,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -222,6 +222,89 @@ var import_zod_utils = require("./zod-utils.cjs");
222
222
  (0, import_vitest.expect)(jsonSchema7).toHaveProperty("properties");
223
223
  });
224
224
  });
225
+ (0, import_vitest.describe)("strict parameter", () => {
226
+ (0, import_vitest.it)("should produce strict JSON schema with strict: true", () => {
227
+ const schema = z4.object({
228
+ name: z4.string(),
229
+ age: z4.number()
230
+ });
231
+ const strictSchema = (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true);
232
+ (0, import_vitest.expect)(strictSchema).toMatchSnapshot();
233
+ });
234
+ (0, import_vitest.it)("should handle nullable fields in strict mode", () => {
235
+ const schema = z4.object({
236
+ required: z4.string(),
237
+ optional: z4.string().nullable()
238
+ });
239
+ const strictSchema = (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true);
240
+ (0, import_vitest.expect)(strictSchema).toMatchSnapshot();
241
+ });
242
+ (0, import_vitest.it)("should handle default values in strict mode", () => {
243
+ const schema = z4.object({
244
+ name: z4.string(),
245
+ role: z4.string().default("user"),
246
+ active: z4.boolean().default(true)
247
+ });
248
+ const strictSchema = (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true);
249
+ (0, import_vitest.expect)(strictSchema).toMatchSnapshot();
250
+ });
251
+ (0, import_vitest.it)("should handle nested objects in strict mode", () => {
252
+ const schema = z4.object({
253
+ user: z4.object({
254
+ name: z4.string(),
255
+ email: z4.string().nullable()
256
+ }),
257
+ metadata: z4.object({
258
+ created: z4.string()
259
+ })
260
+ });
261
+ const strictSchema = (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true);
262
+ (0, import_vitest.expect)(strictSchema).toMatchSnapshot();
263
+ });
264
+ (0, import_vitest.it)("should handle arrays in strict mode", () => {
265
+ const schema = z4.object({
266
+ tags: z4.array(z4.string()),
267
+ numbers: z4.array(z4.number())
268
+ });
269
+ const strictSchema = (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true);
270
+ (0, import_vitest.expect)(strictSchema).toMatchSnapshot();
271
+ });
272
+ (0, import_vitest.it)("should handle v3 schemas in strict mode", () => {
273
+ const schema = z3.object({
274
+ name: z3.string(),
275
+ age: z3.number().optional()
276
+ });
277
+ const strictSchema = (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true);
278
+ (0, import_vitest.expect)(strictSchema).toMatchSnapshot();
279
+ });
280
+ (0, import_vitest.it)("should throw error when using .optional() without .nullable() in strict mode", () => {
281
+ const schema = z4.object({
282
+ required: z4.string(),
283
+ optional: z4.string().optional()
284
+ });
285
+ (0, import_vitest.expect)(() => (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true)).toThrow(
286
+ /uses `.optional\(\)` without `.nullable\(\)` which is not supported by the API/
287
+ );
288
+ });
289
+ (0, import_vitest.it)("should throw error for nested .optional() fields in strict mode", () => {
290
+ const schema = z4.object({
291
+ user: z4.object({
292
+ name: z4.string(),
293
+ email: z4.string().optional()
294
+ })
295
+ });
296
+ (0, import_vitest.expect)(() => (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, true)).toThrow(
297
+ /uses `.optional\(\)` without `.nullable\(\)` which is not supported by the API/
298
+ );
299
+ });
300
+ (0, import_vitest.it)("should NOT throw error when using .optional() in non-strict mode", () => {
301
+ const schema = z4.object({
302
+ required: z4.string(),
303
+ optional: z4.string().optional()
304
+ });
305
+ (0, import_vitest.expect)(() => (0, import_zod_utils.zodSchemaToJsonSchema)(schema, true, false)).not.toThrow();
306
+ });
307
+ });
225
308
  });
226
309
  (0, import_vitest.describe)("parseZodSchema", () => {
227
310
  (0, import_vitest.describe)("Zod v4 schemas", () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/llm/zod-utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { z } from 'zod';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport {\n isZod4Schema,\n isZodObjectSchema,\n isZodSchema,\n parseZodSchema,\n zodSchemaToJsonSchema,\n} from './zod-utils.js';\n\ntype JSONSchemaProperties = Record<string, Record<string, unknown>>;\n\ndescribe('Zod Utils', () => {\n describe('isZod4Schema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.string();\n expect(isZod4Schema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.string();\n expect(isZod4Schema(v3Schema)).toBe(false);\n });\n\n it('should handle default z import (follows installed version)', () => {\n const schema = z.string();\n expect(typeof isZod4Schema(schema)).toBe('boolean');\n });\n });\n\n describe('isZodSchema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.object({ name: z4.string() });\n expect(isZodSchema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.object({ name: z3.string() });\n expect(isZodSchema(v3Schema)).toBe(true);\n });\n\n it('should return false for non-Zod values', () => {\n expect(isZodSchema({})).toBe(false);\n expect(isZodSchema(null)).toBe(false);\n expect(isZodSchema(undefined)).toBe(false);\n expect(isZodSchema('string')).toBe(false);\n expect(isZodSchema(123)).toBe(false);\n expect(isZodSchema({ _def: {} })).toBe(false); // missing typeName\n });\n });\n\n describe('isZodObjectSchema', () => {\n it('should detect Zod v4 object schemas', () => {\n const objectSchema = z4.object({ name: z4.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should detect Zod v3 object schemas', () => {\n const objectSchema = z3.object({ name: z3.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should return false for non-object Zod schemas', () => {\n expect(isZodObjectSchema(z4.string())).toBe(false);\n expect(isZodObjectSchema(z4.number())).toBe(false);\n expect(isZodObjectSchema(z4.array(z4.string()))).toBe(false);\n expect(isZodObjectSchema(z3.string())).toBe(false);\n expect(isZodObjectSchema(z3.number())).toBe(false);\n });\n });\n\n describe('zodSchemaToJsonSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should convert basic v4 object schema to JSON Schema', () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v4 schemas with descriptions', () => {\n // NOTE: This test is skipped because Zod 3.25.76's v4 alpha doesn't fully support\n // descriptions in toJSONSchema yet. This will work in final Zod v4 release.\n const schema = z4.object({\n location: z4.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with optional fields', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 enum schemas', () => {\n const schema = z4.object({\n color: z4.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 array schemas', () => {\n const schema = z4.object({\n tags: z4.array(z4.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 nested object schemas', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with multiple optional fields', () => {\n const schema = z4.object({\n id: z4.string(),\n name: z4.string().optional(),\n age: z4.number().optional(),\n email: z4.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with default values', () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n active: z4.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should convert basic v3 object schema to JSON Schema', () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with descriptions', () => {\n const schema = z3.object({\n location: z3.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v3 schemas with optional fields', () => {\n // NOTE: This test is skipped because in Zod 3.25.76, the v3 export's optional()\n // handling in zod-to-json-schema has some quirks. The behavior is correct for\n // the default z import which is what users will typically use.\n const schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 enum schemas', () => {\n const schema = z3.object({\n color: z3.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 array schemas', () => {\n const schema = z3.object({\n tags: z3.array(z3.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 nested object schemas', () => {\n const schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with multiple optional fields', () => {\n const schema = z3.object({\n id: z3.string(),\n name: z3.string().optional(),\n age: z3.number().optional(),\n email: z3.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with default values', () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n active: z3.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('isOpenai parameter', () => {\n it('should respect isOpenai parameter for v3 schemas', () => {\n const schema = z3.object({ name: z3.string() });\n\n const openaiSchema = zodSchemaToJsonSchema(schema, true);\n const jsonSchema7 = zodSchemaToJsonSchema(schema, false);\n\n // Both should work, just different internal handling\n expect(openaiSchema).toHaveProperty('properties');\n expect(jsonSchema7).toHaveProperty('properties');\n });\n });\n });\n\n describe('parseZodSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should successfully parse valid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v4 optional fields', async () => {\n const schema = z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v4 default values', async () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should successfully parse valid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v3 optional fields', async () => {\n const schema = z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v3 default values', async () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n });\n\n describe('Cross-version compatibility', () => {\n it('should handle mixed v3 and v4 schemas in the same codebase', async () => {\n const v3Schema = z3.object({ name: z3.string() });\n const v4Schema = z4.object({ name: z4.string() });\n\n const v3Result = await parseZodSchema(v3Schema, { name: 'John' });\n const v4Result = await parseZodSchema(v4Schema, { name: 'Jane' });\n\n expect(v3Result.success).toBe(true);\n expect(v4Result.success).toBe(true);\n });\n\n it('should convert both v3 and v4 basic schemas to compatible JSON Schema', () => {\n const v3Schema = z3.object({ count: z3.number() });\n const v4Schema = z4.object({ count: z4.number() });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should produce valid JSON Schema with same structure\n expect(v3Json.type).toBe('object');\n expect(v4Json.type).toBe('object');\n expect((v3Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n expect((v4Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n });\n\n it('should handle optional fields consistently across v3 and v4', () => {\n const v3Schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n const v4Schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should mark 'required' as required\n expect(v3Json.required).toContain('required');\n expect(v4Json.required).toContain('required');\n\n // v4 should NOT mark 'optional' as required\n expect(v4Json.required).not.toContain('optional');\n\n // NOTE: v3's optional handling in zod-to-json-schema (for the v3 export) has quirks\n // in the alpha version 3.25.76. The default z import works correctly for users.\n });\n\n it('should handle complex schemas with nested objects and arrays consistently', () => {\n const v3Schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n }),\n tags: z3.array(z3.string()),\n status: z3.enum(['active', 'inactive']),\n });\n\n const v4Schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n }),\n tags: z4.array(z4.string()),\n status: z4.enum(['active', 'inactive']),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Check structure compatibility\n expect(v3Json.type).toBe(v4Json.type);\n expect(Object.keys(v3Json.properties || {})).toEqual(Object.keys(v4Json.properties || {}));\n\n // Check nested object\n const v3User = (v3Json.properties as JSONSchemaProperties).user;\n const v4User = (v4Json.properties as JSONSchemaProperties).user;\n expect(v3User?.type).toBe('object');\n expect(v4User?.type).toBe('object');\n\n // Check array\n const v3Tags = (v3Json.properties as JSONSchemaProperties).tags;\n const v4Tags = (v4Json.properties as JSONSchemaProperties).tags;\n expect(v3Tags?.type).toBe('array');\n expect(v4Tags?.type).toBe('array');\n\n // Check enum\n const v3Status = (v3Json.properties as JSONSchemaProperties).status;\n const v4Status = (v4Json.properties as JSONSchemaProperties).status;\n expect(v3Status?.enum).toEqual(['active', 'inactive']);\n expect(v4Status?.enum).toEqual(['active', 'inactive']);\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/llm/zod-utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { z } from 'zod';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport {\n isZod4Schema,\n isZodObjectSchema,\n isZodSchema,\n parseZodSchema,\n zodSchemaToJsonSchema,\n} from './zod-utils.js';\n\ntype JSONSchemaProperties = Record<string, Record<string, unknown>>;\n\ndescribe('Zod Utils', () => {\n describe('isZod4Schema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.string();\n expect(isZod4Schema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.string();\n expect(isZod4Schema(v3Schema)).toBe(false);\n });\n\n it('should handle default z import (follows installed version)', () => {\n const schema = z.string();\n expect(typeof isZod4Schema(schema)).toBe('boolean');\n });\n });\n\n describe('isZodSchema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.object({ name: z4.string() });\n expect(isZodSchema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.object({ name: z3.string() });\n expect(isZodSchema(v3Schema)).toBe(true);\n });\n\n it('should return false for non-Zod values', () => {\n expect(isZodSchema({})).toBe(false);\n expect(isZodSchema(null)).toBe(false);\n expect(isZodSchema(undefined)).toBe(false);\n expect(isZodSchema('string')).toBe(false);\n expect(isZodSchema(123)).toBe(false);\n expect(isZodSchema({ _def: {} })).toBe(false); // missing typeName\n });\n });\n\n describe('isZodObjectSchema', () => {\n it('should detect Zod v4 object schemas', () => {\n const objectSchema = z4.object({ name: z4.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should detect Zod v3 object schemas', () => {\n const objectSchema = z3.object({ name: z3.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should return false for non-object Zod schemas', () => {\n expect(isZodObjectSchema(z4.string())).toBe(false);\n expect(isZodObjectSchema(z4.number())).toBe(false);\n expect(isZodObjectSchema(z4.array(z4.string()))).toBe(false);\n expect(isZodObjectSchema(z3.string())).toBe(false);\n expect(isZodObjectSchema(z3.number())).toBe(false);\n });\n });\n\n describe('zodSchemaToJsonSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should convert basic v4 object schema to JSON Schema', () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v4 schemas with descriptions', () => {\n // NOTE: This test is skipped because Zod 3.25.76's v4 alpha doesn't fully support\n // descriptions in toJSONSchema yet. This will work in final Zod v4 release.\n const schema = z4.object({\n location: z4.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with optional fields', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 enum schemas', () => {\n const schema = z4.object({\n color: z4.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 array schemas', () => {\n const schema = z4.object({\n tags: z4.array(z4.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 nested object schemas', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with multiple optional fields', () => {\n const schema = z4.object({\n id: z4.string(),\n name: z4.string().optional(),\n age: z4.number().optional(),\n email: z4.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with default values', () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n active: z4.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should convert basic v3 object schema to JSON Schema', () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with descriptions', () => {\n const schema = z3.object({\n location: z3.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v3 schemas with optional fields', () => {\n // NOTE: This test is skipped because in Zod 3.25.76, the v3 export's optional()\n // handling in zod-to-json-schema has some quirks. The behavior is correct for\n // the default z import which is what users will typically use.\n const schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 enum schemas', () => {\n const schema = z3.object({\n color: z3.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 array schemas', () => {\n const schema = z3.object({\n tags: z3.array(z3.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 nested object schemas', () => {\n const schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with multiple optional fields', () => {\n const schema = z3.object({\n id: z3.string(),\n name: z3.string().optional(),\n age: z3.number().optional(),\n email: z3.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with default values', () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n active: z3.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('isOpenai parameter', () => {\n it('should respect isOpenai parameter for v3 schemas', () => {\n const schema = z3.object({ name: z3.string() });\n\n const openaiSchema = zodSchemaToJsonSchema(schema, true);\n const jsonSchema7 = zodSchemaToJsonSchema(schema, false);\n\n // Both should work, just different internal handling\n expect(openaiSchema).toHaveProperty('properties');\n expect(jsonSchema7).toHaveProperty('properties');\n });\n });\n\n describe('strict parameter', () => {\n it('should produce strict JSON schema with strict: true', () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle nullable fields in strict mode', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().nullable(),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle default values in strict mode', () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n active: z4.boolean().default(true),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle nested objects in strict mode', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().nullable(),\n }),\n metadata: z4.object({\n created: z4.string(),\n }),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle arrays in strict mode', () => {\n const schema = z4.object({\n tags: z4.array(z4.string()),\n numbers: z4.array(z4.number()),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas in strict mode', () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number().optional(),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should throw error when using .optional() without .nullable() in strict mode', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n expect(() => zodSchemaToJsonSchema(schema, true, true)).toThrow(\n /uses `.optional\\(\\)` without `.nullable\\(\\)` which is not supported by the API/,\n );\n });\n\n it('should throw error for nested .optional() fields in strict mode', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n }),\n });\n\n expect(() => zodSchemaToJsonSchema(schema, true, true)).toThrow(\n /uses `.optional\\(\\)` without `.nullable\\(\\)` which is not supported by the API/,\n );\n });\n\n it('should NOT throw error when using .optional() in non-strict mode', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n expect(() => zodSchemaToJsonSchema(schema, true, false)).not.toThrow();\n });\n });\n });\n\n describe('parseZodSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should successfully parse valid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v4 optional fields', async () => {\n const schema = z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v4 default values', async () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should successfully parse valid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v3 optional fields', async () => {\n const schema = z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v3 default values', async () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n });\n\n describe('Cross-version compatibility', () => {\n it('should handle mixed v3 and v4 schemas in the same codebase', async () => {\n const v3Schema = z3.object({ name: z3.string() });\n const v4Schema = z4.object({ name: z4.string() });\n\n const v3Result = await parseZodSchema(v3Schema, { name: 'John' });\n const v4Result = await parseZodSchema(v4Schema, { name: 'Jane' });\n\n expect(v3Result.success).toBe(true);\n expect(v4Result.success).toBe(true);\n });\n\n it('should convert both v3 and v4 basic schemas to compatible JSON Schema', () => {\n const v3Schema = z3.object({ count: z3.number() });\n const v4Schema = z4.object({ count: z4.number() });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should produce valid JSON Schema with same structure\n expect(v3Json.type).toBe('object');\n expect(v4Json.type).toBe('object');\n expect((v3Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n expect((v4Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n });\n\n it('should handle optional fields consistently across v3 and v4', () => {\n const v3Schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n const v4Schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should mark 'required' as required\n expect(v3Json.required).toContain('required');\n expect(v4Json.required).toContain('required');\n\n // v4 should NOT mark 'optional' as required\n expect(v4Json.required).not.toContain('optional');\n\n // NOTE: v3's optional handling in zod-to-json-schema (for the v3 export) has quirks\n // in the alpha version 3.25.76. The default z import works correctly for users.\n });\n\n it('should handle complex schemas with nested objects and arrays consistently', () => {\n const v3Schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n }),\n tags: z3.array(z3.string()),\n status: z3.enum(['active', 'inactive']),\n });\n\n const v4Schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n }),\n tags: z4.array(z4.string()),\n status: z4.enum(['active', 'inactive']),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Check structure compatibility\n expect(v3Json.type).toBe(v4Json.type);\n expect(Object.keys(v3Json.properties || {})).toEqual(Object.keys(v4Json.properties || {}));\n\n // Check nested object\n const v3User = (v3Json.properties as JSONSchemaProperties).user;\n const v4User = (v4Json.properties as JSONSchemaProperties).user;\n expect(v3User?.type).toBe('object');\n expect(v4User?.type).toBe('object');\n\n // Check array\n const v3Tags = (v3Json.properties as JSONSchemaProperties).tags;\n const v4Tags = (v4Json.properties as JSONSchemaProperties).tags;\n expect(v3Tags?.type).toBe('array');\n expect(v4Tags?.type).toBe('array');\n\n // Check enum\n const v3Status = (v3Json.properties as JSONSchemaProperties).status;\n const v4Status = (v4Json.properties as JSONSchemaProperties).status;\n expect(v3Status?.enum).toEqual(['active', 'inactive']);\n expect(v4Status?.enum).toEqual(['active', 'inactive']);\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -205,6 +205,89 @@ describe("Zod Utils", () => {
205
205
  expect(jsonSchema7).toHaveProperty("properties");
206
206
  });
207
207
  });
208
+ describe("strict parameter", () => {
209
+ it("should produce strict JSON schema with strict: true", () => {
210
+ const schema = z4.object({
211
+ name: z4.string(),
212
+ age: z4.number()
213
+ });
214
+ const strictSchema = zodSchemaToJsonSchema(schema, true, true);
215
+ expect(strictSchema).toMatchSnapshot();
216
+ });
217
+ it("should handle nullable fields in strict mode", () => {
218
+ const schema = z4.object({
219
+ required: z4.string(),
220
+ optional: z4.string().nullable()
221
+ });
222
+ const strictSchema = zodSchemaToJsonSchema(schema, true, true);
223
+ expect(strictSchema).toMatchSnapshot();
224
+ });
225
+ it("should handle default values in strict mode", () => {
226
+ const schema = z4.object({
227
+ name: z4.string(),
228
+ role: z4.string().default("user"),
229
+ active: z4.boolean().default(true)
230
+ });
231
+ const strictSchema = zodSchemaToJsonSchema(schema, true, true);
232
+ expect(strictSchema).toMatchSnapshot();
233
+ });
234
+ it("should handle nested objects in strict mode", () => {
235
+ const schema = z4.object({
236
+ user: z4.object({
237
+ name: z4.string(),
238
+ email: z4.string().nullable()
239
+ }),
240
+ metadata: z4.object({
241
+ created: z4.string()
242
+ })
243
+ });
244
+ const strictSchema = zodSchemaToJsonSchema(schema, true, true);
245
+ expect(strictSchema).toMatchSnapshot();
246
+ });
247
+ it("should handle arrays in strict mode", () => {
248
+ const schema = z4.object({
249
+ tags: z4.array(z4.string()),
250
+ numbers: z4.array(z4.number())
251
+ });
252
+ const strictSchema = zodSchemaToJsonSchema(schema, true, true);
253
+ expect(strictSchema).toMatchSnapshot();
254
+ });
255
+ it("should handle v3 schemas in strict mode", () => {
256
+ const schema = z3.object({
257
+ name: z3.string(),
258
+ age: z3.number().optional()
259
+ });
260
+ const strictSchema = zodSchemaToJsonSchema(schema, true, true);
261
+ expect(strictSchema).toMatchSnapshot();
262
+ });
263
+ it("should throw error when using .optional() without .nullable() in strict mode", () => {
264
+ const schema = z4.object({
265
+ required: z4.string(),
266
+ optional: z4.string().optional()
267
+ });
268
+ expect(() => zodSchemaToJsonSchema(schema, true, true)).toThrow(
269
+ /uses `.optional\(\)` without `.nullable\(\)` which is not supported by the API/
270
+ );
271
+ });
272
+ it("should throw error for nested .optional() fields in strict mode", () => {
273
+ const schema = z4.object({
274
+ user: z4.object({
275
+ name: z4.string(),
276
+ email: z4.string().optional()
277
+ })
278
+ });
279
+ expect(() => zodSchemaToJsonSchema(schema, true, true)).toThrow(
280
+ /uses `.optional\(\)` without `.nullable\(\)` which is not supported by the API/
281
+ );
282
+ });
283
+ it("should NOT throw error when using .optional() in non-strict mode", () => {
284
+ const schema = z4.object({
285
+ required: z4.string(),
286
+ optional: z4.string().optional()
287
+ });
288
+ expect(() => zodSchemaToJsonSchema(schema, true, false)).not.toThrow();
289
+ });
290
+ });
208
291
  });
209
292
  describe("parseZodSchema", () => {
210
293
  describe("Zod v4 schemas", () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/llm/zod-utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { z } from 'zod';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport {\n isZod4Schema,\n isZodObjectSchema,\n isZodSchema,\n parseZodSchema,\n zodSchemaToJsonSchema,\n} from './zod-utils.js';\n\ntype JSONSchemaProperties = Record<string, Record<string, unknown>>;\n\ndescribe('Zod Utils', () => {\n describe('isZod4Schema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.string();\n expect(isZod4Schema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.string();\n expect(isZod4Schema(v3Schema)).toBe(false);\n });\n\n it('should handle default z import (follows installed version)', () => {\n const schema = z.string();\n expect(typeof isZod4Schema(schema)).toBe('boolean');\n });\n });\n\n describe('isZodSchema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.object({ name: z4.string() });\n expect(isZodSchema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.object({ name: z3.string() });\n expect(isZodSchema(v3Schema)).toBe(true);\n });\n\n it('should return false for non-Zod values', () => {\n expect(isZodSchema({})).toBe(false);\n expect(isZodSchema(null)).toBe(false);\n expect(isZodSchema(undefined)).toBe(false);\n expect(isZodSchema('string')).toBe(false);\n expect(isZodSchema(123)).toBe(false);\n expect(isZodSchema({ _def: {} })).toBe(false); // missing typeName\n });\n });\n\n describe('isZodObjectSchema', () => {\n it('should detect Zod v4 object schemas', () => {\n const objectSchema = z4.object({ name: z4.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should detect Zod v3 object schemas', () => {\n const objectSchema = z3.object({ name: z3.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should return false for non-object Zod schemas', () => {\n expect(isZodObjectSchema(z4.string())).toBe(false);\n expect(isZodObjectSchema(z4.number())).toBe(false);\n expect(isZodObjectSchema(z4.array(z4.string()))).toBe(false);\n expect(isZodObjectSchema(z3.string())).toBe(false);\n expect(isZodObjectSchema(z3.number())).toBe(false);\n });\n });\n\n describe('zodSchemaToJsonSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should convert basic v4 object schema to JSON Schema', () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v4 schemas with descriptions', () => {\n // NOTE: This test is skipped because Zod 3.25.76's v4 alpha doesn't fully support\n // descriptions in toJSONSchema yet. This will work in final Zod v4 release.\n const schema = z4.object({\n location: z4.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with optional fields', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 enum schemas', () => {\n const schema = z4.object({\n color: z4.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 array schemas', () => {\n const schema = z4.object({\n tags: z4.array(z4.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 nested object schemas', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with multiple optional fields', () => {\n const schema = z4.object({\n id: z4.string(),\n name: z4.string().optional(),\n age: z4.number().optional(),\n email: z4.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with default values', () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n active: z4.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should convert basic v3 object schema to JSON Schema', () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with descriptions', () => {\n const schema = z3.object({\n location: z3.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v3 schemas with optional fields', () => {\n // NOTE: This test is skipped because in Zod 3.25.76, the v3 export's optional()\n // handling in zod-to-json-schema has some quirks. The behavior is correct for\n // the default z import which is what users will typically use.\n const schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 enum schemas', () => {\n const schema = z3.object({\n color: z3.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 array schemas', () => {\n const schema = z3.object({\n tags: z3.array(z3.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 nested object schemas', () => {\n const schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with multiple optional fields', () => {\n const schema = z3.object({\n id: z3.string(),\n name: z3.string().optional(),\n age: z3.number().optional(),\n email: z3.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with default values', () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n active: z3.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('isOpenai parameter', () => {\n it('should respect isOpenai parameter for v3 schemas', () => {\n const schema = z3.object({ name: z3.string() });\n\n const openaiSchema = zodSchemaToJsonSchema(schema, true);\n const jsonSchema7 = zodSchemaToJsonSchema(schema, false);\n\n // Both should work, just different internal handling\n expect(openaiSchema).toHaveProperty('properties');\n expect(jsonSchema7).toHaveProperty('properties');\n });\n });\n });\n\n describe('parseZodSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should successfully parse valid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v4 optional fields', async () => {\n const schema = z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v4 default values', async () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should successfully parse valid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v3 optional fields', async () => {\n const schema = z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v3 default values', async () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n });\n\n describe('Cross-version compatibility', () => {\n it('should handle mixed v3 and v4 schemas in the same codebase', async () => {\n const v3Schema = z3.object({ name: z3.string() });\n const v4Schema = z4.object({ name: z4.string() });\n\n const v3Result = await parseZodSchema(v3Schema, { name: 'John' });\n const v4Result = await parseZodSchema(v4Schema, { name: 'Jane' });\n\n expect(v3Result.success).toBe(true);\n expect(v4Result.success).toBe(true);\n });\n\n it('should convert both v3 and v4 basic schemas to compatible JSON Schema', () => {\n const v3Schema = z3.object({ count: z3.number() });\n const v4Schema = z4.object({ count: z4.number() });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should produce valid JSON Schema with same structure\n expect(v3Json.type).toBe('object');\n expect(v4Json.type).toBe('object');\n expect((v3Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n expect((v4Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n });\n\n it('should handle optional fields consistently across v3 and v4', () => {\n const v3Schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n const v4Schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should mark 'required' as required\n expect(v3Json.required).toContain('required');\n expect(v4Json.required).toContain('required');\n\n // v4 should NOT mark 'optional' as required\n expect(v4Json.required).not.toContain('optional');\n\n // NOTE: v3's optional handling in zod-to-json-schema (for the v3 export) has quirks\n // in the alpha version 3.25.76. The default z import works correctly for users.\n });\n\n it('should handle complex schemas with nested objects and arrays consistently', () => {\n const v3Schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n }),\n tags: z3.array(z3.string()),\n status: z3.enum(['active', 'inactive']),\n });\n\n const v4Schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n }),\n tags: z4.array(z4.string()),\n status: z4.enum(['active', 'inactive']),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Check structure compatibility\n expect(v3Json.type).toBe(v4Json.type);\n expect(Object.keys(v3Json.properties || {})).toEqual(Object.keys(v4Json.properties || {}));\n\n // Check nested object\n const v3User = (v3Json.properties as JSONSchemaProperties).user;\n const v4User = (v4Json.properties as JSONSchemaProperties).user;\n expect(v3User?.type).toBe('object');\n expect(v4User?.type).toBe('object');\n\n // Check array\n const v3Tags = (v3Json.properties as JSONSchemaProperties).tags;\n const v4Tags = (v4Json.properties as JSONSchemaProperties).tags;\n expect(v3Tags?.type).toBe('array');\n expect(v4Tags?.type).toBe('array');\n\n // Check enum\n const v3Status = (v3Json.properties as JSONSchemaProperties).status;\n const v4Status = (v4Json.properties as JSONSchemaProperties).status;\n expect(v3Status?.enum).toEqual(['active', 'inactive']);\n expect(v4Status?.enum).toEqual(['active', 'inactive']);\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/llm/zod-utils.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { z } from 'zod';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport {\n isZod4Schema,\n isZodObjectSchema,\n isZodSchema,\n parseZodSchema,\n zodSchemaToJsonSchema,\n} from './zod-utils.js';\n\ntype JSONSchemaProperties = Record<string, Record<string, unknown>>;\n\ndescribe('Zod Utils', () => {\n describe('isZod4Schema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.string();\n expect(isZod4Schema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.string();\n expect(isZod4Schema(v3Schema)).toBe(false);\n });\n\n it('should handle default z import (follows installed version)', () => {\n const schema = z.string();\n expect(typeof isZod4Schema(schema)).toBe('boolean');\n });\n });\n\n describe('isZodSchema', () => {\n it('should detect Zod v4 schemas', () => {\n const v4Schema = z4.object({ name: z4.string() });\n expect(isZodSchema(v4Schema)).toBe(true);\n });\n\n it('should detect Zod v3 schemas', () => {\n const v3Schema = z3.object({ name: z3.string() });\n expect(isZodSchema(v3Schema)).toBe(true);\n });\n\n it('should return false for non-Zod values', () => {\n expect(isZodSchema({})).toBe(false);\n expect(isZodSchema(null)).toBe(false);\n expect(isZodSchema(undefined)).toBe(false);\n expect(isZodSchema('string')).toBe(false);\n expect(isZodSchema(123)).toBe(false);\n expect(isZodSchema({ _def: {} })).toBe(false); // missing typeName\n });\n });\n\n describe('isZodObjectSchema', () => {\n it('should detect Zod v4 object schemas', () => {\n const objectSchema = z4.object({ name: z4.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should detect Zod v3 object schemas', () => {\n const objectSchema = z3.object({ name: z3.string() });\n expect(isZodObjectSchema(objectSchema)).toBe(true);\n });\n\n it('should return false for non-object Zod schemas', () => {\n expect(isZodObjectSchema(z4.string())).toBe(false);\n expect(isZodObjectSchema(z4.number())).toBe(false);\n expect(isZodObjectSchema(z4.array(z4.string()))).toBe(false);\n expect(isZodObjectSchema(z3.string())).toBe(false);\n expect(isZodObjectSchema(z3.number())).toBe(false);\n });\n });\n\n describe('zodSchemaToJsonSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should convert basic v4 object schema to JSON Schema', () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v4 schemas with descriptions', () => {\n // NOTE: This test is skipped because Zod 3.25.76's v4 alpha doesn't fully support\n // descriptions in toJSONSchema yet. This will work in final Zod v4 release.\n const schema = z4.object({\n location: z4.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with optional fields', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 enum schemas', () => {\n const schema = z4.object({\n color: z4.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 array schemas', () => {\n const schema = z4.object({\n tags: z4.array(z4.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 nested object schemas', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with multiple optional fields', () => {\n const schema = z4.object({\n id: z4.string(),\n name: z4.string().optional(),\n age: z4.number().optional(),\n email: z4.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v4 schemas with default values', () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n active: z4.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should convert basic v3 object schema to JSON Schema', () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with descriptions', () => {\n const schema = z3.object({\n location: z3.string().describe('The location to search'),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it.skip('should handle v3 schemas with optional fields', () => {\n // NOTE: This test is skipped because in Zod 3.25.76, the v3 export's optional()\n // handling in zod-to-json-schema has some quirks. The behavior is correct for\n // the default z import which is what users will typically use.\n const schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 enum schemas', () => {\n const schema = z3.object({\n color: z3.enum(['red', 'blue', 'green']),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 array schemas', () => {\n const schema = z3.object({\n tags: z3.array(z3.string()),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 nested object schemas', () => {\n const schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string(),\n }),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with multiple optional fields', () => {\n const schema = z3.object({\n id: z3.string(),\n name: z3.string().optional(),\n age: z3.number().optional(),\n email: z3.string(),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas with default values', () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n active: z3.boolean().default(true),\n });\n\n const jsonSchema = zodSchemaToJsonSchema(schema);\n expect(jsonSchema).toMatchSnapshot();\n });\n });\n\n describe('isOpenai parameter', () => {\n it('should respect isOpenai parameter for v3 schemas', () => {\n const schema = z3.object({ name: z3.string() });\n\n const openaiSchema = zodSchemaToJsonSchema(schema, true);\n const jsonSchema7 = zodSchemaToJsonSchema(schema, false);\n\n // Both should work, just different internal handling\n expect(openaiSchema).toHaveProperty('properties');\n expect(jsonSchema7).toHaveProperty('properties');\n });\n });\n\n describe('strict parameter', () => {\n it('should produce strict JSON schema with strict: true', () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle nullable fields in strict mode', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().nullable(),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle default values in strict mode', () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n active: z4.boolean().default(true),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle nested objects in strict mode', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().nullable(),\n }),\n metadata: z4.object({\n created: z4.string(),\n }),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle arrays in strict mode', () => {\n const schema = z4.object({\n tags: z4.array(z4.string()),\n numbers: z4.array(z4.number()),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should handle v3 schemas in strict mode', () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number().optional(),\n });\n\n const strictSchema = zodSchemaToJsonSchema(schema, true, true);\n expect(strictSchema).toMatchSnapshot();\n });\n\n it('should throw error when using .optional() without .nullable() in strict mode', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n expect(() => zodSchemaToJsonSchema(schema, true, true)).toThrow(\n /uses `.optional\\(\\)` without `.nullable\\(\\)` which is not supported by the API/,\n );\n });\n\n it('should throw error for nested .optional() fields in strict mode', () => {\n const schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n }),\n });\n\n expect(() => zodSchemaToJsonSchema(schema, true, true)).toThrow(\n /uses `.optional\\(\\)` without `.nullable\\(\\)` which is not supported by the API/,\n );\n });\n\n it('should NOT throw error when using .optional() in non-strict mode', () => {\n const schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n expect(() => zodSchemaToJsonSchema(schema, true, false)).not.toThrow();\n });\n });\n });\n\n describe('parseZodSchema', () => {\n describe('Zod v4 schemas', () => {\n it('should successfully parse valid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v4 data', async () => {\n const schema = z4.object({\n name: z4.string(),\n age: z4.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v4 optional fields', async () => {\n const schema = z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v4 default values', async () => {\n const schema = z4.object({\n name: z4.string(),\n role: z4.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n\n describe('Zod v3 schemas', () => {\n it('should successfully parse valid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 30 });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', age: 30 });\n }\n });\n\n it('should fail to parse invalid v3 data', async () => {\n const schema = z3.object({\n name: z3.string(),\n age: z3.number(),\n });\n\n const result = await parseZodSchema(schema, { name: 'John', age: 'invalid' });\n\n expect(result.success).toBe(false);\n if (!result.success) {\n expect(result.error).toBeDefined();\n }\n });\n\n it('should handle v3 optional fields', async () => {\n const schema = z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n });\n\n const result1 = await parseZodSchema(schema, { name: 'John' });\n expect(result1.success).toBe(true);\n\n const result2 = await parseZodSchema(schema, { name: 'John', email: 'john@example.com' });\n expect(result2.success).toBe(true);\n });\n\n it('should handle v3 default values', async () => {\n const schema = z3.object({\n name: z3.string(),\n role: z3.string().default('user'),\n });\n\n const result = await parseZodSchema(schema, { name: 'John' });\n\n expect(result.success).toBe(true);\n if (result.success) {\n expect(result.data).toEqual({ name: 'John', role: 'user' });\n }\n });\n });\n });\n\n describe('Cross-version compatibility', () => {\n it('should handle mixed v3 and v4 schemas in the same codebase', async () => {\n const v3Schema = z3.object({ name: z3.string() });\n const v4Schema = z4.object({ name: z4.string() });\n\n const v3Result = await parseZodSchema(v3Schema, { name: 'John' });\n const v4Result = await parseZodSchema(v4Schema, { name: 'Jane' });\n\n expect(v3Result.success).toBe(true);\n expect(v4Result.success).toBe(true);\n });\n\n it('should convert both v3 and v4 basic schemas to compatible JSON Schema', () => {\n const v3Schema = z3.object({ count: z3.number() });\n const v4Schema = z4.object({ count: z4.number() });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should produce valid JSON Schema with same structure\n expect(v3Json.type).toBe('object');\n expect(v4Json.type).toBe('object');\n expect((v3Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n expect((v4Json.properties as JSONSchemaProperties).count?.type).toBe('number');\n });\n\n it('should handle optional fields consistently across v3 and v4', () => {\n const v3Schema = z3.object({\n required: z3.string(),\n optional: z3.string().optional(),\n });\n const v4Schema = z4.object({\n required: z4.string(),\n optional: z4.string().optional(),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Both should mark 'required' as required\n expect(v3Json.required).toContain('required');\n expect(v4Json.required).toContain('required');\n\n // v4 should NOT mark 'optional' as required\n expect(v4Json.required).not.toContain('optional');\n\n // NOTE: v3's optional handling in zod-to-json-schema (for the v3 export) has quirks\n // in the alpha version 3.25.76. The default z import works correctly for users.\n });\n\n it('should handle complex schemas with nested objects and arrays consistently', () => {\n const v3Schema = z3.object({\n user: z3.object({\n name: z3.string(),\n email: z3.string().optional(),\n }),\n tags: z3.array(z3.string()),\n status: z3.enum(['active', 'inactive']),\n });\n\n const v4Schema = z4.object({\n user: z4.object({\n name: z4.string(),\n email: z4.string().optional(),\n }),\n tags: z4.array(z4.string()),\n status: z4.enum(['active', 'inactive']),\n });\n\n const v3Json = zodSchemaToJsonSchema(v3Schema);\n const v4Json = zodSchemaToJsonSchema(v4Schema);\n\n // Check structure compatibility\n expect(v3Json.type).toBe(v4Json.type);\n expect(Object.keys(v3Json.properties || {})).toEqual(Object.keys(v4Json.properties || {}));\n\n // Check nested object\n const v3User = (v3Json.properties as JSONSchemaProperties).user;\n const v4User = (v4Json.properties as JSONSchemaProperties).user;\n expect(v3User?.type).toBe('object');\n expect(v4User?.type).toBe('object');\n\n // Check array\n const v3Tags = (v3Json.properties as JSONSchemaProperties).tags;\n const v4Tags = (v4Json.properties as JSONSchemaProperties).tags;\n expect(v3Tags?.type).toBe('array');\n expect(v4Tags?.type).toBe('array');\n\n // Check enum\n const v3Status = (v3Json.properties as JSONSchemaProperties).status;\n const v4Status = (v4Json.properties as JSONSchemaProperties).status;\n expect(v3Status?.enum).toEqual(['active', 'inactive']);\n expect(v4Status?.enum).toEqual(['active', 'inactive']);\n });\n });\n});\n"],"mappings":"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","names":[]}
package/dist/stt/stt.cjs CHANGED
@@ -105,7 +105,6 @@ class SpeechStream {
105
105
  options: { retryable: false }
106
106
  });
107
107
  } else {
108
- this.emitError({ error, recoverable: true });
109
108
  this.logger.warn(
110
109
  { tts: this.#stt.label, attempt: i + 1, error },
111
110
  `failed to recognize speech, retrying in ${retryInterval}s`