openmcp-sdk 0.0.5 → 0.0.6
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 +37 -15
- package/icons/openmcp-sdk.svg +34 -0
- package/main.js +31 -5
- package/package.json +1 -1
- package/renderer/assets/{index-3W5tQSKs.js → index-DfIBlLbZ.js} +1 -1
- package/renderer/index.html +1 -1
- package/service/llm/llm.service.d.ts.map +1 -1
- package/service/llm/llm.service.js +11 -6
package/README.md
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
<div align="center">
|
2
2
|
|
3
|
-
<img src="./icons/openmcp.
|
3
|
+
<img src="./icons/openmcp-sdk.svg" height="200px"/>
|
4
4
|
|
5
|
-
<h3>
|
5
|
+
<h3>openmcp-sdk : 适用于 openmcp 的部署框架</h3>
|
6
|
+
<h4>闪电般将您的 agent 从实验室部署到生产环境</h4>
|
6
7
|
|
7
|
-
<a href="https://
|
8
|
+
<a href="https://kirigaya.cn/openmcp" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #7D3FF8; color: white; border-radius: .5em; text-decoration: none;">📄 OpenMCP 官方文档</a>
|
8
9
|
|
9
10
|
|
10
|
-
<a href="https://discord.gg/af5cfB9a" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none;">
|
11
|
+
<a href="https://qm.qq.com/cgi-bin/qm/qr?k=C6ZUTZvfqWoI12lWe7L93cWa1hUsuVT0&jump_from=webapi&authKey=McW6B1ogTPjPDrCyGttS890tMZGQ1KB3QLuG4aqVNRaYp4vlTSgf2c6dMcNjMuBD" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: #CB81DA; color: white; border-radius: .5em; text-decoration: none;">QQ 讨论群</a><a href="https://discord.gg/af5cfB9a" target="_blank" style="display: inline-block; padding: 8px 16px; background-color: rgb(84, 176, 84); color: white; border-radius: .5em; text-decoration: none; margin-left: 5px;">Discord频道</a>
|
11
12
|
|
12
13
|
</div>
|
13
14
|
|
@@ -18,6 +19,8 @@
|
|
18
19
|
npm install openmcp-sdk
|
19
20
|
```
|
20
21
|
|
22
|
+
> 目前 openmcp-sdk 只支持 esm 模式的导入
|
23
|
+
|
21
24
|
## 使用
|
22
25
|
|
23
26
|
文件名:main.ts
|
@@ -25,26 +28,29 @@ npm install openmcp-sdk
|
|
25
28
|
```typescript
|
26
29
|
import { TaskLoop } from 'openmcp-sdk/task-loop';
|
27
30
|
import { TaskLoopAdapter } from 'openmcp-sdk/service';
|
28
|
-
|
29
31
|
async function main() {
|
30
32
|
// 创建适配器,负责通信和 mcp 连接
|
31
33
|
const adapter = new TaskLoopAdapter();
|
32
34
|
|
33
|
-
//
|
34
|
-
|
35
|
+
// 添加 mcp 服务器
|
36
|
+
adapter.addMcp({
|
35
37
|
connectionType: 'STDIO',
|
36
|
-
|
37
|
-
|
38
|
-
'~/projects/mcp/servers/src/puppeteer/dist/index.js'
|
39
|
-
]
|
38
|
+
commandString: 'uv run mcp run main.py',
|
39
|
+
cwd: '~/projects/openmcp-tutorial/crawl4ai-mcp'
|
40
40
|
});
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
adapter.addMcp({
|
43
|
+
connectionType: 'STDIO',
|
44
|
+
commandString: 'node index.js',
|
45
|
+
cwd: '~/projects/openmcp-tutorial/my-browser/dist'
|
46
|
+
});
|
44
47
|
|
45
48
|
// 创建事件循环驱动器
|
46
49
|
const taskLoop = new TaskLoop({ adapter });
|
47
50
|
|
51
|
+
// 获取所有工具
|
52
|
+
const tools = await taskLoop.getTools();
|
53
|
+
|
48
54
|
// 配置改次事件循环使用的大模型
|
49
55
|
taskLoop.setLlmConfig({
|
50
56
|
id: 'deepseek',
|
@@ -58,8 +64,11 @@ async function main() {
|
|
58
64
|
messages: [],
|
59
65
|
settings: {
|
60
66
|
temperature: 0.7,
|
67
|
+
// 在本次对话使用所有工具
|
61
68
|
enableTools: tools,
|
69
|
+
// 系统提示词
|
62
70
|
systemPrompt: 'you are a clever bot',
|
71
|
+
// 对话上下文的轮数
|
63
72
|
contextLength: 20
|
64
73
|
}
|
65
74
|
};
|
@@ -82,14 +91,27 @@ async function main() {
|
|
82
91
|
console.log('taskLoop epoch');
|
83
92
|
});
|
84
93
|
|
94
|
+
// 每一次工具调用前
|
95
|
+
taskLoop.registerOnToolCall((toolCall) => {
|
96
|
+
return toolCall;
|
97
|
+
});
|
98
|
+
|
99
|
+
// 每一次工具调用完后的结果
|
100
|
+
taskLoop.registerOnToolCalled((result) => {
|
101
|
+
return result;
|
102
|
+
});
|
103
|
+
|
85
104
|
// 开启事件循环
|
86
105
|
await taskLoop.start(storage, message);
|
87
106
|
|
88
107
|
// 打印上下文,最终的回答在 messages.at(-1) 中
|
89
|
-
|
90
|
-
|
108
|
+
const content = storage.messages.at(-1).content;
|
109
|
+
console.log('最终回答:', content);
|
110
|
+
}
|
91
111
|
|
92
112
|
main();
|
93
113
|
```
|
94
114
|
|
115
|
+
更多使用请看官方文档:https://kirigaya.cn/openmcp/sdk-tutorial/
|
116
|
+
|
95
117
|
star 我们的项目:https://github.com/LSTM-Kirigaya/openmcp-client
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<svg width="600" height="674" viewBox="0 0 600 674" fill="none" xmlns="http://www.w3.org/2000/svg">
|
3
|
+
<defs>
|
4
|
+
<linearGradient id="gradient_1" gradientUnits="userSpaceOnUse" x1="300" y1="0" x2="300" y2="600">
|
5
|
+
<stop offset="0" stop-color="#A1A7F6" />
|
6
|
+
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0.2" />
|
7
|
+
</linearGradient>
|
8
|
+
<linearGradient id="gradient_2" gradientUnits="userSpaceOnUse" x1="110.5" y1="0" x2="110.5" y2="221">
|
9
|
+
<stop offset="0.441" stop-color="#A8A3FF" />
|
10
|
+
<stop offset="1" stop-color="#FFFFFF" />
|
11
|
+
</linearGradient>
|
12
|
+
<linearGradient id="gradient_3" gradientUnits="userSpaceOnUse" x1="55.5" y1="0" x2="55.5" y2="111">
|
13
|
+
<stop offset="0" stop-color="#FFFFFF" />
|
14
|
+
<stop offset="1" stop-color="#A489FB" />
|
15
|
+
</linearGradient>
|
16
|
+
<linearGradient id="gradient_5" gradientUnits="userSpaceOnUse" x1="126" y1="0" x2="126" y2="647">
|
17
|
+
<stop offset="0" stop-color="#FFF2B0" />
|
18
|
+
<stop offset="0.461" stop-color="#F2B63A" />
|
19
|
+
</linearGradient>
|
20
|
+
</defs>
|
21
|
+
<g>
|
22
|
+
<g>
|
23
|
+
<g transform="translate(0 74)">
|
24
|
+
<path d="M300 0C465.708 0 600 134.292 600 300C600 300 600 300 600 300C600 465.708 465.708 600 300 600C300 600 300 600 300 600C134.292 600 0 465.708 0 300C0 300 0 300 0 300C0 134.292 134.292 0 300 0Z" fill="#5A00FF" fill-rule="evenodd" />
|
25
|
+
<path d="M300 0C465.708 0 600 134.292 600 300C600 300 600 300 600 300C600 465.708 465.708 600 300 600C300 600 300 600 300 600C134.292 600 0 465.708 0 300C0 300 0 300 0 300C0 134.292 134.292 0 300 0Z" fill="url(#gradient_1)" fill-rule="evenodd" />
|
26
|
+
</g>
|
27
|
+
<path d="M0 110.5C0 49.4725 49.4725 0 110.5 0C171.527 0 221 49.4725 221 110.5C221 171.527 171.527 221 110.5 221C49.4725 221 0 171.527 0 110.5Z" fill="url(#gradient_2)" fill-rule="evenodd" transform="translate(284 417)" />
|
28
|
+
<path d="M0 55.5C0 24.8482 24.8482 0 55.5 0C86.1518 0 111 24.8482 111 55.5C111 86.1518 86.1518 111 55.5 111C24.8482 111 0 86.1518 0 55.5Z" fill="url(#gradient_3)" fill-rule="evenodd" transform="translate(49 374)" />
|
29
|
+
<path d="M0 182.5C0 81.708 81.708 0 182.5 0C283.292 0 365 81.708 365 182.5C365 283.292 283.292 365 182.5 365C81.708 365 0 283.292 0 182.5Z" fill="url(#gradient_4)" fill-rule="evenodd" transform="translate(179 108)" />
|
30
|
+
<path d="M215.354 294.309L24.8044 647C24.8044 647 80.3091 362.484 80.3091 362.484C80.9377 359.199 79.5325 355.85 77.4987 355.85C77.4987 355.85 23.6951 355.85 23.6951 355.85C6.50011 355.85 -4.96321 325.459 2.13664 298.669C2.13664 298.669 75.28 23.6938 75.28 23.6938C79.1258 9.28799 87.5569 0 96.8384 0C96.8384 0 252 0 252 0C252 0 178.82 218.868 178.82 218.868C177.71 222.217 179.115 226.45 181.371 226.45C181.371 226.45 197.938 226.45 197.938 226.45C218.571 226.45 229.332 268.404 215.354 294.309C215.354 294.309 215.354 294.309 215.354 294.309Z" fill="url(#gradient_5)" transform="translate(193 0)" />
|
31
|
+
</g>
|
32
|
+
<rect width="432" height="432" transform="translate(84 107)" />
|
33
|
+
</g>
|
34
|
+
</svg>
|
package/main.js
CHANGED
@@ -5,9 +5,25 @@ async function main() {
|
|
5
5
|
// 创建适配器,负责通信和 mcp 连接
|
6
6
|
const adapter = new TaskLoopAdapter();
|
7
7
|
|
8
|
+
// 添加 mcp 服务器
|
9
|
+
adapter.addMcp({
|
10
|
+
connectionType: 'STDIO',
|
11
|
+
commandString: 'uv run mcp run main.py',
|
12
|
+
cwd: '~/projects/openmcp-tutorial/crawl4ai-mcp'
|
13
|
+
});
|
14
|
+
|
15
|
+
adapter.addMcp({
|
16
|
+
connectionType: 'STDIO',
|
17
|
+
commandString: 'node index.js',
|
18
|
+
cwd: '~/projects/openmcp-tutorial/my-browser/dist'
|
19
|
+
});
|
20
|
+
|
8
21
|
// 创建事件循环驱动器
|
9
22
|
const taskLoop = new TaskLoop({ adapter });
|
10
23
|
|
24
|
+
// 获取所有工具
|
25
|
+
const tools = await taskLoop.getTools();
|
26
|
+
|
11
27
|
// 配置改次事件循环使用的大模型
|
12
28
|
taskLoop.setLlmConfig({
|
13
29
|
id: 'deepseek',
|
@@ -21,8 +37,11 @@ async function main() {
|
|
21
37
|
messages: [],
|
22
38
|
settings: {
|
23
39
|
temperature: 0.7,
|
24
|
-
|
40
|
+
// 在本次对话使用所有工具
|
41
|
+
enableTools: tools,
|
42
|
+
// 系统提示词
|
25
43
|
systemPrompt: 'you are a clever bot',
|
44
|
+
// 对话上下文的轮数
|
26
45
|
contextLength: 20
|
27
46
|
}
|
28
47
|
};
|
@@ -45,15 +64,22 @@ async function main() {
|
|
45
64
|
console.log('taskLoop epoch');
|
46
65
|
});
|
47
66
|
|
67
|
+
// 每一次工具调用前
|
68
|
+
taskLoop.registerOnToolCall((toolCall) => {
|
69
|
+
return toolCall;
|
70
|
+
});
|
71
|
+
|
72
|
+
// 每一次工具调用完后的结果
|
73
|
+
taskLoop.registerOnToolCalled((result) => {
|
74
|
+
return result;
|
75
|
+
});
|
76
|
+
|
48
77
|
// 开启事件循环
|
49
78
|
await taskLoop.start(storage, message);
|
50
79
|
|
51
80
|
// 打印上下文,最终的回答在 messages.at(-1) 中
|
52
|
-
console.log(storage.messages);
|
53
|
-
|
54
81
|
const content = storage.messages.at(-1).content;
|
55
|
-
console.log(content);
|
56
|
-
|
82
|
+
console.log('最终回答:', content);
|
57
83
|
}
|
58
84
|
|
59
85
|
main();
|
package/package.json
CHANGED
@@ -80,7 +80,7 @@ var IZ=Object.defineProperty;var RZ=(t,e,n)=>e in t?IZ(t,e,{enumerable:!0,config
|
|
80
80
|
A 15 15, 0, 0, 1, 15 30
|
81
81
|
A 15 15, 0, 1, 1, 27.99 7.5
|
82
82
|
L 15 15
|
83
|
-
" style="stroke-width:4px;fill:rgba(0, 0, 0, 0);stroke:var(--main-color);"></path></svg></div></span></span>`,1))])):(A(),z("div",{key:0,class:P(["connected-status-container",{connected:n.value.connectionResult.success}]),id:"connected-status-container",onClick:a[0]||(a[0]=vt(u=>s(),["stop"]))},[R("span",pMe,[U(l,{class:"extra-connect-container",effect:"dark",placement:"right",content:r.value},{default:j(()=>[R("span",mMe,Se(o.value),1)]),_:1},8,["content"])]),R("span",gMe,[n.value.connectionResult.success?(A(),z("span",vMe,a[1]||(a[1]=[R("span",{class:"iconfont icon-connect"},null,-1),R("span",{class:"iconfont icon-dui"},null,-1)]))):(A(),z("span",bMe,a[2]||(a[2]=[R("span",{class:"iconfont icon-connect"},null,-1),R("span",{class:"iconfont icon-cuo"},null,-1)])))])],2))}}}),kMe={class:"sidebar-container"},SMe=J({__name:"index",setup(t){return(e,n)=>(A(),z("div",kMe,[R("div",null,[U(ite),U(ure)]),R("div",null,[U(_Me)])]))}}),xMe={class:"main-panel-container"},CMe={class:"tabs-container"},EMe={class:"scroll-tabs-container"},TMe=["onClick"],AMe={class:"tab-name"},OMe=["onClick"],MMe={class:"main-panel"},IMe=J({__name:"index",setup(t){const e="/",n=_5(),r=t2();function o(){YB(),n.name!=="debug"&&r.push(e+"debug")}function s(i){i>=0&&i<Cn.content.length&&(Cn.activeIndex=i,n.name!=="debug"&&r.push(e+"debug"))}return(i,a)=>{const l=Ue("el-scrollbar"),u=Ue("router-view");return A(),z("div",xMe,[R("div",CMe,[U(l,null,{default:j(()=>[R("div",EMe,[(A(!0),z(Xe,null,Et(f(Cn).content,(c,d)=>(A(),z("span",{class:P(["tab",{"active-tab":f(Cn).activeIndex===d}]),key:c.id,onClick:h=>s(d)},[R("span",null,[R("span",{class:P(`iconfont ${c.icon}`)},null,2),R("span",AMe,Se(c.name),1)]),R("span",{class:"iconfont icon-close",onClick:vt(h=>f(iMe)(d),["stop"])},null,8,OMe)],10,TMe))),128))])]),_:1}),R("span",{class:"add-button iconfont icon-add",onClick:o})]),R("div",MMe,[U(u)])])}}});function $d(t){if(t.startsWith("#")){let e=t.slice(1);e.length===3&&(e=e.split("").map(s=>s+s).join(""));const n=parseInt(e.slice(0,2),16),r=parseInt(e.slice(2,4),16),o=parseInt(e.slice(4,6),16);return{r:n,g:r,b:o}}else if(t.startsWith("rgba")){const e=t.match(/rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d+(\.\d+)?)\)/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10),o=parseInt(e[3],10),s=parseFloat(e[4]);return{r:n,g:r,b:o,a:s}}}else if(t.startsWith("rgb")){const e=t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10),o=parseInt(e[3],10);return{r:n,g:r,b:o}}}}function dw(t){return t/=255,t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}function wS(t,e,n){return t=dw(t),e=dw(e),n=dw(n),.2126*t+.7152*e+.0722*n>.5}function RO(t){const{r:e,g:n,b:r}=t;return`rgb(${e}, ${n}, ${r})`}class RMe{constructor(e={}){Bn(this,"option");Bn(this,"rootStyles");Bn(this,"theme","dark");Bn(this,"foregroundColor");Bn(this,"backgroundColor");Bn(this,"foregroundColorString","");Bn(this,"backgroundColorString","");this.option=e,this.rootStyles=getComputedStyle(document==null?void 0:document.documentElement);const n=this.rootStyles.getPropertyValue(e.BaseForegroundColorMacroName||"--foreground"),r=this.rootStyles.getPropertyValue(e.BaseBackgroundColorMacroName||"--background");if(this.foregroundColor=$d(n),this.backgroundColor=$d(r),this.foregroundColorString=n,this.backgroundColorString=r,this.backgroundColor){const s=wS(this.backgroundColor.r,this.backgroundColor.g,this.backgroundColor.b);this.theme=s?"light":"dark"}else this.theme="light";this.rootStyles.getPropertyValue("--sidebar")===r&&(document==null||document.documentElement.style.setProperty("--sidebar","var(--vscode-icube-colorBg2)"))}getColor(e,n={}){const r=this.theme,o=this.rootStyles;if((n.mode||"svg")==="svg")return(o==null?void 0:o.getPropertyValue(e))||"#fff";switch(e){case"--foreground":case"--wire-color":case"--cross-dot-color":if(r==="dark")return"#2D323B"}const i=(o==null?void 0:o.getPropertyValue(e))||"#fff",a=$d(i);if(!a)return i;if(!a.a)return RO(a);const l=$d("#ffffff"),u={r:Math.round(a.r*a.a+l.r*(1-a.a)),g:Math.round(a.g*a.a+l.g*(1-a.a)),b:Math.round(a.b*a.a+l.b*(1-a.a))};return RO(u)}}new RMe;function NMe(){document==null||document.body.style.setProperty("--el-color-primary","var(--main-color)"),document==null||document.body.style.setProperty("--el-color-primary-light-9","var(--main-color)"),document==null||document.body.style.setProperty("--el-color-primary-light-3","var(--main-color)"),document==null||document.body.style.setProperty("--el-text-color-secondary","var(--foreground)"),document==null||document.body.style.setProperty("--el-text-color-regular","var(--foreground)"),document==null||document.body.style.setProperty("--el-border-color","var(--vscode-input-border)"),document==null||document.body.style.setProperty("--el-fill-color-blank","var(--sidebar)"),document==null||document.body.style.setProperty("--el-fill-color-light","var(--vscode-button-hoverBackground)"),document==null||document.body.style.setProperty("--el-switch-on-color","var(--main-color)"),document==null||document.body.style.setProperty("--el-border","var(--sidebar)"),document==null||document.body.style.setProperty("--el-border-color-light","var(--sidebar)"),document==null||document.body.style.setProperty("--el-border-color-lighter","var(--sidebar)"),document==null||document.body.style.setProperty("--el-bg-color-overlay","var(--sidebar)"),document==null||document.body.style.setProperty("--el-color-info","var(--foreground)"),document==null||document.body.style.setProperty("--el-color-info-light-8","var(--main-color)"),document==null||document.body.style.setProperty("--el-fill-color-light","var(--sidebar-item-selected)"),document==null||document.body.style.setProperty("--el-color-primary-dark-2","var(--main-light-color)"),document==null||document.body.style.setProperty("--el-fill-color-dark","var(--main-light-color)"),document==null||document.body.style.setProperty("--el-fill-color-darker","var(--main-light-color)"),document==null||document.body.style.setProperty("--el-color-primary-light-5","var(--button-disabled)"),document==null||document.body.style.setProperty("--el-bg-color","var(--background)"),document==null||document.body.style.setProperty("--el-text-color-primary","var(--foreground)"),document==null||document.body.style.setProperty("--el-button-hover-text-color","var(--background)"),document==null||document.body.style.setProperty("--time-scale-height","30px"),document==null||document.body.style.setProperty("--vcd-render-padding","30px"),document==null||document.body.style.setProperty("--sidebar-width","330px"),document==null||document.body.style.setProperty("--toolbar-height","60px");const e=getComputedStyle(document==null?void 0:document.documentElement).getPropertyValue("--background"),n=$d(e);if(!n)return;const{r,g:o,b:s}=n;if(wS(r,o,s)?PMe():$Me(),(window.acquireVsCodeApi===void 0?"debug":"release")==="debug"){const l=DMe(),u=document==null?void 0:document.getElementById("app");u==null||u.classList.add("vscode-"+l)}}let U1;function DMe(){if(U1)return U1;const e=getComputedStyle(document==null?void 0:document.documentElement).getPropertyValue("--background"),n=$d(e);return n?(U1=wS(n.r,n.g,n.b)?"light":"dark",U1):"dark"}function PMe(){document==null||document.body.style.setProperty("--vline-stroke-color","#ddd")}function $Me(){document==null||document.body.style.setProperty("--vline-stroke-color","#333")}const{t:LMe}=ff.global,Yn=Jt([]),Xn=Jt({currentModelIndex:0});function NO(t){const e=yS("tool");e.componentIndex=2,e.icon="icon-tool",e.name=LMe("tools");const n={activeNames:[0],currentToolName:t.function.name,formData:JSON.parse(t.function.arguments)};e.storage=n,Cn.content.push(e),Cn.activeIndex=Cn.content.length-1}const P2=B(!0);async function FMe(){const e=await ur().commandRequest("setting/load");if(e.code!==200)wo("配置加载失败"),console.log(e.msg);else{const n=e.msg;wo("配置加载成功"),Xn.currentModelIndex=n.MODEL_INDEX||0,ff.global.locale.value=n.LANG||"zh",Ki.timeout=n.MCP_TIMEOUT_SEC||60,Ki.proxyServer=n.PROXY_SERVER||"",n.LLM_INFO.forEach(r=>{Yn.push(r)})}}async function BMe(){const t=ur(),{code:e,msg:n}=await t.commandRequest("setting/get-tour");e===200&&(wo("获取引导状态成功 "+n.userHasReadGuide),P2.value=n.userHasReadGuide||!1)}async function zMe(){const t=ur(),{code:e,msg:n}=await t.commandRequest("setting/set-tour",{userHasReadGuide:P2.value})}function Cm(t){const e=ur(),n={MODEL_INDEX:Xn.currentModelIndex,LLM_INFO:JSON.parse(JSON.stringify(Yn)),LANG:ff.global.locale.value,MCP_TIMEOUT_SEC:Ki.timeout,PROXY_SERVER:Ki.proxyServer};e.addCommandListener("setting/save",r=>{const o=r.code;wo("配置保存状态:"+o),t&&t()},{once:!0}),e.postMessage({command:"setting/save",data:n})}const JB=B(null);async function QB(){wo("准备请求设置");const t=UB.service({fullscreen:!0,lock:!0,text:"Loading",background:"rgba(0, 0, 0, 0.7)"});FMe(),await BMe(),t.close(),await ln.launch(),await ln.loadPanels(),ZB.value=!1}const Fu=(t,e)=>{const n=t.__vccOpts||t;for(const[r,o]of e)n[r]=o;return n},VMe={},HMe={class:"tour-title"};function UMe(t,e){return A(),z("div",HMe,[e[0]||(e[0]=R("span",{class:"openmcp-image tour-title-icon"},null,-1)),ke(t.$slots,"default")])}const gs=Fu(VMe,[["render",UMe]]),ez=B(null);var bo=(t=>(t.ServerError="server internal error",t.ReceiveChunkError="receive chunk error",t.Timeout="timeout",t.MaxEpochs="max epochs",t.Unknown="unknown error",t.Abort="abort",t.ToolCall="tool call failed",t.None="none",t.Success="success",t.ParseJsonError="parse json error",t.NoToolFunction="no tool function",t))(bo||{});function tz(t){const e=[];for(let n=0;n<t.length;n++){const r=t[n];r.enabled&&e.push({type:"function",function:{name:r.name,description:r.description||"",parameters:r.inputSchema}})}return e}async function WMe(t){if(!t.function)return{content:[{type:"error",text:"no tool function"}],state:bo.NoToolFunction};const e=t.function.name,n=qMe(t.function.arguments);if(n.error)return{content:[{type:"error",text:jMe(n.error)}],state:bo.ParseJsonError};const r=n.value,o=await ln.callTool(e,r);return KMe(o)}function qMe(t){try{return{value:JSON.parse(t),error:void 0}}catch(e){return{value:void 0,error:e}}}function KMe(t){return typeof t=="string"?(Mb("error happen"+JSON.stringify(t)),{content:[{type:"error",text:t}],state:bo.ToolCall}):t.isError?{content:t.content,state:bo.ToolCall}:{content:t.content,state:bo.Success}}function jMe(t){return typeof t=="string"?t:typeof t=="object"?JSON.stringify(t,null,2):t.toString()}function GMe(t,e){return t.id?(e.has(t.id)||e.set(t.id,e.size),e.get(t.id)):0}function YMe(t){return 0}function XMe(t){return t.index||0}function ZMe(t){if(t.userModel.startsWith("gemini"))return YMe;if(t.userModel.startsWith("grok")){const e=new Map;return n=>GMe(n,e)}return XMe}const Hi=B([{name:"Default",content:"你是一个AI助手, 你可以回答任何问题。"}]);function JMe(t){const e=Hi.value.find(n=>n.name===t);if(e)return e.content}async function DO(t,e){const r=await ur().commandRequest("system-prompts/set",{name:t,content:e});return r.code===200&&(wo("system prompt 添加成功"),Hi.value.some(o=>o.name===t)||Hi.value.push({name:t,content:e})),r}async function QMe(t){const n=await ur().commandRequest("system-prompts/delete",{name:t});return n.code===200&&(wo("system prompt 删除成功"),Hi.value=Hi.value.filter(r=>r.name!==t)),n}async function eIe(){const e=await ur().commandRequest("system-prompts/load");return e.code===200&&(wo("system prompt 加载成功"),Hi.value=e.msg),e}class nz{constructor(e={maxEpochs:20,maxJsonParseRetry:3,adapter:void 0}){Bn(this,"bridge");Bn(this,"streamingContent");Bn(this,"streamingToolCalls");Bn(this,"currentChatId","");Bn(this,"onError",e=>{});Bn(this,"onChunk",e=>{});Bn(this,"onDone",()=>{});Bn(this,"onToolCall",e=>e);Bn(this,"onToolCalled",e=>e);Bn(this,"onEpoch",()=>{});Bn(this,"completionUsage");Bn(this,"llmConfig");Bn(this,"nodejsStatus",{connectionFut:new Promise(e=>e(void 0))});if(this.taskOptions=e,this.streamingContent=B(""),this.streamingToolCalls=B([]),l0()==="nodejs"){const r=e.adapter;if(!r)throw new Error("adapter is required");hre(r.emitter),this.nodejsStatus.connectionFut=ln.launch()}this.bridge=ur()}handleChunkDeltaContent(e){var r,o;const n=((o=(r=e.choices[0])==null?void 0:r.delta)==null?void 0:o.content)||"";n&&(this.streamingContent.value+=n)}handleChunkDeltaToolCalls(e,n){var o,s,i,a,l,u,c;const r=(i=(s=(o=e.choices[0])==null?void 0:o.delta)==null?void 0:s.tool_calls)==null?void 0:i[0];if(r){(r.index===void 0||r.index===null)&&console.warn("tool_call.index is undefined or null");const d=n(r),h=this.streamingToolCalls.value[d];h===void 0?this.streamingToolCalls.value[d]={id:r.id,index:d,type:"function",function:{name:((a=r.function)==null?void 0:a.name)||"",arguments:((l=r.function)==null?void 0:l.arguments)||""}}:h&&(r.id&&(h.id=r.id),(u=r.function)!=null&&u.name&&(h.function.name=r.function.name),(c=r.function)!=null&&c.arguments&&(h.function.arguments+=r.function.arguments))}}handleChunkUsage(e){const n=e.usage;n&&(this.completionUsage=n)}doConversation(e,n){return new Promise((r,o)=>{const s=this.bridge.addCommandListener("llm/chat/completions/chunk",l=>{const{chunk:u}=l.msg;this.handleChunkDeltaContent(u),this.handleChunkDeltaToolCalls(u,n),this.handleChunkUsage(u),this.onChunk(u)},{once:!1}),i=this.bridge.addCommandListener("llm/chat/completions/done",l=>{this.onDone(),s(),a(),r({stop:!1})},{once:!0}),a=this.bridge.addCommandListener("llm/chat/completions/error",l=>{this.onError({state:bo.ReceiveChunkError,msg:l.msg||"请求模型服务时发生错误"}),s(),i(),r({stop:!0})},{once:!0});this.bridge.postMessage({command:"llm/chat/completions",data:JSON.parse(JSON.stringify(e))})})}setProxyServer(e){Ki.proxyServer=e}makeChatData(e){const n=this.getLlmConfig().baseUrl,r=this.getLlmConfig().userToken||"";if(r.trim()===""){e.messages.length>0&&e.messages[e.messages.length-1].role==="user"&&(e.messages.pop(),Pr.error("请先设置 API Key"));return}console.log("setting",e.settings);const o=this.getLlmConfig().userModel,s=e.settings.temperature,i=tz(e.settings.enableTools),a=e.settings.parallelToolCalls,l=Ki.proxyServer||"",u=[];if(e.settings.systemPrompt){const p=JMe(e.settings.systemPrompt)||e.settings.systemPrompt;u.push({role:"system",content:p})}const c=e.messages.slice(-e.settings.contextLength);return u.push(...c),{id:crypto.randomUUID(),baseURL:n,apiKey:r,model:o,temperature:s,tools:i,parallelToolCalls:a,messages:u,proxyServer:l}}abort(){this.bridge.postMessage({command:"llm/chat/completions/abort",data:{id:this.currentChatId}}),this.streamingContent.value="",this.streamingToolCalls.value=[]}registerOnError(e){this.onError=e}registerOnChunk(e){this.onChunk=e}registerOnDone(e){this.onDone=e}registerOnEpoch(e){this.onEpoch=e}registerOnToolCall(e){this.onToolCall=e}registerOnToolCalled(e){this.onToolCalled=e}setMaxEpochs(e){this.taskOptions.maxEpochs=e}setLlmConfig(e){this.llmConfig=e}bindStreaming(e,n){this.streamingContent=e,this.streamingToolCalls=n}getLlmConfig(){return this.llmConfig?this.llmConfig:Yn[Xn.currentModelIndex]}async listTools(){l0()==="nodejs"&&await this.nodejsStatus.connectionFut;const n={};for(const r of ln.clients){if(!r.connected)continue;const o=await r.getTools(),s=r.connectionResult.name;n[s]=Array.from(o.values())}return n}async start(e,n){var i;l0()==="nodejs"&&await this.nodejsStatus.connectionFut,e.messages.push({role:"user",content:n,extraInfo:{created:Date.now(),state:bo.Success,serverName:this.getLlmConfig().id||"unknown"}});let o=0;const s=this.taskOptions.maxEpochs||20;for(let a=0;a<s;++a){this.onEpoch(),this.streamingContent.value="",this.streamingToolCalls.value=[],this.completionUsage=void 0;const l=this.makeChatData(e);if(!l){this.onDone();break}this.currentChatId=l.id;const u=this.getLlmConfig(),c=ZMe(u),d=await this.doConversation(l,c);if(this.streamingToolCalls.value.length>0){e.messages.push({role:"assistant",content:this.streamingContent.value||"",tool_calls:this.streamingToolCalls.value,extraInfo:{created:Date.now(),state:bo.Success,serverName:this.getLlmConfig().id||"unknown"}}),wo("调用工具数量:"+this.streamingToolCalls.value.length);for(let h of this.streamingToolCalls.value||[]){h=this.onToolCall(h);let p=await WMe(h);if(p=this.onToolCalled(p),p.state===bo.ParseJsonError){if(e.messages.pop(),o++,Mb("解析 JSON 错误 "+((i=h==null?void 0:h.function)==null?void 0:i.arguments)),o>=(this.taskOptions.maxJsonParseRetry||3)){e.messages.push({role:"assistant",content:`解析 JSON 错误,无法继续调用工具 (累计错误次数 ${this.taskOptions.maxJsonParseRetry})`,extraInfo:{created:Date.now(),state:p.state,serverName:this.getLlmConfig().id||"unknown",usage:void 0}});break}}else p.state===bo.Success?e.messages.push({role:"tool",index:c(h),tool_call_id:h.id||"",content:p.content,extraInfo:{created:Date.now(),state:p.state,serverName:this.getLlmConfig().id||"unknown",usage:this.completionUsage}}):p.state===bo.ToolCall&&e.messages.push({role:"tool",index:c(h),tool_call_id:h.id||h.function.name,content:p.content,extraInfo:{created:Date.now(),state:p.state,serverName:this.getLlmConfig().id||"unknown",usage:this.completionUsage}})}}else if(this.streamingContent.value){e.messages.push({role:"assistant",content:this.streamingContent.value,extraInfo:{created:Date.now(),state:bo.Success,serverName:this.getLlmConfig().id||"unknown",usage:this.completionUsage}});break}else break;if(d.stop)break}}}function tIe(t){var n,r,o;if(t.serverName==="unknown"||t.usage===void 0||t.usage===null)return;const e=t.usage;switch(t.serverName){case"deepseek":return{input:e.prompt_tokens,output:e.completion_tokens,total:e.prompt_tokens+e.completion_tokens,cacheHitRatio:Math.ceil((((n=e.prompt_tokens_details)==null?void 0:n.cached_tokens)||0)/e.prompt_tokens*1e3)/10};case"openai":return{input:e==null?void 0:e.prompt_tokens,output:e==null?void 0:e.completion_tokens,total:e.prompt_tokens+e.completion_tokens,cacheHitRatio:Math.ceil(((r=e.prompt_tokens_details)==null?void 0:r.cached_tokens)||0/e.prompt_tokens*1e3)/10};default:return e.prompt_tokens&&e.completion_tokens?{input:e.prompt_tokens,output:e.completion_tokens,total:e.prompt_tokens+e.completion_tokens,cacheHitRatio:Math.ceil((((o=e.prompt_tokens_details)==null?void 0:o.cached_tokens)||0)/e.prompt_tokens*1e3)/10}:void 0}}const rz=B(null),No=Jt({done:!1,start:!1,error:"",tps:void 0});async function nIe(){No.done=!1,No.start=!0,No.tps=void 0;const t="hello",e=new nz,n={messages:[],settings:{temperature:.6,modelIndex:Xn.currentModelIndex,systemPrompt:"",enableTools:[],enableWebSearch:!1,contextLength:5,parallelToolCalls:!0}};e.setMaxEpochs(1),e.registerOnDone(()=>{No.error="",No.done=!0,No.start=!1}),e.registerOnError(i=>{const a=i.msg,l=JSON.stringify(a);No.error=l,No.start=!1});const r=Date.now();await e.start(n,t);const o=(Date.now()-r)/1e3,s=n.messages[n.messages.length-1];if(console.log(n.messages),s!=null&&s.extraInfo){const i=s.extraInfo.usage;if(i!=null&&i.prompt_tokens&&i.completion_tokens){const a=(i==null?void 0:i.prompt_tokens)+(i==null?void 0:i.completion_tokens);No.tps=(a/o).toFixed(2)}}}const rIe=J({__name:"tour",setup(t){const e=B(!0),{t:n}=Tn(),r=t2(),o="/";function s(){e.value=!1,P2.value=!0,zMe()}return(i,a)=>{const l=Ue("el-tour-step"),u=Ue("el-tour");return A(),ye(u,{modelValue:e.value,"onUpdate:modelValue":a[0]||(a[0]=c=>e.value=c)},{default:j(()=>[U(l,{"next-button-props":{children:"开始"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[1]||(a[1]=[nt("介绍")])),_:1,__:[1]})]),default:j(()=>[a[2]||(a[2]=R("div",{style:{display:"flex",padding:"10px","padding-bottom":"20px"}},[R("div",{class:"tour-common-text"},[nt(" 欢迎来到大模型与 mcp 的世界! "),R("br"),R("br"),nt(" OpenMCP 将会助力你快速将任何奇思妙想开发成 mcp 服务器,通过接入大模型,让你的任何 idea 都可以快速落地。 "),R("br"),R("br"),nt(" 倘若阁下是第一次使用 OpenMCP,请务必走完我们准备好的引导。 ")])],-1))]),_:1,__:[2]}),U(l,{target:"#connected-status-container","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[3]||(a[3]=[nt("引导")])),_:1,__:[3]})]),default:j(()=>[a[4]||(a[4]=R("div",{class:"tour-common-text"},[nt(" 这里会显示当前调试的 mcp 服务器的名称(缩写)和连接状态。只有当连接状态为「已连接」,调试工作才能开始。 "),R("br"),R("br"),nt(" OpenMCP 通过服务器名称对项目所的所有服务进行统一管理,请避免在同一个项目中使用相同的名称。 ")],-1))]),_:1,__:[4]}),U(l,{target:"#sidebar-connect","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步",onClick:()=>f(r).push(f(o)+"connect")},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[5]||(a[5]=[nt("连接")])),_:1,__:[5]})]),default:j(()=>[a[6]||(a[6]=R("div",{class:"tour-common-text"}," 如果显示「未连接」或阁下想要更改连接参数或者连接方式,可以点击这里进入连接面板。 ",-1))]),_:1,__:[6]},8,["next-button-props"]),U(l,{target:f(ln).clients[0].connectionSettingRef,"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"right"},{header:j(()=>[U(gs,null,{default:j(()=>a[7]||(a[7]=[nt("连接")])),_:1,__:[7]})]),default:j(()=>[a[8]||(a[8]=R("div",{class:"tour-common-text"},[nt(" 阁下可以在左侧面板选择与您心爱的 mcp 服务器进行连接的方式,并填入对应的连接参数。 "),R("br"),R("br"),nt(" 对于 openmcp vscode/trae/cursor 插件端的用户,当您通过面板按钮进入 openmcp 的时候,默认就会选择 STDIO 作为连接方式,并根据你的上下文生成启动参数。 openmcp desktop 的用户可能就需要自己填写了。Anyway,这总比在你的好友电脑中植入 chrome 浏览器密码破解木马简单。 ")],-1))]),_:1,__:[8]},8,["target"]),U(l,{target:f(ln).clients[0].connectionLogRef,"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"left"},{header:j(()=>[U(gs,null,{default:j(()=>a[9]||(a[9]=[nt("连接")])),_:1,__:[9]})]),default:j(()=>[a[10]||(a[10]=R("div",{class:"tour-common-text"}," 连接响应会在这个地方打印出来,如果出现绿色背景的信息,代表连接成功。 ",-1))]),_:1,__:[10]},8,["target"]),U(l,{target:f(JB),"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[11]||(a[11]=[nt("调试")])),_:1,__:[11]})]),default:j(()=>[a[12]||(a[12]=R("div",{class:"tour-common-text"}," 你可以点击最右侧的加号来添加额外的 mcp 服务器,让你当前正在调试的 agent 零成本快速获得额外的能力。 ",-1))]),_:1,__:[12]},8,["target"]),U(l,{target:"#sidebar-debug","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步",onClick:()=>f(r).push(f(o)+"debug")},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[13]||(a[13]=[nt("调试")])),_:1,__:[13]})]),default:j(()=>[a[14]||(a[14]=R("div",{class:"tour-common-text"}," 假设你已经成功连接了 mcp 服务器,那么点击调试按钮,你可以开始你的调试工作。 ",-1))]),_:1,__:[14]},8,["next-button-props"]),U(l,{target:f(ez),"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"right"},{header:j(()=>[U(gs,null,{default:j(()=>a[15]||(a[15]=[nt("调试")])),_:1,__:[15]})]),default:j(()=>[a[16]||(a[16]=R("div",{class:"tour-common-text"},[nt(" 我们目前提供了四种主要调试选项,「资源」、「提词」、「工具」分别和 MCP 协议中的 resources、prompts、tools 对应。 而「交互测试」则允许你直接将写好的 mcp 服务器放入大模型中直接做全链路测试,从而更加获取更加真实的反馈和数据,进而改进的你的 mcp 服务器。 "),R("br"),R("br"),nt(" 基于我们在 agent 和 rl 方向的最佳实践,我们后续还会推出更多的调试和数据集聚合制作选项,请期待吧! ")],-1))]),_:1,__:[16]},8,["target"]),U(l,{target:"#sidebar-setting","prev-button-props":{children:"上一步",onClick:()=>f(r).push(f(o)+"debug")},"next-button-props":{children:"下一步",onClick:()=>f(r).push(f(o)+"setting")},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[17]||(a[17]=[nt("设置")])),_:1,__:[17]})]),default:j(()=>[a[18]||(a[18]=R("div",{class:"tour-common-text"}," 如果要进行交互测试,请不要忘记先配置你常用的大模型 API ",-1))]),_:1,__:[18]},8,["prev-button-props","next-button-props"]),U(l,{target:f(rz),"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"right"},{header:j(()=>[U(gs,null,{default:j(()=>a[19]||(a[19]=[nt("设置")])),_:1,__:[19]})]),default:j(()=>[a[20]||(a[20]=R("div",{class:"tour-common-text"}," OpenMCP 目前支持所有支持 openai 接口规范的大模型,比如 deepseek,openai,kimi 等等。 本地部署的 ollama 也正在支持。 ",-1))]),_:1,__:[20]},8,["target"]),U(l,{target:"#add-new-server-button","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[21]||(a[21]=[nt("设置")])),_:1,__:[21]})]),default:j(()=>[a[22]||(a[22]=R("div",{class:"tour-common-text"}," 如果需要添加自定义的大模型服务,请点击这里。比如火山云,阿里云,硅基流动等。 ",-1))]),_:1,__:[22]}),U(l,{target:"#test-llm-button","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[23]||(a[23]=[nt("设置")])),_:1,__:[23]})]),default:j(()=>[a[24]||(a[24]=R("div",{class:"tour-common-text"}," 填写完成连接签名后,点击这里来测试 大模型服务是否可以访问。 ",-1))]),_:1,__:[24]}),U(l,{target:"#save-llm-button","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[25]||(a[25]=[nt("设置")])),_:1,__:[25]})]),default:j(()=>[a[26]||(a[26]=R("div",{class:"tour-common-text"}," 最后请不要忘记点击保存按钮,保存你的设置。 ",-1))]),_:1,__:[26]}),U(l,{"prev-button-props":{children:"上一步",onClick:()=>f(r).push(f(o)+"setting")},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[27]||(a[27]=[nt("🎉恭喜")])),_:1,__:[27]})]),default:j(()=>[a[28]||(a[28]=R("div",{class:"tour-common-text"},[nt(" 🎉恭喜,我的朋友,现在的你已经是半个 mcp 专家了,请充好一杯咖啡,慢慢享用快乐的开发时间吧! "),R("br"),R("br"),nt(" 如果是插件用户,左侧面板的最下面「入门与帮助」有一些我们准备好的资料,希望能帮到阁下优雅地开发你的 mcp 服务器。 让我们一起把越来越多的 api 和 sdk 接入 大模型吧。 ")],-1))]),_:1,__:[28]},8,["prev-button-props"]),U(l,{"prev-button-props":{children:"上一步",onClick:()=>f(r).push(f(o)+"setting")},"next-button-props":{children:"结束",onClick:()=>s()},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[29]||(a[29]=[nt("终章?")])),_:1,__:[29]})]),default:j(()=>[a[30]||(a[30]=R("div",{class:"tour-common-text"},[R("pre",null,[R("code",{style:{color:"unset !important","background-color":"unset !important"}},[nt("(base) "),R("span",{style:{color:"greenyellow"}},"➜"),nt(" "),R("span",{style:{color:"#6AC2CF"}},".openmcp"),nt(),R("span",{style:{color:"#6BC34B"}},"cat"),nt(),R("span",{style:{color:"#D357DB"}},"KEY"),nt(`
|
83
|
+
" style="stroke-width:4px;fill:rgba(0, 0, 0, 0);stroke:var(--main-color);"></path></svg></div></span></span>`,1))])):(A(),z("div",{key:0,class:P(["connected-status-container",{connected:n.value.connectionResult.success}]),id:"connected-status-container",onClick:a[0]||(a[0]=vt(u=>s(),["stop"]))},[R("span",pMe,[U(l,{class:"extra-connect-container",effect:"dark",placement:"right",content:r.value},{default:j(()=>[R("span",mMe,Se(o.value),1)]),_:1},8,["content"])]),R("span",gMe,[n.value.connectionResult.success?(A(),z("span",vMe,a[1]||(a[1]=[R("span",{class:"iconfont icon-connect"},null,-1),R("span",{class:"iconfont icon-dui"},null,-1)]))):(A(),z("span",bMe,a[2]||(a[2]=[R("span",{class:"iconfont icon-connect"},null,-1),R("span",{class:"iconfont icon-cuo"},null,-1)])))])],2))}}}),kMe={class:"sidebar-container"},SMe=J({__name:"index",setup(t){return(e,n)=>(A(),z("div",kMe,[R("div",null,[U(ite),U(ure)]),R("div",null,[U(_Me)])]))}}),xMe={class:"main-panel-container"},CMe={class:"tabs-container"},EMe={class:"scroll-tabs-container"},TMe=["onClick"],AMe={class:"tab-name"},OMe=["onClick"],MMe={class:"main-panel"},IMe=J({__name:"index",setup(t){const e="/",n=_5(),r=t2();function o(){YB(),n.name!=="debug"&&r.push(e+"debug")}function s(i){i>=0&&i<Cn.content.length&&(Cn.activeIndex=i,n.name!=="debug"&&r.push(e+"debug"))}return(i,a)=>{const l=Ue("el-scrollbar"),u=Ue("router-view");return A(),z("div",xMe,[R("div",CMe,[U(l,null,{default:j(()=>[R("div",EMe,[(A(!0),z(Xe,null,Et(f(Cn).content,(c,d)=>(A(),z("span",{class:P(["tab",{"active-tab":f(Cn).activeIndex===d}]),key:c.id,onClick:h=>s(d)},[R("span",null,[R("span",{class:P(`iconfont ${c.icon}`)},null,2),R("span",AMe,Se(c.name),1)]),R("span",{class:"iconfont icon-close",onClick:vt(h=>f(iMe)(d),["stop"])},null,8,OMe)],10,TMe))),128))])]),_:1}),R("span",{class:"add-button iconfont icon-add",onClick:o})]),R("div",MMe,[U(u)])])}}});function $d(t){if(t.startsWith("#")){let e=t.slice(1);e.length===3&&(e=e.split("").map(s=>s+s).join(""));const n=parseInt(e.slice(0,2),16),r=parseInt(e.slice(2,4),16),o=parseInt(e.slice(4,6),16);return{r:n,g:r,b:o}}else if(t.startsWith("rgba")){const e=t.match(/rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d+(\.\d+)?)\)/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10),o=parseInt(e[3],10),s=parseFloat(e[4]);return{r:n,g:r,b:o,a:s}}}else if(t.startsWith("rgb")){const e=t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if(e){const n=parseInt(e[1],10),r=parseInt(e[2],10),o=parseInt(e[3],10);return{r:n,g:r,b:o}}}}function dw(t){return t/=255,t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}function wS(t,e,n){return t=dw(t),e=dw(e),n=dw(n),.2126*t+.7152*e+.0722*n>.5}function RO(t){const{r:e,g:n,b:r}=t;return`rgb(${e}, ${n}, ${r})`}class RMe{constructor(e={}){Bn(this,"option");Bn(this,"rootStyles");Bn(this,"theme","dark");Bn(this,"foregroundColor");Bn(this,"backgroundColor");Bn(this,"foregroundColorString","");Bn(this,"backgroundColorString","");this.option=e,this.rootStyles=getComputedStyle(document==null?void 0:document.documentElement);const n=this.rootStyles.getPropertyValue(e.BaseForegroundColorMacroName||"--foreground"),r=this.rootStyles.getPropertyValue(e.BaseBackgroundColorMacroName||"--background");if(this.foregroundColor=$d(n),this.backgroundColor=$d(r),this.foregroundColorString=n,this.backgroundColorString=r,this.backgroundColor){const s=wS(this.backgroundColor.r,this.backgroundColor.g,this.backgroundColor.b);this.theme=s?"light":"dark"}else this.theme="light";this.rootStyles.getPropertyValue("--sidebar")===r&&(document==null||document.documentElement.style.setProperty("--sidebar","var(--vscode-icube-colorBg2)"))}getColor(e,n={}){const r=this.theme,o=this.rootStyles;if((n.mode||"svg")==="svg")return(o==null?void 0:o.getPropertyValue(e))||"#fff";switch(e){case"--foreground":case"--wire-color":case"--cross-dot-color":if(r==="dark")return"#2D323B"}const i=(o==null?void 0:o.getPropertyValue(e))||"#fff",a=$d(i);if(!a)return i;if(!a.a)return RO(a);const l=$d("#ffffff"),u={r:Math.round(a.r*a.a+l.r*(1-a.a)),g:Math.round(a.g*a.a+l.g*(1-a.a)),b:Math.round(a.b*a.a+l.b*(1-a.a))};return RO(u)}}new RMe;function NMe(){document==null||document.body.style.setProperty("--el-color-primary","var(--main-color)"),document==null||document.body.style.setProperty("--el-color-primary-light-9","var(--main-color)"),document==null||document.body.style.setProperty("--el-color-primary-light-3","var(--main-color)"),document==null||document.body.style.setProperty("--el-text-color-secondary","var(--foreground)"),document==null||document.body.style.setProperty("--el-text-color-regular","var(--foreground)"),document==null||document.body.style.setProperty("--el-border-color","var(--vscode-input-border)"),document==null||document.body.style.setProperty("--el-fill-color-blank","var(--sidebar)"),document==null||document.body.style.setProperty("--el-fill-color-light","var(--vscode-button-hoverBackground)"),document==null||document.body.style.setProperty("--el-switch-on-color","var(--main-color)"),document==null||document.body.style.setProperty("--el-border","var(--sidebar)"),document==null||document.body.style.setProperty("--el-border-color-light","var(--sidebar)"),document==null||document.body.style.setProperty("--el-border-color-lighter","var(--sidebar)"),document==null||document.body.style.setProperty("--el-bg-color-overlay","var(--sidebar)"),document==null||document.body.style.setProperty("--el-color-info","var(--foreground)"),document==null||document.body.style.setProperty("--el-color-info-light-8","var(--main-color)"),document==null||document.body.style.setProperty("--el-fill-color-light","var(--sidebar-item-selected)"),document==null||document.body.style.setProperty("--el-color-primary-dark-2","var(--main-light-color)"),document==null||document.body.style.setProperty("--el-fill-color-dark","var(--main-light-color)"),document==null||document.body.style.setProperty("--el-fill-color-darker","var(--main-light-color)"),document==null||document.body.style.setProperty("--el-color-primary-light-5","var(--button-disabled)"),document==null||document.body.style.setProperty("--el-bg-color","var(--background)"),document==null||document.body.style.setProperty("--el-text-color-primary","var(--foreground)"),document==null||document.body.style.setProperty("--el-button-hover-text-color","var(--background)"),document==null||document.body.style.setProperty("--time-scale-height","30px"),document==null||document.body.style.setProperty("--vcd-render-padding","30px"),document==null||document.body.style.setProperty("--sidebar-width","330px"),document==null||document.body.style.setProperty("--toolbar-height","60px");const e=getComputedStyle(document==null?void 0:document.documentElement).getPropertyValue("--background"),n=$d(e);if(!n)return;const{r,g:o,b:s}=n;if(wS(r,o,s)?PMe():$Me(),(window.acquireVsCodeApi===void 0?"debug":"release")==="debug"){const l=DMe(),u=document==null?void 0:document.getElementById("app");u==null||u.classList.add("vscode-"+l)}}let U1;function DMe(){if(U1)return U1;const e=getComputedStyle(document==null?void 0:document.documentElement).getPropertyValue("--background"),n=$d(e);return n?(U1=wS(n.r,n.g,n.b)?"light":"dark",U1):"dark"}function PMe(){document==null||document.body.style.setProperty("--vline-stroke-color","#ddd")}function $Me(){document==null||document.body.style.setProperty("--vline-stroke-color","#333")}const{t:LMe}=ff.global,Yn=Jt([]),Xn=Jt({currentModelIndex:0});function NO(t){const e=yS("tool");e.componentIndex=2,e.icon="icon-tool",e.name=LMe("tools");const n={activeNames:[0],currentToolName:t.function.name,formData:JSON.parse(t.function.arguments)};e.storage=n,Cn.content.push(e),Cn.activeIndex=Cn.content.length-1}const P2=B(!0);async function FMe(){const e=await ur().commandRequest("setting/load");if(e.code!==200)wo("配置加载失败"),console.log(e.msg);else{const n=e.msg;wo("配置加载成功"),Xn.currentModelIndex=n.MODEL_INDEX||0,ff.global.locale.value=n.LANG||"zh",Ki.timeout=n.MCP_TIMEOUT_SEC||60,Ki.proxyServer=n.PROXY_SERVER||"",n.LLM_INFO.forEach(r=>{Yn.push(r)})}}async function BMe(){const t=ur(),{code:e,msg:n}=await t.commandRequest("setting/get-tour");e===200&&(wo("获取引导状态成功 "+n.userHasReadGuide),P2.value=n.userHasReadGuide||!1)}async function zMe(){const t=ur(),{code:e,msg:n}=await t.commandRequest("setting/set-tour",{userHasReadGuide:P2.value})}function Cm(t){const e=ur(),n={MODEL_INDEX:Xn.currentModelIndex,LLM_INFO:JSON.parse(JSON.stringify(Yn)),LANG:ff.global.locale.value,MCP_TIMEOUT_SEC:Ki.timeout,PROXY_SERVER:Ki.proxyServer};e.addCommandListener("setting/save",r=>{const o=r.code;wo("配置保存状态:"+o),t&&t()},{once:!0}),e.postMessage({command:"setting/save",data:n})}const JB=B(null);async function QB(){wo("准备请求设置");const t=UB.service({fullscreen:!0,lock:!0,text:"Loading",background:"rgba(0, 0, 0, 0.7)"});FMe(),await BMe(),t.close(),await ln.launch(),await ln.loadPanels(),ZB.value=!1}const Fu=(t,e)=>{const n=t.__vccOpts||t;for(const[r,o]of e)n[r]=o;return n},VMe={},HMe={class:"tour-title"};function UMe(t,e){return A(),z("div",HMe,[e[0]||(e[0]=R("span",{class:"openmcp-image tour-title-icon"},null,-1)),ke(t.$slots,"default")])}const gs=Fu(VMe,[["render",UMe]]),ez=B(null);var bo=(t=>(t.ServerError="server internal error",t.ReceiveChunkError="receive chunk error",t.Timeout="timeout",t.MaxEpochs="max epochs",t.Unknown="unknown error",t.Abort="abort",t.ToolCall="tool call failed",t.None="none",t.Success="success",t.ParseJsonError="parse json error",t.NoToolFunction="no tool function",t))(bo||{});function tz(t){const e=[];for(let n=0;n<t.length;n++){const r=t[n];r.enabled&&e.push({type:"function",function:{name:r.name,description:r.description||"",parameters:r.inputSchema}})}return e}async function WMe(t){if(!t.function)return{content:[{type:"error",text:"no tool function"}],state:bo.NoToolFunction};const e=t.function.name,n=qMe(t.function.arguments);if(n.error)return{content:[{type:"error",text:jMe(n.error)}],state:bo.ParseJsonError};const r=n.value,o=await ln.callTool(e,r);return KMe(o)}function qMe(t){try{return{value:JSON.parse(t),error:void 0}}catch(e){return{value:void 0,error:e}}}function KMe(t){return typeof t=="string"?(Mb("error happen"+JSON.stringify(t)),{content:[{type:"error",text:t}],state:bo.ToolCall}):t.isError?{content:t.content,state:bo.ToolCall}:{content:t.content,state:bo.Success}}function jMe(t){return typeof t=="string"?t:typeof t=="object"?JSON.stringify(t,null,2):t.toString()}function GMe(t,e){return t.id?(e.has(t.id)||e.set(t.id,e.size),e.get(t.id)):0}function YMe(t){return 0}function XMe(t){return t.index||0}function ZMe(t){if(t.userModel.startsWith("gemini"))return YMe;if(t.userModel.startsWith("grok")){const e=new Map;return n=>GMe(n,e)}return XMe}const Hi=B([{name:"Default",content:"你是一个AI助手, 你可以回答任何问题。"}]);function JMe(t){const e=Hi.value.find(n=>n.name===t);if(e)return e.content}async function DO(t,e){const r=await ur().commandRequest("system-prompts/set",{name:t,content:e});return r.code===200&&(wo("system prompt 添加成功"),Hi.value.some(o=>o.name===t)||Hi.value.push({name:t,content:e})),r}async function QMe(t){const n=await ur().commandRequest("system-prompts/delete",{name:t});return n.code===200&&(wo("system prompt 删除成功"),Hi.value=Hi.value.filter(r=>r.name!==t)),n}async function eIe(){const e=await ur().commandRequest("system-prompts/load");return e.code===200&&(wo("system prompt 加载成功"),Hi.value=e.msg),e}class nz{constructor(e={maxEpochs:20,maxJsonParseRetry:3,adapter:void 0}){Bn(this,"bridge");Bn(this,"streamingContent");Bn(this,"streamingToolCalls");Bn(this,"currentChatId","");Bn(this,"onError",e=>{});Bn(this,"onChunk",e=>{});Bn(this,"onDone",()=>{});Bn(this,"onToolCall",e=>e);Bn(this,"onToolCalled",e=>e);Bn(this,"onEpoch",()=>{});Bn(this,"completionUsage");Bn(this,"llmConfig");Bn(this,"nodejsStatus",{connectionFut:new Promise(e=>e(void 0))});if(this.taskOptions=e,this.streamingContent=B(""),this.streamingToolCalls=B([]),l0()==="nodejs"){const r=e.adapter;if(!r)throw new Error("adapter is required");hre(r.emitter),this.nodejsStatus.connectionFut=ln.launch()}this.bridge=ur()}handleChunkDeltaContent(e){var r,o;const n=((o=(r=e.choices[0])==null?void 0:r.delta)==null?void 0:o.content)||"";n&&(this.streamingContent.value+=n)}handleChunkDeltaToolCalls(e,n){var o,s,i,a,l,u,c;const r=(i=(s=(o=e.choices[0])==null?void 0:o.delta)==null?void 0:s.tool_calls)==null?void 0:i[0];if(r){(r.index===void 0||r.index===null)&&console.warn("tool_call.index is undefined or null");const d=n(r),h=this.streamingToolCalls.value[d];h===void 0?this.streamingToolCalls.value[d]={id:r.id,index:d,type:"function",function:{name:((a=r.function)==null?void 0:a.name)||"",arguments:((l=r.function)==null?void 0:l.arguments)||""}}:h&&(r.id&&(h.id=r.id),(u=r.function)!=null&&u.name&&(h.function.name=r.function.name),(c=r.function)!=null&&c.arguments&&(h.function.arguments+=r.function.arguments))}}handleChunkUsage(e){const n=e.usage;n&&(this.completionUsage=n)}doConversation(e,n){return new Promise((r,o)=>{const s=this.bridge.addCommandListener("llm/chat/completions/chunk",l=>{const{chunk:u}=l.msg;this.handleChunkDeltaContent(u),this.handleChunkDeltaToolCalls(u,n),this.handleChunkUsage(u),this.onChunk(u)},{once:!1}),i=this.bridge.addCommandListener("llm/chat/completions/done",l=>{this.onDone(),s(),a(),r({stop:!1})},{once:!0}),a=this.bridge.addCommandListener("llm/chat/completions/error",l=>{this.onError({state:bo.ReceiveChunkError,msg:l.msg||"请求模型服务时发生错误"}),s(),i(),r({stop:!0})},{once:!0});this.bridge.postMessage({command:"llm/chat/completions",data:JSON.parse(JSON.stringify(e))})})}setProxyServer(e){Ki.proxyServer=e}makeChatData(e){const n=this.getLlmConfig().baseUrl,r=this.getLlmConfig().userToken||"";if(r.trim()===""){e.messages.length>0&&e.messages[e.messages.length-1].role==="user"&&(e.messages.pop(),Pr.error("请先设置 API Key"));return}const o=this.getLlmConfig().userModel,s=e.settings.temperature,i=tz(e.settings.enableTools),a=e.settings.parallelToolCalls,l=Ki.proxyServer||"",u=[];if(e.settings.systemPrompt){const p=JMe(e.settings.systemPrompt)||e.settings.systemPrompt;u.push({role:"system",content:p})}const c=e.messages.slice(-e.settings.contextLength);return u.push(...c),{id:crypto.randomUUID(),baseURL:n,apiKey:r,model:o,temperature:s,tools:i,parallelToolCalls:a,messages:u,proxyServer:l}}abort(){this.bridge.postMessage({command:"llm/chat/completions/abort",data:{id:this.currentChatId}}),this.streamingContent.value="",this.streamingToolCalls.value=[]}registerOnError(e){this.onError=e}registerOnChunk(e){this.onChunk=e}registerOnDone(e){this.onDone=e}registerOnEpoch(e){this.onEpoch=e}registerOnToolCall(e){this.onToolCall=e}registerOnToolCalled(e){this.onToolCalled=e}setMaxEpochs(e){this.taskOptions.maxEpochs=e}setLlmConfig(e){this.llmConfig=e}bindStreaming(e,n){this.streamingContent=e,this.streamingToolCalls=n}getLlmConfig(){return this.llmConfig?this.llmConfig:Yn[Xn.currentModelIndex]}async listTools(){l0()==="nodejs"&&await this.nodejsStatus.connectionFut;const n=[];for(const r of ln.clients){if(!r.connected)continue;const o=await r.getTools();n.push(...Array.from(o.values()).map(s=>({...s,enabled:!0})))}return n}async start(e,n){var i;l0()==="nodejs"&&await this.nodejsStatus.connectionFut,e.messages.push({role:"user",content:n,extraInfo:{created:Date.now(),state:bo.Success,serverName:this.getLlmConfig().id||"unknown"}});let o=0;const s=this.taskOptions.maxEpochs||20;for(let a=0;a<s;++a){this.onEpoch(),this.streamingContent.value="",this.streamingToolCalls.value=[],this.completionUsage=void 0;const l=this.makeChatData(e);if(!l){this.onDone();break}this.currentChatId=l.id;const u=this.getLlmConfig(),c=ZMe(u),d=await this.doConversation(l,c);if(this.streamingToolCalls.value.length>0){e.messages.push({role:"assistant",content:this.streamingContent.value||"",tool_calls:this.streamingToolCalls.value,extraInfo:{created:Date.now(),state:bo.Success,serverName:this.getLlmConfig().id||"unknown"}}),wo("调用工具数量:"+this.streamingToolCalls.value.length);for(let h of this.streamingToolCalls.value||[]){h=this.onToolCall(h);let p=await WMe(h);if(p=this.onToolCalled(p),p.state===bo.ParseJsonError){if(e.messages.pop(),o++,Mb("解析 JSON 错误 "+((i=h==null?void 0:h.function)==null?void 0:i.arguments)),o>=(this.taskOptions.maxJsonParseRetry||3)){e.messages.push({role:"assistant",content:`解析 JSON 错误,无法继续调用工具 (累计错误次数 ${this.taskOptions.maxJsonParseRetry})`,extraInfo:{created:Date.now(),state:p.state,serverName:this.getLlmConfig().id||"unknown",usage:void 0}});break}}else p.state===bo.Success?e.messages.push({role:"tool",index:c(h),tool_call_id:h.id||"",content:p.content,extraInfo:{created:Date.now(),state:p.state,serverName:this.getLlmConfig().id||"unknown",usage:this.completionUsage}}):p.state===bo.ToolCall&&e.messages.push({role:"tool",index:c(h),tool_call_id:h.id||h.function.name,content:p.content,extraInfo:{created:Date.now(),state:p.state,serverName:this.getLlmConfig().id||"unknown",usage:this.completionUsage}})}}else if(this.streamingContent.value){e.messages.push({role:"assistant",content:this.streamingContent.value,extraInfo:{created:Date.now(),state:bo.Success,serverName:this.getLlmConfig().id||"unknown",usage:this.completionUsage}});break}else break;if(d.stop)break}}}function tIe(t){var n,r,o;if(t.serverName==="unknown"||t.usage===void 0||t.usage===null)return;const e=t.usage;switch(t.serverName){case"deepseek":return{input:e.prompt_tokens,output:e.completion_tokens,total:e.prompt_tokens+e.completion_tokens,cacheHitRatio:Math.ceil((((n=e.prompt_tokens_details)==null?void 0:n.cached_tokens)||0)/e.prompt_tokens*1e3)/10};case"openai":return{input:e==null?void 0:e.prompt_tokens,output:e==null?void 0:e.completion_tokens,total:e.prompt_tokens+e.completion_tokens,cacheHitRatio:Math.ceil(((r=e.prompt_tokens_details)==null?void 0:r.cached_tokens)||0/e.prompt_tokens*1e3)/10};default:return e.prompt_tokens&&e.completion_tokens?{input:e.prompt_tokens,output:e.completion_tokens,total:e.prompt_tokens+e.completion_tokens,cacheHitRatio:Math.ceil((((o=e.prompt_tokens_details)==null?void 0:o.cached_tokens)||0)/e.prompt_tokens*1e3)/10}:void 0}}const rz=B(null),No=Jt({done:!1,start:!1,error:"",tps:void 0});async function nIe(){No.done=!1,No.start=!0,No.tps=void 0;const t="hello",e=new nz,n={messages:[],settings:{temperature:.6,modelIndex:Xn.currentModelIndex,systemPrompt:"",enableTools:[],enableWebSearch:!1,contextLength:5,parallelToolCalls:!0}};e.setMaxEpochs(1),e.registerOnDone(()=>{No.error="",No.done=!0,No.start=!1}),e.registerOnError(i=>{const a=i.msg,l=JSON.stringify(a);No.error=l,No.start=!1});const r=Date.now();await e.start(n,t);const o=(Date.now()-r)/1e3,s=n.messages[n.messages.length-1];if(console.log(n.messages),s!=null&&s.extraInfo){const i=s.extraInfo.usage;if(i!=null&&i.prompt_tokens&&i.completion_tokens){const a=(i==null?void 0:i.prompt_tokens)+(i==null?void 0:i.completion_tokens);No.tps=(a/o).toFixed(2)}}}const rIe=J({__name:"tour",setup(t){const e=B(!0),{t:n}=Tn(),r=t2(),o="/";function s(){e.value=!1,P2.value=!0,zMe()}return(i,a)=>{const l=Ue("el-tour-step"),u=Ue("el-tour");return A(),ye(u,{modelValue:e.value,"onUpdate:modelValue":a[0]||(a[0]=c=>e.value=c)},{default:j(()=>[U(l,{"next-button-props":{children:"开始"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[1]||(a[1]=[nt("介绍")])),_:1,__:[1]})]),default:j(()=>[a[2]||(a[2]=R("div",{style:{display:"flex",padding:"10px","padding-bottom":"20px"}},[R("div",{class:"tour-common-text"},[nt(" 欢迎来到大模型与 mcp 的世界! "),R("br"),R("br"),nt(" OpenMCP 将会助力你快速将任何奇思妙想开发成 mcp 服务器,通过接入大模型,让你的任何 idea 都可以快速落地。 "),R("br"),R("br"),nt(" 倘若阁下是第一次使用 OpenMCP,请务必走完我们准备好的引导。 ")])],-1))]),_:1,__:[2]}),U(l,{target:"#connected-status-container","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[3]||(a[3]=[nt("引导")])),_:1,__:[3]})]),default:j(()=>[a[4]||(a[4]=R("div",{class:"tour-common-text"},[nt(" 这里会显示当前调试的 mcp 服务器的名称(缩写)和连接状态。只有当连接状态为「已连接」,调试工作才能开始。 "),R("br"),R("br"),nt(" OpenMCP 通过服务器名称对项目所的所有服务进行统一管理,请避免在同一个项目中使用相同的名称。 ")],-1))]),_:1,__:[4]}),U(l,{target:"#sidebar-connect","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步",onClick:()=>f(r).push(f(o)+"connect")},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[5]||(a[5]=[nt("连接")])),_:1,__:[5]})]),default:j(()=>[a[6]||(a[6]=R("div",{class:"tour-common-text"}," 如果显示「未连接」或阁下想要更改连接参数或者连接方式,可以点击这里进入连接面板。 ",-1))]),_:1,__:[6]},8,["next-button-props"]),U(l,{target:f(ln).clients[0].connectionSettingRef,"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"right"},{header:j(()=>[U(gs,null,{default:j(()=>a[7]||(a[7]=[nt("连接")])),_:1,__:[7]})]),default:j(()=>[a[8]||(a[8]=R("div",{class:"tour-common-text"},[nt(" 阁下可以在左侧面板选择与您心爱的 mcp 服务器进行连接的方式,并填入对应的连接参数。 "),R("br"),R("br"),nt(" 对于 openmcp vscode/trae/cursor 插件端的用户,当您通过面板按钮进入 openmcp 的时候,默认就会选择 STDIO 作为连接方式,并根据你的上下文生成启动参数。 openmcp desktop 的用户可能就需要自己填写了。Anyway,这总比在你的好友电脑中植入 chrome 浏览器密码破解木马简单。 ")],-1))]),_:1,__:[8]},8,["target"]),U(l,{target:f(ln).clients[0].connectionLogRef,"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"left"},{header:j(()=>[U(gs,null,{default:j(()=>a[9]||(a[9]=[nt("连接")])),_:1,__:[9]})]),default:j(()=>[a[10]||(a[10]=R("div",{class:"tour-common-text"}," 连接响应会在这个地方打印出来,如果出现绿色背景的信息,代表连接成功。 ",-1))]),_:1,__:[10]},8,["target"]),U(l,{target:f(JB),"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[11]||(a[11]=[nt("调试")])),_:1,__:[11]})]),default:j(()=>[a[12]||(a[12]=R("div",{class:"tour-common-text"}," 你可以点击最右侧的加号来添加额外的 mcp 服务器,让你当前正在调试的 agent 零成本快速获得额外的能力。 ",-1))]),_:1,__:[12]},8,["target"]),U(l,{target:"#sidebar-debug","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步",onClick:()=>f(r).push(f(o)+"debug")},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[13]||(a[13]=[nt("调试")])),_:1,__:[13]})]),default:j(()=>[a[14]||(a[14]=R("div",{class:"tour-common-text"}," 假设你已经成功连接了 mcp 服务器,那么点击调试按钮,你可以开始你的调试工作。 ",-1))]),_:1,__:[14]},8,["next-button-props"]),U(l,{target:f(ez),"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"right"},{header:j(()=>[U(gs,null,{default:j(()=>a[15]||(a[15]=[nt("调试")])),_:1,__:[15]})]),default:j(()=>[a[16]||(a[16]=R("div",{class:"tour-common-text"},[nt(" 我们目前提供了四种主要调试选项,「资源」、「提词」、「工具」分别和 MCP 协议中的 resources、prompts、tools 对应。 而「交互测试」则允许你直接将写好的 mcp 服务器放入大模型中直接做全链路测试,从而更加获取更加真实的反馈和数据,进而改进的你的 mcp 服务器。 "),R("br"),R("br"),nt(" 基于我们在 agent 和 rl 方向的最佳实践,我们后续还会推出更多的调试和数据集聚合制作选项,请期待吧! ")],-1))]),_:1,__:[16]},8,["target"]),U(l,{target:"#sidebar-setting","prev-button-props":{children:"上一步",onClick:()=>f(r).push(f(o)+"debug")},"next-button-props":{children:"下一步",onClick:()=>f(r).push(f(o)+"setting")},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[17]||(a[17]=[nt("设置")])),_:1,__:[17]})]),default:j(()=>[a[18]||(a[18]=R("div",{class:"tour-common-text"}," 如果要进行交互测试,请不要忘记先配置你常用的大模型 API ",-1))]),_:1,__:[18]},8,["prev-button-props","next-button-props"]),U(l,{target:f(rz),"prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1,placement:"right"},{header:j(()=>[U(gs,null,{default:j(()=>a[19]||(a[19]=[nt("设置")])),_:1,__:[19]})]),default:j(()=>[a[20]||(a[20]=R("div",{class:"tour-common-text"}," OpenMCP 目前支持所有支持 openai 接口规范的大模型,比如 deepseek,openai,kimi 等等。 本地部署的 ollama 也正在支持。 ",-1))]),_:1,__:[20]},8,["target"]),U(l,{target:"#add-new-server-button","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[21]||(a[21]=[nt("设置")])),_:1,__:[21]})]),default:j(()=>[a[22]||(a[22]=R("div",{class:"tour-common-text"}," 如果需要添加自定义的大模型服务,请点击这里。比如火山云,阿里云,硅基流动等。 ",-1))]),_:1,__:[22]}),U(l,{target:"#test-llm-button","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[23]||(a[23]=[nt("设置")])),_:1,__:[23]})]),default:j(()=>[a[24]||(a[24]=R("div",{class:"tour-common-text"}," 填写完成连接签名后,点击这里来测试 大模型服务是否可以访问。 ",-1))]),_:1,__:[24]}),U(l,{target:"#save-llm-button","prev-button-props":{children:"上一步"},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[25]||(a[25]=[nt("设置")])),_:1,__:[25]})]),default:j(()=>[a[26]||(a[26]=R("div",{class:"tour-common-text"}," 最后请不要忘记点击保存按钮,保存你的设置。 ",-1))]),_:1,__:[26]}),U(l,{"prev-button-props":{children:"上一步",onClick:()=>f(r).push(f(o)+"setting")},"next-button-props":{children:"下一步"},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[27]||(a[27]=[nt("🎉恭喜")])),_:1,__:[27]})]),default:j(()=>[a[28]||(a[28]=R("div",{class:"tour-common-text"},[nt(" 🎉恭喜,我的朋友,现在的你已经是半个 mcp 专家了,请充好一杯咖啡,慢慢享用快乐的开发时间吧! "),R("br"),R("br"),nt(" 如果是插件用户,左侧面板的最下面「入门与帮助」有一些我们准备好的资料,希望能帮到阁下优雅地开发你的 mcp 服务器。 让我们一起把越来越多的 api 和 sdk 接入 大模型吧。 ")],-1))]),_:1,__:[28]},8,["prev-button-props"]),U(l,{"prev-button-props":{children:"上一步",onClick:()=>f(r).push(f(o)+"setting")},"next-button-props":{children:"结束",onClick:()=>s()},"show-close":!1},{header:j(()=>[U(gs,null,{default:j(()=>a[29]||(a[29]=[nt("终章?")])),_:1,__:[29]})]),default:j(()=>[a[30]||(a[30]=R("div",{class:"tour-common-text"},[R("pre",null,[R("code",{style:{color:"unset !important","background-color":"unset !important"}},[nt("(base) "),R("span",{style:{color:"greenyellow"}},"➜"),nt(" "),R("span",{style:{color:"#6AC2CF"}},".openmcp"),nt(),R("span",{style:{color:"#6BC34B"}},"cat"),nt(),R("span",{style:{color:"#D357DB"}},"KEY"),nt(`
|
84
84
|
直面恐惧,创造未来
|
85
85
|
Face your fears, create the future
|
86
86
|
恐怖に直面し、未来を創り出`)])])],-1))]),_:1,__:[30]},8,["prev-button-props","next-button-props"])]),_:1},8,["modelValue"])}}}),$p=Jt({allow:!0,password:""}),oIe=J({__name:"index",setup(t){const e=B(!0),n=async()=>{await ur().setupWebSocket("ws://localhost:8282?t="+$p.password)?(Pr.success("密码验证成功,欢迎回来锦恢"),e.value=!1,QB()):Pr.error("密码验证失败,请重新输入")};return Mt(()=>{e.value=!0}),(r,o)=>{const s=Ue("el-input"),i=Ue("el-button"),a=Ue("el-dialog");return A(),ye(a,{modelValue:e.value,"onUpdate:modelValue":o[1]||(o[1]=l=>e.value=l),title:"请输入密码","close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":!1,width:"30%",top:"20vh"},{footer:j(()=>[U(i,{type:"primary",onClick:n},{default:j(()=>o[2]||(o[2]=[nt("确认")])),_:1,__:[2]})]),default:j(()=>[o[3]||(o[3]=R("br",null,null,-1)),U(s,{modelValue:f($p).password,"onUpdate:modelValue":o[0]||(o[0]=l=>f($p).password=l),type:"password",placeholder:"请输入密码",onKeyup:_n(vt(n,["prevent"]),["enter"])},null,8,["modelValue","onKeyup"])]),_:1,__:[3]},8,["modelValue"])}}}),sIe=Fu(oIe,[["__scopeId","data-v-d681a05d"]]),iIe={class:"main"},aIe=J({__name:"App",setup(t){const e=ur();e.addCommandListener("hello",s=>{D9(`${s.name}`),D9(`version: ${s.version}`)},{once:!0});const n=_5(),r=t2(),o=!1;return console.log("false",o),$p.allow=!o,Mt(async()=>{if(NMe(),wo("OpenMCP Client 启动"),n.name!=="debug"){const s="/debug";console.log("go to "+s),r.push(s)}await e.awaitForWebsocket(),$p.allow&&(document==null||document.addEventListener("click",()=>{wD.showPanel=!1}),await QB())}),(s,i)=>(A(),z("div",iIe,[U(SMe),U(IMe),f(P2)?be("",!0):(A(),ye(rIe,{key:0})),f(o)?(A(),ye(sIe,{key:1})):be("",!0)]))}}),lIe="modulepreload",uIe=function(t){return"/"+t},PO={},W1=function(e,n,r){let o=Promise.resolve();if(n&&n.length>0){let i=function(u){return Promise.all(u.map(c=>Promise.resolve(c).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),l=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));o=i(n.map(u=>{if(u=uIe(u),u in PO)return;PO[u]=!0;const c=u.endsWith(".css"),d=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${d}`))return;const h=document.createElement("link");if(h.rel=c?"stylesheet":lIe,c||(h.as="script"),h.crossOrigin="",h.href=u,l&&h.setAttribute("nonce",l),document.head.appendChild(h),c)return new Promise((p,m)=>{h.addEventListener("load",p),h.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${u}`)))})}))}function s(i){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i}return o.then(i=>{for(const a of i||[])a.status==="rejected"&&s(a.reason);return e().catch(s)})},ep="/",cIe=[{name:"default",path:"/",redirect:ep+"debug"},{path:ep+"debug",name:"debug",component:()=>W1(()=>Promise.resolve().then(()=>jKe),void 0),meta:{title:"Debug"}},{path:ep+"connect",name:"connect",component:()=>W1(()=>Promise.resolve().then(()=>$je),void 0),meta:{title:"Connect"}},{path:ep+"setting",name:"setting",component:()=>W1(()=>Promise.resolve().then(()=>PGe),void 0),meta:{title:"Setting"}},{path:ep+"about",name:"about",component:()=>W1(()=>Promise.resolve().then(()=>BGe),void 0),meta:{title:"Tools"}}],oz=nte({history:Iee("/"),routes:cIe});oz.beforeEach((t,e,n)=>{t.meta.title&&document&&(document.title=`OpenMCP | ${t.meta.title}`),n()});Jy(aIe).use(ff).use(oz).use(KCe).mount("#app");const dIe={class:"resource-template"},fIe=["onClick"],hIe={class:"resource-template-container-scrollbar"},pIe={class:"resource-template-container"},mIe=["onClick"],gIe={key:1,style:{padding:"10px"}},vIe=J({__name:"resource-list-templates",props:{tabId:{type:Number,required:!0}},setup(t){ur();const{t:e}=Tn(),n=t;let r;n.tabId>=0?r=Cn.content[n.tabId].storage:r=Jt({activeNames:[0],templateActiveNames:[0],currentType:"template",currentResourceName:"",formData:{},lastResourceReadResponse:void 0});async function o(i,a){await i.getResourceTemplates({cache:!1}),Pr({message:e("finish-refresh"),type:"success",duration:3e3,showClose:!0})}function s(i){r.currentType="template",r.currentResourceName=i.name,r.lastResourceReadResponse=void 0}return Mt(async()=>{var i,a;if(r.currentResourceName===void 0&&r.currentType==="template"){const l=ln.masterNode,u=(i=l==null?void 0:l.resourceTemplates)==null?void 0:i.values().next();r.currentResourceName=((a=u==null?void 0:u.value)==null?void 0:a.name)||""}}),(i,a)=>{const l=Ue("el-scrollbar"),u=Ue("el-collapse-item"),c=Ue("el-collapse");return A(),ye(c,{"expand-icon-position":"left",modelValue:f(r).templateActiveNames,"onUpdate:modelValue":a[0]||(a[0]=d=>f(r).templateActiveNames=d)},{default:j(()=>[(A(!0),z(Xe,null,Et(f(ln).clients,(d,h)=>(A(),ye(u,{name:h,class:P([])},{title:j(()=>[R("h3",dIe,[a[1]||(a[1]=R("span",null,"resources/templates/list",-1)),R("span",{class:"iconfont icon-restart",onClick:p=>o(d,{first:!1})},null,8,fIe)])]),default:j(()=>{var p;return[R("div",hIe,[(((p=d.resourceTemplates)==null?void 0:p.size)||0)>0?(A(),ye(l,{key:0,height:"500px"},{default:j(()=>{var m;return[R("div",pIe,[(A(!0),z(Xe,null,Et((m=d.resourceTemplates)==null?void 0:m.values(),g=>(A(),z("div",{class:P(["item",{active:n.tabId>=0&&f(r).currentType==="template"&&f(r).currentResourceName===g.name}]),key:g.name,onClick:y=>s(g)},[R("span",null,Se(g.name),1),R("span",null,Se(g.description||""),1)],10,mIe))),128))])]}),_:2},1024)):(A(),z("div",gIe," empty "))])]}),_:2},1032,["name"]))),256))]),_:1},8,["modelValue"])}}}),bIe={class:"resource-template"},yIe=["onClick"],wIe={class:"resource-template-container-scrollbar"},_Ie={class:"resource-template-container"},kIe=["onClick"],sz=J({__name:"resource-list",props:{tabId:{type:Number,required:!0}},emits:["resource-selected"],setup(t,{emit:e}){const{t:n}=Tn(),r=t,o=e;let s;r.tabId>=0?s=Cn.content[r.tabId].storage:s=Jt({activeNames:[0],templateActiveNames:[0],currentType:"resource",currentResourceName:"",formData:{},lastResourceReadResponse:void 0});async function i(l,u){await l.getResources({cache:!1}),Pr({message:n("finish-refresh"),type:"success",duration:3e3,showClose:!0})}async function a(l){if(s.currentType="resource",s.currentResourceName=l.name,s.lastResourceReadResponse=void 0,o("resource-selected",l),r.tabId>=0){const u=await ln.readResource(l.uri);s.lastResourceReadResponse=u}}return Mt(async()=>{var l,u;if(s.currentResourceName===void 0&&s.currentType==="resource"){const d=(l=ln.masterNode.resources)==null?void 0:l.values().next();s.currentResourceName=((u=d==null?void 0:d.value)==null?void 0:u.name)||""}}),(l,u)=>{const c=Ue("el-scrollbar"),d=Ue("el-collapse-item"),h=Ue("el-collapse");return A(),ye(h,{"expand-icon-position":"left",modelValue:f(s).activeNames,"onUpdate:modelValue":u[0]||(u[0]=p=>f(s).activeNames=p)},{default:j(()=>[(A(!0),z(Xe,null,Et(f(ln).clients,(p,m)=>(A(),ye(d,{name:m,class:P([])},{title:j(()=>[R("h3",bIe,[u[1]||(u[1]=R("span",null,"resources/list",-1)),R("span",{class:"iconfont icon-restart",onClick:g=>i(p,{first:!1})},null,8,yIe)])]),default:j(()=>[R("div",wIe,[U(c,{height:"500px"},{default:j(()=>{var g;return[R("div",_Ie,[(A(!0),z(Xe,null,Et((g=p.resources)==null?void 0:g.values(),y=>(A(),z("div",{class:P(["item",{active:r.tabId>=0&&f(s).currentType==="resource"&&f(s).currentResourceName===y.name}]),key:y.uri,onClick:b=>a(y)},[R("span",null,Se(y.name),1),R("span",null,Se(y.mimeType),1)],10,kIe))),128))])]}),_:2},1024)])]),_:2},1032,["name"]))),256))]),_:1},8,["modelValue"])}}});function SIe(t){const e=/\{([^}]+)\}/g,n=new Set;let r;for(;(r=e.exec(t))!==null;)n.add(r[1]);const o=Array.from(n);return{params:o,fill:i=>{let a=t;for(const l of o)if(i[l]===void 0)throw new Error(`缺少必要参数: ${l}`);for(const l of o)a=a.replace(new RegExp(`\\{${l}\\}`,"g"),i[l].toString());return a}}}const xIe={class:"resource-reader-container"},iz=J({__name:"resouce-reader",props:{tabId:{type:Number,required:!0},currentResourceName:{type:String,required:!1}},emits:["resource-get-response"],setup(t,{emit:e}){const{t:n}=Tn(),r=t,o=e;let s;r.tabId>=0?s=Cn.content[r.tabId].storage:s=Jt({activeNames:[0],templateActiveNames:[0],currentType:"resource",currentResourceName:r.currentResourceName||"",formData:{},lastResourceReadResponse:void 0}),s.formData||(s.formData={});const i=B(),a=B(!1),l=B(),u=O(()=>{var g,y;for(const b of ln.clients){const S=(g=b.resources)==null?void 0:g.get(s.currentResourceName);if(S)return{name:S.name,template:S,params:[],fill:()=>""};const _=(y=b.resourceTemplates)==null?void 0:y.get(s.currentResourceName);if(_){const{params:k,fill:x}=SIe(_.uriTemplate);return{name:_.name,template:_,params:k,fill:x}}}}),c=O(()=>{var y;const g={};return(y=u.value)==null||y.params.forEach(b=>{g[b]=[{message:`${b} 是必填字段`,trigger:"blur"}]}),g}),d=()=>{var g;(g=u.value)!=null&&g.params&&u.value.params.forEach(y=>{s.formData[y]!==void 0&&s.formData[y]})},h=()=>{var g;(g=i.value)==null||g.resetFields(),l.value=void 0};function p(){var g,y;if(s.currentType==="template")return(((g=u.value)==null?void 0:g.fill)||(_=>_))(s.formData);for(const b of ln.clients){const S=(y=b.resources)==null?void 0:y.get(s.currentResourceName);if(S)return S.uri}}async function m(){const g=p(),y=await ln.readResource(g);s.lastResourceReadResponse=y,o("resource-get-response",y)}return r.tabId>=0&&$e(()=>s.currentResourceName,()=>{d(),h()},{immediate:!0}),(g,y)=>{var x;const b=Ue("el-input"),S=Ue("el-form-item"),_=Ue("el-button"),k=Ue("el-form");return A(),z(Xe,null,[R("div",null,[R("h3",null,Se((x=u.value)==null?void 0:x.name),1)]),R("div",xIe,[U(k,{model:f(s).formData,rules:c.value,ref_key:"formRef",ref:i,"label-position":"top"},{default:j(()=>{var C;return[(A(!0),z(Xe,null,Et((C=u.value)==null?void 0:C.params,E=>(A(),ye(S,{key:E,label:E,prop:E},{default:j(()=>[U(b,{modelValue:f(s).formData[E],"onUpdate:modelValue":I=>f(s).formData[E]=I,placeholder:f(n)("enter")+" "+E,onKeydown:_n(vt(m,["prevent"]),["enter"])},null,8,["modelValue","onUpdate:modelValue","placeholder","onKeydown"])]),_:2},1032,["label","prop"]))),128)),f(s).currentType==="template"?(A(),ye(S,{key:0},{default:j(()=>[U(_,{type:"primary",loading:a.value,onClick:m},{default:j(()=>[nt(Se(f(n)("read-resource")),1)]),_:1},8,["loading"]),U(_,{onClick:h},{default:j(()=>[nt(Se(f(n)("reset")),1)]),_:1})]),_:1})):(A(),ye(S,{key:1},{default:j(()=>[U(_,{onClick:m},{default:j(()=>[nt(Se(f(n)("refresh")),1)]),_:1})]),_:1}))]}),_:1},8,["model","rules"])])],64)}}}),Lp=new Map;async function CIe(t){var a,l;if(Lp.has(t))return Lp.get(t);const n=await ur().commandRequest("ocr/get-ocr-image",{filename:t});if((n==null?void 0:n.code)!==200)return"";const r=(a=n==null?void 0:n.msg)==null?void 0:a.base64String;if(!r)return"";const o=(l=t.split(".").pop())==null?void 0:l.toLowerCase();let s="image/png";switch(o){case"jpg":case"jpeg":s="image/jpeg";break;case"gif":s="image/gif";break;case"webp":s="image/webp";break;case"bmp":s="image/bmp";break;case"svg":s="image/svg+xml";break}return _S(r,s,t)}function _S(t,e,n){if(n&&Lp.has(n))return Lp.get(n);const r=atob(t),o=new Array(r.length);for(let l=0;l<r.length;l++)o[l]=r.charCodeAt(l);const s=new Uint8Array(o),i=new Blob([s],{type:e}),a=URL.createObjectURL(i);return n&&Lp.set(n,a),a}const $O={};function EIe(t){let e=$O[t];if(e)return e;e=$O[t]=[];for(let n=0;n<128;n++){const r=String.fromCharCode(n);e.push(r)}for(let n=0;n<t.length;n++){const r=t.charCodeAt(n);e[r]="%"+("0"+r.toString(16).toUpperCase()).slice(-2)}return e}function X0(t,e){typeof e!="string"&&(e=X0.defaultChars);const n=EIe(e);return t.replace(/(%[a-f0-9]{2})+/gi,function(r){let o="";for(let s=0,i=r.length;s<i;s+=3){const a=parseInt(r.slice(s+1,s+3),16);if(a<128){o+=n[a];continue}if((a&224)===192&&s+3<i){const l=parseInt(r.slice(s+4,s+6),16);if((l&192)===128){const u=a<<6&1984|l&63;u<128?o+="��":o+=String.fromCharCode(u),s+=3;continue}}if((a&240)===224&&s+6<i){const l=parseInt(r.slice(s+4,s+6),16),u=parseInt(r.slice(s+7,s+9),16);if((l&192)===128&&(u&192)===128){const c=a<<12&61440|l<<6&4032|u&63;c<2048||c>=55296&&c<=57343?o+="���":o+=String.fromCharCode(c),s+=6;continue}}if((a&248)===240&&s+9<i){const l=parseInt(r.slice(s+4,s+6),16),u=parseInt(r.slice(s+7,s+9),16),c=parseInt(r.slice(s+10,s+12),16);if((l&192)===128&&(u&192)===128&&(c&192)===128){let d=a<<18&1835008|l<<12&258048|u<<6&4032|c&63;d<65536||d>1114111?o+="����":(d-=65536,o+=String.fromCharCode(55296+(d>>10),56320+(d&1023))),s+=9;continue}}o+="�"}return o})}X0.defaultChars=";/?:@&=+$,#";X0.componentChars="";const LO={};function TIe(t){let e=LO[t];if(e)return e;e=LO[t]=[];for(let n=0;n<128;n++){const r=String.fromCharCode(n);/^[0-9a-z]$/i.test(r)?e.push(r):e.push("%"+("0"+n.toString(16).toUpperCase()).slice(-2))}for(let n=0;n<t.length;n++)e[t.charCodeAt(n)]=t[n];return e}function gg(t,e,n){typeof e!="string"&&(n=e,e=gg.defaultChars),typeof n>"u"&&(n=!0);const r=TIe(e);let o="";for(let s=0,i=t.length;s<i;s++){const a=t.charCodeAt(s);if(n&&a===37&&s+2<i&&/^[0-9a-f]{2}$/i.test(t.slice(s+1,s+3))){o+=t.slice(s,s+3),s+=2;continue}if(a<128){o+=r[a];continue}if(a>=55296&&a<=57343){if(a>=55296&&a<=56319&&s+1<i){const l=t.charCodeAt(s+1);if(l>=56320&&l<=57343){o+=encodeURIComponent(t[s]+t[s+1]),s++;continue}}o+="%EF%BF%BD";continue}o+=encodeURIComponent(t[s])}return o}gg.defaultChars=";/?:@&=+$,-_.!~*'()#";gg.componentChars="-_.!~*'()";function kS(t){let e="";return e+=t.protocol||"",e+=t.slashes?"//":"",e+=t.auth?t.auth+"@":"",t.hostname&&t.hostname.indexOf(":")!==-1?e+="["+t.hostname+"]":e+=t.hostname||"",e+=t.port?":"+t.port:"",e+=t.pathname||"",e+=t.search||"",e+=t.hash||"",e}function ry(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}const AIe=/^([a-z0-9.+-]+:)/i,OIe=/:[0-9]*$/,MIe=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,IIe=["<",">",'"',"`"," ","\r",`
|
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-DfIBlLbZ.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;AAOzD,eAAO,IAAI,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAW,CAAC;AAE3D,wBAAsB,uBAAuB,CACzC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,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;AAOzD,eAAO,IAAI,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAW,CAAC;AAE3D,wBAAsB,uBAAuB,CACzC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,cAAc,iBAsH1B;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,eAAe,CAYvF;AA0CD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,iBAyBlE"}
|
@@ -33,9 +33,6 @@ export function streamingChatCompletion(data, webview) {
|
|
33
33
|
border: ['grey']
|
34
34
|
}
|
35
35
|
});
|
36
|
-
requestTable.push(['Model', model], ['Base URL', baseURL || 'Default'], ['Temperature', temperature], ['Tools Count', tools.length], ['Parallel Tool Calls', parallelToolCalls], ['Proxy Server', proxyServer || 'No Proxy']);
|
37
|
-
console.log('\nOpenAI Request Parameters:');
|
38
|
-
console.log(requestTable.toString());
|
39
36
|
const client = new OpenAI({
|
40
37
|
baseURL,
|
41
38
|
apiKey,
|
@@ -54,9 +51,17 @@ export function streamingChatCompletion(data, webview) {
|
|
54
51
|
const seriableParallelToolCalls = (tools.length === 0) ?
|
55
52
|
undefined : model.startsWith('gemini') ? undefined : parallelToolCalls;
|
56
53
|
yield postProcessMessages(messages);
|
57
|
-
// 使用表格渲染请求参数
|
58
|
-
|
59
|
-
|
54
|
+
// // 使用表格渲染请求参数
|
55
|
+
// requestTable.push(
|
56
|
+
// ['Model', model],
|
57
|
+
// ['Base URL', baseURL || 'Default'],
|
58
|
+
// ['Temperature', temperature],
|
59
|
+
// ['Tools Count', tools.length],
|
60
|
+
// ['Parallel Tool Calls', parallelToolCalls],
|
61
|
+
// ['Proxy Server', proxyServer || 'No Proxy']
|
62
|
+
// );
|
63
|
+
// console.log('\nOpenAI Request Parameters:');
|
64
|
+
// console.log(requestTable.toString());
|
60
65
|
const stream = yield client.chat.completions.create({
|
61
66
|
model,
|
62
67
|
messages,
|