openmcp-sdk 0.0.6 → 0.0.7
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/README.md +40 -33
- package/package.json +4 -3
- package/renderer/assets/{index-DfIBlLbZ.js → index-Cv4IO6Jg.js} +75 -71
- package/renderer/index.html +1 -1
- package/service/llm/llm.service.d.ts.map +1 -1
- package/service/llm/llm.service.js +0 -11
- package/service/mcp/connect.service.d.ts.map +1 -1
- package/task-loop.d.ts +1 -1
- package/task-loop.js +121 -14
- package/tools.mjs +10 -0
package/renderer/index.html
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
<link rel="stylesheet" href="/animation.css">
|
11
11
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
12
12
|
<title>OpenMCP 客户端</title>
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
13
|
+
<script type="module" crossorigin src="/assets/index-Cv4IO6Jg.js"></script>
|
14
14
|
<link rel="stylesheet" crossorigin href="/assets/style-DX4gh5fe.css">
|
15
15
|
</head>
|
16
16
|
<body>
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"llm.service.d.ts","sourceRoot":"","sources":["../../src/llm/llm.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAqB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
1
|
+
{"version":3,"file":"llm.service.d.ts","sourceRoot":"","sources":["../../src/llm/llm.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAqB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAMzD,eAAO,IAAI,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAW,CAAC;AAE3D,wBAAsB,uBAAuB,CACzC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,cAAc,iBA0G1B;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,eAAe,CAYvF;AA0CD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,iBAyBlE"}
|
@@ -17,7 +17,6 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
17
17
|
import { OpenAI } from "openai";
|
18
18
|
import { ocrDB } from "../hook/db.js";
|
19
19
|
import { ocrWorkerStorage } from "../mcp/ocr.service.js";
|
20
|
-
import { axiosFetch } from "../hook/axios-fetch.js";
|
21
20
|
import Table from 'cli-table3';
|
22
21
|
export let currentStream = null;
|
23
22
|
export function streamingChatCompletion(data, webview) {
|
@@ -36,16 +35,6 @@ export function streamingChatCompletion(data, webview) {
|
|
36
35
|
const client = new OpenAI({
|
37
36
|
baseURL,
|
38
37
|
apiKey,
|
39
|
-
fetch: (input, init) => __awaiter(this, void 0, void 0, function* () {
|
40
|
-
if (model.startsWith('gemini') && init) {
|
41
|
-
// 该死的 google
|
42
|
-
init.headers = {
|
43
|
-
'Content-Type': 'application/json',
|
44
|
-
'Authorization': `Bearer ${apiKey}`
|
45
|
-
};
|
46
|
-
}
|
47
|
-
return yield axiosFetch(input, init, { proxyServer });
|
48
|
-
})
|
49
38
|
});
|
50
39
|
const seriableTools = (tools.length === 0) ? undefined : tools;
|
51
40
|
const seriableParallelToolCalls = (tools.length === 0) ?
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"connect.service.d.ts","sourceRoot":"","sources":["../../src/mcp/connect.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,eAAO,MAAM,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAa,CAAC;AACnE,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvG;AA8MD,wBAAsB,cAAc,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,
|
1
|
+
{"version":3,"file":"connect.service.d.ts","sourceRoot":"","sources":["../../src/mcp/connect.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,eAAO,MAAM,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAa,CAAC;AACnE,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBvG;AA8MD,wBAAsB,cAAc,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CA+E1B"}
|
package/task-loop.d.ts
CHANGED
package/task-loop.js
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
"use strict";
|
2
|
-
Object.
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
3
3
|
const vue = require("vue");
|
4
4
|
const elementPlus = require("./tools.js");
|
5
|
+
const chalk = require("chalk").default;
|
5
6
|
var MessageState = /* @__PURE__ */ ((MessageState2) => {
|
6
7
|
MessageState2["ServerError"] = "server internal error";
|
7
8
|
MessageState2["ReceiveChunkError"] = "receive chunk error";
|
@@ -7827,9 +7828,16 @@ class McpClientAdapter {
|
|
7827
7828
|
this.clients.push(client);
|
7828
7829
|
const ok = await client.connect();
|
7829
7830
|
if (ok) {
|
7830
|
-
console.log(
|
7831
|
+
console.log(
|
7832
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
7833
|
+
chalk.green(`🚀 [${client.name}] ${client.version} connected`)
|
7834
|
+
);
|
7831
7835
|
} else {
|
7832
|
-
console.log(
|
7836
|
+
console.log(
|
7837
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
7838
|
+
chalk.red(`× fail to connect `),
|
7839
|
+
chalk.red(JSON.stringify(client.connectionResult.logString, null, 2))
|
7840
|
+
);
|
7833
7841
|
}
|
7834
7842
|
allOk &&= ok;
|
7835
7843
|
}
|
@@ -8055,7 +8063,6 @@ function deserializeToolCallResponse(toolArgs) {
|
|
8055
8063
|
}
|
8056
8064
|
function handleToolResponse(toolResponse) {
|
8057
8065
|
if (typeof toolResponse === "string") {
|
8058
|
-
redLog("error happen" + JSON.stringify(toolResponse));
|
8059
8066
|
return {
|
8060
8067
|
content: [{
|
8061
8068
|
type: "error",
|
@@ -8120,7 +8127,12 @@ function getSystemPrompt(name) {
|
|
8120
8127
|
}
|
8121
8128
|
}
|
8122
8129
|
class TaskLoop {
|
8123
|
-
constructor(taskOptions = {
|
8130
|
+
constructor(taskOptions = {
|
8131
|
+
maxEpochs: 20,
|
8132
|
+
maxJsonParseRetry: 3,
|
8133
|
+
adapter: void 0,
|
8134
|
+
verbose: 0
|
8135
|
+
}) {
|
8124
8136
|
this.taskOptions = taskOptions;
|
8125
8137
|
this.streamingContent = vue.ref("");
|
8126
8138
|
this.streamingToolCalls = vue.ref([]);
|
@@ -8207,10 +8219,10 @@ class TaskLoop {
|
|
8207
8219
|
this.handleChunkDeltaContent(chunk);
|
8208
8220
|
this.handleChunkDeltaToolCalls(chunk, toolcallIndexAdapter);
|
8209
8221
|
this.handleChunkUsage(chunk);
|
8210
|
-
this.
|
8222
|
+
this.consumeChunks(chunk);
|
8211
8223
|
}, { once: false });
|
8212
8224
|
const doneHandler = this.bridge.addCommandListener("llm/chat/completions/done", (data) => {
|
8213
|
-
this.
|
8225
|
+
this.consumeDones();
|
8214
8226
|
chunkHandler();
|
8215
8227
|
errorHandler();
|
8216
8228
|
resolve({
|
@@ -8218,7 +8230,7 @@ class TaskLoop {
|
|
8218
8230
|
});
|
8219
8231
|
}, { once: true });
|
8220
8232
|
const errorHandler = this.bridge.addCommandListener("llm/chat/completions/error", (data) => {
|
8221
|
-
this.
|
8233
|
+
this.consumeErrors({
|
8222
8234
|
state: MessageState.ReceiveChunkError,
|
8223
8235
|
msg: data.msg || "请求模型服务时发生错误"
|
8224
8236
|
});
|
@@ -8324,6 +8336,92 @@ class TaskLoop {
|
|
8324
8336
|
registerOnToolCalled(handler) {
|
8325
8337
|
this.onToolCalled = handler;
|
8326
8338
|
}
|
8339
|
+
consumeErrors(error2) {
|
8340
|
+
const { verbose = 0 } = this.taskOptions;
|
8341
|
+
if (verbose > 0) {
|
8342
|
+
console.log(
|
8343
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8344
|
+
chalk.red("error happen in task loop "),
|
8345
|
+
chalk.red(error2.msg)
|
8346
|
+
);
|
8347
|
+
}
|
8348
|
+
return this.onError(error2);
|
8349
|
+
}
|
8350
|
+
consumeChunks(chunk) {
|
8351
|
+
const { verbose = 0 } = this.taskOptions;
|
8352
|
+
if (verbose > 1) {
|
8353
|
+
console.log(
|
8354
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8355
|
+
chalk.blue("receive chunk")
|
8356
|
+
);
|
8357
|
+
} else if (verbose > 2) {
|
8358
|
+
const delta = chunk.choices[0]?.delta;
|
8359
|
+
if (delta) {
|
8360
|
+
console.log(
|
8361
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8362
|
+
chalk.blue("receive chunk"),
|
8363
|
+
chalk.bold(JSON.stringify(delta, null, 2))
|
8364
|
+
);
|
8365
|
+
} else {
|
8366
|
+
console.log(
|
8367
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8368
|
+
chalk.blue("receive chunk"),
|
8369
|
+
chalk.blue("delta is empty")
|
8370
|
+
);
|
8371
|
+
}
|
8372
|
+
}
|
8373
|
+
return this.onChunk(chunk);
|
8374
|
+
}
|
8375
|
+
consumeToolCalls(toolCall) {
|
8376
|
+
const { verbose = 0 } = this.taskOptions;
|
8377
|
+
if (verbose > 0) {
|
8378
|
+
console.log(
|
8379
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8380
|
+
chalk.blueBright("🔧 calling tool"),
|
8381
|
+
chalk.blueBright(toolCall.function.name)
|
8382
|
+
);
|
8383
|
+
}
|
8384
|
+
return this.onToolCall(toolCall);
|
8385
|
+
}
|
8386
|
+
consumeToolCalleds(result) {
|
8387
|
+
const { verbose = 0 } = this.taskOptions;
|
8388
|
+
if (verbose > 0) {
|
8389
|
+
if (result.state === "success") {
|
8390
|
+
console.log(
|
8391
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8392
|
+
chalk.green("✓ call tools okey dockey"),
|
8393
|
+
chalk.green(result.state)
|
8394
|
+
);
|
8395
|
+
} else {
|
8396
|
+
console.log(
|
8397
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8398
|
+
chalk.red("× fail to call tools"),
|
8399
|
+
chalk.red(result.content.map((item) => item.text).join(", "))
|
8400
|
+
);
|
8401
|
+
}
|
8402
|
+
}
|
8403
|
+
return this.onToolCalled(result);
|
8404
|
+
}
|
8405
|
+
consumeEpochs() {
|
8406
|
+
const { verbose = 0 } = this.taskOptions;
|
8407
|
+
if (verbose > 0) {
|
8408
|
+
console.log(
|
8409
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8410
|
+
chalk.blue("task loop enters a new epoch")
|
8411
|
+
);
|
8412
|
+
}
|
8413
|
+
return this.onEpoch();
|
8414
|
+
}
|
8415
|
+
consumeDones() {
|
8416
|
+
const { verbose = 0 } = this.taskOptions;
|
8417
|
+
if (verbose > 0) {
|
8418
|
+
console.log(
|
8419
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8420
|
+
chalk.green("task loop finish a epoch")
|
8421
|
+
);
|
8422
|
+
}
|
8423
|
+
return this.onDone();
|
8424
|
+
}
|
8327
8425
|
setMaxEpochs(maxEpochs) {
|
8328
8426
|
this.taskOptions.maxEpochs = maxEpochs;
|
8329
8427
|
}
|
@@ -8389,15 +8487,18 @@ class TaskLoop {
|
|
8389
8487
|
}
|
8390
8488
|
});
|
8391
8489
|
let jsonParseErrorRetryCount = 0;
|
8392
|
-
const
|
8490
|
+
const {
|
8491
|
+
maxEpochs = 20,
|
8492
|
+
verbose = 0
|
8493
|
+
} = this.taskOptions || {};
|
8393
8494
|
for (let i = 0; i < maxEpochs; ++i) {
|
8394
|
-
this.
|
8495
|
+
this.consumeEpochs();
|
8395
8496
|
this.streamingContent.value = "";
|
8396
8497
|
this.streamingToolCalls.value = [];
|
8397
8498
|
this.completionUsage = void 0;
|
8398
8499
|
const chatData = this.makeChatData(tabStorage);
|
8399
8500
|
if (!chatData) {
|
8400
|
-
this.
|
8501
|
+
this.consumeDones();
|
8401
8502
|
break;
|
8402
8503
|
}
|
8403
8504
|
this.currentChatId = chatData.id;
|
@@ -8415,11 +8516,17 @@ class TaskLoop {
|
|
8415
8516
|
serverName: this.getLlmConfig().id || "unknown"
|
8416
8517
|
}
|
8417
8518
|
});
|
8418
|
-
|
8519
|
+
if (verbose > 0) {
|
8520
|
+
console.log(
|
8521
|
+
chalk.gray(`[${(/* @__PURE__ */ new Date()).toLocaleString()}]`),
|
8522
|
+
chalk.yellow("🤖 llm wants to call these tools"),
|
8523
|
+
chalk.yellow(this.streamingToolCalls.value.map((tool) => tool.function.name || "").join(", "))
|
8524
|
+
);
|
8525
|
+
}
|
8419
8526
|
for (let toolCall of this.streamingToolCalls.value || []) {
|
8420
|
-
toolCall = this.
|
8527
|
+
toolCall = this.consumeToolCalls(toolCall);
|
8421
8528
|
let toolCallResult = await handleToolCalls(toolCall);
|
8422
|
-
toolCallResult = this.
|
8529
|
+
toolCallResult = this.consumeToolCalleds(toolCallResult);
|
8423
8530
|
if (toolCallResult.state === MessageState.ParseJsonError) {
|
8424
8531
|
tabStorage.messages.pop();
|
8425
8532
|
jsonParseErrorRetryCount++;
|