sdkwork-browser-agent 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -0
- package/README.zh.md +228 -0
- package/dist/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/agent-kexkkI13.d.cts +197 -0
- package/dist/browser/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/browser/chunk-7W2JJCSS.js +276 -0
- package/dist/browser/chunk-7W2JJCSS.js.map +1 -0
- package/dist/browser/chunk-BHRFRGR7.js +144 -0
- package/dist/browser/chunk-BHRFRGR7.js.map +1 -0
- package/dist/browser/chunk-CLP6UNSV.js +285 -0
- package/dist/browser/chunk-CLP6UNSV.js.map +1 -0
- package/dist/browser/chunk-HXLRBB7S.js +1569 -0
- package/dist/browser/chunk-HXLRBB7S.js.map +1 -0
- package/dist/browser/chunk-VJEFLRZT.js +1720 -0
- package/dist/browser/chunk-VJEFLRZT.js.map +1 -0
- package/dist/browser/index.d.ts +842 -0
- package/dist/browser/index.js +3293 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/llm/index.d.ts +235 -0
- package/dist/browser/llm/index.js +29 -0
- package/dist/browser/llm/index.js.map +1 -0
- package/dist/browser/mcp/index.d.ts +63 -0
- package/dist/browser/mcp/index.js +9 -0
- package/dist/browser/mcp/index.js.map +1 -0
- package/dist/browser/provider-Dna36xA-.d.ts +105 -0
- package/dist/browser/skills/index.d.ts +401 -0
- package/dist/browser/skills/index.js +31 -0
- package/dist/browser/skills/index.js.map +1 -0
- package/dist/browser/storage/index.d.ts +64 -0
- package/dist/browser/storage/index.js +15 -0
- package/dist/browser/storage/index.js.map +1 -0
- package/dist/browser/tools/index.d.ts +45 -0
- package/dist/browser/tools/index.js +15 -0
- package/dist/browser/tools/index.js.map +1 -0
- package/dist/browser/types-CG5I-byI.d.ts +30 -0
- package/dist/chunk-56J3IBXZ.js +144 -0
- package/dist/chunk-56J3IBXZ.js.map +1 -0
- package/dist/chunk-5XTVS5MB.js +1720 -0
- package/dist/chunk-5XTVS5MB.js.map +1 -0
- package/dist/chunk-6AYIRBGI.js +166 -0
- package/dist/chunk-6AYIRBGI.js.map +1 -0
- package/dist/chunk-C2EYJHXW.cjs +276 -0
- package/dist/chunk-C2EYJHXW.cjs.map +1 -0
- package/dist/chunk-HOZQ445W.cjs +166 -0
- package/dist/chunk-HOZQ445W.cjs.map +1 -0
- package/dist/chunk-KZNZ6CGD.cjs +144 -0
- package/dist/chunk-KZNZ6CGD.cjs.map +1 -0
- package/dist/chunk-XFMT5ZA4.js +276 -0
- package/dist/chunk-XFMT5ZA4.js.map +1 -0
- package/dist/chunk-XPGICLEJ.cjs +1720 -0
- package/dist/chunk-XPGICLEJ.cjs.map +1 -0
- package/dist/index.cjs +1311 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +395 -0
- package/dist/index.d.ts +395 -0
- package/dist/index.js +1311 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.cjs +29 -0
- package/dist/llm/index.cjs.map +1 -0
- package/dist/llm/index.d.cts +235 -0
- package/dist/llm/index.d.ts +235 -0
- package/dist/llm/index.js +29 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/index.cjs +9 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +63 -0
- package/dist/mcp/index.d.ts +63 -0
- package/dist/mcp/index.js +9 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/node/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/node/agent-kexkkI13.d.cts +197 -0
- package/dist/node/chunk-7W2JJCSS.js +276 -0
- package/dist/node/chunk-7W2JJCSS.js.map +1 -0
- package/dist/node/chunk-BHRFRGR7.js +144 -0
- package/dist/node/chunk-BHRFRGR7.js.map +1 -0
- package/dist/node/chunk-CLP6UNSV.js +285 -0
- package/dist/node/chunk-CLP6UNSV.js.map +1 -0
- package/dist/node/chunk-HXLRBB7S.js +1569 -0
- package/dist/node/chunk-HXLRBB7S.js.map +1 -0
- package/dist/node/chunk-IYG37UN3.cjs +144 -0
- package/dist/node/chunk-IYG37UN3.cjs.map +1 -0
- package/dist/node/chunk-JF33ZOMB.cjs +285 -0
- package/dist/node/chunk-JF33ZOMB.cjs.map +1 -0
- package/dist/node/chunk-KXXS33G3.cjs +276 -0
- package/dist/node/chunk-KXXS33G3.cjs.map +1 -0
- package/dist/node/chunk-MTFOABGC.cjs +1720 -0
- package/dist/node/chunk-MTFOABGC.cjs.map +1 -0
- package/dist/node/chunk-VJEFLRZT.js +1720 -0
- package/dist/node/chunk-VJEFLRZT.js.map +1 -0
- package/dist/node/chunk-YDHQCPSN.cjs +1569 -0
- package/dist/node/chunk-YDHQCPSN.cjs.map +1 -0
- package/dist/node/index.cjs +3293 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +842 -0
- package/dist/node/index.d.ts +842 -0
- package/dist/node/index.js +3293 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/llm/index.cjs +29 -0
- package/dist/node/llm/index.cjs.map +1 -0
- package/dist/node/llm/index.d.cts +235 -0
- package/dist/node/llm/index.d.ts +235 -0
- package/dist/node/llm/index.js +29 -0
- package/dist/node/llm/index.js.map +1 -0
- package/dist/node/mcp/index.cjs +9 -0
- package/dist/node/mcp/index.cjs.map +1 -0
- package/dist/node/mcp/index.d.cts +63 -0
- package/dist/node/mcp/index.d.ts +63 -0
- package/dist/node/mcp/index.js +9 -0
- package/dist/node/mcp/index.js.map +1 -0
- package/dist/node/provider-Dna36xA-.d.cts +105 -0
- package/dist/node/provider-Dna36xA-.d.ts +105 -0
- package/dist/node/skills/index.cjs +31 -0
- package/dist/node/skills/index.cjs.map +1 -0
- package/dist/node/skills/index.d.cts +401 -0
- package/dist/node/skills/index.d.ts +401 -0
- package/dist/node/skills/index.js +31 -0
- package/dist/node/skills/index.js.map +1 -0
- package/dist/node/storage/index.cjs +15 -0
- package/dist/node/storage/index.cjs.map +1 -0
- package/dist/node/storage/index.d.cts +64 -0
- package/dist/node/storage/index.d.ts +64 -0
- package/dist/node/storage/index.js +15 -0
- package/dist/node/storage/index.js.map +1 -0
- package/dist/node/tools/index.cjs +15 -0
- package/dist/node/tools/index.cjs.map +1 -0
- package/dist/node/tools/index.d.cts +45 -0
- package/dist/node/tools/index.d.ts +45 -0
- package/dist/node/tools/index.js +15 -0
- package/dist/node/tools/index.js.map +1 -0
- package/dist/node/types-CG5I-byI.d.cts +30 -0
- package/dist/node/types-CG5I-byI.d.ts +30 -0
- package/dist/provider-Dna36xA-.d.cts +105 -0
- package/dist/provider-Dna36xA-.d.ts +105 -0
- package/dist/skills/index.cjs +15 -0
- package/dist/skills/index.cjs.map +1 -0
- package/dist/skills/index.d.cts +43 -0
- package/dist/skills/index.d.ts +43 -0
- package/dist/skills/index.js +15 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/tools/index.cjs +15 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +45 -0
- package/dist/tools/index.d.ts +45 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +150 -0
package/README.md
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# SDKWork Browser Agent
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/sdkwork-browser-agent)
|
|
4
|
+
[](https://www.typescriptlang.org/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
一个浏览器兼容的 Agent 架构,支持 Skills、MCP、Tools 和灵活的 LLM Provider 体系。
|
|
8
|
+
|
|
9
|
+
[English](./README.md) | [中文](./README.zh.md)
|
|
10
|
+
|
|
11
|
+
## ✨ 特性
|
|
12
|
+
|
|
13
|
+
- 🤖 **智能决策引擎** - 自动选择最合适的 Skill,基于嵌入相似度匹配
|
|
14
|
+
- 🔄 **动态 Skill 加载** - 懒加载机制,支持文件、URL、模块多种来源
|
|
15
|
+
- 💰 **Token 优化** - 智能压缩和截断,最小化 Token 消耗
|
|
16
|
+
- 🔌 **多 LLM 支持** - OpenAI、Anthropic、Google Gemini 等主流模型
|
|
17
|
+
- 📦 **MCP 协议** - 完整的 Model Context Protocol 支持
|
|
18
|
+
- 🔧 **插件系统** - 可扩展的插件架构
|
|
19
|
+
- 🌐 **浏览器兼容** - 同时支持浏览器和 Node.js 环境
|
|
20
|
+
- 📘 **TypeScript** - 完整的类型支持
|
|
21
|
+
|
|
22
|
+
## 🚀 快速开始
|
|
23
|
+
|
|
24
|
+
### 安装
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install sdkwork-browser-agent
|
|
28
|
+
# 或
|
|
29
|
+
yarn add sdkwork-browser-agent
|
|
30
|
+
# 或
|
|
31
|
+
pnpm add sdkwork-browser-agent
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 基础使用
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { SmartAgent, OpenAIProvider, builtInSkills } from 'sdkwork-browser-agent';
|
|
38
|
+
|
|
39
|
+
// 创建智能 Agent
|
|
40
|
+
const agent = new SmartAgent({
|
|
41
|
+
name: 'my-agent',
|
|
42
|
+
llmProvider: new OpenAIProvider({
|
|
43
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
44
|
+
}),
|
|
45
|
+
skills: builtInSkills,
|
|
46
|
+
autoDecide: true,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// 初始化
|
|
50
|
+
await agent.initialize();
|
|
51
|
+
|
|
52
|
+
// 自动处理输入
|
|
53
|
+
const result = await agent.process('Calculate 2 + 2');
|
|
54
|
+
console.log(result.result); // 4
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 使用不同的 LLM Provider
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { AnthropicProvider, GeminiProvider } from 'sdkwork-browser-agent';
|
|
61
|
+
|
|
62
|
+
// Anthropic Claude
|
|
63
|
+
const claudeAgent = new SmartAgent({
|
|
64
|
+
llmProvider: new AnthropicProvider({
|
|
65
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Google Gemini
|
|
70
|
+
const geminiAgent = new SmartAgent({
|
|
71
|
+
llmProvider: new GeminiProvider({
|
|
72
|
+
apiKey: process.env.GEMINI_API_KEY,
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 📚 文档
|
|
78
|
+
|
|
79
|
+
完整文档请访问:[https://sdkwork-browser-agent.vercel.app](https://sdkwork-browser-agent.vercel.app)
|
|
80
|
+
|
|
81
|
+
- [快速开始](https://sdkwork-browser-agent.vercel.app/guide/getting-started)
|
|
82
|
+
- [核心概念](https://sdkwork-browser-agent.vercel.app/guide/concepts)
|
|
83
|
+
- [API 参考](https://sdkwork-browser-agent.vercel.app/api/)
|
|
84
|
+
- [示例](https://sdkwork-browser-agent.vercel.app/examples/)
|
|
85
|
+
|
|
86
|
+
## 🏗️ 架构
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
sdkwork-browser-agent/
|
|
90
|
+
├── src/
|
|
91
|
+
│ ├── core/ # Agent 核心
|
|
92
|
+
│ │ ├── agent.ts # 基础 Agent
|
|
93
|
+
│ │ ├── smart-agent.ts # 智能 Agent(自动决策)
|
|
94
|
+
│ │ ├── decision-engine.ts # 决策引擎
|
|
95
|
+
│ │ ├── skill-loader.ts # 动态加载
|
|
96
|
+
│ │ └── token-optimizer.ts # Token 优化
|
|
97
|
+
│ ├── llm/ # LLM Provider
|
|
98
|
+
│ ├── skills/ # Skill 系统
|
|
99
|
+
│ ├── tools/ # Tool 系统
|
|
100
|
+
│ ├── mcp/ # MCP 协议
|
|
101
|
+
│ └── plugins/ # 插件系统
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 🎯 核心功能
|
|
105
|
+
|
|
106
|
+
### 1. 智能决策引擎
|
|
107
|
+
|
|
108
|
+
自动根据输入选择最合适的 Skill:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const agent = new SmartAgent({
|
|
112
|
+
decisionEngine: {
|
|
113
|
+
enableEmbeddings: true, // 启用嵌入相似度
|
|
114
|
+
enableCaching: true, // 启用决策缓存
|
|
115
|
+
threshold: 0.6, // 相似度阈值
|
|
116
|
+
maxSkills: 3, // 最大选择 Skill 数
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 2. 动态 Skill 加载
|
|
122
|
+
|
|
123
|
+
支持从多种来源懒加载 Skill:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
// 注册 Skill 源
|
|
127
|
+
agent.registerSkillSource('my-skill', 'https://example.com/skills/my-skill.json', 'url');
|
|
128
|
+
|
|
129
|
+
// 动态加载
|
|
130
|
+
const skill = await agent.skillLoader.load('my-skill');
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3. Token 优化
|
|
134
|
+
|
|
135
|
+
自动优化 Token 消耗:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
const optimizer = new TokenOptimizer({
|
|
139
|
+
enableCompression: true,
|
|
140
|
+
maxSkillDescriptionLength: 200,
|
|
141
|
+
maxContextTokens: 4000,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const optimized = optimizer.optimizeSkills(skills);
|
|
145
|
+
const stats = optimizer.getOptimizationStats(skills, optimized);
|
|
146
|
+
console.log(`Saved ${stats.savingsPercent}% tokens`);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 4. 自定义 Skill
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { Skill } from 'sdkwork-browser-agent';
|
|
153
|
+
|
|
154
|
+
const mySkill: Skill = {
|
|
155
|
+
name: 'translate',
|
|
156
|
+
description: 'Translate text to another language',
|
|
157
|
+
parameters: {
|
|
158
|
+
type: 'object',
|
|
159
|
+
properties: {
|
|
160
|
+
text: { type: 'string', description: 'Text to translate' },
|
|
161
|
+
targetLang: { type: 'string', description: 'Target language' },
|
|
162
|
+
},
|
|
163
|
+
required: ['text', 'targetLang'],
|
|
164
|
+
},
|
|
165
|
+
handler: async params => {
|
|
166
|
+
// 实现翻译逻辑
|
|
167
|
+
return { success: true, data: translatedText };
|
|
168
|
+
},
|
|
169
|
+
metadata: {
|
|
170
|
+
category: 'language',
|
|
171
|
+
tags: ['translate', 'nlp'],
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
agent.registerSkill(mySkill);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 🧪 测试
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# 运行所有测试
|
|
182
|
+
npm test
|
|
183
|
+
|
|
184
|
+
# 监视模式
|
|
185
|
+
npm run test:watch
|
|
186
|
+
|
|
187
|
+
# 覆盖率报告
|
|
188
|
+
npm run test:coverage
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## 🛠️ 开发
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# 安装依赖
|
|
195
|
+
npm install
|
|
196
|
+
|
|
197
|
+
# 开发模式
|
|
198
|
+
npm run dev
|
|
199
|
+
|
|
200
|
+
# 构建
|
|
201
|
+
npm run build
|
|
202
|
+
|
|
203
|
+
# 类型检查
|
|
204
|
+
npm run typecheck
|
|
205
|
+
|
|
206
|
+
# 代码格式化
|
|
207
|
+
npm run format
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 🤝 贡献
|
|
211
|
+
|
|
212
|
+
欢迎提交 Issue 和 PR!请阅读 [贡献指南](./CONTRIBUTING.md)。
|
|
213
|
+
|
|
214
|
+
## 📄 许可证
|
|
215
|
+
|
|
216
|
+
[MIT](./LICENSE)
|
|
217
|
+
|
|
218
|
+
## 🙏 致谢
|
|
219
|
+
|
|
220
|
+
- [Agent Skills Specification](https://agentskills.io/specification)
|
|
221
|
+
- [Model Context Protocol](https://modelcontextprotocol.io)
|
|
222
|
+
- [OpenCode](https://opencode.ai) - 架构灵感来源
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
<p align="center">
|
|
227
|
+
Made with ❤️ by SDKWork Team
|
|
228
|
+
</p>
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# SDKWork Browser Agent
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/sdkwork-browser-agent)
|
|
4
|
+
[](https://www.typescriptlang.org/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
一个浏览器兼容的 Agent 架构,支持 Skills、MCP、Tools 和灵活的 LLM Provider 体系。
|
|
8
|
+
|
|
9
|
+
[英文](./README.md) | [中文](./README.zh.md)
|
|
10
|
+
|
|
11
|
+
## ✨ 特性
|
|
12
|
+
|
|
13
|
+
- 🤖 **智能决策引擎** - 自动选择最合适的 Skill,基于嵌入相似度匹配
|
|
14
|
+
- 🔄 **动态 Skill 加载** - 懒加载机制,支持文件、URL、模块多种来源
|
|
15
|
+
- 💰 **Token 优化** - 智能压缩和截断,最小化 Token 消耗
|
|
16
|
+
- 🔌 **多 LLM 支持** - OpenAI、Anthropic、Google Gemini 等主流模型
|
|
17
|
+
- 📦 **MCP 协议** - 完整的 Model Context Protocol 支持
|
|
18
|
+
- 🔧 **插件系统** - 可扩展的插件架构
|
|
19
|
+
- 🌐 **浏览器兼容** - 同时支持浏览器和 Node.js 环境
|
|
20
|
+
- 📘 **TypeScript** - 完整的类型支持
|
|
21
|
+
|
|
22
|
+
## 🚀 快速开始
|
|
23
|
+
|
|
24
|
+
### 安装
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install sdkwork-browser-agent
|
|
28
|
+
# 或
|
|
29
|
+
yarn add sdkwork-browser-agent
|
|
30
|
+
# 或
|
|
31
|
+
pnpm add sdkwork-browser-agent
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 基础使用
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { SmartAgent, OpenAIProvider, builtInSkills } from 'sdkwork-browser-agent';
|
|
38
|
+
|
|
39
|
+
// 创建智能 Agent
|
|
40
|
+
const agent = new SmartAgent({
|
|
41
|
+
name: 'my-agent',
|
|
42
|
+
llmProvider: new OpenAIProvider({
|
|
43
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
44
|
+
}),
|
|
45
|
+
skills: builtInSkills,
|
|
46
|
+
autoDecide: true,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// 初始化
|
|
50
|
+
await agent.initialize();
|
|
51
|
+
|
|
52
|
+
// 自动处理输入
|
|
53
|
+
const result = await agent.process('计算 2 + 2');
|
|
54
|
+
console.log(result.result); // 4
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 使用不同的 LLM Provider
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { AnthropicProvider, GeminiProvider } from 'sdkwork-browser-agent';
|
|
61
|
+
|
|
62
|
+
// Anthropic Claude
|
|
63
|
+
const claudeAgent = new SmartAgent({
|
|
64
|
+
llmProvider: new AnthropicProvider({
|
|
65
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Google Gemini
|
|
70
|
+
const geminiAgent = new SmartAgent({
|
|
71
|
+
llmProvider: new GeminiProvider({
|
|
72
|
+
apiKey: process.env.GEMINI_API_KEY,
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 📚 文档
|
|
78
|
+
|
|
79
|
+
完整文档请访问:[https://sdkwork-browser-agent.vercel.app](https://sdkwork-browser-agent.vercel.app)
|
|
80
|
+
|
|
81
|
+
- [快速开始](https://sdkwork-browser-agent.vercel.app/guide/getting-started)
|
|
82
|
+
- [核心概念](https://sdkwork-browser-agent.vercel.app/guide/concepts)
|
|
83
|
+
- [API 参考](https://sdkwork-browser-agent.vercel.app/api/)
|
|
84
|
+
- [示例](https://sdkwork-browser-agent.vercel.app/examples/)
|
|
85
|
+
|
|
86
|
+
## 🏗️ 架构
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
sdkwork-browser-agent/
|
|
90
|
+
├── src/
|
|
91
|
+
│ ├── core/ # Agent 核心
|
|
92
|
+
│ │ ├── agent.ts # 基础 Agent
|
|
93
|
+
│ │ ├── smart-agent.ts # 智能 Agent(自动决策)
|
|
94
|
+
│ │ ├── decision-engine.ts # 决策引擎
|
|
95
|
+
│ │ ├── skill-loader.ts # 动态加载
|
|
96
|
+
│ │ └── token-optimizer.ts # Token 优化
|
|
97
|
+
│ ├── llm/ # LLM Provider
|
|
98
|
+
│ ├── skills/ # Skill 系统
|
|
99
|
+
│ ├── tools/ # Tool 系统
|
|
100
|
+
│ ├── mcp/ # MCP 协议
|
|
101
|
+
│ └── plugins/ # 插件系统
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 🎯 核心功能
|
|
105
|
+
|
|
106
|
+
### 1. 智能决策引擎
|
|
107
|
+
|
|
108
|
+
自动根据输入选择最合适的 Skill:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const agent = new SmartAgent({
|
|
112
|
+
decisionEngine: {
|
|
113
|
+
enableEmbeddings: true, // 启用嵌入相似度
|
|
114
|
+
enableCaching: true, // 启用决策缓存
|
|
115
|
+
threshold: 0.6, // 相似度阈值
|
|
116
|
+
maxSkills: 3, // 最大选择 Skill 数
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 2. 动态 Skill 加载
|
|
122
|
+
|
|
123
|
+
支持从多种来源懒加载 Skill:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
// 注册 Skill 源
|
|
127
|
+
agent.registerSkillSource('my-skill', 'https://example.com/skills/my-skill.json', 'url');
|
|
128
|
+
|
|
129
|
+
// 动态加载
|
|
130
|
+
const skill = await agent.skillLoader.load('my-skill');
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3. Token 优化
|
|
134
|
+
|
|
135
|
+
自动优化 Token 消耗:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
const optimizer = new TokenOptimizer({
|
|
139
|
+
enableCompression: true,
|
|
140
|
+
maxSkillDescriptionLength: 200,
|
|
141
|
+
maxContextTokens: 4000,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const optimized = optimizer.optimizeSkills(skills);
|
|
145
|
+
const stats = optimizer.getOptimizationStats(skills, optimized);
|
|
146
|
+
console.log(`节省了 ${stats.savingsPercent}% tokens`);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 4. 自定义 Skill
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { Skill } from 'sdkwork-browser-agent';
|
|
153
|
+
|
|
154
|
+
const mySkill: Skill = {
|
|
155
|
+
name: 'translate',
|
|
156
|
+
description: '将文本翻译为另一种语言',
|
|
157
|
+
parameters: {
|
|
158
|
+
type: 'object',
|
|
159
|
+
properties: {
|
|
160
|
+
text: { type: 'string', description: '要翻译的文本' },
|
|
161
|
+
targetLang: { type: 'string', description: '目标语言' },
|
|
162
|
+
},
|
|
163
|
+
required: ['text', 'targetLang'],
|
|
164
|
+
},
|
|
165
|
+
handler: async params => {
|
|
166
|
+
// 实现翻译逻辑
|
|
167
|
+
return { success: true, data: translatedText };
|
|
168
|
+
},
|
|
169
|
+
metadata: {
|
|
170
|
+
category: 'language',
|
|
171
|
+
tags: ['translate', 'nlp'],
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
agent.registerSkill(mySkill);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 🧪 测试
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# 运行所有测试
|
|
182
|
+
npm test
|
|
183
|
+
|
|
184
|
+
# 监视模式
|
|
185
|
+
npm run test:watch
|
|
186
|
+
|
|
187
|
+
# 覆盖率报告
|
|
188
|
+
npm run test:coverage
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## 🛠️ 开发
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# 安装依赖
|
|
195
|
+
npm install
|
|
196
|
+
|
|
197
|
+
# 开发模式
|
|
198
|
+
npm run dev
|
|
199
|
+
|
|
200
|
+
# 构建
|
|
201
|
+
npm run build
|
|
202
|
+
|
|
203
|
+
# 类型检查
|
|
204
|
+
npm run typecheck
|
|
205
|
+
|
|
206
|
+
# 代码格式化
|
|
207
|
+
npm run format
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 🤝 贡献
|
|
211
|
+
|
|
212
|
+
欢迎提交 Issue 和 PR!请阅读 [贡献指南](./CONTRIBUTING.md)。
|
|
213
|
+
|
|
214
|
+
## 📄 许可证
|
|
215
|
+
|
|
216
|
+
[MIT](./LICENSE)
|
|
217
|
+
|
|
218
|
+
## 🙏 致谢
|
|
219
|
+
|
|
220
|
+
- [Agent Skills Specification](https://agentskills.io/specification)
|
|
221
|
+
- [Model Context Protocol](https://modelcontextprotocol.io)
|
|
222
|
+
- [OpenCode](https://opencode.ai) - 架构灵感来源
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
<p align="center">
|
|
227
|
+
Made with ❤️ by SDKWork Team
|
|
228
|
+
</p>
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { L as LLMProvider, a as LLMMessage, b as LLMRequest, c as LLMResponse, d as LLMStreamChunk, T as ToolDefinition } from './provider-Dna36xA-.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core Agent Architecture
|
|
5
|
+
* High cohesion, low coupling design
|
|
6
|
+
* Compatible with https://agentskills.io/specification
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
interface Skill {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
parameters: ParameterSchema;
|
|
13
|
+
handler: SkillHandler;
|
|
14
|
+
metadata?: SkillMetadata;
|
|
15
|
+
}
|
|
16
|
+
interface ParameterSchema {
|
|
17
|
+
type: 'object';
|
|
18
|
+
properties: Record<string, ParameterProperty>;
|
|
19
|
+
required?: string[];
|
|
20
|
+
}
|
|
21
|
+
interface ParameterProperty {
|
|
22
|
+
type: string;
|
|
23
|
+
description: string;
|
|
24
|
+
enum?: string[];
|
|
25
|
+
default?: unknown;
|
|
26
|
+
}
|
|
27
|
+
interface SkillMetadata {
|
|
28
|
+
category?: string;
|
|
29
|
+
tags?: string[];
|
|
30
|
+
version?: string;
|
|
31
|
+
author?: string;
|
|
32
|
+
deprecated?: boolean;
|
|
33
|
+
}
|
|
34
|
+
type SkillHandler = (params: Record<string, unknown>, context: ExecutionContext) => Promise<SkillResult>;
|
|
35
|
+
interface ExecutionContext {
|
|
36
|
+
agent: Agent;
|
|
37
|
+
skillName: string;
|
|
38
|
+
timestamp: Date;
|
|
39
|
+
metadata?: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
interface SkillResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
data?: unknown;
|
|
44
|
+
error?: string;
|
|
45
|
+
metadata?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
interface Tool {
|
|
48
|
+
name: string;
|
|
49
|
+
description: string;
|
|
50
|
+
parameters?: ParameterSchema;
|
|
51
|
+
execute: ToolExecutor;
|
|
52
|
+
metadata?: ToolMetadata;
|
|
53
|
+
}
|
|
54
|
+
interface ToolMetadata {
|
|
55
|
+
category?: string;
|
|
56
|
+
tags?: string[];
|
|
57
|
+
version?: string;
|
|
58
|
+
requiresConfirmation?: boolean;
|
|
59
|
+
}
|
|
60
|
+
type ToolExecutor = (input: unknown, context: ExecutionContext) => Promise<ToolOutput>;
|
|
61
|
+
interface ToolOutput {
|
|
62
|
+
content: Array<{
|
|
63
|
+
type: string;
|
|
64
|
+
text?: string;
|
|
65
|
+
data?: unknown;
|
|
66
|
+
}>;
|
|
67
|
+
isError?: boolean;
|
|
68
|
+
metadata?: Record<string, unknown>;
|
|
69
|
+
}
|
|
70
|
+
interface MCPResource {
|
|
71
|
+
uri: string;
|
|
72
|
+
name: string;
|
|
73
|
+
description?: string;
|
|
74
|
+
mimeType?: string;
|
|
75
|
+
read: () => Promise<MCPResourceContent>;
|
|
76
|
+
metadata?: MCPResourceMetadata;
|
|
77
|
+
}
|
|
78
|
+
interface MCPResourceContent {
|
|
79
|
+
uri: string;
|
|
80
|
+
mimeType: string;
|
|
81
|
+
text?: string;
|
|
82
|
+
blob?: string;
|
|
83
|
+
metadata?: Record<string, unknown>;
|
|
84
|
+
}
|
|
85
|
+
interface MCPResourceMetadata {
|
|
86
|
+
size?: number;
|
|
87
|
+
lastModified?: Date;
|
|
88
|
+
etag?: string;
|
|
89
|
+
}
|
|
90
|
+
interface MCPTool {
|
|
91
|
+
name: string;
|
|
92
|
+
description: string;
|
|
93
|
+
inputSchema: unknown;
|
|
94
|
+
execute: (args: unknown, context: ExecutionContext) => Promise<MCPToolResult>;
|
|
95
|
+
metadata?: ToolMetadata;
|
|
96
|
+
}
|
|
97
|
+
interface MCPToolResult {
|
|
98
|
+
content: Array<{
|
|
99
|
+
type: string;
|
|
100
|
+
text?: string;
|
|
101
|
+
data?: unknown;
|
|
102
|
+
}>;
|
|
103
|
+
isError?: boolean;
|
|
104
|
+
metadata?: Record<string, unknown>;
|
|
105
|
+
}
|
|
106
|
+
interface Plugin {
|
|
107
|
+
name: string;
|
|
108
|
+
version: string;
|
|
109
|
+
description?: string;
|
|
110
|
+
initialize: (context: PluginContext) => Promise<void>;
|
|
111
|
+
destroy?: () => Promise<void>;
|
|
112
|
+
metadata?: PluginMetadata;
|
|
113
|
+
}
|
|
114
|
+
interface PluginMetadata {
|
|
115
|
+
author?: string;
|
|
116
|
+
homepage?: string;
|
|
117
|
+
repository?: string;
|
|
118
|
+
license?: string;
|
|
119
|
+
dependencies?: string[];
|
|
120
|
+
}
|
|
121
|
+
interface PluginContext {
|
|
122
|
+
agent: Agent;
|
|
123
|
+
registerSkill: (skill: Skill) => void;
|
|
124
|
+
registerTool: (tool: Tool) => void;
|
|
125
|
+
registerMCPResource: (resource: MCPResource) => void;
|
|
126
|
+
registerMCPTool: (tool: MCPTool) => void;
|
|
127
|
+
getLLMProvider: () => LLMProvider | undefined;
|
|
128
|
+
config: Record<string, unknown>;
|
|
129
|
+
}
|
|
130
|
+
interface AgentConfig {
|
|
131
|
+
name: string;
|
|
132
|
+
description?: string;
|
|
133
|
+
version?: string;
|
|
134
|
+
llmProvider?: LLMProvider;
|
|
135
|
+
systemPrompt?: string;
|
|
136
|
+
maxIterations?: number;
|
|
137
|
+
skills?: Skill[];
|
|
138
|
+
tools?: Tool[];
|
|
139
|
+
plugins?: Plugin[];
|
|
140
|
+
mcpResources?: MCPResource[];
|
|
141
|
+
mcpTools?: MCPTool[];
|
|
142
|
+
middlewares?: AgentMiddleware[];
|
|
143
|
+
hooks?: AgentHooks;
|
|
144
|
+
}
|
|
145
|
+
interface AgentHooks {
|
|
146
|
+
beforeSkillExecution?: (skillName: string, params: Record<string, unknown>) => Promise<void>;
|
|
147
|
+
afterSkillExecution?: (skillName: string, result: SkillResult) => Promise<void>;
|
|
148
|
+
onError?: (error: Error, context: ExecutionContext) => Promise<void>;
|
|
149
|
+
onToolCall?: (toolName: string, args: unknown) => Promise<void>;
|
|
150
|
+
}
|
|
151
|
+
type AgentMiddleware = (context: ExecutionContext, next: () => Promise<SkillResult>) => Promise<SkillResult>;
|
|
152
|
+
declare class Agent {
|
|
153
|
+
private config;
|
|
154
|
+
private _skills;
|
|
155
|
+
private _tools;
|
|
156
|
+
private _plugins;
|
|
157
|
+
private _mcpResources;
|
|
158
|
+
private _mcpTools;
|
|
159
|
+
private _middlewares;
|
|
160
|
+
private _initialized;
|
|
161
|
+
readonly name: string;
|
|
162
|
+
readonly description?: string;
|
|
163
|
+
readonly version?: string;
|
|
164
|
+
llmProvider?: LLMProvider;
|
|
165
|
+
systemPrompt?: string;
|
|
166
|
+
maxIterations: number;
|
|
167
|
+
hooks?: AgentHooks;
|
|
168
|
+
constructor(config: AgentConfig);
|
|
169
|
+
initialize(): Promise<void>;
|
|
170
|
+
registerSkill(skill: Skill): void;
|
|
171
|
+
registerTool(tool: Tool): void;
|
|
172
|
+
registerMCPResource(resource: MCPResource): void;
|
|
173
|
+
registerMCPTool(tool: MCPTool): void;
|
|
174
|
+
use(middleware: AgentMiddleware): void;
|
|
175
|
+
executeSkill(name: string, params?: Record<string, unknown>): Promise<SkillResult>;
|
|
176
|
+
executeTool(name: string, input: unknown): Promise<ToolOutput>;
|
|
177
|
+
readMCPResource(uri: string): Promise<MCPResourceContent | null>;
|
|
178
|
+
executeMCPTool(name: string, args: unknown): Promise<MCPToolResult>;
|
|
179
|
+
chat(messages: LLMMessage[], options?: Partial<LLMRequest>): Promise<LLMResponse>;
|
|
180
|
+
streamChat(messages: LLMMessage[], options?: Partial<LLMRequest>): AsyncIterableIterator<LLMStreamChunk>;
|
|
181
|
+
executeWithTools(messages: LLMMessage[], tools?: ToolDefinition[]): Promise<LLMResponse>;
|
|
182
|
+
getSkill(name: string): Skill | undefined;
|
|
183
|
+
getTool(name: string): Tool | undefined;
|
|
184
|
+
getMCPResource(uri: string): MCPResource | undefined;
|
|
185
|
+
getMCPTool(name: string): MCPTool | undefined;
|
|
186
|
+
getPlugin(name: string): Plugin | undefined;
|
|
187
|
+
getSkillNames(): string[];
|
|
188
|
+
getToolNames(): string[];
|
|
189
|
+
getMCPResourceURIs(): string[];
|
|
190
|
+
getMCPToolNames(): string[];
|
|
191
|
+
getPluginNames(): string[];
|
|
192
|
+
getAllSkills(): Skill[];
|
|
193
|
+
getAllTools(): Tool[];
|
|
194
|
+
destroy(): Promise<void>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export { Agent as A, type ExecutionContext as E, type MCPResource as M, type Plugin as P, type Skill as S, type Tool as T, type SkillResult as a, type AgentConfig as b, type PluginContext as c, type AgentHooks as d, type AgentMiddleware as e, type MCPResourceContent as f, type MCPResourceMetadata as g, type MCPTool as h, type MCPToolResult as i, type ParameterProperty as j, type ParameterSchema as k, type PluginMetadata as l, type SkillHandler as m, type SkillMetadata as n, type ToolExecutor as o, type ToolMetadata as p, type ToolOutput as q };
|