小王子Roy:用Coze搭建一个神奇宠物诞生器
创作背景:某天在coze里面看到有大佬公开配置了一个“古风美少女抽卡游戏”,很有意思,可以随机生成美女等级/形象/人物故事,于是一个尘封已久的愿望在我心中重燃:像《神奇宝贝》中的小智一样,在未知的世界中随机遇到精灵宝可梦,每个宝可梦都有自己的故事/技能甚至使命,和小智一起行走天下。
于是,神奇宠物诞生器出现了!
“神奇宠物诞生器”链接:https://www.coze.cn/store/bot/7396692632459542538
在此特别感谢“古风美少女抽卡游戏”的作者君寻寻公开她/他的coze配置
“古风美少女抽卡游戏”链接:https://www.coze.cn/store/bot/7360966333124804627
诞生器初始界面
诞生器实现效果
输入“召唤”或“随机召唤”:
会随机召唤出属性为R(概率75%)/SR(概率20%)/SSR(概率5%)的随机形象和名字宠物,并输出对应宠物的小传/技能/使命
输入“特定召唤”或输入某种动物或者植物:
会进行引导输出特定某种动物或植物形象的的宠物,名字和属性等级R(概率75%)/SR(概率20%)/SSR(概率5%)随机生成,并输出宠物的小传/技能/使命
搭建步骤教程
执行流程图
工作流搭建
“随机召唤”工作流 Random_Card_Pet_pro
随机生成属性和宠物描述
因为星级属性需要稳定输出,所以选择了代码节点来实现
import random
async def main(args: Args) -> Output:
random_number = random.random()
level = None
prompt = None
if random_number < 0.05:
level = "SSR"
prompt = "一个可爱的宠物,天使形象,有两只洁白的翅膀,头戴橄榄叶,手拿魔法棒,面带微笑,非常阳光。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物"
elif random_number < 0.25:
level = "SR"
prompt = "一个邪恶的宠物,魔鬼形象,黑色羽毛的翅膀,鹰爪,头上有红色的牛角,手拿火棍,面露狰狞,十分恐怖。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物"
else:
level = "R"
prompt = "一个朴素小宠物,可爱,圆滚滚的,大眼睛,毛茸茸的。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物"
return {
"level": level,
"prompt": prompt,
"random_number": random_number,
}
对于不会写代码的小伙伴,可以使用通过内置的“尝试AI”功能来帮你写,但是这里有几点需要特别注意:
- 尽量选择python代码编写,JavaScript我尝试了好几次都出现error,python基本上都是一次就正确生成
- 书写之前先把要输出的变量确定好,没用的变量提前删掉,同时需要设置好输出变量名
- 给AI写需求的时候,一定要在前面加上两个字“实现”,这一点非常重要,如果不加,大概率会理解错,无法正常生成代码
参考写代码的提示词(如果一直报错,直接复制上面的代码吧):
实现以下内容:
1. 生成一个随机数
2. 按照下面规则进行输出:
如果随机数小于0.05,那么输出变量level输出固定字符串"SSR",输出变量prompt输出固定字符串"一个可爱的宠物,天使形象,有两只洁白的翅膀,头戴橄榄叶,手拿魔法棒,面带微笑,非常阳光。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物";
如果随机数大于0.25,那么输出变量level输出固定字符串"R",输出变量prompt输出固定字符串"一个朴素小宠物,可爱,圆滚滚的,大眼睛,毛茸茸的。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物";
其他情况输出变量level输出固定字符串"SR",输出变量prompt输出固定字符串"一个邪恶的宠物,魔鬼形象,黑色羽毛的翅膀,鹰爪,头上有红色的牛角,手拿火棍,面露狰狞,十分恐怖。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物"。
生成宠物形象
使用coze自带的文生图工具text2image插件即可
宠物形象描述文字生成
使用图片理解插件imgUnderstand
生成宠物的名字
这里我借鉴了鸟山明给七龙珠人物起名的逻辑,使用蔬菜名字的中文译名反过来来给随即生成的宠物命名。
比如:西红柿——>tomato——>托马特——>特马托
使用的节点是大模型节点:
提示词:
请随机生成一个蔬菜名称,该名称是先将蔬菜的英文名倒过来(反念),然后将倒过来的英文名称按中文发音规则进行音译,得到的名字应该是这个音译的中文名称。输出这个中文名字。
#限制
- 只输出最后的中文名字
- 不要说其他任何的话和解释
生成宠物小传/技能/使命
调用了前面节点的两个数据:
- 生成的宠物形象描述文字(来自图片理解插件),命名为figure
- 随机生成的宠物名字(来自生成宠物名字的节点),命名为name
提示词(如果给到格式的例子,输出会更稳定):
#角色
你现在是一个神奇宠物小传创作大师,可以根据神奇宠物的名字{{name}}和神奇宠物的外形描述{{figure}}生成对应神奇宠物身世经历和特殊战斗技能。
#技能
技能1:对神奇宠物小传内容加以润色,描述清楚这只神奇宠物的身世故事。
技能2:根据神奇宠物小传,赋予这只神奇宠物战斗技能。
示例:
“### 神奇宠物小传
包包是一只与众不同的神奇宠物,外形酷似一只金毛猎犬,但其身体却如热狗般修长。这只特别的宠物有着神奇的身世故事和非凡的天赋。
包包出生在一片神秘的森林中,这片森林充满了魔法和奇幻生物。据传说,包包是由森林之神赐予的礼物,目的是带给世界和平与欢乐。包包从小就展现出非凡的魔法天赋,这些天赋不仅让它在森林中备受喜爱,也让它成为守护森林和平的象征。
### 战斗技能
包包拥有四项强大的战斗技能,每一项都能在战斗中发挥关键作用:
1. **治愈之光**:包包可以释放出一道治愈的光芒,能够迅速治愈自己和同伴的伤口,让他们在战斗中恢复元气。这道光芒不仅能治愈肉体上的创伤,还能抚平心灵的伤痛。
2. **瞬间移动**:包包能够在瞬间移动到任何它想去的地方,无论是躲避敌人的攻击,还是快速接近目标。这项技能让包包在战斗中变得难以捉摸,敌人往往还没反应过来就已经落入了包包的陷阱。
3. **语言通晓**:包包能够理解和使用任何语言,这使它在战斗中可以与各种生物交流,甚至说服敌人停止战斗。包包通过这种能力,常常能化解一场即将爆发的冲突,将战争转化为和平谈判。
4. **食物生成**:包包可以凭空生成各种美味的食物,不仅能在战斗后恢复体力,还能用食物来吸引和安抚敌人。许多敌人在品尝了包包的美食后,都不忍再对它出手,反而成为了它的朋友。
### 包包的使命
包包的使命是利用它的魔法天赋和善良的心灵,带给世界更多的和平与欢乐。无论是治愈伤痛、化解纷争,还是用美食拉近人与人之间的距离,包包始终以它独特的方式在世界各地传播着爱与温暖。每一个遇到包包的人都会被它的魅力所感染,深深地感受到来自这只神奇宠物的纯真与善良。”
#限制:
- 严格按照示例格式输出。
- 字数限制500字以内。
- 首段落前需要空4字符。
- 仅返回文字,不返回其他字符。
整理输出
引用了前面节点的四个数据:
- 属性等级level
- 宠物名字那么
- 宠物形象图片链接image_url
- 人物小传/技能/使命文本text
回答格式为:
恭喜你召唤了{{level}}卡的神奇宠物!!
它是:{{name}}
![link]({{image_url}})
{{text}}
如果要直接显示图片,请用小括号先把图片的链接变量框起来,然后前面加上![link]
“定制召唤”工作流 Custom_Card_Pet_pro
这一个工作流其实是“随机召唤”工作流的变种,只不过对用户输入的动物或植物这个关键词进行带入,不用让AI随机生成了,但是属性等级还是需要根据比例进行区分的,难点在于如何将宠物的种类带入到描述里面,具体流程图如下:
需要修改的节点1:开始节点
因为需要用户输入宠物种类(动物或者植物),因此开始节点需要新增一个输入变量,我把它定义为keywords
需要修改的节点2:代码节点
与之前随机生成宠物种类不同,要对特定种类种类生成的话,需要把这个关键词嵌入到描述prompt里。
比如,
如果召唤师输入“熊猫”,
那么R属性的宠物描述就要修改为
“一个朴素小熊猫宠物,可爱,圆滚滚的,大眼睛,毛茸茸的。画风参考著名动画片《神奇宝贝》”
SR和SSR依次类推,
因此我们的描述prompt就变成了三段字符串相加的情况,即:
原描述第一段+宠物种类+原描述第二段
具体实现代码如下:
import random
import random
async def main(args: Args) -> Output:
random_number = random.random()
level = None
prompt = None
query = args.params['query']
if random_number < 0.05:
level = "SSR"
prompt = "一个可爱的"+query+"宠物,天使形象,有两只洁白的翅膀,头戴橄榄叶,手拿魔法棒,面带微笑,非常阳光。画风参考著名动画片《神奇宝贝》"
elif random_number < 0.25:
level = "SR"
prompt = "一个邪恶的"+query+"宠物,魔鬼形象,黑色羽毛的翅膀,鹰爪,头上有红色的牛角,手拿火棍,面露狰狞,十分恐怖。画风参考著名动画片《神奇宝贝》"
else:
level = "R"
prompt = "一个朴素小"+query+"宠物,可爱,圆滚滚的,大眼睛,毛茸茸的。画风参考著名动画片《神奇宝贝》"
return {
"level": level,
"prompt": prompt,
"random_number": random_number,
}
其余节点均与“随机召唤工作流一致”
“召唤师选择”工作流 pet_workflow_opinion
为了提高调用工作流的准确性和稳定性,我设置了这个工作流,目的是:
- 只有当召唤师输入“随机召唤”等相近意思的词时,才会调用“随机召唤”工作流
- 只有当召唤师输入特定动物或植物名称时,才会调用“特定召唤”工作流
- 否则,引导召唤师输入特定动物或植物名称,然后再调用“特定召唤”工作流
具体流程图如下:
工作流实现
选择器1:判断是否是随机召唤
选择器2:判断是否已经输入宠物种类
代码节点:引导召唤师输入宠物种类
async function main({ params }: Args): Promise<Output> {
const ret = {
"key0": "请输入一种动物或植物",
};
return ret;
}
结束节点
因为最终结果只会走其中一条路线,那么除了这条路线上有输出外,其他路线上上的输出为空,所以结束节点只需要罗列各条路径的输出即可。
Agent搭建
人设与回复逻辑
因为我这个只需要执行“召唤师选择”工作流,因此人设与回复逻辑就简单写成:
根据用户输入执行工作流“pet_workflow_opinion”
工作流
调用工作流“pet_workflow_opinion”
开场白
欢迎来到B612冒险星球,请输入“随机召唤”或“特定召唤”迎接你的神奇宠物吧!
备注:“特定召唤”可以任意输入动物/植物等等
【神奇宠物等级】
R-普通(概率75%)
SR-稀有(概率20%)
SSR-超级稀有(概率5%)
快捷指令
为了方便召唤师一键选择,因此这里设置了两个快捷指令:
- 随机召唤:一键调用“随机召唤”工作流
- 特定召唤:输入特定宠物种类,一键调用“特定召唤”工作流
语音
凭爱好选择即可,我喜欢阳光甜妹,哈哈哈
以上就是搭建“神奇宠物诞生器”的全部过程了,希望能帮你找到童年久违的热血!
去吧!皮卡丘!
作者:小王子Roy
关注小王子Roy视频号吧