@opentiny/next-sdk 0.1.14 → 0.1.15-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/agent/AgentModelProvider.ts +546 -22
  2. package/agent/type.ts +12 -6
  3. package/agent/utils/generateReActPrompt.ts +55 -0
  4. package/agent/utils/parseReActAction.ts +34 -0
  5. package/dist/McpSdk.d.ts +14 -0
  6. package/dist/WebAgent.d.ts +5 -0
  7. package/dist/WebMcp.d.ts +20 -0
  8. package/dist/WebMcpClient.d.ts +389 -1152
  9. package/dist/WebMcpServer.d.ts +79 -78
  10. package/dist/Zod.d.ts +1 -0
  11. package/dist/agent/AgentModelProvider.d.ts +40 -4
  12. package/dist/agent/type.d.ts +13 -3
  13. package/dist/agent/utils/generateReActPrompt.d.ts +9 -0
  14. package/dist/agent/utils/getAISDKTools.d.ts +1 -0
  15. package/dist/agent/utils/parseReActAction.d.ts +14 -0
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.es.dev.js +36353 -34348
  18. package/dist/index.es.js +28821 -25466
  19. package/dist/index.js +3880 -25
  20. package/dist/index.umd.dev.js +34230 -32225
  21. package/dist/index.umd.js +220 -128
  22. package/dist/mcpsdk@1.24.3.dev.js +22539 -0
  23. package/dist/mcpsdk@1.24.3.es.dev.js +22537 -0
  24. package/dist/mcpsdk@1.24.3.es.js +16781 -0
  25. package/dist/mcpsdk@1.24.3.js +43 -0
  26. package/dist/remoter/createRemoter.d.ts +9 -0
  27. package/dist/remoter/tooltips.d.ts +36 -0
  28. package/dist/script/utils.d.ts +1 -0
  29. package/dist/transport/ExtensionClientTransport.d.ts +3 -2
  30. package/dist/transport/ExtensionContentServerTransport.d.ts +3 -2
  31. package/dist/transport/ExtensionPageServerTransport.d.ts +4 -4
  32. package/dist/vite-build-tsc.d.ts +2 -0
  33. package/dist/vite.config.d.ts +2 -0
  34. package/dist/vite.config.mcpSdk.d.ts +2 -0
  35. package/dist/vite.config.webAgent.d.ts +2 -0
  36. package/dist/vite.config.webMcp.d.ts +2 -0
  37. package/dist/vite.config.webMcpFull.d.ts +2 -0
  38. package/dist/vite.config.zod.d.ts +2 -0
  39. package/dist/webagent.dev.js +24569 -20836
  40. package/dist/webagent.es.dev.js +23907 -20174
  41. package/dist/webagent.es.js +25326 -20723
  42. package/dist/webagent.js +209 -110
  43. package/dist/webmcp-full.dev.js +21225 -20021
  44. package/dist/webmcp-full.es.dev.js +21223 -20019
  45. package/dist/webmcp-full.es.js +16710 -14437
  46. package/dist/webmcp-full.js +42 -15
  47. package/dist/webmcp.dev.js +14 -22
  48. package/dist/webmcp.es.dev.js +12 -20
  49. package/dist/webmcp.es.js +172 -179
  50. package/dist/webmcp.js +1 -1
  51. package/dist/zod@3.25.76.dev.js +30 -32
  52. package/dist/zod@3.25.76.es.dev.js +28 -30
  53. package/dist/zod@3.25.76.es.js +143 -145
  54. package/dist/zod@3.25.76.js +1 -1
  55. package/package.json +11 -9
  56. package/remoter/createRemoter.ts +126 -71
  57. package/remoter/tooltips.ts +260 -0
  58. package/transport/ExtensionPageServerTransport.ts +2 -4
  59. package/tsconfig.json +5 -3
  60. package/vite-build-tsc.ts +60 -0
  61. package/vite-env.d.ts +5 -0
  62. package/dist/WebMcpClient.js +0 -363
  63. package/dist/WebMcpServer.js +0 -283
  64. package/dist/agent/AgentModelProvider.js +0 -293
  65. package/dist/agent/type.js +0 -1
  66. package/dist/agent/utils/getAISDKTools.js +0 -36
  67. package/dist/mcpsdk@1.17.0.dev.js +0 -21391
  68. package/dist/mcpsdk@1.17.0.es.dev.js +0 -21389
  69. package/dist/mcpsdk@1.17.0.es.js +0 -14505
  70. package/dist/mcpsdk@1.17.0.js +0 -16
  71. package/dist/remoter/QrCode.js +0 -55
  72. package/dist/remoter/createRemoter.js +0 -743
  73. package/dist/transport/ExtensionClientTransport.js +0 -81
  74. package/dist/transport/ExtensionContentServerTransport.js +0 -128
  75. package/dist/transport/ExtensionPageServerTransport.js +0 -118
  76. package/dist/transport/messages.js +0 -51
  77. package/dist/utils/uuid.js +0 -10
@@ -1,293 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __rest = (this && this.__rest) || function (s, e) {
11
- var t = {};
12
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
- t[p] = s[p];
14
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
- t[p[i]] = s[p[i]];
18
- }
19
- return t;
20
- };
21
- import { streamText, stepCountIs, generateText } from 'ai';
22
- import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
23
- import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
24
- import { createOpenAI } from '@ai-sdk/openai';
25
- import { createDeepSeek } from '@ai-sdk/deepseek';
26
- import { ExtensionClientTransport } from '../transport/ExtensionClientTransport';
27
- import { MessageChannelTransport } from '@opentiny/next';
28
- import { WebMcpClient } from '../WebMcpClient';
29
- import { getAISDKTools } from './utils/getAISDKTools';
30
- export const AIProviderFactories = {
31
- ['openai']: createOpenAI,
32
- ['deepseek']: createDeepSeek
33
- };
34
- /** 一个通用的ai-sdk的Agent封装
35
- * @summary 内部自动管理了 llm, mcpServer, ai-sdk的clients 和 tools
36
- * @returns 暴露了 chat, chatStream方法
37
- */
38
- export class AgentModelProvider {
39
- constructor({ llmConfig, mcpServers }) {
40
- /** 当前mcpServers对象集合。键为服务器名称,值为 McpServerConfig 或任意的 MCPTransport
41
- * 参考: https://ai-sdk.dev/docs/ai-sdk-core/tools-and-tool-calling#initializing-an-mcp-client */
42
- this.mcpServers = {};
43
- /** 当前ai-sdk的 mcpClient 对象集合,键为服务器名称 */
44
- this.mcpClients = {};
45
- /** 当前 mcpClients 所对应的tools,键为服务器名称 */
46
- this.mcpTools = {};
47
- /** 需要实时过滤掉的tools name*/
48
- this.ignoreToolnames = [];
49
- /** 缓存 ai-sdk response 中的 多轮会话的上下文 */
50
- this.messages = [];
51
- if (!llmConfig) {
52
- throw new Error('llmConfig is required to initialize AgentModelProvider');
53
- }
54
- this.mcpServers = mcpServers || {};
55
- this.mcpClients = {};
56
- this.mcpTools = {};
57
- if (llmConfig.llm) {
58
- this.llm = llmConfig.llm;
59
- }
60
- else if (llmConfig.providerType) {
61
- const providerType = llmConfig.providerType;
62
- let providerFn;
63
- if (typeof providerType === 'string') {
64
- providerFn = AIProviderFactories[providerType];
65
- }
66
- else {
67
- providerFn = providerType;
68
- }
69
- this.llm = providerFn({
70
- apiKey: llmConfig.apiKey,
71
- baseURL: llmConfig.baseURL
72
- });
73
- }
74
- else {
75
- throw new Error('Either llmConfig.llm or llmConfig.providerType must be provided');
76
- }
77
- }
78
- /** 创建一个 ai-sdk的 mcpClient, 创建失败则返回 null */
79
- _createOneClient(serverConfig) {
80
- return __awaiter(this, void 0, void 0, function* () {
81
- try {
82
- let transport;
83
- // transport 一定是 streamableHttp 或者就是: ai-sdk允许的 transport
84
- if ('type' in serverConfig && serverConfig.type.toLocaleLowerCase() === 'streamablehttp') {
85
- transport = new StreamableHTTPClientTransport(new URL(serverConfig.url));
86
- }
87
- else if ('type' in serverConfig && serverConfig.type === 'extension') {
88
- transport = new ExtensionClientTransport(serverConfig.sessionId);
89
- }
90
- else {
91
- transport = serverConfig;
92
- }
93
- const client = new WebMcpClient({ name: 'mcp-web-client', version: '1.0.0' }, { capabilities: { roots: { listChanged: true }, sampling: {}, elicitation: {} } });
94
- yield client.connect(transport);
95
- //@ts-ignore
96
- client['__transport__'] = transport;
97
- return client;
98
- }
99
- catch (error) {
100
- if (this.onError) {
101
- this.onError((error === null || error === void 0 ? void 0 : error.message) || `Failed to create MCP client`, error);
102
- }
103
- console.error(`Failed to create MCP client`, serverConfig, error);
104
- return null;
105
- }
106
- });
107
- }
108
- /** 关闭一个 mcpClient */
109
- _closeOneClient(client) {
110
- return __awaiter(this, void 0, void 0, function* () {
111
- var _a, _b, _c;
112
- try {
113
- const transport = client['__transport__'];
114
- // 如果是 InMemoryTransport,不关闭传输层 因为它是配对的,关闭一端会影响另一端(服务端)
115
- if ((transport && transport instanceof InMemoryTransport) ||
116
- (transport && transport instanceof MessageChannelTransport)) {
117
- return;
118
- }
119
- // 其他类型的传输正常关闭
120
- yield ((_a = transport === null || transport === void 0 ? void 0 : transport.terminateSession) === null || _a === void 0 ? void 0 : _a.call(transport));
121
- yield ((_b = transport === null || transport === void 0 ? void 0 : transport.close) === null || _b === void 0 ? void 0 : _b.call(transport));
122
- yield ((_c = client === null || client === void 0 ? void 0 : client.close) === null || _c === void 0 ? void 0 : _c.call(client));
123
- }
124
- catch (error) { }
125
- });
126
- }
127
- /** 创建所有 mcpClients */
128
- _createMpcClients() {
129
- return __awaiter(this, void 0, void 0, function* () {
130
- // 使用 Promise.all 并行处理所有 mcpServer 项
131
- const serverEntries = Object.entries(this.mcpServers);
132
- const clients = yield Promise.all(serverEntries.map((_a) => __awaiter(this, [_a], void 0, function* ([serverName, server]) {
133
- const client = yield this._createOneClient(server);
134
- return { serverName, client };
135
- })));
136
- // 将结果存储到对象中,使用 serverName 作为键
137
- this.mcpClients = {};
138
- clients.forEach(({ serverName, client }) => {
139
- this.mcpClients[serverName] = client;
140
- });
141
- });
142
- }
143
- /** 查询所有 mcpClients 的 tools, 失败则保存为null */
144
- _createMpcTools() {
145
- return __awaiter(this, void 0, void 0, function* () {
146
- const clientEntries = Object.entries(this.mcpClients);
147
- const tools = yield Promise.all(clientEntries.map((_a) => __awaiter(this, [_a], void 0, function* ([serverName, client]) {
148
- try {
149
- const result = client ? yield getAISDKTools(client) : null;
150
- return { serverName, tools: result };
151
- }
152
- catch (error) {
153
- if (this.onError) {
154
- this.onError((error === null || error === void 0 ? void 0 : error.message) || `Failed to query tools`, error);
155
- }
156
- console.error(`Failed to query tools`, error);
157
- return { serverName, tools: null };
158
- }
159
- })));
160
- // 将结果存储到对象中,使用 serverName 作为键
161
- this.mcpTools = {};
162
- tools.forEach(({ serverName, tools: toolsData }) => {
163
- const normalizedTools = toolsData && typeof toolsData === 'object' ? toolsData : {};
164
- this.mcpTools[serverName] = normalizedTools;
165
- });
166
- });
167
- }
168
- /** 关闭所有的 clients */
169
- closeAll() {
170
- return __awaiter(this, void 0, void 0, function* () {
171
- yield Promise.all(Object.values(this.mcpClients).map((client) => __awaiter(this, void 0, void 0, function* () {
172
- try {
173
- yield this._closeOneClient(client);
174
- }
175
- catch (error) {
176
- if (this.onError) {
177
- this.onError((error === null || error === void 0 ? void 0 : error.message) || `Failed to close client`, error);
178
- }
179
- console.error(`Failed to close client`, error);
180
- }
181
- })));
182
- });
183
- }
184
- /** 创建所有的 mcpClients,并更新它们的tools */
185
- initClientsAndTools() {
186
- return __awaiter(this, void 0, void 0, function* () {
187
- var _a;
188
- yield this._createMpcClients();
189
- yield this._createMpcTools();
190
- (_a = this.onUpdatedTools) === null || _a === void 0 ? void 0 : _a.call(this);
191
- });
192
- }
193
- /** 全量更新所有的 mcpServers */
194
- updateMcpServers(mcpServers) {
195
- return __awaiter(this, void 0, void 0, function* () {
196
- yield this.closeAll();
197
- this.mcpServers = mcpServers || this.mcpServers;
198
- yield this.initClientsAndTools();
199
- });
200
- }
201
- /** 插入一个新的mcpServer,如果已经存在则返回false */
202
- insertMcpServer(serverName, mcpServer) {
203
- return __awaiter(this, void 0, void 0, function* () {
204
- var _a, _b;
205
- // 检查是否已存在相同名称的服务器
206
- if (this.mcpServers[serverName]) {
207
- return false;
208
- }
209
- const client = yield this._createOneClient(mcpServer);
210
- if (!client) {
211
- // 创建客户端失败时直接返回,避免后续出现空指针问题
212
- (_a = this.onError) === null || _a === void 0 ? void 0 : _a.call(this, `Failed to create MCP client: ${serverName}`);
213
- return null;
214
- }
215
- this.mcpClients[serverName] = client;
216
- const tools = yield getAISDKTools(client);
217
- // 工具列表可能为 null,统一兜底为空对象,确保类型安全
218
- this.mcpTools[serverName] = tools && typeof tools === 'object' ? tools : {};
219
- this.mcpServers[serverName] = mcpServer;
220
- (_b = this.onUpdatedTools) === null || _b === void 0 ? void 0 : _b.call(this);
221
- return client;
222
- });
223
- }
224
- /** 通过服务器名称删除mcpServer: mcpServers mcpClients mcpTools ignoreToolnames */
225
- removeMcpServer(serverName) {
226
- return __awaiter(this, void 0, void 0, function* () {
227
- var _a;
228
- if (!this.mcpServers[serverName]) {
229
- return;
230
- }
231
- // 删除 mcpServer
232
- delete this.mcpServers[serverName];
233
- // 关闭并删除 client
234
- const delClient = this.mcpClients[serverName];
235
- delete this.mcpClients[serverName];
236
- try {
237
- yield this._closeOneClient(delClient);
238
- }
239
- catch (error) { }
240
- // 删除 tools 并清理 ignoreToolnames
241
- const delTool = this.mcpTools[serverName];
242
- delete this.mcpTools[serverName];
243
- if (delTool) {
244
- Object.keys(delTool).forEach((toolName) => {
245
- this.ignoreToolnames = this.ignoreToolnames.filter((name) => name !== toolName);
246
- });
247
- }
248
- (_a = this.onUpdatedTools) === null || _a === void 0 ? void 0 : _a.call(this);
249
- });
250
- }
251
- /** 创建临时允许调用的tools集合 */
252
- _tempMergeTools(extraTool = {}) {
253
- // 将对象的值转换为数组后再 reduce
254
- const toolsResult = Object.values(this.mcpTools).reduce((acc, curr) => (Object.assign(Object.assign({}, acc), curr)), {});
255
- Object.assign(toolsResult, extraTool);
256
- this.ignoreToolnames.forEach((name) => {
257
- delete toolsResult[name];
258
- });
259
- return toolsResult;
260
- }
261
- _chat(chatMethod, _a) {
262
- return __awaiter(this, void 0, void 0, function* () {
263
- var _b;
264
- var { model, maxSteps = 5 } = _a, options = __rest(_a, ["model", "maxSteps"]);
265
- if (!this.llm) {
266
- throw new Error('LLM is not initialized');
267
- }
268
- yield this.initClientsAndTools();
269
- const chatOptions = Object.assign(Object.assign({
270
- // @ts-ignore ProviderV2 是所有llm的父类, 在每一个具体的llm 类都有一个选择model的函数用法
271
- model: this.llm(model), stopWhen: stepCountIs(maxSteps) }, options), { tools: this._tempMergeTools(options.tools) });
272
- if (options.message && !options.messages) {
273
- this.messages.push({ role: 'user', content: options.message });
274
- chatOptions.messages = [...this.messages];
275
- }
276
- const result = chatMethod(chatOptions);
277
- (_b = result === null || result === void 0 ? void 0 : result.response) === null || _b === void 0 ? void 0 : _b.then((res) => {
278
- this.messages.push(...res.messages);
279
- });
280
- return result;
281
- });
282
- }
283
- chat(options) {
284
- return __awaiter(this, void 0, void 0, function* () {
285
- return this._chat(generateText, options);
286
- });
287
- }
288
- chatStream(options) {
289
- return __awaiter(this, void 0, void 0, function* () {
290
- return this._chat(streamText, options);
291
- });
292
- }
293
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,36 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { dynamicTool, jsonSchema } from 'ai';
11
- /**
12
- * 快速从官方 mcp 或 WebMcpClient 这2种client中读取 tools 数组,并转换成 ai-sdk 的tool的对象格式。
13
- * @params client 一个已连接好的 WebMcpClient
14
- * @returns ai-sdk的dynamicTool对象。
15
- */
16
- export const getAISDKTools = (client) => __awaiter(void 0, void 0, void 0, function* () {
17
- var _a;
18
- const tools = {};
19
- try {
20
- const listToolsResult = yield client.listTools();
21
- for (const { name, description, inputSchema } of listToolsResult.tools) {
22
- const execute = (args, options) => __awaiter(void 0, void 0, void 0, function* () {
23
- return client.callTool({ name, arguments: args }, { signal: options === null || options === void 0 ? void 0 : options.abortSignal });
24
- });
25
- tools[name] = dynamicTool({
26
- description,
27
- inputSchema: jsonSchema(Object.assign(Object.assign({}, inputSchema), { properties: (_a = inputSchema.properties) !== null && _a !== void 0 ? _a : {}, additionalProperties: false })),
28
- execute
29
- });
30
- }
31
- return tools;
32
- }
33
- catch (error) {
34
- throw error;
35
- }
36
- });