File size: 2,228 Bytes
d9494a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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;
};