@opentiny/next-sdk 0.2.6 → 0.2.8

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.
@@ -1,4 +1,4 @@
1
- import { streamText, stepCountIs, generateText, StreamTextResult } from 'ai'
1
+ import { streamText, stepCountIs, generateText } from 'ai'
2
2
  import { MCPClientConfig, createMCPClient } from '@ai-sdk/mcp'
3
3
  import type { ToolSet } from 'ai'
4
4
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
@@ -281,18 +281,27 @@ export class AgentModelProvider {
281
281
  this.onUpdatedTools?.()
282
282
  }
283
283
 
284
- /** 创建临时允许调用的tools集合 */
285
- private _tempMergeTools(extraTool = {}) {
286
- // 将对象的值转换为数组后再 reduce
287
- const toolsResult = Object.values(this.mcpTools).reduce((acc, curr) => ({ ...acc, ...curr }), {})
284
+ /** 创建临时允许调用的 tools 集合,合并 mcpTools 与 extraTool */
285
+ private _tempMergeTools(extraTool: ToolSet = {} as ToolSet, deleteIgnored = true): ToolSet {
286
+ const toolsResult: ToolSet = Object.values(this.mcpTools).reduce(
287
+ (acc, curr) => ({ ...acc, ...curr } as ToolSet),
288
+ {} as ToolSet
289
+ )
288
290
  Object.assign(toolsResult, extraTool)
289
291
 
290
- this.ignoreToolnames.forEach((name) => {
291
- delete toolsResult[name]
292
- })
292
+ if (deleteIgnored) {
293
+ this.ignoreToolnames.forEach((name) => {
294
+ delete toolsResult[name]
295
+ })
296
+ }
293
297
  return toolsResult
294
298
  }
295
299
 
300
+ /** 获取当前激活的 tools 名称列表(过滤 ignoreToolnames) */
301
+ private _getActiveToolNames(tools: ToolSet): string[] {
302
+ return Object.keys(tools).filter((name) => !this.ignoreToolnames.includes(name))
303
+ }
304
+
296
305
  /** 生成 ReAct 模式的系统提示词(包含工具描述) */
297
306
  private _generateReActSystemPrompt(tools: ToolSet, modelName: string, baseSystemPrompt?: string): string {
298
307
  // 统一使用 XML 格式的 ReAct 提示词(所有 ReAct 模式都使用相同格式)
@@ -342,7 +351,7 @@ export class AgentModelProvider {
342
351
  await this.initClientsAndTools()
343
352
 
344
353
  // 合并所有可用工具
345
- const allTools = this._tempMergeTools(options.tools) as ToolSet
354
+ const allTools = this._tempMergeTools(options.tools)
346
355
  const toolNames = Object.keys(allTools)
347
356
 
348
357
  // 如果没有工具,回退到普通模式
@@ -810,12 +819,15 @@ export class AgentModelProvider {
810
819
 
811
820
  await this.initClientsAndTools()
812
821
 
822
+ const allTools = this._tempMergeTools(options.tools, false)
823
+
813
824
  const chatOptions = {
814
825
  // @ts-ignore ProviderV2 是所有llm的父类, 在每一个具体的llm 类都有一个选择model的函数用法
815
826
  model: this.llm(model),
816
827
  stopWhen: stepCountIs(maxSteps),
817
828
  ...options,
818
- tools: this._tempMergeTools(options.tools) as ToolSet
829
+ tools: allTools,
830
+ activeTools: this._getActiveToolNames(allTools),
819
831
  }
820
832
 
821
833
  // 保存最后一条 user 消息,用于后续缓存
@@ -14,9 +14,13 @@ export function generateReActToolsPrompt(tools: ToolSet): string {
14
14
  return ''
15
15
  }
16
16
 
17
- let prompt = '\n\n# 工具调用\n\n'
18
- prompt += '你可以根据需要调用以下工具:\n\n'
19
- prompt += '<tools>\n'
17
+ let prompt = `
18
+ # 工具调用
19
+
20
+ 你可以根据需要调用以下工具:
21
+
22
+ <tools>
23
+ `
20
24
 
21
25
  // 遍历所有工具,生成工具描述
22
26
  toolEntries.forEach(([toolName, tool]) => {
@@ -33,23 +37,35 @@ export function generateReActToolsPrompt(tools: ToolSet): string {
33
37
  prompt += `${JSON.stringify(toolJson, null, 2)}\n`
34
38
  })
35
39
 
36
- prompt += '</tools>\n\n'
37
- prompt += '## 工具调用格式\n\n'
38
- prompt += '要调用工具,请使用以下 XML 格式:\n'
39
- prompt += 'Thought: [你的思考过程]\n'
40
- prompt += '<tool_call>{"name": "toolName", "arguments": {"arg1": "value1"}}</tool_call>\n\n'
41
- prompt += '工具执行后,你将收到 <tool_response> 格式的结果。你可以继续思考或调用其他工具。\n\n'
42
- prompt += '## 使用示例\n\n'
43
- prompt += '如果用户要求"获取今天的日期",你可以这样调用工具:\n'
44
- prompt += 'Thought: 用户想要获取今天的日期,我需要调用日期相关的工具。\n'
45
- prompt += '<tool_call>{"name": "get-today", "arguments": {}}</tool_call>\n\n'
46
- prompt += '然后等待工具返回结果(Observation),再根据结果给出最终答案。\n\n'
47
- prompt += '## 任务完成\n\n'
48
- prompt += '当任务完成或无法继续时,直接给出最终答案即可。\n\n'
49
- prompt += '**重要提示**:\n'
50
- prompt += '- 必须严格按照 XML 格式调用工具\n'
51
- prompt += '- arguments 必须是有效的 JSON 格式\n'
52
- prompt += '- 如果不需要调用工具,直接给出最终答案即可\n'
40
+ prompt += `
41
+ </tools>
42
+
43
+ ## 工具调用格式
44
+
45
+ 要调用工具,请使用以下 XML 格式:
46
+ Thought: [你的思考过程]
47
+ <tool_call>
48
+ {"name": "toolName", "arguments": {"arg1": "value1"}}
49
+ </tool_call>
50
+
51
+ 工具执行后,你将收到 <tool_response> 格式的结果。你可以继续思考或调用其他工具。
52
+
53
+ ## 使用示例
54
+
55
+ 如果用户要求"获取今天的日期",你可以这样调用工具:
56
+ Thought: 用户想要获取今天的日期,我需要调用日期相关的工具。
57
+ <tool_call>{"name": "get-today", "arguments": {}}</tool_call>
58
+
59
+ 然后等待工具返回结果(Observation),再根据结果给出最终答案。
60
+
61
+ ## 任务完成
62
+
63
+ 当任务完成或无法继续时,直接给出最终答案即可。
53
64
 
65
+ **重要提示**:
66
+ - 必须严格按照 XML 格式调用工具
67
+ - arguments 必须是有效的 JSON 格式
68
+ - 如果不需要调用工具,直接给出最终答案即可
69
+ `
54
70
  return prompt
55
71
  }
@@ -53,8 +53,10 @@ export declare class AgentModelProvider {
53
53
  insertMcpServer(serverName: string, mcpServer: McpServerConfig): Promise<false | WebMcpClient | import('@ai-sdk/mcp').MCPClient | null>;
54
54
  /** 通过服务器名称删除mcpServer: mcpServers mcpClients mcpTools ignoreToolnames */
55
55
  removeMcpServer(serverName: string): Promise<void>;
56
- /** 创建临时允许调用的tools集合 */
56
+ /** 创建临时允许调用的 tools 集合,合并 mcpTools 与 extraTool */
57
57
  private _tempMergeTools;
58
+ /** 获取当前激活的 tools 名称列表(过滤 ignoreToolnames) */
59
+ private _getActiveToolNames;
58
60
  /** 生成 ReAct 模式的系统提示词(包含工具描述) */
59
61
  private _generateReActSystemPrompt;
60
62
  /** 执行 ReAct 模式下的工具调用 */
package/dist/index.d.ts CHANGED
@@ -26,4 +26,5 @@ export { AgentModelProvider } from './agent/AgentModelProvider';
26
26
  export { getAISDKTools } from './agent/utils/getAISDKTools';
27
27
  export { QrCode, type QrCodeOption } from './remoter/QrCode';
28
28
  export type * from './agent/type';
29
+ export * from './page-tools/bridge';
29
30
  export { getSkillOverviews, formatSkillsForSystemPrompt, getSkillMdPaths, getSkillMdContent, getMainSkillPaths, getMainSkillPathByName, parseSkillFrontMatter, createSkillTools, type SkillMeta, type SkillToolsSet } from './skills/index';