@ai-sdk/google
Version:
66 lines (61 loc) • 1.86 kB
text/typescript
import type { JSONSchema7, JSONSchema7Definition } from '@ai-sdk/provider';
/**
* Recursively replaces `const` with a single-value `enum` in the JSON Schema
* locations supported by Google because `responseJsonSchema` does not support
* `const`. All other schema properties are preserved.
*/
export function sanitizeResponseJsonSchema(schema: JSONSchema7): JSONSchema7 {
const {
const: constValue,
properties,
items,
additionalProperties,
anyOf,
oneOf,
...result
} = schema;
return {
...result,
...(constValue !== undefined ? { enum: [constValue] } : {}),
...(properties != null
? { properties: sanitizeDefinitions(properties) }
: {}),
...(items != null
? {
items: Array.isArray(items)
? items.map(sanitizeDefinition)
: sanitizeDefinition(items),
}
: {}),
...(additionalProperties != null
? {
additionalProperties:
typeof additionalProperties === 'boolean'
? additionalProperties
: sanitizeDefinition(additionalProperties),
}
: {}),
...(anyOf != null ? { anyOf: anyOf.map(sanitizeDefinition) } : {}),
...(oneOf != null ? { oneOf: oneOf.map(sanitizeDefinition) } : {}),
...(result.$defs != null
? { $defs: sanitizeDefinitions(result.$defs) }
: {}),
};
}
function sanitizeDefinitions(
definitions: Record<string, JSONSchema7Definition>,
): Record<string, JSONSchema7Definition> {
return Object.fromEntries(
Object.entries(definitions).map(([name, definition]) => [
name,
sanitizeDefinition(definition),
]),
);
}
function sanitizeDefinition(
definition: JSONSchema7Definition,
): JSONSchema7Definition {
return typeof definition === 'boolean'
? definition
: sanitizeResponseJsonSchema(definition);
}