@modular-prompt/driver 0.12.0 → 0.13.2

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