twenty / packages /twenty-shared /src /logic-function /build-tool-input-json-schema.ts
Jules
Initial clean CRM deployment with prebuilt assets
d9494a5
Raw
History Blame Contribute Delete
2.23 kB
import { isNonEmptyString, isObject } from '@sniptt/guards';
import { type InputJsonSchema } from '@/logic-function/input-json-schema.type';
import { isRecordObjectSchema } from '@/logic-function/is-record-object-schema';
import { isDefined } from '@/utils/validation/isDefined';
type ResolveObjectLabel = (
objectUniversalIdentifier: string,
) => string | undefined;
const buildRecordIdDescription = (
objectUniversalIdentifier: string | undefined,
resolveObjectLabel?: ResolveObjectLabel,
): string => {
const objectLabel = isNonEmptyString(objectUniversalIdentifier)
? resolveObjectLabel?.(objectUniversalIdentifier)
: undefined;
return `Id of the ${isNonEmptyString(objectLabel) ? objectLabel : 'linked'} record`;
};
export const buildToolInputJsonSchema = (
jsonSchema: InputJsonSchema,
resolveObjectLabel?: ResolveObjectLabel,
): InputJsonSchema => {
if (isRecordObjectSchema(jsonSchema)) {
return {
type: 'string',
description: buildRecordIdDescription(
jsonSchema.objectUniversalIdentifier,
resolveObjectLabel,
),
};
}
if (jsonSchema.type === 'records') {
return {
type: 'array',
items: {
type: 'string',
description: buildRecordIdDescription(
jsonSchema.objectUniversalIdentifier,
resolveObjectLabel,
),
},
};
}
const {
objectUniversalIdentifier: _objectUniversalIdentifier,
multiline: _multiline,
label: _label,
items,
properties,
additionalProperties,
...standardKeywords
} = jsonSchema;
const toolSchema: InputJsonSchema = { ...standardKeywords };
if (isDefined(items)) {
toolSchema.items = buildToolInputJsonSchema(items, resolveObjectLabel);
}
if (isDefined(properties)) {
toolSchema.properties = Object.fromEntries(
Object.entries(properties).map(([key, value]) => [
key,
buildToolInputJsonSchema(value, resolveObjectLabel),
]),
);
}
if (isDefined(additionalProperties)) {
toolSchema.additionalProperties = isObject(additionalProperties)
? buildToolInputJsonSchema(additionalProperties, resolveObjectLabel)
: additionalProperties;
}
return toolSchema;
};