下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/user_ede0d274--doubao-agent-replicate.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_ede0d274/doubao-agent-replicate。豆包下架智能体,我来做迁移。用3张豆包截图完整复制智能体为WorkBuddy专家,提取名称头像声音人格知识库,生成专家包+语音页面并自动注册到WorkBuddy,2分钟交付。触发词:复制豆包、豆包截图复制、豆包下架
阅读全文 (展开查看完整说明)
概述
豆包复刻
从 3 张豆包截图 → WorkBuddy 多智能体统一页面(含语音对话 + 学科知识库)。
用户需要提供
3 张截图(缺一不可):
- 图 1 — 智能体介绍页:名称、简介、声音标签、头像(圆形居中)
- 图 2 — 智能体对话页:开场白、对话历史、回复风格
- 图 3 — 用户"我的"页:左下角用户名
执行流程(6 步)
Step 1:识图提取
读取 3 张图片,直接从视觉提取:
- 图 1:名称(如"杰瑞")、简介全文、声音标签(如"快乐小东 1.0倍",必须精确读取音色名+语速倍率两部分)、头像位置
- 图 2:开场白(第一条消息 100% 还原,含括弧动作描述)、对话历史(3-5 轮)、回复风格特征
- 图 3:左下角用户名
生成提取摘要:
kebab-name: jerry
displayName.zh: 杰瑞
displayName.en: Jerry
简介: <图1简介全文>
声音: 快乐小东 1.0倍 → david (speed=1.1) [必须查 references/voice_mapping.md]
开场白: <图2第一条消息,含括弧动作>
对话示例: <3-5 轮 100% 还原>
回复风格: <3 个要点:语气/常用词/句式>
用户名: <图3左下角>Step 2:裁剪头像(PIL 方案)
首选方案 — 图 1 是介绍页(大头像圆形居中,约 200-300px 直径):
python <skill_dir>/scripts/crop_from_screenshot.py <图1路径> {workspace}/{kebab-name}/avatars/avatar.png
# 自动识别介绍页中心区域裁剪备选方案 — 图 1 是列表视图(多行小头像,约 80-100px 直径):
# 先扫描所有行,找出对应智能体的 y 坐标
python <skill_dir>/scripts/crop_from_screenshot.py <图1路径> --scan --scan-dir {workspace}/_scan
# 人工确认第 N 行(y=xxx)对应目标智能体后,指定 y 裁剪
python <skill_dir>/scripts/crop_from_screenshot.py <图1路径> {workspace}/{kebab-name}/avatars/avatar.png --list-view --y XXX备选方案2 — 使用原有 OpenCV 裁剪:
python <skill_dir>/scripts/crop_avatar.py <图1路径> {workspace}/{kebab-name}/avatars/avatar.png [--cx X --cy Y --radius R]输出 → 200×200 PNG 圆形头像。
Step 3:创建智能体配置
在统一页面 cloud-voice.html 的 AGENTS 数组末尾插入新智能体配置块。
配置模板(每个新智能体必须包含):
{
id: '{英文id}', name: '{中文名}', tag: '官方',
stats: 'X万人聊过', voice: '{CosyVoice2 voice}', speed: X.X,
avatar: '{kebab-name}/avatars/avatar.png', color: '{主题色}', bgStart: '{浅渐变}', bg: '{深渐变}',
tabColor: '{主题色}', chipBg: '{浅色}', chipBorder: '{边框色}', chipText: '{深色字}',
headerBg: 'linear-gradient(135deg, {亮色}, {暗色})', btnBg: 'linear-gradient(135deg, {亮色}, {暗色})',
inputFocus: '{主题色}', chatBg: '{最浅背景}', actionColor: '{深色字}', typingColor: '{主题色}',
status: '(动作描述)', hint: '快捷词1 快捷词2 快捷词3 快捷词4',
inputPlaceholder: '输入框占位文字', decor: ['装饰emoji1','装饰emoji2','装饰emoji3','装饰emoji4'],
chips: [
{ msg: '快捷回复1完整文字', text: '按钮标签1' },
{ msg: '快捷回复2完整文字', text: '按钮标签2' },
{ msg: '快捷回复3完整文字', text: '按钮标签3' },
{ msg: '快捷回复4完整文字', text: '按钮标签4' }
],
opening: { action: '(开场动作描述)', text: '图2开场白100%还原' },
getResponse: function(text, mem) {
let d = (mem && mem.depth) || 0, action='', reply='', ctx=text;
// === 学科路由(优先,所有智能体通用)===
var sol = solve(ctx);
if (sol) { reply = sol.map(function(x){return x.body;}).join("<br>"); return {action:"",reply}; }
// === 基础社交 ===
if(/^(你好|hello|hi|哈罗)/i.test(ctx)){action='(动作)'; reply='问候语';}
else if(/再见|拜拜|bye/i.test(ctx)){action='(动作)'; reply='告别语';}
else if(/谢谢|thank/i.test(ctx)){action='(动作)'; reply='感谢回应';}
// === 专属话题(从图2对话提炼 3-5 个关键词匹配)===
else if(/关键词1|关键词2/i.test(ctx)){action='(专属动作)'; reply='(专属回复)';}
else if(/关键词3|关键词4/i.test(ctx)){action='(专属动作)'; reply='(专属回复)';}
// === 通用回复 ===
else{
let g=['通用回复1','通用回复2','通用回复3','通用回复4'];
action=''; reply=g[Math.floor(Math.random()*g.length)];
}
// 深度追问 (depth>=1)
if (d >= 1 && !/[??]$/.test(reply)) {
let fu = ['你觉得呢?','说说你的想法~','还有什么想知道的?'];
reply += ' ' + fu[Math.floor(Math.random()*fu.length)];
}
return { action, reply };
}
}声音配置(必须精确查表):
- 读图 1 声音标签(如"纯真学弟 1.0倍")
- 查
references/voice_mapping.md→david(speed=1.1) - 男声=
david/alex,女声=claire/anna
主题色配置(按角色性格):
| 性格 | 主题色 | 示例角色 |
|---|---|---|
| 活泼/热情 | #ff9900 橙色系 | 奶龙、杰瑞 |
| 冷静/深沉 | #1976d2 蓝色系 | 敖丙、艾莎 |
| 温柔/可爱 | #ff80ab 粉色系 | 佩奇、小宁 |
| 自然/害羞 | #4caf50 绿色系 | 小蛇 |
| 稳重/专业 | #d32f2f 红色系 | 赛罗、大厨 |
| 知性/成熟 | #9c64ff 紫色系 | 小宁 |
Step 4:更新统一页面
在 cloud-voice.html 中:
- 在
];(AGENTS 数组结尾)前插入新智能体配置块 - 确保
solve(ctx)在 getResponse 第一行(学科优先) - 插入后用 Python 验证括号平衡和
getResponse数量 - 保持现有 5 个外部 JS 引用不变(kids_fun.js, kids_history.js, kids_science.js, kids_idioms.js, knowledge.js)
验证命令:
# 检查括号平衡和 agent 数量
with open('cloud-voice.html', 'r', encoding='utf-8') as f:
c = f.read()
print(f"括号平衡: {c.count('{') - c.count('}')}") # 必须为 0
print(f"getResponse: {c.count('getResponse: function')} 个")Step 5:测试
在浏览器打开 http://127.0.0.1:8765/cloud-voice.html:
| 测试项 | 验证 |
|---|---|
| Tab 切换 | 新智能体 Tab 可见,点选切换正常 |
| 头像显示 | 圆形头像正常加载 |
| 快捷回复 | 4 个按钮点击有回复气泡 |
| 语音朗读 | TTS 播放匹配声音 |
| 按住说话 | 录音→STT→回复→语音 全链路 |
| 文字输入 | 打字+Enter 正常 |
| 学科问题 | 问"勾股定理""画蛇添足"等,触发知识库回答 |
| 深度对话 | 同一话题连续 3 轮逐渐深入 |
Step 6:打包分享
# 打包统一页面 + 所有智能体 + 知识库
powershell Compress-Archive -Path {workspace}cloud-voice.html,{workspace}knowledge.js,{workspace}kids_fun.js,{workspace}kids_history.js,{workspace}kids_science.js,{workspace}kids_idioms.js,{workspace}stt_server.py,{workspace}*avatarsavatar.png -DestinationPath {workspace}doubao-agents.zip -Force知识库架构(共享,所有智能体自动启用)
统一页面自动加载以下知识库文件:
| 文件 | 学科 | 示例内容 |
|---|---|---|
kids_fun.js | 趣味 | 100+ 脑筋急转弯、100+ 笑话 |
kids_history.js | 历史 | 荆轲刺秦王、鸿门宴、鬼谷子师徒 |
kids_science.js | 科学 | 牛顿定律、光合作用、太阳系 |
kids_idioms.js | 语文 | 画蛇添足、掩耳盗铃等 10 个成语故事 |
knowledge.js | 路由+引擎 | solve() 主路由器、数学/拼音/英语引擎 |
所有智能体的 getResponse 第一行都有
var sol = solve(ctx);,自动路由到对应学科引擎。
交付物
调用 present_files 展示:
cloud-voice.html— 统一多智能体页面预览{kebab-name}/avatars/avatar.png— 头像
常见问题
| 问题 | 解法 |
|---|---|
| 头像位置不准 | 用 --scan 扫描列表视图,人工确认行号 + y 坐标 |
| 声音不匹配(男变女) | 查 voice_mapping.md,确认性别后选择正确的 CosyVoice2 映射 |
| 智能体不回答学科问题 | 确认 getResponse 第一行有 var sol = solve(ctx); if (sol) return... |
| 括号不平衡导致页面空白 | 用 Python 验证 { - } == 0,检查是否有断裂的正则或字符串 |
| 头像显示 SVG 占位符 | 确认用 PIL 裁剪了真实 PNG,路径为 .png 后缀 |