大家好,我是宇哥,专注AI编程、智能体,解决小白AI编程问题。
前两篇加餐,我们已经做了两件事:
加餐 01:做了一个本地转化事件看板; 加餐 02:接了一个用户反馈表,但反馈只进入人工审核,不直接改工具库。
这一篇继续往前走:给 AI 工具站做一个工具提交入口。
注意,今天不是做一个“别人一提交就自动上架”的入口。那样风险很高:官网可能填错,价格可能过期,分类可能不准,甚至会混进低质量工具。
我们这篇只做一个安全版本:
候选工具先提交到本地样例数据,再人工审核,通过后下一篇再同步到飞书表格审核区。

这篇你能做出什么
跟着做完,你会得到 5 类文件:
| 文件 | 作用 |
|---|---|
data/tool-submission-fields.json |
定义工具提交表单需要哪些字段 |
public/tool-submit.html |
本地可打开的工具提交入口页面 |
data/sample-tool-submissions.jsonl |
5 条本地工具候选样例 |
reports/tool-submission-review.md |
人工审核报告和边界说明 |
scripts/check-tool-submission.py |
一键检查字段、样例、页面和合规边界 |

本篇完成后,下一篇可以直接复用 sample-tool-submissions.jsonl 里审核通过的候选,继续做“同步到飞书表格审核区”。
适合谁,不适合谁
适合:
已经跟完 AI 工具站主线,想让站点有用户参与入口的人; 想学习“AI 编程 + 人工审核边界”的小白; 想把工具提交、反馈、审核这些运营动作做成可维护流程的人。
不适合:
想让用户提交后立刻自动上架的人; 想跳过审核,直接批量抓取或搬运工具数据的人; 想采集登录后、付费墙、个人隐私或网站明确禁止采集内容的人。
WorkBuddy 在这里适合帮我们生成字段、页面和检查脚本;但它不应该替我们做最终判断。工具是否可信、价格是否准确、分类是否合适,仍然要人工复核。
准备环境
这篇继续使用本地文件,不需要数据库,也不需要后端。
你需要准备:
Python 3; 一个可以打开本地 HTML 的浏览器; 上一篇生成的反馈表文件; WorkBuddy,或者你常用的 AI 编程助手。
本篇 demo 路径:
tutorials/workbuddy-tool-directory-extras/demo/extra-03/
上一篇输入文件:
tutorials/workbuddy-tool-directory-extras/demo/extra-02/data/feedback-fields.json
tutorials/workbuddy-tool-directory-extras/demo/extra-02/public/feedback-form.html
tutorials/workbuddy-tool-directory-extras/demo/extra-02/scripts/check-feedback-form.py
如果你没有跟上一篇,也可以先新建目录,再按本文代码直接生成本篇文件。
先看最终效果
最终页面是一个本地工具提交入口,包含 7 个字段:
工具名称; 工具官网; 建议分类; 适合场景; 价格线索; 补充说明; 确认人工审核。
核心边界只有一句话:
工具候选只能先进入人工审核,不能自动覆盖正式工具库。

第一步|新建本篇目录
在工作区里新建这一篇的 demo 目录:
cd /root/workspace/wechat-articles
mkdir -p tutorials/workbuddy-tool-directory-extras/demo/extra-03/{data,public,reports,scripts,prompts}
如果你不是在我的服务器上操作,把 /root/workspace/wechat-articles 换成你自己的项目根目录即可。
验收点:看到下面这些目录就算成功:
data/
public/
reports/
scripts/
prompts/
第二步|把任务交给 WorkBuddy
打开 WorkBuddy,新建一个任务,把下面这段提示词复制进去:
你是我的 AI 编程助手。请在 WorkBuddy AI 工具站加餐项目里做一个“工具提交入口”本地样例,承接上一篇用户反馈表。
输入参考:
- tutorials/workbuddy-tool-directory-extras/demo/extra-02/data/feedback-fields.json
- tutorials/workbuddy-tool-directory-extras/demo/extra-02/public/feedback-form.html
- tutorials/workbuddy-tool-directory-extras/demo/extra-02/scripts/check-feedback-form.py
请输出:
1. data/tool-submission-fields.json:工具提交字段定义,包含字段名、类型、必填、边界和审核状态。
2. public/tool-submit.html:一个可以本地打开的工具提交入口页面。
3. data/sample-tool-submissions.jsonl:5 条本地工具候选样例,每条包含 review_status。
4. reports/tool-submission-review.md:人工审核报告,说明哪些信息必须复核。
5. scripts/check-tool-submission.py:检查字段、页面、样例数据、报告和合规边界。
限制:
- 只做本地样例,不接真实后端。
- 不收集个人联系方式。
- 工具候选只能先进入人工审核,不能自动写回正式工具库。
- 不写真实密钥,不写外部引导内容。
这段提示词的重点不是“生成页面”,而是要求 WorkBuddy 同时生成:字段、页面、样例、报告、检查脚本。
如果你只让它生成 HTML,后面很容易变成一个漂亮但不可维护的表单。
验收点:WorkBuddy 的输出里应该明确出现这 5 个文件名,而不是只给你一段页面代码。
第三步|生成字段定义
工具提交入口最重要的是字段设计。复制下面内容,保存为:
tutorials/workbuddy-tool-directory-extras/demo/extra-03/data/tool-submission-fields.json
{
"form_id": "workbuddy-tool-submission-local-v1",
"title": "WorkBuddy AI 工具站工具提交入口",
"source_page": "public/tool-submit.html",
"storage": "local_demo_only",
"privacy_boundary": "只用于本地样例,不接真实后端,不收集个人联系方式,不自动写回正式工具库。",
"reuse_from_extra_02": {
"feedback_form_id": "workbuddy-tool-feedback-local-v1",
"review_statuses": ["new", "needs_check", "accepted", "rejected"]
},
"fields": [
{"name": "tool_name", "label": "工具名称", "type": "text", "required": true, "min_length": 2, "max_length": 60},
{"name": "tool_url", "label": "工具官网", "type": "url", "required": true, "must_start_with": ["https://"]},
{"name": "category", "label": "建议分类", "type": "select", "required": true, "options": ["AI 编程", "浏览器自动化", "内容生产", "知识库", "效率工具"]},
{"name": "use_case", "label": "适合场景", "type": "textarea", "required": true, "min_length": 12, "max_length": 240},
{"name": "pricing_hint", "label": "价格线索", "type": "select", "required": true, "options": ["免费", "免费试用", "付费订阅", "开源自部署", "待人工复核"]},
{"name": "submitter_note", "label": "补充说明", "type": "textarea", "required": false, "max_length": 240},
{"name": "confirm_review", "label": "我知道提交后需要人工审核", "type": "boolean", "required": true, "default": false}
],
"review_statuses": ["new", "needs_check", "accepted", "rejected"],
"next_step": "extra-04 可以把 accepted 的工具候选同步到飞书表格审核区。"
}
这里我特意把 pricing_hint 命名为“价格线索”,不是“价格结论”。
因为工具价格很容易变,用户提交的信息只能当线索。正式入库前,必须人工复核。
验收点:这个 JSON 里应该有 7 个字段,并且 storage 必须是 local_demo_only。
第四步|生成 5 条本地工具候选
新建文件:
tutorials/workbuddy-tool-directory-extras/demo/extra-03/data/sample-tool-submissions.jsonl
每一行是一条候选工具,注意是 JSONL,不是普通 JSON 数组:
{"id":"sub-001","tool_name":"Stagehand","tool_url":"https://www.stagehand.dev/","category":"浏览器自动化","use_case":"适合做浏览器 Agent 的网页操作和页面理解示例。","pricing_hint":"开源自部署","submitter_note":"需要人工确认当前开源协议和文档入口。","confirm_review":true,"review_status":"needs_check","source":"local_demo_only"}
{"id":"sub-002","tool_name":"LiteLLM","tool_url":"https://www.litellm.ai/","category":"AI 编程","use_case":"适合把多个模型 API 统一成一个调用入口,方便工具站后续做模型适配。","pricing_hint":"开源自部署","submitter_note":"需要复核是否归到开发工具分类。","confirm_review":true,"review_status":"new","source":"local_demo_only"}
{"id":"sub-003","tool_name":"Firecrawl","tool_url":"https://www.firecrawl.dev/","category":"内容生产","use_case":"适合把网页整理成 Markdown,给资料库或内容助手使用。","pricing_hint":"免费试用","submitter_note":"需要人工复核免费额度是否变化。","confirm_review":true,"review_status":"needs_check","source":"local_demo_only"}
{"id":"sub-004","tool_name":"Open WebUI","tool_url":"https://openwebui.com/","category":"知识库","use_case":"适合做本地模型聊天和知识库入口,适合后续知识库季复用。","pricing_hint":"开源自部署","submitter_note":"需要确认部署门槛。","confirm_review":true,"review_status":"new","source":"local_demo_only"}
{"id":"sub-005","tool_name":"Excalidraw","tool_url":"https://excalidraw.com/","category":"效率工具","use_case":"适合快速画产品草图、流程图和教程结构图。","pricing_hint":"免费","submitter_note":"这条可作为非 AI 但高频效率工具候选。","confirm_review":true,"review_status":"accepted","source":"local_demo_only"}
这里有 3 个小设计:
所有链接都用 https://;每条都有 review_status;只有 1 条是 accepted,方便下一篇演示“只同步审核通过项”。
验收点:这个文件应该有 5 行,每一行都能被 Python 当成 JSON 解析。
第五步|生成本地提交页面
新建文件:
tutorials/workbuddy-tool-directory-extras/demo/extra-03/public/tool-submit.html
为了文章不太长,这里只放页面骨架。你可以让 WorkBuddy 根据字段 JSON 生成更完整的样式。
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>WorkBuddy AI 工具站工具提交入口</title>
</head>
<body>
<h1>WorkBuddy AI 工具站工具提交入口</h1>
<p>本地样例:候选工具先进入人工审核,不自动写回正式工具库。</p>
<form>
<label>工具名称 *</label>
<input placeholder="例如 Stagehand" />
<label>工具官网 *</label>
<input placeholder="https://example.com" />
<label>建议分类 *</label>
<select>
<option>AI 编程</option>
<option>浏览器自动化</option>
<option>内容生产</option>
<option>知识库</option>
<option>效率工具</option>
</select>
<label>适合场景 *</label>
<textarea placeholder="用一句话说清它能帮读者解决什么问题。"></textarea>
<label>价格线索 *</label>
<select>
<option>免费</option>
<option>免费试用</option>
<option>付费订阅</option>
<option>开源自部署</option>
<option>待人工复核</option>
</select>
<label>补充说明</label>
<textarea placeholder="填写需要人工复核的点。"></textarea>
<label>
<input type="checkbox" /> 我知道提交后需要人工审核,不会直接进入正式工具库
</label>
<button type="button">生成本地候选提交</button>
</form>
</body>
</html>
验收点:浏览器打开这个 HTML,应该能看到完整表单,并且页面里明确写着“人工审核”。
第六步|写人工审核报告
新建文件:
tutorials/workbuddy-tool-directory-extras/demo/extra-03/reports/tool-submission-review.md
核心内容可以先这样写:
# WorkBuddy 工具提交入口审核报告
## 本地样例数据
- 字段定义:data/tool-submission-fields.json
- 提交入口:public/tool-submit.html
- 样例候选:data/sample-tool-submissions.jsonl
- 样例候选条数:5
- 待复核:2
- 可进入下一步审核区:1
## 人工审核流程
1. 先打开 tool_url,确认官网能访问且不是明显错误页面。
2. 再检查 category 和 use_case 是否匹配,不匹配就标记 needs_check。
3. 对 pricing_hint 只当线索,不当最终价格结论。
4. 只有 review_status = accepted 的候选,才允许进入下一篇飞书表格审核区。
5. 即使进入审核区,也仍然不能自动覆盖正式工具库。
## 边界
- 本篇只做本地样例,不接真实后端。
- 不保存个人联系方式。
- 不自动更新正式工具数据。
- 官网、价格、分类和适用场景都需要人工复核。
验收点:报告里必须同时出现“待复核”“可进入下一步审核区”和“不自动更新正式工具数据”。
第七步|写检查脚本
新建文件:
tutorials/workbuddy-tool-directory-extras/demo/extra-03/scripts/check-tool-submission.py
检查脚本至少要验证 6 件事:
from pathlib import Path
import json
import sys
ROOT = Path('/root/workspace/wechat-articles')
DEMO = ROOT / 'tutorials/workbuddy-tool-directory-extras/demo/extra-03'
fields = json.loads((DEMO / 'data/tool-submission-fields.json').read_text(encoding='utf-8'))
samples = [json.loads(line) for line in (DEMO / 'data/sample-tool-submissions.jsonl').read_text(encoding='utf-8').splitlines() if line.strip()]
html = (DEMO / 'public/tool-submit.html').read_text(encoding='utf-8')
report = (DEMO / 'reports/tool-submission-review.md').read_text(encoding='utf-8')
required_fields = {'tool_name','tool_url','category','use_case','pricing_hint','submitter_note','confirm_review'}
field_names = {item.get('name') for item in fields.get('fields', [])}
if field_names != required_fields:
print('失败 字段定义不完整')
sys.exit(1)
if fields.get('storage') != 'local_demo_only':
print('失败 storage 必须标记为 local_demo_only')
sys.exit(1)
if len(samples) != 5:
print('失败 样例候选应为 5 条')
sys.exit(1)
accepted = 0
needs_check = 0
for row in samples:
if row.get('source') != 'local_demo_only':
print('失败 样例候选 source 必须是 local_demo_only')
sys.exit(1)
if not row.get('tool_url', '').startswith('https://'):
print('失败 工具官网必须是 https 链接')
sys.exit(1)
if row.get('confirm_review') is not True:
print('失败 样例候选必须确认人工审核')
sys.exit(1)
accepted += row.get('review_status') == 'accepted'
needs_check += row.get('review_status') == 'needs_check'
for needle in ['WorkBuddy AI 工具站工具提交入口', '本地样例', '正式工具库']:
if needle not in html:
print('失败 HTML 提交入口缺少:' + needle)
sys.exit(1)
for needle in ['字段明细', '人工审核流程', '本地候选清单', '下一篇输入']:
if needle not in report:
print('失败 审核报告缺少:' + needle)
sys.exit(1)
print(f'通过 字段定义检查通过:{len(field_names)} 个字段')
print(f'通过 样例候选检查通过:{len(samples)} 条')
print(f'通过 审核分布:待复核 {needs_check} 条,可进入下一步 {accepted} 条')
print('通过 WorkBuddy 工具提交入口检查全部通过')
实际项目里,我还加了对上一课输入、页面边界和敏感内容的检查。文章里放的是简化版,完整脚本见本篇 demo 目录。
第八步|运行真实验证
进入本篇 demo 目录:
cd /root/workspace/wechat-articles/tutorials/workbuddy-tool-directory-extras/demo/extra-03
python3 scripts/create-extra-03-demo.py && python3 scripts/check-tool-submission.py
我这次实际运行结果如下:
WorkBuddy 工具提交入口本地样例生成完成
字段数: 7
样例候选: 5
待复核: 2
可进入下一步审核区: 1
提交入口:public/tool-submit.html
审核报告:reports/tool-submission-review.md
通过 上一篇输入检查通过,已复用反馈字段和表单检查思路
通过 字段定义检查通过,工具提交字段 7 个,审核状态 4 个
通过 样例候选检查通过,候选 5 条,全部为本地样例和 https 链接
通过 审核分布检查通过,待复核 2 条,可进入下一步审核区 1 条
通过 HTML 提交入口检查通过,包含本地样例和先审核再入库边界
通过 Markdown 审核报告检查通过,包含字段、流程、候选清单和下一篇输入
通过 未发现夸张宣传、外部联系引导或真实密钥
通过 WorkBuddy 工具提交入口检查全部通过

看到最后一行 通过 WorkBuddy 工具提交入口检查全部通过,说明本篇 demo 可以继续往下用了。
常见报错和排查
1. JSONL 解析失败
常见原因:你把 5 条样例包成了一个 JSON 数组。
JSONL 的规则是:一行一条 JSON。不要在最外层加 [ 和 ]。
2. 检查脚本提示官网必须是 https
说明某条 tool_url 不是 https:// 开头。
工具提交入口不应该收各种奇怪链接。第一版先收紧规则,后面真要支持更多来源,也要单独写清楚边界。
3. 页面做出来了,但没有审核状态
这说明 WorkBuddy 只完成了表单,没有完成运营流程。
你要回到提示词里补一句:每条候选必须包含 review_status,并且只有 accepted 才允许进入下一步审核区。
4. 页面看起来能用,是不是就可以上线?
还不行。
这篇只有本地样例,没有后端、没有权限、没有提交频率限制、没有人工审核后台。真实上线前至少还要补:后端接口、数据校验、日志、审核后台和异常处理。
完整代码 / 配置汇总
本篇完整 demo 已经生成在:
/root/workspace/wechat-articles/tutorials/workbuddy-tool-directory-extras/demo/extra-03/
最重要的验证命令是:
cd /root/workspace/wechat-articles/tutorials/workbuddy-tool-directory-extras/demo/extra-03
python3 scripts/create-extra-03-demo.py && python3 scripts/check-tool-submission.py
如果你在自己的电脑上跟做,只要把脚本里的项目根目录改成你的路径即可。
这一篇你学会了什么
这一篇我们没有急着接真实后端,而是先用 WorkBuddy 做了一个安全的工具提交入口:
用 JSON 定义提交字段; 用 HTML 做本地页面; 用 JSONL 保存工具候选; 用 Markdown 写人工审核报告; 用 Python 检查字段、样例、页面和边界。
真正重要的是这条线:
用户提交不是入库结果,只是进入审核流程的开始。
这就是工具站运营能力和普通表单页面的区别。
下一篇预告
下一篇继续做:
用WorkBuddy做AI工具站加餐04:把站点数据同步到飞书表格
我们会复用这篇的:
data/sample-tool-submissions.jsonl
reports/tool-submission-review.md
scripts/check-tool-submission.py
目标是把 review_status = accepted 的候选同步到飞书表格审核区,继续保持“先审核、后入库”的边界。
资料来源
本篇 demo 由本地脚本真实生成并验证; 输入参考:加餐 02 的 feedback-fields.json、feedback-form.html和check-feedback-form.py;工具候选数据为本地教程样例,只用于演示字段、审核状态和数据流转,不代表正式推荐或实时价格信息。
夜雨聆风