@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.
- package/dist/cache-controller.d.ts +4 -1
- package/dist/cache-controller.d.ts.map +1 -1
- package/dist/echo-driver.d.ts.map +1 -1
- package/dist/echo-driver.js +9 -39
- package/dist/echo-driver.js.map +1 -1
- package/dist/formatter/completion-formatter.d.ts.map +1 -1
- package/dist/formatter/completion-formatter.js +30 -24
- package/dist/formatter/completion-formatter.js.map +1 -1
- package/dist/formatter/converter.d.ts.map +1 -1
- package/dist/formatter/converter.js +18 -13
- package/dist/formatter/converter.js.map +1 -1
- package/dist/formatter/types.d.ts +7 -0
- package/dist/formatter/types.d.ts.map +1 -1
- package/dist/google-genai/google-genai-cache-controller.d.ts +1 -1
- package/dist/google-genai/google-genai-cache-controller.d.ts.map +1 -1
- package/dist/google-genai/google-genai-cache-controller.js +4 -4
- package/dist/google-genai/google-genai-cache-controller.js.map +1 -1
- package/dist/mlx-ml/mlx-cache-controller.d.ts +3 -4
- package/dist/mlx-ml/mlx-cache-controller.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-cache-controller.js +46 -22
- package/dist/mlx-ml/mlx-cache-controller.js.map +1 -1
- package/dist/mlx-ml/mlx-driver.js +4 -4
- package/dist/mlx-ml/mlx-driver.js.map +1 -1
- package/dist/mlx-ml/process/response-processor.js +1 -1
- package/dist/mlx-ml/process/response-processor.js.map +1 -1
- package/dist/mlx-ml/tool-call-parser/content-parsers.d.ts +9 -0
- package/dist/mlx-ml/tool-call-parser/content-parsers.d.ts.map +1 -0
- package/dist/mlx-ml/tool-call-parser/content-parsers.js +223 -0
- package/dist/mlx-ml/tool-call-parser/content-parsers.js.map +1 -0
- package/dist/mlx-ml/tool-call-parser/detector.d.ts +16 -0
- package/dist/mlx-ml/tool-call-parser/detector.d.ts.map +1 -0
- package/dist/mlx-ml/tool-call-parser/detector.js +58 -0
- package/dist/mlx-ml/tool-call-parser/detector.js.map +1 -0
- package/dist/mlx-ml/tool-call-parser/index.d.ts +7 -0
- package/dist/mlx-ml/tool-call-parser/index.d.ts.map +1 -0
- package/dist/mlx-ml/tool-call-parser/index.js +136 -0
- package/dist/mlx-ml/tool-call-parser/index.js.map +1 -0
- package/dist/mlx-ml/tool-call-parser/tool-formatter.d.ts +8 -0
- package/dist/mlx-ml/tool-call-parser/tool-formatter.d.ts.map +1 -0
- package/dist/mlx-ml/tool-call-parser/tool-formatter.js +88 -0
- package/dist/mlx-ml/tool-call-parser/tool-formatter.js.map +1 -0
- package/dist/mlx-ml/tool-call-parser/types.d.ts +18 -0
- package/dist/mlx-ml/tool-call-parser/types.d.ts.map +1 -0
- package/dist/mlx-ml/tool-call-parser/types.js +2 -0
- package/dist/mlx-ml/tool-call-parser/types.js.map +1 -0
- package/dist/mlx-ml/tool-call-parser/utils.d.ts +5 -0
- package/dist/mlx-ml/tool-call-parser/utils.d.ts.map +1 -0
- package/dist/mlx-ml/tool-call-parser/utils.js +77 -0
- package/dist/mlx-ml/tool-call-parser/utils.js.map +1 -0
- package/package.json +3 -1
- package/src/mlx-ml/python/utils/token_utils.py +8 -38
- package/dist/mlx-ml/tool-call-parser.d.ts +0 -30
- package/dist/mlx-ml/tool-call-parser.d.ts.map +0 -1
- package/dist/mlx-ml/tool-call-parser.js +0 -642
- 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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"}
|