-
Notifications
You must be signed in to change notification settings - Fork 3k
Expand file tree
/
Copy pathgenerate-input-json-schema.ts
More file actions
106 lines (100 loc) · 2.76 KB
/
generate-input-json-schema.ts
File metadata and controls
106 lines (100 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* Copyright 2025 coze-dev Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable @typescript-eslint/naming-convention */
import { type SchemaObject } from 'ajv';
import {
VariableTypeDTO,
type VariableMetaDTO,
AssistTypeDTO,
} from '@coze-workflow/base';
// Type mapping to be converted
const VariableType2JsonSchemaProps = {
[VariableTypeDTO.object]: {
type: 'object',
},
[VariableTypeDTO.list]: {
type: 'array',
},
[VariableTypeDTO.float]: {
type: 'number',
},
[VariableTypeDTO.number]: {
type: 'number',
},
[VariableTypeDTO.integer]: {
type: 'integer',
},
[VariableTypeDTO.boolean]: {
type: 'boolean',
},
[VariableTypeDTO.string]: {
type: 'string',
},
[VariableTypeDTO.time]: {
type: 'string',
},
};
const inputToJsonSchema = (
input,
level = 0,
transformer?: (input: unknown) => VariableMetaDTO,
): SchemaObject | undefined => {
const _input = transformer ? transformer(input) : input;
const { type, description } = _input;
const props = VariableType2JsonSchemaProps[type];
if (type === VariableTypeDTO.object) {
const properties = {};
const required: string[] = [];
for (const field of _input.schema) {
properties[field.name] = inputToJsonSchema(field, level + 1, transformer);
if (field.required) {
required.push(field.name);
}
}
return {
...props,
description,
required,
properties,
};
} else if (type === VariableTypeDTO.list) {
return {
...props,
description,
items: inputToJsonSchema(_input.schema, level + 1, transformer),
};
}
// The basic type does not need to generate jsonSchema, and the image type does not need jsonSchema. It directly throws an exception and jumps out of recursion.
if (
level === 0 ||
type === 'image' ||
(_input.assistType && _input.assistType !== AssistTypeDTO.time)
) {
throw Error('not json type');
}
return { ...props, description };
};
export const generateInputJsonSchema = (
input: VariableMetaDTO,
transformer?: (input: unknown) => VariableMetaDTO,
): SchemaObject | undefined => {
try {
const jsonSchema = inputToJsonSchema(input, 0, transformer);
return jsonSchema;
} catch {
return undefined;
}
};