@open-multi-agent/core 1.4.0
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/LICENSE +21 -0
- package/README.md +373 -0
- package/dist/agent/agent.d.ts +153 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +559 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/loop-detector.d.ts +39 -0
- package/dist/agent/loop-detector.d.ts.map +1 -0
- package/dist/agent/loop-detector.js +122 -0
- package/dist/agent/loop-detector.js.map +1 -0
- package/dist/agent/pool.d.ts +158 -0
- package/dist/agent/pool.d.ts.map +1 -0
- package/dist/agent/pool.js +320 -0
- package/dist/agent/pool.js.map +1 -0
- package/dist/agent/runner.d.ts +242 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +943 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/structured-output.d.ts +33 -0
- package/dist/agent/structured-output.d.ts.map +1 -0
- package/dist/agent/structured-output.js +116 -0
- package/dist/agent/structured-output.js.map +1 -0
- package/dist/cli/oma.d.ts +30 -0
- package/dist/cli/oma.d.ts.map +1 -0
- package/dist/cli/oma.js +433 -0
- package/dist/cli/oma.js.map +1 -0
- package/dist/dashboard/layout-tasks.d.ts +23 -0
- package/dist/dashboard/layout-tasks.d.ts.map +1 -0
- package/dist/dashboard/layout-tasks.js +79 -0
- package/dist/dashboard/layout-tasks.js.map +1 -0
- package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
- package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
- package/dist/dashboard/render-team-run-dashboard.js +456 -0
- package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/adapter.d.ts +54 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +101 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/anthropic.d.ts +57 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +432 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/azure-openai.d.ts +74 -0
- package/dist/llm/azure-openai.d.ts.map +1 -0
- package/dist/llm/azure-openai.js +267 -0
- package/dist/llm/azure-openai.js.map +1 -0
- package/dist/llm/bedrock.d.ts +41 -0
- package/dist/llm/bedrock.d.ts.map +1 -0
- package/dist/llm/bedrock.js +345 -0
- package/dist/llm/bedrock.js.map +1 -0
- package/dist/llm/copilot.d.ts +92 -0
- package/dist/llm/copilot.d.ts.map +1 -0
- package/dist/llm/copilot.js +433 -0
- package/dist/llm/copilot.js.map +1 -0
- package/dist/llm/deepseek.d.ts +21 -0
- package/dist/llm/deepseek.d.ts.map +1 -0
- package/dist/llm/deepseek.js +24 -0
- package/dist/llm/deepseek.js.map +1 -0
- package/dist/llm/gemini.d.ts +65 -0
- package/dist/llm/gemini.d.ts.map +1 -0
- package/dist/llm/gemini.js +427 -0
- package/dist/llm/gemini.js.map +1 -0
- package/dist/llm/grok.d.ts +21 -0
- package/dist/llm/grok.d.ts.map +1 -0
- package/dist/llm/grok.js +24 -0
- package/dist/llm/grok.js.map +1 -0
- package/dist/llm/minimax.d.ts +21 -0
- package/dist/llm/minimax.d.ts.map +1 -0
- package/dist/llm/minimax.js +24 -0
- package/dist/llm/minimax.js.map +1 -0
- package/dist/llm/openai-common.d.ts +65 -0
- package/dist/llm/openai-common.d.ts.map +1 -0
- package/dist/llm/openai-common.js +286 -0
- package/dist/llm/openai-common.js.map +1 -0
- package/dist/llm/openai.d.ts +63 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +256 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/qiniu.d.ts +21 -0
- package/dist/llm/qiniu.d.ts.map +1 -0
- package/dist/llm/qiniu.js +24 -0
- package/dist/llm/qiniu.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +2 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory/shared.d.ts +162 -0
- package/dist/memory/shared.d.ts.map +1 -0
- package/dist/memory/shared.js +294 -0
- package/dist/memory/shared.js.map +1 -0
- package/dist/memory/store.d.ts +72 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +121 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +245 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +1400 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/scheduler.d.ts +112 -0
- package/dist/orchestrator/scheduler.d.ts.map +1 -0
- package/dist/orchestrator/scheduler.js +256 -0
- package/dist/orchestrator/scheduler.js.map +1 -0
- package/dist/task/queue.d.ts +191 -0
- package/dist/task/queue.d.ts.map +1 -0
- package/dist/task/queue.js +408 -0
- package/dist/task/queue.js.map +1 -0
- package/dist/task/task.d.ts +90 -0
- package/dist/task/task.d.ts.map +1 -0
- package/dist/task/task.js +206 -0
- package/dist/task/task.js.map +1 -0
- package/dist/team/messaging.d.ts +106 -0
- package/dist/team/messaging.d.ts.map +1 -0
- package/dist/team/messaging.js +183 -0
- package/dist/team/messaging.js.map +1 -0
- package/dist/team/team.d.ts +141 -0
- package/dist/team/team.d.ts.map +1 -0
- package/dist/team/team.js +293 -0
- package/dist/team/team.js.map +1 -0
- package/dist/tool/built-in/bash.d.ts +12 -0
- package/dist/tool/built-in/bash.d.ts.map +1 -0
- package/dist/tool/built-in/bash.js +133 -0
- package/dist/tool/built-in/bash.js.map +1 -0
- package/dist/tool/built-in/delegate.d.ts +29 -0
- package/dist/tool/built-in/delegate.d.ts.map +1 -0
- package/dist/tool/built-in/delegate.js +92 -0
- package/dist/tool/built-in/delegate.js.map +1 -0
- package/dist/tool/built-in/file-edit.d.ts +14 -0
- package/dist/tool/built-in/file-edit.d.ts.map +1 -0
- package/dist/tool/built-in/file-edit.js +130 -0
- package/dist/tool/built-in/file-edit.js.map +1 -0
- package/dist/tool/built-in/file-read.d.ts +12 -0
- package/dist/tool/built-in/file-read.d.ts.map +1 -0
- package/dist/tool/built-in/file-read.js +82 -0
- package/dist/tool/built-in/file-read.js.map +1 -0
- package/dist/tool/built-in/file-write.d.ts +11 -0
- package/dist/tool/built-in/file-write.d.ts.map +1 -0
- package/dist/tool/built-in/file-write.js +70 -0
- package/dist/tool/built-in/file-write.js.map +1 -0
- package/dist/tool/built-in/fs-walk.d.ts +23 -0
- package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
- package/dist/tool/built-in/fs-walk.js +78 -0
- package/dist/tool/built-in/fs-walk.js.map +1 -0
- package/dist/tool/built-in/glob.d.ts +12 -0
- package/dist/tool/built-in/glob.d.ts.map +1 -0
- package/dist/tool/built-in/glob.js +82 -0
- package/dist/tool/built-in/glob.js.map +1 -0
- package/dist/tool/built-in/grep.d.ts +15 -0
- package/dist/tool/built-in/grep.d.ts.map +1 -0
- package/dist/tool/built-in/grep.js +218 -0
- package/dist/tool/built-in/grep.js.map +1 -0
- package/dist/tool/built-in/index.d.ts +48 -0
- package/dist/tool/built-in/index.d.ts.map +1 -0
- package/dist/tool/built-in/index.js +56 -0
- package/dist/tool/built-in/index.js.map +1 -0
- package/dist/tool/executor.d.ts +100 -0
- package/dist/tool/executor.d.ts.map +1 -0
- package/dist/tool/executor.js +184 -0
- package/dist/tool/executor.js.map +1 -0
- package/dist/tool/framework.d.ts +167 -0
- package/dist/tool/framework.d.ts.map +1 -0
- package/dist/tool/framework.js +402 -0
- package/dist/tool/framework.js.map +1 -0
- package/dist/tool/mcp.d.ts +31 -0
- package/dist/tool/mcp.d.ts.map +1 -0
- package/dist/tool/mcp.js +175 -0
- package/dist/tool/mcp.js.map +1 -0
- package/dist/tool/text-tool-extractor.d.ts +32 -0
- package/dist/tool/text-tool-extractor.d.ts.map +1 -0
- package/dist/tool/text-tool-extractor.js +195 -0
- package/dist/tool/text-tool-extractor.js.map +1 -0
- package/dist/types.d.ts +916 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/keywords.d.ts +18 -0
- package/dist/utils/keywords.d.ts.map +1 -0
- package/dist/utils/keywords.js +32 -0
- package/dist/utils/keywords.js.map +1 -0
- package/dist/utils/semaphore.d.ts +49 -0
- package/dist/utils/semaphore.d.ts.map +1 -0
- package/dist/utils/semaphore.js +89 -0
- package/dist/utils/semaphore.js.map +1 -0
- package/dist/utils/tokens.d.ts +7 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/utils/trace.d.ts +12 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +30 -0
- package/dist/utils/trace.js.map +1 -0
- package/docs/DECISIONS.md +49 -0
- package/docs/cli.md +265 -0
- package/docs/context-management.md +24 -0
- package/docs/featured-partner.md +28 -0
- package/docs/observability.md +56 -0
- package/docs/providers.md +78 -0
- package/docs/shared-memory.md +27 -0
- package/docs/tool-configuration.md +152 -0
- package/package.json +96 -0
package/dist/tool/mcp.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { defineTool } from './framework.js';
|
|
3
|
+
const DEFAULT_MCP_REQUEST_TIMEOUT_MS = 60_000;
|
|
4
|
+
async function loadMCPModules() {
|
|
5
|
+
const [{ Client }, { StdioClientTransport }] = await Promise.all([
|
|
6
|
+
import('@modelcontextprotocol/sdk/client/index.js'),
|
|
7
|
+
import('@modelcontextprotocol/sdk/client/stdio.js'),
|
|
8
|
+
]);
|
|
9
|
+
return { Client, StdioClientTransport };
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build an LLM-safe tool name: MCP and prior examples used `prefix/name`, but
|
|
13
|
+
* Anthropic and other providers reject `/` in tool names.
|
|
14
|
+
*/
|
|
15
|
+
function normalizeToolName(rawName, namePrefix) {
|
|
16
|
+
const trimmedPrefix = namePrefix?.trim();
|
|
17
|
+
const base = trimmedPrefix !== undefined && trimmedPrefix !== ''
|
|
18
|
+
? `${trimmedPrefix}_${rawName}`
|
|
19
|
+
: rawName;
|
|
20
|
+
return base.replace(/\//g, '_');
|
|
21
|
+
}
|
|
22
|
+
/** MCP `tools/list` JSON Schema; forwarded to the LLM as-is (runtime validation stays `z.any()`). */
|
|
23
|
+
function mcpLlmInputSchema(schema) {
|
|
24
|
+
if (schema !== undefined && typeof schema === 'object' && !Array.isArray(schema)) {
|
|
25
|
+
return schema;
|
|
26
|
+
}
|
|
27
|
+
return { type: 'object' };
|
|
28
|
+
}
|
|
29
|
+
function contentBlockToText(block) {
|
|
30
|
+
const typ = block.type;
|
|
31
|
+
if (typ === 'text' && typeof block.text === 'string') {
|
|
32
|
+
return block.text;
|
|
33
|
+
}
|
|
34
|
+
if (typ === 'image' && typeof block.data === 'string') {
|
|
35
|
+
const mime = typeof block.mimeType === 'string' ? block.mimeType : 'image/*';
|
|
36
|
+
return `[image ${mime}; base64 length=${block.data.length}]`;
|
|
37
|
+
}
|
|
38
|
+
if (typ === 'audio' && typeof block.data === 'string') {
|
|
39
|
+
const mime = typeof block.mimeType === 'string' ? block.mimeType : 'audio/*';
|
|
40
|
+
return `[audio ${mime}; base64 length=${block.data.length}]`;
|
|
41
|
+
}
|
|
42
|
+
if (typ === 'resource' &&
|
|
43
|
+
block.resource !== null &&
|
|
44
|
+
typeof block.resource === 'object') {
|
|
45
|
+
const r = block.resource;
|
|
46
|
+
const uri = typeof r.uri === 'string' ? r.uri : '';
|
|
47
|
+
if (typeof r.text === 'string') {
|
|
48
|
+
return `[resource ${uri}]\n${r.text}`;
|
|
49
|
+
}
|
|
50
|
+
if (typeof r.blob === 'string') {
|
|
51
|
+
const mime = typeof r.mimeType === 'string' ? r.mimeType : '';
|
|
52
|
+
return `[resource ${uri}; mimeType=${mime}; blob base64 length=${r.blob.length}]`;
|
|
53
|
+
}
|
|
54
|
+
return `[resource ${uri}]`;
|
|
55
|
+
}
|
|
56
|
+
if (typ === 'resource_link') {
|
|
57
|
+
const uri = typeof block.uri === 'string' ? block.uri : '';
|
|
58
|
+
const name = typeof block.name === 'string' ? block.name : '';
|
|
59
|
+
const desc = typeof block.description === 'string' ? block.description : '';
|
|
60
|
+
const head = `[resource_link name=${JSON.stringify(name)} uri=${JSON.stringify(uri)}]`;
|
|
61
|
+
return desc === '' ? head : `${head}\n${desc}`;
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
function toToolResultData(result) {
|
|
66
|
+
if ('toolResult' in result && result.toolResult !== undefined) {
|
|
67
|
+
try {
|
|
68
|
+
return JSON.stringify(result.toolResult, null, 2);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return String(result.toolResult);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const lines = [];
|
|
75
|
+
for (const block of result.content ?? []) {
|
|
76
|
+
if (block === null || typeof block !== 'object')
|
|
77
|
+
continue;
|
|
78
|
+
const rec = block;
|
|
79
|
+
const line = contentBlockToText(rec);
|
|
80
|
+
if (line !== undefined) {
|
|
81
|
+
lines.push(line);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
lines.push(`[${String(rec.type ?? 'unknown')}]\n${JSON.stringify(rec, null, 2)}`);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
lines.push('[mcp content block]');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (lines.length > 0) {
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
if (result.structuredContent !== undefined) {
|
|
95
|
+
try {
|
|
96
|
+
return JSON.stringify(result.structuredContent, null, 2);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return String(result.structuredContent);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return JSON.stringify(result);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return 'MCP tool completed with non-text output.';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function listAllMcpTools(client, requestOpts) {
|
|
110
|
+
const acc = [];
|
|
111
|
+
let cursor;
|
|
112
|
+
do {
|
|
113
|
+
const page = await client.listTools(cursor !== undefined ? { cursor } : {}, requestOpts);
|
|
114
|
+
acc.push(...(page.tools ?? []));
|
|
115
|
+
cursor =
|
|
116
|
+
typeof page.nextCursor === 'string' && page.nextCursor !== ''
|
|
117
|
+
? page.nextCursor
|
|
118
|
+
: undefined;
|
|
119
|
+
} while (cursor !== undefined);
|
|
120
|
+
return acc;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Connect to an MCP server over stdio and convert exposed MCP tools into
|
|
124
|
+
* open-multi-agent ToolDefinitions.
|
|
125
|
+
*/
|
|
126
|
+
export async function connectMCPTools(config) {
|
|
127
|
+
const { Client, StdioClientTransport } = await loadMCPModules();
|
|
128
|
+
const transport = new StdioClientTransport({
|
|
129
|
+
command: config.command,
|
|
130
|
+
args: config.args ?? [],
|
|
131
|
+
env: config.env,
|
|
132
|
+
cwd: config.cwd,
|
|
133
|
+
});
|
|
134
|
+
const client = new Client({
|
|
135
|
+
name: config.clientName ?? 'open-multi-agent',
|
|
136
|
+
version: config.clientVersion ?? '0.0.0',
|
|
137
|
+
}, { capabilities: {} });
|
|
138
|
+
const requestOpts = {
|
|
139
|
+
timeout: config.requestTimeoutMs ?? DEFAULT_MCP_REQUEST_TIMEOUT_MS,
|
|
140
|
+
};
|
|
141
|
+
await client.connect(transport, requestOpts);
|
|
142
|
+
const mcpTools = await listAllMcpTools(client, requestOpts);
|
|
143
|
+
const tools = mcpTools.map((tool) => defineTool({
|
|
144
|
+
name: normalizeToolName(tool.name, config.namePrefix),
|
|
145
|
+
description: tool.description ?? `MCP tool: ${tool.name}`,
|
|
146
|
+
inputSchema: z.any(),
|
|
147
|
+
llmInputSchema: mcpLlmInputSchema(tool.inputSchema),
|
|
148
|
+
execute: async (input) => {
|
|
149
|
+
try {
|
|
150
|
+
const result = await client.callTool({
|
|
151
|
+
name: tool.name,
|
|
152
|
+
arguments: input,
|
|
153
|
+
}, undefined, requestOpts);
|
|
154
|
+
return {
|
|
155
|
+
data: toToolResultData(result),
|
|
156
|
+
isError: result.isError === true,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
161
|
+
return {
|
|
162
|
+
data: `MCP tool "${tool.name}" failed: ${message}`,
|
|
163
|
+
isError: true,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
}));
|
|
168
|
+
return {
|
|
169
|
+
tools,
|
|
170
|
+
disconnect: async () => {
|
|
171
|
+
await client.close?.();
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/tool/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Fallback tool-call extractor for local models.
|
|
3
|
+
*
|
|
4
|
+
* When a local model (Ollama, vLLM, LM Studio) returns tool calls as plain
|
|
5
|
+
* text instead of using the OpenAI `tool_calls` wire format, this module
|
|
6
|
+
* attempts to extract them from the text output.
|
|
7
|
+
*
|
|
8
|
+
* Common scenarios:
|
|
9
|
+
* - Ollama thinking-model bug: tool call JSON ends up inside unclosed `<think>` tags
|
|
10
|
+
* - Model outputs raw JSON tool calls without the server parsing them
|
|
11
|
+
* - Model wraps tool calls in markdown code fences
|
|
12
|
+
* - Hermes-format `<tool_call>` tags
|
|
13
|
+
*
|
|
14
|
+
* This is a **safety net**, not the primary path. Native `tool_calls` from
|
|
15
|
+
* the server are always preferred.
|
|
16
|
+
*/
|
|
17
|
+
import type { ToolUseBlock } from '../types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Attempt to extract tool calls from a model's text output.
|
|
20
|
+
*
|
|
21
|
+
* Tries multiple strategies in order:
|
|
22
|
+
* 1. Hermes `<tool_call>` tags
|
|
23
|
+
* 2. JSON objects in text (bare or inside code fences)
|
|
24
|
+
*
|
|
25
|
+
* @param text - The model's text output.
|
|
26
|
+
* @param knownToolNames - Whitelist of registered tool names. When non-empty,
|
|
27
|
+
* only JSON objects whose `name` matches a known tool
|
|
28
|
+
* are treated as tool calls.
|
|
29
|
+
* @returns Extracted {@link ToolUseBlock}s, or an empty array if none found.
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractToolCallsFromText(text: string, knownToolNames: string[]): ToolUseBlock[];
|
|
32
|
+
//# sourceMappingURL=text-tool-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-tool-extractor.d.ts","sourceRoot":"","sources":["../../src/tool/text-tool-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA4K/C;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,GACvB,YAAY,EAAE,CAoBhB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Fallback tool-call extractor for local models.
|
|
3
|
+
*
|
|
4
|
+
* When a local model (Ollama, vLLM, LM Studio) returns tool calls as plain
|
|
5
|
+
* text instead of using the OpenAI `tool_calls` wire format, this module
|
|
6
|
+
* attempts to extract them from the text output.
|
|
7
|
+
*
|
|
8
|
+
* Common scenarios:
|
|
9
|
+
* - Ollama thinking-model bug: tool call JSON ends up inside unclosed `<think>` tags
|
|
10
|
+
* - Model outputs raw JSON tool calls without the server parsing them
|
|
11
|
+
* - Model wraps tool calls in markdown code fences
|
|
12
|
+
* - Hermes-format `<tool_call>` tags
|
|
13
|
+
*
|
|
14
|
+
* This is a **safety net**, not the primary path. Native `tool_calls` from
|
|
15
|
+
* the server are always preferred.
|
|
16
|
+
*/
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// ID generation
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
let callCounter = 0;
|
|
21
|
+
/** Generate a unique tool-call ID for extracted calls. */
|
|
22
|
+
function generateToolCallId() {
|
|
23
|
+
return `extracted_call_${Date.now()}_${++callCounter}`;
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Internal parsers
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Try to parse a single JSON object as a tool call.
|
|
30
|
+
*
|
|
31
|
+
* Accepted shapes:
|
|
32
|
+
* ```json
|
|
33
|
+
* { "name": "bash", "arguments": { "command": "ls" } }
|
|
34
|
+
* { "name": "bash", "parameters": { "command": "ls" } }
|
|
35
|
+
* { "function": { "name": "bash", "arguments": { "command": "ls" } } }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
function parseToolCallJSON(json, knownToolNames) {
|
|
39
|
+
if (json === null || typeof json !== 'object' || Array.isArray(json)) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const obj = json;
|
|
43
|
+
// Shape: { function: { name, arguments } }
|
|
44
|
+
if (typeof obj['function'] === 'object' && obj['function'] !== null) {
|
|
45
|
+
const fn = obj['function'];
|
|
46
|
+
return parseFlat(fn, knownToolNames);
|
|
47
|
+
}
|
|
48
|
+
// Shape: { name, arguments|parameters }
|
|
49
|
+
return parseFlat(obj, knownToolNames);
|
|
50
|
+
}
|
|
51
|
+
function parseFlat(obj, knownToolNames) {
|
|
52
|
+
const name = obj['name'];
|
|
53
|
+
if (typeof name !== 'string' || name.length === 0)
|
|
54
|
+
return null;
|
|
55
|
+
// Whitelist check — don't treat arbitrary JSON as a tool call
|
|
56
|
+
if (knownToolNames.size > 0 && !knownToolNames.has(name))
|
|
57
|
+
return null;
|
|
58
|
+
let input = {};
|
|
59
|
+
const args = obj['arguments'] ?? obj['parameters'] ?? obj['input'];
|
|
60
|
+
if (args !== null && args !== undefined) {
|
|
61
|
+
if (typeof args === 'string') {
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(args);
|
|
64
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
65
|
+
input = parsed;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Malformed — use empty input
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (typeof args === 'object' && !Array.isArray(args)) {
|
|
73
|
+
input = args;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
type: 'tool_use',
|
|
78
|
+
id: generateToolCallId(),
|
|
79
|
+
name,
|
|
80
|
+
input,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// JSON extraction from text
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
/**
|
|
87
|
+
* Find all top-level JSON objects in a string by tracking brace depth.
|
|
88
|
+
* Returns the parsed objects (not sub-objects).
|
|
89
|
+
*/
|
|
90
|
+
function extractJSONObjects(text) {
|
|
91
|
+
const results = [];
|
|
92
|
+
let depth = 0;
|
|
93
|
+
let start = -1;
|
|
94
|
+
let inString = false;
|
|
95
|
+
let escape = false;
|
|
96
|
+
for (let i = 0; i < text.length; i++) {
|
|
97
|
+
const ch = text[i];
|
|
98
|
+
if (escape) {
|
|
99
|
+
escape = false;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (ch === '\\' && inString) {
|
|
103
|
+
escape = true;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (ch === '"') {
|
|
107
|
+
inString = !inString;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (inString)
|
|
111
|
+
continue;
|
|
112
|
+
if (ch === '{') {
|
|
113
|
+
if (depth === 0)
|
|
114
|
+
start = i;
|
|
115
|
+
depth++;
|
|
116
|
+
}
|
|
117
|
+
else if (ch === '}') {
|
|
118
|
+
// Stray `}` outside any open object (e.g. prose like "use ${var}" where
|
|
119
|
+
// the `${` was prefix-truncated, or a model quoting unbalanced text).
|
|
120
|
+
// Ignoring it keeps depth non-negative — otherwise the `depth === 0`
|
|
121
|
+
// anchor for the next `{` would never re-fire, and any later valid JSON
|
|
122
|
+
// tool calls would be skipped (or the inner sub-object extracted in
|
|
123
|
+
// their place, which has no `name` field and is silently rejected).
|
|
124
|
+
if (depth === 0)
|
|
125
|
+
continue;
|
|
126
|
+
depth--;
|
|
127
|
+
if (depth === 0 && start !== -1) {
|
|
128
|
+
const candidate = text.slice(start, i + 1);
|
|
129
|
+
try {
|
|
130
|
+
results.push(JSON.parse(candidate));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Not valid JSON — skip
|
|
134
|
+
}
|
|
135
|
+
start = -1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return results;
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Hermes format: <tool_call>...</tool_call>
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
function extractHermesToolCalls(text, knownToolNames) {
|
|
145
|
+
const results = [];
|
|
146
|
+
for (const match of text.matchAll(/<tool_call>\s*([\s\S]*?)\s*<\/tool_call>/g)) {
|
|
147
|
+
const inner = match[1].trim();
|
|
148
|
+
try {
|
|
149
|
+
const parsed = JSON.parse(inner);
|
|
150
|
+
const block = parseToolCallJSON(parsed, knownToolNames);
|
|
151
|
+
if (block !== null)
|
|
152
|
+
results.push(block);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Malformed hermes content — skip
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return results;
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Public API
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
/**
|
|
164
|
+
* Attempt to extract tool calls from a model's text output.
|
|
165
|
+
*
|
|
166
|
+
* Tries multiple strategies in order:
|
|
167
|
+
* 1. Hermes `<tool_call>` tags
|
|
168
|
+
* 2. JSON objects in text (bare or inside code fences)
|
|
169
|
+
*
|
|
170
|
+
* @param text - The model's text output.
|
|
171
|
+
* @param knownToolNames - Whitelist of registered tool names. When non-empty,
|
|
172
|
+
* only JSON objects whose `name` matches a known tool
|
|
173
|
+
* are treated as tool calls.
|
|
174
|
+
* @returns Extracted {@link ToolUseBlock}s, or an empty array if none found.
|
|
175
|
+
*/
|
|
176
|
+
export function extractToolCallsFromText(text, knownToolNames) {
|
|
177
|
+
if (text.length === 0)
|
|
178
|
+
return [];
|
|
179
|
+
const nameSet = new Set(knownToolNames);
|
|
180
|
+
// Strategy 1: Hermes format
|
|
181
|
+
const hermesResults = extractHermesToolCalls(text, nameSet);
|
|
182
|
+
if (hermesResults.length > 0)
|
|
183
|
+
return hermesResults;
|
|
184
|
+
// Strategy 2: Strip code fences, then extract JSON objects
|
|
185
|
+
const stripped = text.replace(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/g, '$1');
|
|
186
|
+
const jsonObjects = extractJSONObjects(stripped);
|
|
187
|
+
const results = [];
|
|
188
|
+
for (const obj of jsonObjects) {
|
|
189
|
+
const block = parseToolCallJSON(obj, nameSet);
|
|
190
|
+
if (block !== null)
|
|
191
|
+
results.push(block);
|
|
192
|
+
}
|
|
193
|
+
return results;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=text-tool-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-tool-extractor.js","sourceRoot":"","sources":["../../src/tool/text-tool-extractor.ts"],"names":[],"mappings":"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"}
|