|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| interface JsonSchemaish {
|
| type?: string;
|
| properties?: Record<string, JsonSchemaish>;
|
| }
|
|
|
| |
| |
| |
| |
|
|
| export function repairToolArguments(args: string, paramSchema?: JsonSchemaish): string {
|
| let parsed: unknown;
|
| try {
|
| parsed = JSON.parse(args);
|
| } catch {
|
| return args;
|
| }
|
|
|
| let changed = false;
|
|
|
|
|
|
|
| if (typeof parsed === 'string') {
|
| try {
|
| const inner = JSON.parse(parsed);
|
| if (inner !== null && typeof inner === 'object' && !Array.isArray(inner)) {
|
| parsed = inner;
|
| changed = true;
|
| } else {
|
| return args;
|
| }
|
| } catch {
|
| return args;
|
| }
|
| }
|
|
|
| if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
| return changed ? JSON.stringify(parsed) : args;
|
| }
|
|
|
| const props = paramSchema?.properties;
|
| if (props) {
|
| const obj = parsed as Record<string, unknown>;
|
| for (const [key, value] of Object.entries(obj)) {
|
| if (typeof value !== 'string') continue;
|
| const want = props[key]?.type;
|
| if (want !== 'array' && want !== 'object') continue;
|
| const trimmed = value.trim();
|
| if (!(trimmed.startsWith('[') || trimmed.startsWith('{'))) continue;
|
| try {
|
| const inner = JSON.parse(trimmed);
|
| const isMatch = want === 'array'
|
| ? Array.isArray(inner)
|
| : inner !== null && typeof inner === 'object' && !Array.isArray(inner);
|
| if (isMatch) {
|
| obj[key] = inner;
|
| changed = true;
|
| }
|
| } catch {
|
|
|
| }
|
| }
|
| }
|
|
|
| return changed ? JSON.stringify(parsed) : args;
|
| }
|
|
|
| |
| |
| |
|
|
| export function toolSchemaMap(
|
| tools?: Array<{ type?: string; function?: { name?: string; parameters?: unknown } }>,
|
| ): Map<string, JsonSchemaish> {
|
| const map = new Map<string, JsonSchemaish>();
|
| for (const t of tools ?? []) {
|
| const name = t.function?.name;
|
| if (t.type === 'function' && name && t.function?.parameters && typeof t.function.parameters === 'object') {
|
| map.set(name, t.function.parameters as JsonSchemaish);
|
| }
|
| }
|
| return map;
|
| }
|
|
|