deepfish-ai 1.0.23 → 1.0.24
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_CN.md +2 -2
- package/package.json +2 -2
- package/src/AgentRobot/BaseAgentRobot/lazy-tools/pdf.js +1 -0
- package/src/AgentRobot/BaseAgentRobot/tools/GenerateTools.js +31 -112
- package/src/AgentRobot/BaseAgentRobot/tools/SystemTools.js +3 -3
- package/src/AgentRobot/BaseAgentRobot/utils/AIToolManager.js +2 -1
- package/src/AgentRobot/BaseAgentRobot/utils/AttachmentToolScanner.js +1 -1
package/README_CN.md
CHANGED
|
@@ -378,8 +378,8 @@ AI始终使用相对于当前工作目录的相对路径。
|
|
|
378
378
|
|
|
379
379
|
### 对话历史
|
|
380
380
|
|
|
381
|
-
对话历史是以程序执行目录为单位创建的,每个程序的执行目录会对应一个独立的 Agent 上下文。这意味着在不同目录下启动的对话是相互独立的。
|
|
382
|
-
|
|
381
|
+
对话历史是以程序执行目录为单位创建的,每个程序的执行目录会对应一个独立的 Agent 上下文。这意味着在不同目录下启动的对话是相互独立的。
|
|
382
|
+
|
|
383
383
|
> **⚠️ 重要提示:** AI上下文是以目录为单位的,一个目录对应一个上下文。**请不要在同一个目录下开启两个命令行对话框**,以免造成上下文冲突和意外行为。
|
|
384
384
|
|
|
385
385
|
对话历史会在一定时间内自动清除(通过配置文件中的 `maxMemoryExpireTime` 字段控制,默认为 30 天)。您也可以手动管理对话历史:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deepfish-ai",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.24",
|
|
4
4
|
"description": "This is an AI-driven command-line tool built on Node.js, equipped with AI agent and workflow capabilities. It is compatible with a wide range of AI models, can convert natural language into cross-system terminal and file operation commands, and features high extensibility. It supports complex tasks such as translation, content creation, and format conversion, while allowing custom extensions to be automatically generated via AI.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"openai": "^6.18.0",
|
|
57
57
|
"pdf-lib": "^1.17.1",
|
|
58
58
|
"pdf-parse": "^2.4.5",
|
|
59
|
-
"pdf-to-img": "
|
|
59
|
+
"pdf-to-img": "5.0.0",
|
|
60
60
|
"pdfkit": "^0.18.0",
|
|
61
61
|
"pizzip": "^3.2.0",
|
|
62
62
|
"pptxgenjs": "^4.0.1",
|
|
@@ -455,6 +455,7 @@ async function pdfToLongImage(pdfPath, outputImagePath) {
|
|
|
455
455
|
|
|
456
456
|
return ok({ pdfPath, outputImagePath, pageCount: pages.length, width: maxWidth, height: totalHeight })
|
|
457
457
|
} catch (error) {
|
|
458
|
+
console.error(error)
|
|
458
459
|
return fail(error, { pdfPath, outputImagePath })
|
|
459
460
|
}
|
|
460
461
|
}
|
|
@@ -64,14 +64,13 @@ const descriptions = [
|
|
|
64
64
|
]
|
|
65
65
|
|
|
66
66
|
async function getGenerateSkillRules(goal) {
|
|
67
|
-
const packagePath = path.resolve(__filename, '../../../index.js')
|
|
68
67
|
const newGoal = `
|
|
69
|
-
|
|
68
|
+
## 任务目标
|
|
70
69
|
基于指定规则创建一个标准化的Node.js NPM项目,实现用户目标:${goal},最终输出符合AI工作流调用规范的函数模块,并配套中英文说明文档。
|
|
71
70
|
|
|
72
|
-
|
|
71
|
+
## 任务步骤
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
### 第一步:项目初始化
|
|
75
74
|
1. 目录创建:新建目录,目录名称以"deepfish-ai-"开头,如"deepfish-ai-「项目功能名称」",作为NPM项目根目录,并作为当前项目的名称
|
|
76
75
|
2. package.json配置:
|
|
77
76
|
- name字段值:与项目名称一致,即"deepfish-ai-「项目功能名称」"
|
|
@@ -86,10 +85,9 @@ async function getGenerateSkillRules(goal) {
|
|
|
86
85
|
- 文档文件:项目根目录需新增2个文档文件:
|
|
87
86
|
- README_CN.md(中文说明文档)
|
|
88
87
|
- README.md(英文说明文档)
|
|
89
|
-
- 主测试文件:test.js
|
|
90
88
|
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
### 第二步:核心代码开发
|
|
90
|
+
#### 2.1 核心输出要求
|
|
93
91
|
文件需输出四个核心字段,且代码逻辑清晰、可运行:
|
|
94
92
|
- name:字符串类型,扩展的名称标识
|
|
95
93
|
- description:字符串类型,扩展功能的简要描述,说明该扩展提供的核心能力
|
|
@@ -97,7 +95,7 @@ async function getGenerateSkillRules(goal) {
|
|
|
97
95
|
- platform:字符串类型,扩展支持的平台(process.platform),all或空表示所有平台, win32表示仅支持Windows, darwin表示仅支持MacOS, linux表示仅支持Linux:
|
|
98
96
|
- functions:对象类型,key为函数名称,value为函数方法体
|
|
99
97
|
|
|
100
|
-
|
|
98
|
+
#### 2.2 开发强制规则
|
|
101
99
|
1. 参数一致性:functions中函数的入参,必须与descriptions中对应函数声明的parameters完全一致
|
|
102
100
|
2. 命名规范:
|
|
103
101
|
- 函数名称前缀:「领域用途+分隔符」(如systemFileManagement_)
|
|
@@ -108,8 +106,9 @@ async function getGenerateSkillRules(goal) {
|
|
|
108
106
|
4. 函数数量:至少包含1个可被AI工作流调用的函数
|
|
109
107
|
5. 拆分成多个文件,保持文件结构清晰
|
|
110
108
|
6. 对于大于5个的扩展功能,需要在functions中输出一个说明函数,只需返回一个markdown类型的英文字符串,专门用于解释当前扩展工具的使用方法、参数说明、示例等内容,函数名称为「readme」,如「systemFileManagement_readme」;函数描述需要强调调用该扩展模块前必须先阅读该规则文档。
|
|
109
|
+
7. 仅进行简单逻辑性检查,不需要测试。
|
|
111
110
|
|
|
112
|
-
|
|
111
|
+
#### 2.3 基础代码模板(必须遵循)
|
|
113
112
|
const descriptions = []
|
|
114
113
|
const functions = {}
|
|
115
114
|
module.exports = {
|
|
@@ -120,9 +119,9 @@ module.exports = {
|
|
|
120
119
|
functions,
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
|
|
122
|
+
#### 2.4 参考示例(可参考格式,展示多文件拆分结构)
|
|
124
123
|
|
|
125
|
-
|
|
124
|
+
##### index.js(主文件)
|
|
126
125
|
const descriptions = require('./descriptions')
|
|
127
126
|
const functions = require('./functions')
|
|
128
127
|
module.exports = {
|
|
@@ -133,7 +132,7 @@ module.exports = {
|
|
|
133
132
|
functions,
|
|
134
133
|
}
|
|
135
134
|
|
|
136
|
-
|
|
135
|
+
##### descriptions.js(描述子文件)
|
|
137
136
|
const descriptions = [
|
|
138
137
|
{
|
|
139
138
|
name: 'systemFileManagement_renameFile',
|
|
@@ -160,7 +159,7 @@ const descriptions = [
|
|
|
160
159
|
]
|
|
161
160
|
module.exports = descriptions
|
|
162
161
|
|
|
163
|
-
|
|
162
|
+
##### functions.js(函数子文件)
|
|
164
163
|
const functions = {
|
|
165
164
|
systemFileManagement_renameFile: function(oldPath, newPath) {
|
|
166
165
|
try {
|
|
@@ -196,26 +195,14 @@ const functions = {
|
|
|
196
195
|
}
|
|
197
196
|
module.exports = functions
|
|
198
197
|
|
|
199
|
-
|
|
200
|
-
1
|
|
201
|
-
2. 测试文件:统一在 test.js 编写可直接运行的测试脚本,结构清晰,包含“准备数据 → 执行函数 → 断言结果 → 输出结论”。
|
|
202
|
-
3. 测试文件:如果引入了requestAI,必须确保函数可正确使用 this.Tools 上下文。
|
|
203
|
-
- 环境创建方式:
|
|
204
|
-
"const { DeepFishAI } = require('${packagePath}')\nconst deepfishAI = new DeepFishAI();"
|
|
205
|
-
- 调用方式:为模块导出的functions绑定Tools上下文,示例:functions.Tools = deepfishAI.agentRobot.toolManager.functions;
|
|
206
|
-
4. 断言与输出规范:每个用例需打印“用例名称、输入、期望、实际、是否通过(PASS/FAIL)”;全部执行后输出汇总(总数、通过数、失败数)。
|
|
207
|
-
5. 失败处理:出现异常时不得静默吞错,需捕获并输出可定位信息(错误消息、对应用例、关键参数)。
|
|
208
|
-
6. 副作用控制:测试过程中创建的临时文件必须使用 tmp_test_ 前缀,并在测试结束后清理。
|
|
209
|
-
7. 执行方式:test.js 不需要导出模块,支持通过 node test.js 直接运行并看到结果。
|
|
210
|
-
|
|
211
|
-
#### 第四步:README文档规范
|
|
212
|
-
##### 4.1 通用要求
|
|
198
|
+
### 第三步:输出README文档
|
|
199
|
+
#### 3.1 通用要求
|
|
213
200
|
- 两个文档需在标题下方包含「中英文切换标签」(如文档顶部标注「English | 中文」/「中文 | English」)
|
|
214
201
|
- 结构保持一致,仅语言不同,核心模块顺序不可调整
|
|
215
202
|
- 文件名称README_CN.md(中文)、README.md(英文)
|
|
216
203
|
- 链接使用相对路径,如[中文](./README_CN.md)
|
|
217
204
|
|
|
218
|
-
|
|
205
|
+
#### 3.2 核心模块
|
|
219
206
|
1. 总体功能描述:
|
|
220
207
|
- 清晰说明当前NPM包的核心定位、整体功能价值、适用场景
|
|
221
208
|
- 语言简洁易懂,无需技术细节,聚焦「做什么」而非「怎么做」
|
|
@@ -240,12 +227,12 @@ async function generateSkill(rules) {
|
|
|
240
227
|
|
|
241
228
|
async function getGenerateClawSkillRules(goal) {
|
|
242
229
|
const newGoal = `
|
|
243
|
-
|
|
230
|
+
## 任务目标
|
|
244
231
|
基于OpenClaw Skill规范创建一个标准化的Skill工具包,实现用户目标:${goal},最终输出可被你直接加载使用。
|
|
245
232
|
|
|
246
|
-
|
|
233
|
+
## 任务步骤
|
|
247
234
|
|
|
248
|
-
|
|
235
|
+
### 第一步:项目初始化
|
|
249
236
|
1. 目录创建:在当前工作目录下新建一个子目录,目录名称应简洁明了地反映Skill功能(如"web-scraper"、"code-reviewer"、"image-optimizer"等)
|
|
250
237
|
2. 核心文件:目录中必须包含 SKILL.md 文件(文件名大小写敏感,必须为 SKILL.md)
|
|
251
238
|
3. 文档文件:目录中需新增2个说明文档:
|
|
@@ -253,7 +240,7 @@ async function getGenerateClawSkillRules(goal) {
|
|
|
253
240
|
- README.md(英文说明文档)
|
|
254
241
|
4. 辅助文件:如果Skill涉及复杂逻辑,可在目录中创建辅助脚本文件(如 .js、.sh、.py 等),并在 SKILL.md 中说明其用途和调用方式
|
|
255
242
|
|
|
256
|
-
|
|
243
|
+
#### 标准目录结构
|
|
257
244
|
\`\`\`
|
|
258
245
|
<skill-name>/
|
|
259
246
|
├── SKILL.md # [必需] 核心文件:YAML元数据 + AI执行指令
|
|
@@ -268,13 +255,13 @@ async function getGenerateClawSkillRules(goal) {
|
|
|
268
255
|
└── ...
|
|
269
256
|
\`\`\`
|
|
270
257
|
|
|
271
|
-
|
|
272
|
-
|
|
258
|
+
### 第二步:SKILL.md 完整开发规范
|
|
259
|
+
#### 2.1 文件结构
|
|
273
260
|
SKILL.md 由两部分组成:
|
|
274
261
|
- **YAML Frontmatter**(元数据区):位于文件顶部,用 \`---\` 包裹
|
|
275
262
|
- **Markdown Body**(指令正文区):Frontmatter之后的所有内容,是AI执行Skill的核心指令
|
|
276
263
|
|
|
277
|
-
|
|
264
|
+
#### 2.2 YAML Frontmatter 规范(必须遵循)
|
|
278
265
|
\`\`\`yaml
|
|
279
266
|
---
|
|
280
267
|
name: "skill-name"
|
|
@@ -288,7 +275,7 @@ homepage: "https://github.com/your-repo/skill-name"
|
|
|
288
275
|
- description:Skill功能的简要描述,用于在Skill列表中展示,帮助AI判断何时匹配使用该Skill
|
|
289
276
|
- homepage:Skill的主页或仓库地址,可留空
|
|
290
277
|
|
|
291
|
-
|
|
278
|
+
#### 2.3 Markdown Body 指令正文规范
|
|
292
279
|
指令正文是Skill的核心,AI在加载Skill后会仔细阅读此部分内容来学习如何使用该Skill。正文需包含以下模块:
|
|
293
280
|
|
|
294
281
|
**模块一:概述**
|
|
@@ -318,90 +305,22 @@ homepage: "https://github.com/your-repo/skill-name"
|
|
|
318
305
|
- 列出已知限制和边界条件
|
|
319
306
|
- 提供常见问题的处理建议
|
|
320
307
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
name: "file-translator"
|
|
325
|
-
description: "将指定文件翻译为目标语言,支持多种文件格式的智能翻译"
|
|
326
|
-
homepage: "https://github.com/example/file-translator"
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
# File Translator Skill
|
|
330
|
-
|
|
331
|
-
## 概述
|
|
332
|
-
本Skill提供文件翻译能力,能够将指定文件内容翻译为目标语言。支持 .txt、.md、.json 等文本格式文件。
|
|
333
|
-
|
|
334
|
-
#### 能力范围
|
|
335
|
-
- ✅ 支持文本文件的全文翻译
|
|
336
|
-
- ✅ 支持保留原文件格式结构
|
|
337
|
-
- ✅ 支持中、英、日、韩等主流语言互译
|
|
338
|
-
- ❌ 不支持二进制文件(如图片、视频)
|
|
339
|
-
- ❌ 不支持超过100MB的大文件
|
|
340
|
-
|
|
341
|
-
## 使用指令
|
|
342
|
-
|
|
343
|
-
#### 步骤1:读取源文件
|
|
344
|
-
通过 readFile 工具函数读取需要翻译的源文件内容。
|
|
345
|
-
|
|
346
|
-
#### 步骤2:执行翻译
|
|
347
|
-
调用 requestAI 工具函数,将文件内容和目标语言作为参数,获取翻译结果。
|
|
348
|
-
|
|
349
|
-
提示词模板:
|
|
350
|
-
"请将以下内容翻译为{目标语言},保持原有格式不变:\\n{文件内容}"
|
|
351
|
-
|
|
352
|
-
#### 步骤3:写入结果
|
|
353
|
-
将翻译结果写入目标文件。目标文件命名规则:{原文件名}_{语言代码}.{扩展名}
|
|
354
|
-
|
|
355
|
-
## 输入输出
|
|
356
|
-
- 输入:源文件路径、目标语言
|
|
357
|
-
- 输出:翻译后的文件路径
|
|
358
|
-
|
|
359
|
-
## 注意事项
|
|
360
|
-
- 大文件需按分块规则处理,避免超出上下文长度限制
|
|
361
|
-
- 翻译完成后需校验文件完整性
|
|
362
|
-
\`\`\`
|
|
363
|
-
|
|
364
|
-
##### 2.5 开发强制规则
|
|
365
|
-
1. SKILL.md 的指令正文必须足够详细,使AI仅通过阅读该文件即可完全理解并执行Skill的所有功能
|
|
366
|
-
2. 避免使用模糊描述(如"适当处理"、"合理配置"),所有操作步骤必须明确、具体、可执行
|
|
367
|
-
3. 如果Skill依赖辅助脚本文件,必须在指令正文中说明文件路径和调用方式
|
|
368
|
-
4. Skill的指令中可以引导AI使用内置工具函数完成任务,如:
|
|
369
|
-
- executeCommand(command):执行系统命令
|
|
370
|
-
- executeJSCode(code):执行Node.js代码
|
|
371
|
-
- requestAI(systemDescription, prompt, temperature):调用AI进行文本处理
|
|
372
|
-
5. description字段的描述至关重要,它决定了AI何时选择加载该Skill,必须准确反映Skill的核心能力
|
|
373
|
-
6. 工具包创建在当前工作目录下,完成后不需要自动安装到全局
|
|
374
|
-
|
|
375
|
-
#### 第三步:辅助脚本文件规范(如需要)
|
|
376
|
-
1. 如果Skill的功能较复杂,无法仅通过纯文本指令描述完成,可以创建辅助脚本文件
|
|
377
|
-
2. 辅助脚本可以是任意可执行格式(.js、.sh、.py、.bat等),需确保与目标操作系统兼容
|
|
378
|
-
3. 脚本文件放置在Skill目录中,SKILL.md中通过相对路径引用
|
|
379
|
-
4. 脚本需要有良好的注释和错误处理
|
|
380
|
-
5. 如果脚本依赖第三方库,需要在SKILL.md的环境依赖模块中明确说明安装方式
|
|
381
|
-
|
|
382
|
-
#### 第四步:README文档规范
|
|
383
|
-
##### 4.1 通用要求
|
|
308
|
+
### 第三步:输出README文档
|
|
309
|
+
#### 3.1 通用要求
|
|
384
310
|
- 两个文档需在标题下方包含「中英文切换标签」(如文档顶部标注「English | 中文」/「中文 | English」)
|
|
385
311
|
- 结构保持一致,仅语言不同,核心模块顺序不可调整
|
|
386
312
|
- 文件名称README_CN.md(中文)、README.md(英文)
|
|
387
313
|
- 链接使用相对路径,如[中文](./README_CN.md)
|
|
388
314
|
|
|
389
|
-
|
|
315
|
+
#### 3.2 核心模块
|
|
390
316
|
1. 总体功能描述:
|
|
391
|
-
- 清晰说明当前
|
|
317
|
+
- 清晰说明当前SKILL包的核心定位、整体功能价值、适用场景
|
|
392
318
|
- 语言简洁易懂,无需技术细节,聚焦「做什么」而非「怎么做」
|
|
393
319
|
2. 快速开始:
|
|
394
|
-
-
|
|
395
|
-
①
|
|
396
|
-
②
|
|
397
|
-
③
|
|
398
|
-
- 也可以从ClawHub安装(如已发布):ai skill install <clawhub-url>
|
|
399
|
-
3. Skill能力说明:
|
|
400
|
-
- 列出该Skill提供的所有能力
|
|
401
|
-
- 对应说明每项能力的使用场景和效果
|
|
402
|
-
4. 使用示例:
|
|
403
|
-
- 提供1-3个典型的使用场景示例
|
|
404
|
-
- 说明用户输入和预期输出
|
|
320
|
+
- 明确说明安装步骤:
|
|
321
|
+
① 全局安装deepfish-ai:npm install deepfish-ai -g
|
|
322
|
+
② 全局安装当前项目:ai skill add <skill-name>;ai skill ls;ai skill enable <skill-name|skill-index>
|
|
323
|
+
③ 在命令行中输入:ai 「skill功能」。如:添加了一个查询天气的扩展。则输入:ai 查询一下今天的天气
|
|
405
324
|
`
|
|
406
325
|
return newGoal
|
|
407
326
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @Author: Roman 306863030@qq.com
|
|
3
3
|
* @Date: 2026-03-17 11:59:19
|
|
4
|
-
* @LastEditors:
|
|
5
|
-
* @LastEditTime: 2026-04-
|
|
4
|
+
* @LastEditors: roman_123 306863030@qq.com
|
|
5
|
+
* @LastEditTime: 2026-04-24 00:07:22
|
|
6
6
|
* @FilePath: \deepfish\src\AgentRobot\BaseAgentRobot\tools\SystemTools.js
|
|
7
7
|
* @Description: 默认扩展函数
|
|
8
8
|
* @
|
|
@@ -101,7 +101,7 @@ async function executeJSCode(code) {
|
|
|
101
101
|
this.logMessages.push(Array.from(arguments).join(' '))
|
|
102
102
|
}
|
|
103
103
|
console.log = newLog.bind(this)
|
|
104
|
-
function __main() {
|
|
104
|
+
async function __main() {
|
|
105
105
|
${code}
|
|
106
106
|
}
|
|
107
107
|
const result = await __main()
|
|
@@ -46,7 +46,6 @@ class AIToolManager {
|
|
|
46
46
|
this.functions.aiCli = {
|
|
47
47
|
Tools: this.functions,
|
|
48
48
|
}
|
|
49
|
-
|
|
50
49
|
// 外部工具扫描
|
|
51
50
|
this.toolCollection = AttachmentToolScanner.getToolCollection(
|
|
52
51
|
this.agentRobot.workspace,
|
|
@@ -54,6 +53,8 @@ class AIToolManager {
|
|
|
54
53
|
this.clawSkillCollection = AttachmentToolScanner.getClawSkillCollection(
|
|
55
54
|
this.agentRobot.basespace,
|
|
56
55
|
) // 加载Claw技能集合
|
|
56
|
+
this.agentRobot.toolCollection = this.toolCollection
|
|
57
|
+
this.agentRobot.clawSkillCollection = this.clawSkillCollection
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
// 动态添加工具
|
|
@@ -187,7 +187,7 @@ ${table1}
|
|
|
187
187
|
- 一次只加载一个Skill,优先匹配最具体的Skill
|
|
188
188
|
- 当用户请求不匹配任何Skill描述时,不加载任何Skill
|
|
189
189
|
- Type类型为'ClawSkill'时,使用Skill前先使用readFile函数读取SKILL.md文件获取调用说明,通过仔细阅读说明文件学习Skill的使用方法,来完成任务
|
|
190
|
-
- Type类型为'BaseSkill'时,使用loadAttachTool函数加载Skill
|
|
190
|
+
- Type类型为'BaseSkill'时,使用loadAttachTool函数加载Skill后,该技能中的工具函数会被添加到工具列表中,即可直接调用
|
|
191
191
|
## Available Skills
|
|
192
192
|
|
|
193
193
|
| Skill | Type | Description | Location | FilePath |
|