@copilotkit/shared
Version:
<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />
194 lines (193 loc) • 6.04 kB
JavaScript
// src/utils/json-schema.ts
import { z } from "zod";
function actionParametersToJsonSchema(actionParameters) {
let parameters = {};
for (let parameter of actionParameters || []) {
parameters[parameter.name] = convertAttribute(parameter);
}
let requiredParameterNames = [];
for (let arg of actionParameters || []) {
if (arg.required !== false) {
requiredParameterNames.push(arg.name);
}
}
return {
type: "object",
properties: parameters,
required: requiredParameterNames
};
}
function jsonSchemaToActionParameters(jsonSchema) {
if (jsonSchema.type !== "object" || !jsonSchema.properties) {
return [];
}
const parameters = [];
const requiredFields = jsonSchema.required || [];
for (const [name, schema] of Object.entries(jsonSchema.properties)) {
const parameter = convertJsonSchemaToParameter(name, schema, requiredFields.includes(name));
parameters.push(parameter);
}
return parameters;
}
function convertJsonSchemaToParameter(name, schema, isRequired) {
const baseParameter = {
name,
description: schema.description
};
if (!isRequired) {
baseParameter.required = false;
}
switch (schema.type) {
case "string":
return {
...baseParameter,
type: "string",
...schema.enum && { enum: schema.enum }
};
case "number":
case "boolean":
return {
...baseParameter,
type: schema.type
};
case "object":
if (schema.properties) {
const attributes = [];
const requiredFields = schema.required || [];
for (const [propName, propSchema] of Object.entries(schema.properties)) {
attributes.push(
convertJsonSchemaToParameter(propName, propSchema, requiredFields.includes(propName))
);
}
return {
...baseParameter,
type: "object",
attributes
};
}
return {
...baseParameter,
type: "object"
};
case "array":
if (schema.items.type === "object" && "properties" in schema.items) {
const attributes = [];
const requiredFields = schema.items.required || [];
for (const [propName, propSchema] of Object.entries(schema.items.properties || {})) {
attributes.push(
convertJsonSchemaToParameter(propName, propSchema, requiredFields.includes(propName))
);
}
return {
...baseParameter,
type: "object[]",
attributes
};
} else if (schema.items.type === "array") {
throw new Error("Nested arrays are not supported");
} else {
return {
...baseParameter,
type: `${schema.items.type}[]`
};
}
default:
return {
...baseParameter,
type: "string"
};
}
}
function convertAttribute(attribute) {
var _a, _b, _c;
switch (attribute.type) {
case "string":
return {
type: "string",
description: attribute.description,
...attribute.enum && { enum: attribute.enum }
};
case "number":
case "boolean":
return {
type: attribute.type,
description: attribute.description
};
case "object":
case "object[]":
const properties = (_a = attribute.attributes) == null ? void 0 : _a.reduce(
(acc, attr) => {
acc[attr.name] = convertAttribute(attr);
return acc;
},
{}
);
const required = (_b = attribute.attributes) == null ? void 0 : _b.filter((attr) => attr.required !== false).map((attr) => attr.name);
if (attribute.type === "object[]") {
return {
type: "array",
items: {
type: "object",
...properties && { properties },
...required && required.length > 0 && { required }
},
description: attribute.description
};
}
return {
type: "object",
description: attribute.description,
...properties && { properties },
...required && required.length > 0 && { required }
};
default:
if ((_c = attribute.type) == null ? void 0 : _c.endsWith("[]")) {
const itemType = attribute.type.slice(0, -2);
return {
type: "array",
items: { type: itemType },
description: attribute.description
};
}
return {
type: "string",
description: attribute.description
};
}
}
function convertJsonSchemaToZodSchema(jsonSchema, required) {
if (jsonSchema.type === "object") {
const spec = {};
if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {
return !required ? z.object(spec).optional() : z.object(spec);
}
for (const [key, value] of Object.entries(jsonSchema.properties)) {
spec[key] = convertJsonSchemaToZodSchema(
value,
jsonSchema.required ? jsonSchema.required.includes(key) : false
);
}
let schema = z.object(spec).describe(jsonSchema.description);
return required ? schema : schema.optional();
} else if (jsonSchema.type === "string") {
let schema = z.string().describe(jsonSchema.description);
return required ? schema : schema.optional();
} else if (jsonSchema.type === "number") {
let schema = z.number().describe(jsonSchema.description);
return required ? schema : schema.optional();
} else if (jsonSchema.type === "boolean") {
let schema = z.boolean().describe(jsonSchema.description);
return required ? schema : schema.optional();
} else if (jsonSchema.type === "array") {
let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);
let schema = z.array(itemSchema).describe(jsonSchema.description);
return required ? schema : schema.optional();
}
throw new Error("Invalid JSON schema");
}
export {
actionParametersToJsonSchema,
jsonSchemaToActionParameters,
convertJsonSchemaToZodSchema
};
//# sourceMappingURL=chunk-2KQ6HEWZ.mjs.map