@modular-prompt/driver 0.13.1 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/cache-controller.d.ts +4 -1
  2. package/dist/cache-controller.d.ts.map +1 -1
  3. package/dist/echo-driver.d.ts.map +1 -1
  4. package/dist/echo-driver.js +9 -39
  5. package/dist/echo-driver.js.map +1 -1
  6. package/dist/formatter/completion-formatter.d.ts.map +1 -1
  7. package/dist/formatter/completion-formatter.js +30 -24
  8. package/dist/formatter/completion-formatter.js.map +1 -1
  9. package/dist/formatter/converter.d.ts.map +1 -1
  10. package/dist/formatter/converter.js +18 -13
  11. package/dist/formatter/converter.js.map +1 -1
  12. package/dist/formatter/types.d.ts +7 -0
  13. package/dist/formatter/types.d.ts.map +1 -1
  14. package/dist/google-genai/google-genai-cache-controller.d.ts +1 -1
  15. package/dist/google-genai/google-genai-cache-controller.d.ts.map +1 -1
  16. package/dist/google-genai/google-genai-cache-controller.js +4 -4
  17. package/dist/google-genai/google-genai-cache-controller.js.map +1 -1
  18. package/dist/mlx-ml/mlx-cache-controller.d.ts +3 -4
  19. package/dist/mlx-ml/mlx-cache-controller.d.ts.map +1 -1
  20. package/dist/mlx-ml/mlx-cache-controller.js +46 -22
  21. package/dist/mlx-ml/mlx-cache-controller.js.map +1 -1
  22. package/dist/mlx-ml/mlx-driver.js +4 -4
  23. package/dist/mlx-ml/mlx-driver.js.map +1 -1
  24. package/dist/mlx-ml/process/response-processor.js +1 -1
  25. package/dist/mlx-ml/process/response-processor.js.map +1 -1
  26. package/dist/mlx-ml/tool-call-parser/content-parsers.d.ts +9 -0
  27. package/dist/mlx-ml/tool-call-parser/content-parsers.d.ts.map +1 -0
  28. package/dist/mlx-ml/tool-call-parser/content-parsers.js +223 -0
  29. package/dist/mlx-ml/tool-call-parser/content-parsers.js.map +1 -0
  30. package/dist/mlx-ml/tool-call-parser/detector.d.ts +16 -0
  31. package/dist/mlx-ml/tool-call-parser/detector.d.ts.map +1 -0
  32. package/dist/mlx-ml/tool-call-parser/detector.js +58 -0
  33. package/dist/mlx-ml/tool-call-parser/detector.js.map +1 -0
  34. package/dist/mlx-ml/tool-call-parser/index.d.ts +7 -0
  35. package/dist/mlx-ml/tool-call-parser/index.d.ts.map +1 -0
  36. package/dist/mlx-ml/tool-call-parser/index.js +136 -0
  37. package/dist/mlx-ml/tool-call-parser/index.js.map +1 -0
  38. package/dist/mlx-ml/tool-call-parser/tool-formatter.d.ts +8 -0
  39. package/dist/mlx-ml/tool-call-parser/tool-formatter.d.ts.map +1 -0
  40. package/dist/mlx-ml/tool-call-parser/tool-formatter.js +88 -0
  41. package/dist/mlx-ml/tool-call-parser/tool-formatter.js.map +1 -0
  42. package/dist/mlx-ml/tool-call-parser/types.d.ts +18 -0
  43. package/dist/mlx-ml/tool-call-parser/types.d.ts.map +1 -0
  44. package/dist/mlx-ml/tool-call-parser/types.js +2 -0
  45. package/dist/mlx-ml/tool-call-parser/types.js.map +1 -0
  46. package/dist/mlx-ml/tool-call-parser/utils.d.ts +5 -0
  47. package/dist/mlx-ml/tool-call-parser/utils.d.ts.map +1 -0
  48. package/dist/mlx-ml/tool-call-parser/utils.js +77 -0
  49. package/dist/mlx-ml/tool-call-parser/utils.js.map +1 -0
  50. package/package.json +3 -1
  51. package/src/mlx-ml/python/utils/token_utils.py +8 -38
  52. package/dist/mlx-ml/tool-call-parser.d.ts +0 -30
  53. package/dist/mlx-ml/tool-call-parser.d.ts.map +0 -1
  54. package/dist/mlx-ml/tool-call-parser.js +0 -642
  55. package/dist/mlx-ml/tool-call-parser.js.map +0 -1
@@ -1,642 +0,0 @@
1
- /** tool_call関連のspecial_tokensキー名リスト */
2
- const TOOL_CALL_TOKEN_KEYS = [
3
- 'tool_call', 'tool_call_explicit', 'tool_call_xml',
4
- 'tool_calls_section', 'function_call_tags',
5
- 'longcat_tool_call', 'minimax_tool_call'
6
- ];
7
- /** 既知のtool parserとデリミタのマッピング */
8
- const KNOWN_TOOL_PARSER_DELIMITERS = {
9
- json_tools: { start: '<tool_call>', end: '</tool_call>' },
10
- pythonic: { start: '<|tool_call_start|>', end: '<|tool_call_end|>' },
11
- function_gemma: { start: '<start_function_call>', end: '<end_function_call>' },
12
- mistral: { start: '[TOOL_CALLS]', end: '' },
13
- kimi_k2: { start: '<|tool_calls_section_begin|>', end: '<|tool_calls_section_end|>' },
14
- longcat: { start: '<longcat_tool_call>', end: '</longcat_tool_call>' },
15
- glm47: { start: '<tool_call>', end: '</tool_call>' },
16
- qwen3_coder: { start: '<tool_call>', end: '</tool_call>' },
17
- minimax_m2: { start: '<minimax:tool_call>', end: '</minimax:tool_call>' },
18
- gemma4: { start: '<|tool_call>', end: '<tool_call|>' },
19
- };
20
- /**
21
- * モデル出力からtool callを検出・パース
22
- *
23
- * 検出戦略:
24
- * 1. runtimeInfo.features.chat_template.tool_call_format が存在 → テンプレート由来のデリミタで検出
25
- * 2. runtimeInfo.special_tokens.tool_call が存在 → 特殊トークンによるデリミタで検出
26
- * 3. ```json:toolCall コードブロック → ラベル付きコードブロック検出
27
- * 4. 汎用フォールバック → JSON形式のtool call検出
28
- */
29
- export function parseToolCalls(text, runtimeInfo) {
30
- // 1. tool_call_format(テンプレート由来)による検出
31
- const toolCallFormat = runtimeInfo?.features?.chat_template?.tool_call_format;
32
- if (toolCallFormat?.call_start && toolCallFormat?.call_end) {
33
- const result = parseWithDelimiters(text, toolCallFormat.call_start, toolCallFormat.call_end);
34
- if (result.toolCalls.length > 0) {
35
- return result;
36
- }
37
- }
38
- // 1.5. tool_parser_type から既知デリミタで検出
39
- if (toolCallFormat?.tool_parser_type) {
40
- const known = KNOWN_TOOL_PARSER_DELIMITERS[toolCallFormat.tool_parser_type];
41
- if (known && known.end) {
42
- const result = parseWithDelimiters(text, known.start, known.end);
43
- if (result.toolCalls.length > 0) {
44
- return result;
45
- }
46
- }
47
- }
48
- // 2. 特殊トークンによる検出(拡張:複数のキー名を検索)
49
- for (const key of TOOL_CALL_TOKEN_KEYS) {
50
- const toolCallToken = runtimeInfo?.special_tokens?.[key];
51
- if (toolCallToken && typeof toolCallToken === 'object' && 'start' in toolCallToken) {
52
- const pair = toolCallToken;
53
- const result = parseWithDelimiters(text, pair.start.text, pair.end.text);
54
- if (result.toolCalls.length > 0) {
55
- return result;
56
- }
57
- }
58
- }
59
- // 2.5. 単体マーカートークンによる検出(Mistral型)
60
- const toolCallsMarker = runtimeInfo?.special_tokens?.['tool_calls_marker'];
61
- if (toolCallsMarker && typeof toolCallsMarker === 'object' && 'text' in toolCallsMarker) {
62
- const markerToken = toolCallsMarker;
63
- const result = parseMistralStyleToolCalls(text, markerToken.text);
64
- if (result.toolCalls.length > 0) {
65
- return result;
66
- }
67
- }
68
- // 3. ```json:toolCall コードブロック検出
69
- const codeBlockResult = parseCodeBlockToolCalls(text);
70
- if (codeBlockResult.toolCalls.length > 0) {
71
- return codeBlockResult;
72
- }
73
- // 4. 汎用フォールバック
74
- return parseGenericToolCalls(text);
75
- }
76
- /**
77
- * 値を適切な型に変換
78
- * - 文字列: そのまま
79
- * - true/false/True/False → boolean
80
- * - null/None → null
81
- * - 数値文字列 → number
82
- */
83
- function coerceValue(value) {
84
- if (value === undefined)
85
- return null;
86
- // Python形式の変換
87
- const normalized = value === 'None' ? 'null' : value === 'True' ? 'true' : value === 'False' ? 'false' : value;
88
- try {
89
- return JSON.parse(normalized);
90
- }
91
- catch {
92
- return value;
93
- }
94
- }
95
- /**
96
- * JSONオブジェクトを正規化してParsedToolCall形式に変換
97
- */
98
- function normalizeJsonToolCall(obj) {
99
- if (typeof obj !== 'object' || obj === null) {
100
- return null;
101
- }
102
- const objRecord = obj;
103
- // 標準形式: {"name": "...", "arguments": {...}}
104
- if (objRecord.name && typeof objRecord.name === 'string') {
105
- let args = objRecord.arguments || objRecord.parameters || {};
106
- if (typeof args === 'string') {
107
- try {
108
- args = JSON.parse(args);
109
- }
110
- catch {
111
- args = {};
112
- }
113
- }
114
- if (typeof args !== 'object' || args === null)
115
- args = {};
116
- return { name: objRecord.name, arguments: args };
117
- }
118
- // ネスト形式: {"function": {"name": "...", "arguments": {...}}}
119
- if (objRecord.function && typeof objRecord.function === 'object' && objRecord.function !== null) {
120
- const func = objRecord.function;
121
- if (func.name && typeof func.name === 'string') {
122
- let args = func.arguments || func.parameters || {};
123
- if (typeof args === 'string') {
124
- try {
125
- args = JSON.parse(args);
126
- }
127
- catch {
128
- args = {};
129
- }
130
- }
131
- if (typeof args !== 'object' || args === null)
132
- args = {};
133
- return { name: func.name, arguments: args };
134
- }
135
- }
136
- // tool wrapping: {"tool": {"name": "...", ...}}
137
- if (objRecord.tool && typeof objRecord.tool === 'object' && objRecord.tool !== null) {
138
- const tool = objRecord.tool;
139
- if (tool.name && typeof tool.name === 'string') {
140
- let args = tool.arguments || tool.parameters || {};
141
- if (typeof args !== 'object' || args === null)
142
- args = {};
143
- return {
144
- name: tool.name,
145
- arguments: args
146
- };
147
- }
148
- }
149
- return null;
150
- }
151
- /**
152
- * JSON形式のtool callコンテンツをパース
153
- */
154
- function parseJsonToolCallContent(content) {
155
- try {
156
- const parsed = JSON.parse(content);
157
- // 配列形式
158
- if (Array.isArray(parsed)) {
159
- const results = parsed
160
- .map((item) => normalizeJsonToolCall(item))
161
- .filter((item) => item !== null);
162
- return results.length > 0 ? results : null;
163
- }
164
- // オブジェクト形式
165
- return normalizeJsonToolCall(parsed);
166
- }
167
- catch {
168
- return null;
169
- }
170
- }
171
- /**
172
- * Pythonic形式のtool callコンテンツをパース
173
- * 例: [func_name(arg1="value", arg2=123)]
174
- */
175
- function parsePythonicToolCallContent(content) {
176
- const match = content.match(/^\[(\w+)\((.*)\)\]$/s);
177
- if (!match)
178
- return null;
179
- const name = match[1];
180
- const argsStr = match[2].trim();
181
- const args = {};
182
- if (argsStr) {
183
- // key=value ペアを抽出(値が括弧構造を含む場合は括弧対応で取得)
184
- let pos = 0;
185
- while (pos < argsStr.length) {
186
- // key の抽出
187
- const keyMatch = argsStr.slice(pos).match(/^(\w+)\s*=\s*/);
188
- if (!keyMatch)
189
- break;
190
- const key = keyMatch[1];
191
- pos += keyMatch[0].length;
192
- // value の抽出
193
- const ch = argsStr[pos];
194
- let value;
195
- if (ch === '[' || ch === '{') {
196
- // 括弧対応で値を抽出
197
- const extracted = extractBracketedValue(argsStr, pos);
198
- if (!extracted)
199
- break;
200
- value = extracted;
201
- pos += value.length;
202
- }
203
- else if (ch === '"' || ch === "'") {
204
- // 引用符で囲まれた文字列
205
- const quote = ch;
206
- let end = pos + 1;
207
- while (end < argsStr.length && argsStr[end] !== quote) {
208
- if (argsStr[end] === '\\')
209
- end++;
210
- end++;
211
- }
212
- value = argsStr.slice(pos + 1, end);
213
- pos = end + 1;
214
- }
215
- else {
216
- // カンマまたは末尾まで
217
- const endMatch = argsStr.slice(pos).match(/^([^,)]*)/);
218
- value = endMatch ? endMatch[1].trim() : '';
219
- pos += endMatch ? endMatch[0].length : 0;
220
- }
221
- args[key] = coerceValue(value);
222
- // カンマをスキップ
223
- const sep = argsStr.slice(pos).match(/^\s*,\s*/);
224
- if (sep)
225
- pos += sep[0].length;
226
- }
227
- }
228
- return { name, arguments: args };
229
- }
230
- /**
231
- * 括弧対応で値を抽出([...] や {...})
232
- */
233
- function extractBracketedValue(text, start) {
234
- let depth = 0;
235
- let inString = false;
236
- let escape = false;
237
- for (let i = start; i < text.length; i++) {
238
- const ch = text[i];
239
- if (escape) {
240
- escape = false;
241
- continue;
242
- }
243
- if (ch === '\\' && inString) {
244
- escape = true;
245
- continue;
246
- }
247
- if (ch === '"') {
248
- inString = !inString;
249
- continue;
250
- }
251
- if (inString)
252
- continue;
253
- if (ch === '[' || ch === '{')
254
- depth++;
255
- else if (ch === ']' || ch === '}')
256
- depth--;
257
- if (depth === 0) {
258
- return text.slice(start, i + 1);
259
- }
260
- }
261
- return null;
262
- }
263
- /**
264
- * XML形式のtool callコンテンツをパース
265
- * - qwen3_coder形式: <function=name><parameter=key>value</parameter>...</function>
266
- * - minimax形式: <invoke name="name"><parameter name="key">value</parameter>...</invoke>
267
- */
268
- function parseXmlToolCallContent(content) {
269
- // qwen3_coder形式
270
- const qwenMatch = content.match(/<function=([\w.-]+)>([\s\S]*?)<\/function>/);
271
- if (qwenMatch) {
272
- const name = qwenMatch[1];
273
- const paramsStr = qwenMatch[2];
274
- const args = {};
275
- const paramRegex = /<parameter=(\w+)>([\s\S]*?)<\/parameter>/g;
276
- let paramMatch;
277
- while ((paramMatch = paramRegex.exec(paramsStr)) !== null) {
278
- args[paramMatch[1]] = coerceValue(paramMatch[2].trim());
279
- }
280
- return { name, arguments: args };
281
- }
282
- // minimax形式
283
- const minimaxMatch = content.match(/<invoke\s+name="([\w.]+)">([\s\S]*?)<\/invoke>/);
284
- if (minimaxMatch) {
285
- const name = minimaxMatch[1];
286
- const paramsStr = minimaxMatch[2];
287
- const args = {};
288
- const paramRegex = /<parameter\s+name="(\w+)">([\s\S]*?)<\/parameter>/g;
289
- let paramMatch;
290
- while ((paramMatch = paramRegex.exec(paramsStr)) !== null) {
291
- args[paramMatch[1]] = coerceValue(paramMatch[2].trim());
292
- }
293
- return { name, arguments: args };
294
- }
295
- return null;
296
- }
297
- /**
298
- * Gemma 4形式のtool callコンテンツをパース
299
- * 例: call:get_weather{location:<|"|>東京<|"|>,limit:10}
300
- */
301
- function parseGemma4ToolCallContent(content) {
302
- const match = content.match(/^call:([\w.-]+)\{([\s\S]*)\}$/);
303
- if (!match)
304
- return null;
305
- const name = match[1];
306
- const argsStr = match[2].trim();
307
- const args = {};
308
- if (argsStr) {
309
- // <|"|> を通常の引用符に置換
310
- const normalized = argsStr.replace(/<\|"\|>/g, '"');
311
- // key:value ペアを抽出
312
- let pos = 0;
313
- while (pos < normalized.length) {
314
- // key の抽出
315
- const keyMatch = normalized.slice(pos).match(/^(\w+):/);
316
- if (!keyMatch)
317
- break;
318
- const key = keyMatch[1];
319
- pos += keyMatch[0].length;
320
- // value の抽出
321
- const ch = normalized[pos];
322
- let value;
323
- if (ch === '"') {
324
- // 引用符で囲まれた文字列
325
- let end = pos + 1;
326
- while (end < normalized.length && normalized[end] !== '"') {
327
- if (normalized[end] === '\\')
328
- end++;
329
- end++;
330
- }
331
- value = normalized.slice(pos + 1, end);
332
- pos = end + 1;
333
- }
334
- else if (ch === '[' || ch === '{') {
335
- // 括弧対応で値を抽出
336
- const extracted = extractBracketedValue(normalized, pos);
337
- if (!extracted)
338
- break;
339
- value = extracted;
340
- pos += value.length;
341
- }
342
- else {
343
- // カンマまたは末尾まで
344
- const endMatch = normalized.slice(pos).match(/^([^,}]*)/);
345
- value = endMatch ? endMatch[1].trim() : '';
346
- pos += endMatch ? endMatch[0].length : 0;
347
- }
348
- args[key] = coerceValue(value);
349
- // カンマをスキップ
350
- const sep = normalized.slice(pos).match(/^\s*,\s*/);
351
- if (sep)
352
- pos += sep[0].length;
353
- }
354
- }
355
- return { name, arguments: args };
356
- }
357
- /**
358
- * 複数形式を試行してtool callコンテンツをパース
359
- */
360
- function parseToolCallContent(content) {
361
- // 1. JSON形式を試行
362
- const jsonResult = parseJsonToolCallContent(content);
363
- if (jsonResult)
364
- return jsonResult;
365
- // 2. Gemma 4形式を試行
366
- const gemma4Result = parseGemma4ToolCallContent(content);
367
- if (gemma4Result)
368
- return gemma4Result;
369
- // 3. Pythonic形式を試行
370
- const pythonicResult = parsePythonicToolCallContent(content);
371
- if (pythonicResult)
372
- return pythonicResult;
373
- // 4. XML形式を試行
374
- const xmlResult = parseXmlToolCallContent(content);
375
- if (xmlResult)
376
- return xmlResult;
377
- return null;
378
- }
379
- function parseWithDelimiters(text, startDelimiter, endDelimiter) {
380
- const toolCalls = [];
381
- let content = text;
382
- let callIndex = 0;
383
- // startDelimiter...endDelimiter のパターンを繰り返し検索
384
- const regex = new RegExp(escapeRegExp(startDelimiter) + '([\\s\\S]*?)' + escapeRegExp(endDelimiter), 'g');
385
- let match;
386
- while ((match = regex.exec(text)) !== null) {
387
- const innerContent = match[1].trim();
388
- // 複数形式を順次試行
389
- const parsed = parseToolCallContent(innerContent);
390
- if (parsed) {
391
- // parsedが配列の場合もある(glm47等)
392
- const calls = Array.isArray(parsed) ? parsed : [parsed];
393
- for (const call of calls) {
394
- toolCalls.push({
395
- id: `call_${callIndex++}`,
396
- name: call.name,
397
- arguments: call.arguments || {}
398
- });
399
- }
400
- }
401
- }
402
- if (toolCalls.length > 0) {
403
- // tool call部分をテキストから除去
404
- content = text.replace(regex, '').trim();
405
- }
406
- return { content, toolCalls };
407
- }
408
- function parseCodeBlockToolCalls(text) {
409
- const toolCalls = [];
410
- let content = text;
411
- let callIndex = 0;
412
- // ```json:toolCall ... ``` パターンを検出
413
- const codeBlockRegex = /```json:toolCall\s*\n([\s\S]*?)```/g;
414
- let match;
415
- while ((match = codeBlockRegex.exec(text)) !== null) {
416
- const jsonStr = match[1].trim();
417
- try {
418
- const parsed = JSON.parse(jsonStr);
419
- toolCalls.push({
420
- id: `call_${callIndex++}`,
421
- name: parsed.name,
422
- arguments: parsed.arguments || parsed.parameters || {}
423
- });
424
- }
425
- catch {
426
- // JSONパース失敗 → スキップ
427
- }
428
- }
429
- if (toolCalls.length > 0) {
430
- content = text.replace(codeBlockRegex, '').trim();
431
- }
432
- return { content, toolCalls };
433
- }
434
- function parseGenericToolCalls(text) {
435
- const toolCalls = [];
436
- let content = text;
437
- let callIndex = 0;
438
- const matched = [];
439
- // テキスト中の JSON オブジェクトを括弧対応で抽出し、tool call か判定
440
- for (let i = 0; i < text.length; i++) {
441
- if (text[i] !== '{')
442
- continue;
443
- const jsonStr = extractJsonObject(text, i);
444
- if (!jsonStr)
445
- continue;
446
- try {
447
- const parsed = JSON.parse(jsonStr);
448
- const normalized = normalizeJsonToolCall(parsed);
449
- if (normalized) {
450
- toolCalls.push({
451
- id: `call_${callIndex++}`,
452
- name: normalized.name,
453
- arguments: normalized.arguments || {}
454
- });
455
- matched.push(jsonStr);
456
- i += jsonStr.length - 1; // skip past this JSON
457
- }
458
- }
459
- catch {
460
- // パース失敗 → スキップ
461
- }
462
- }
463
- if (matched.length > 0) {
464
- for (const m of matched) {
465
- content = content.replace(m, '').trim();
466
- }
467
- }
468
- return { content, toolCalls };
469
- }
470
- /**
471
- * テキスト中の位置 start から括弧対応で JSON オブジェクトを抽出
472
- */
473
- function extractJsonObject(text, start) {
474
- if (text[start] !== '{')
475
- return null;
476
- let depth = 0;
477
- let inString = false;
478
- let escape = false;
479
- for (let i = start; i < text.length; i++) {
480
- const ch = text[i];
481
- if (escape) {
482
- escape = false;
483
- continue;
484
- }
485
- if (ch === '\\' && inString) {
486
- escape = true;
487
- continue;
488
- }
489
- if (ch === '"') {
490
- inString = !inString;
491
- continue;
492
- }
493
- if (inString)
494
- continue;
495
- if (ch === '{' || ch === '[')
496
- depth++;
497
- else if (ch === '}' || ch === ']')
498
- depth--;
499
- if (depth === 0) {
500
- return text.slice(start, i + 1);
501
- }
502
- }
503
- return null;
504
- }
505
- function parseMistralStyleToolCalls(text, marker) {
506
- const markerIndex = text.indexOf(marker);
507
- if (markerIndex === -1) {
508
- return { content: text, toolCalls: [] };
509
- }
510
- const content = text.substring(0, markerIndex).trim();
511
- const callText = text.substring(markerIndex + marker.length).trim();
512
- const toolCalls = [];
513
- let callIndex = 0;
514
- // JSONオブジェクトを抽出
515
- try {
516
- const parsed = JSON.parse(callText);
517
- if (parsed.name) {
518
- toolCalls.push({
519
- id: `call_${callIndex++}`,
520
- name: parsed.name,
521
- arguments: parsed.arguments || parsed.parameters || {}
522
- });
523
- }
524
- else if (Array.isArray(parsed)) {
525
- for (const item of parsed) {
526
- if (item.name) {
527
- toolCalls.push({
528
- id: `call_${callIndex++}`,
529
- name: item.name,
530
- arguments: item.arguments || item.parameters || {}
531
- });
532
- }
533
- }
534
- }
535
- }
536
- catch {
537
- // JSONパース失敗 → スキップ
538
- }
539
- return { content, toolCalls };
540
- }
541
- function escapeRegExp(str) {
542
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
543
- }
544
- /**
545
- * パラメータ properties を再帰的にフォーマット
546
- */
547
- function formatProperties(lines, properties, required, depth = 1) {
548
- const indent = ' '.repeat(depth);
549
- for (const [name, schema] of Object.entries(properties)) {
550
- const schemaObj = schema;
551
- const req = required?.includes(name) ? ' (required)' : '';
552
- const desc = schemaObj.description ? `: ${schemaObj.description}` : '';
553
- const type = schemaObj.type || 'any';
554
- if (type === 'array' && schemaObj.items) {
555
- lines.push(`${indent}- ${name}: array${req}${desc}`);
556
- const items = schemaObj.items;
557
- if (items.properties) {
558
- lines.push(`${indent} Each item:`);
559
- formatProperties(lines, items.properties, items.required, depth + 2);
560
- }
561
- }
562
- else if (type === 'object' && schemaObj.properties) {
563
- lines.push(`${indent}- ${name}: object${req}${desc}`);
564
- formatProperties(lines, schemaObj.properties, schemaObj.required, depth + 1);
565
- }
566
- else {
567
- lines.push(`${indent}- ${name}: ${type}${req}${desc}`);
568
- }
569
- }
570
- }
571
- /**
572
- * tool定義をテキスト形式にフォーマット
573
- * tool_call_formatまたは特殊トークンがある場合はそのフォーマットに合わせた指示を生成
574
- */
575
- export function formatToolDefinitionsAsText(tools, specialTokens, toolCallFormat) {
576
- // ツール定義一覧
577
- const lines = ['## Available Tools', ''];
578
- lines.push('Instead of generating a text response, you can respond with tool call data.');
579
- lines.push('The result of the tool execution will be provided as context in your next generation.');
580
- lines.push('Choose a tool from the available list below, determine the appropriate arguments, and output a JSON string in the specified format.');
581
- lines.push('If a required tool is not in the available list, report this to the user.');
582
- lines.push('');
583
- // 具体例を生成するための最初のツール情報を記録
584
- let exampleToolName;
585
- let exampleArgs;
586
- for (const tool of tools) {
587
- lines.push(`### ${tool.name}`);
588
- if (tool.description) {
589
- lines.push(tool.description);
590
- }
591
- if (tool.parameters) {
592
- const params = tool.parameters;
593
- if (params.properties) {
594
- lines.push('Parameters:');
595
- formatProperties(lines, params.properties, params.required, 1);
596
- // 最初のツールで具体例を生成
597
- if (!exampleToolName) {
598
- exampleToolName = tool.name;
599
- const argEntries = [];
600
- for (const [name, schema] of Object.entries(params.properties)) {
601
- const schemaObj = schema;
602
- const val = schemaObj.type === 'number' ? '0' : schemaObj.type === 'boolean' ? 'true' : `"..."`;
603
- argEntries.push(`"${name}": ${val}`);
604
- }
605
- exampleArgs = `{${argEntries.join(', ')}}`;
606
- }
607
- }
608
- else {
609
- lines.push(`Parameters: ${JSON.stringify(tool.parameters)}`);
610
- }
611
- }
612
- lines.push('');
613
- }
614
- // tool call出力フォーマットの指示
615
- const concreteExample = exampleToolName
616
- ? `{"name": "${exampleToolName}", "arguments": ${exampleArgs}}`
617
- : '{"name": "tool_name", "arguments": {"key": "value"}}';
618
- if (toolCallFormat?.call_start && toolCallFormat?.call_end) {
619
- lines.push('To call a tool, respond ONLY with:');
620
- lines.push(toolCallFormat.call_start);
621
- lines.push(concreteExample);
622
- lines.push(toolCallFormat.call_end);
623
- }
624
- else {
625
- const toolCallToken = specialTokens?.tool_call;
626
- if (toolCallToken && 'start' in toolCallToken && 'end' in toolCallToken) {
627
- const pair = toolCallToken;
628
- lines.push('To call a tool, respond ONLY with:');
629
- lines.push(`${pair.start.text}`);
630
- lines.push(concreteExample);
631
- lines.push(`${pair.end.text}`);
632
- }
633
- else {
634
- lines.push('To call a tool, respond ONLY with the following format. Do not include any other text before or after the tool call block:');
635
- lines.push('```json:toolCall');
636
- lines.push(concreteExample);
637
- lines.push('```');
638
- }
639
- }
640
- return lines.join('\n');
641
- }
642
- //# sourceMappingURL=tool-call-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-call-parser.js","sourceRoot":"","sources":["../../src/mlx-ml/tool-call-parser.ts"],"names":[],"mappings":"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"}