跳转到内容

小王子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”功能来帮你写,但是这里有几点需要特别注意:

  1. 尽量选择python代码编写,JavaScript我尝试了好几次都出现error,python基本上都是一次就正确生成
  2. 书写之前先把要输出的变量确定好,没用的变量提前删掉,同时需要设置好输出变量名
  3. 给AI写需求的时候,一定要在前面加上两个字“实现”,这一点非常重要,如果不加,大概率会理解错,无法正常生成代码

参考写代码的提示词(如果一直报错,直接复制上面的代码吧):

实现以下内容:
1. 生成一个随机数
2. 按照下面规则进行输出:
如果随机数小于0.05,那么输出变量level输出固定字符串"SSR",输出变量prompt输出固定字符串"一个可爱的宠物,天使形象,有两只洁白的翅膀,头戴橄榄叶,手拿魔法棒,面带微笑,非常阳光。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物";
如果随机数大于0.25,那么输出变量level输出固定字符串"R",输出变量prompt输出固定字符串"一个朴素小宠物,可爱,圆滚滚的,大眼睛,毛茸茸的。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物";
其他情况输出变量level输出固定字符串"SR",输出变量prompt输出固定字符串"一个邪恶的宠物,魔鬼形象,黑色羽毛的翅膀,鹰爪,头上有红色的牛角,手拿火棍,面露狰狞,十分恐怖。画风参考著名动画片《神奇宝贝》,宠物形象随机任何动物或植物"。

生成宠物形象

使用coze自带的文生图工具text2image插件即可

宠物形象描述文字生成

使用图片理解插件imgUnderstand

生成宠物的名字

这里我借鉴了鸟山明给七龙珠人物起名的逻辑,使用蔬菜名字的中文译名反过来来给随即生成的宠物命名。

比如:西红柿——&gt;tomato——&gt;托马特——&gt;特马托

使用的节点是大模型节点:

提示词:

请随机生成一个蔬菜名称,该名称是先将蔬菜的英文名倒过来(反念),然后将倒过来的英文名称按中文发音规则进行音译,得到的名字应该是这个音译的中文名称。输出这个中文名字。
#限制
- 只输出最后的中文名字
- 不要说其他任何的话和解释

生成宠物小传/技能/使命

调用了前面节点的两个数据:

  1. 生成的宠物形象描述文字(来自图片理解插件),命名为figure
  2. 随机生成的宠物名字(来自生成宠物名字的节点),命名为name

提示词(如果给到格式的例子,输出会更稳定):

#角色
你现在是一个神奇宠物小传创作大师,可以根据神奇宠物的名字{{name}}和神奇宠物的外形描述{{figure}}生成对应神奇宠物身世经历和特殊战斗技能。
#技能
技能1:对神奇宠物小传内容加以润色,描述清楚这只神奇宠物的身世故事。
技能2:根据神奇宠物小传,赋予这只神奇宠物战斗技能。
示例:
“### 神奇宠物小传
 
包包是一只与众不同的神奇宠物,外形酷似一只金毛猎犬,但其身体却如热狗般修长。这只特别的宠物有着神奇的身世故事和非凡的天赋。
 
包包出生在一片神秘的森林中,这片森林充满了魔法和奇幻生物。据传说,包包是由森林之神赐予的礼物,目的是带给世界和平与欢乐。包包从小就展现出非凡的魔法天赋,这些天赋不仅让它在森林中备受喜爱,也让它成为守护森林和平的象征。
 
### 战斗技能
 
包包拥有四项强大的战斗技能,每一项都能在战斗中发挥关键作用:
 
1. **治愈之光**:包包可以释放出一道治愈的光芒,能够迅速治愈自己和同伴的伤口,让他们在战斗中恢复元气。这道光芒不仅能治愈肉体上的创伤,还能抚平心灵的伤痛。
 
2. **瞬间移动**:包包能够在瞬间移动到任何它想去的地方,无论是躲避敌人的攻击,还是快速接近目标。这项技能让包包在战斗中变得难以捉摸,敌人往往还没反应过来就已经落入了包包的陷阱。
 
3. **语言通晓**:包包能够理解和使用任何语言,这使它在战斗中可以与各种生物交流,甚至说服敌人停止战斗。包包通过这种能力,常常能化解一场即将爆发的冲突,将战争转化为和平谈判。
 
4. **食物生成**:包包可以凭空生成各种美味的食物,不仅能在战斗后恢复体力,还能用食物来吸引和安抚敌人。许多敌人在品尝了包包的美食后,都不忍再对它出手,反而成为了它的朋友。
 
### 包包的使命
 
包包的使命是利用它的魔法天赋和善良的心灵,带给世界更多的和平与欢乐。无论是治愈伤痛、化解纷争,还是用美食拉近人与人之间的距离,包包始终以它独特的方式在世界各地传播着爱与温暖。每一个遇到包包的人都会被它的魅力所感染,深深地感受到来自这只神奇宠物的纯真与善良。”
#限制:
- 严格按照示例格式输出。
- 字数限制500字以内。
- 首段落前需要空4字符。
- 仅返回文字,不返回其他字符。

整理输出

引用了前面节点的四个数据:

  1. 属性等级level
  2. 宠物名字那么
  3. 宠物形象图片链接image_url
  4. 人物小传/技能/使命文本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. 只有当召唤师输入特定动物或植物名称时,才会调用“特定召唤”工作流
  3. 否则,引导召唤师输入特定动物或植物名称,然后再调用“特定召唤”工作流

具体流程图如下:

工作流实现

选择器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%)

快捷指令

为了方便召唤师一键选择,因此这里设置了两个快捷指令:

  1. 随机召唤:一键调用“随机召唤”工作流
  1. 特定召唤:输入特定宠物种类,一键调用“特定召唤”工作流

语音

凭爱好选择即可,我喜欢阳光甜妹,哈哈哈

🐣

以上就是搭建“神奇宠物诞生器”的全部过程了,希望能帮你找到童年久违的热血!

去吧!皮卡丘!

作者:小王子Roy

关注小王子Roy视频号吧