Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DND game agent #220

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion docs/guidebook/zh/2_2_3_集成的工具.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,22 @@ metadata:
headers 发送请求需要使用的 http的header,
json_parse 输入参数是否需要是要HTTP解析,POST请求时需要设置为True,GET请求需要设置为False
response_content_type http请求结果的解析方式,设置为json时,会返回json结果,设置为text时会返回text结果
该工具可以直接使用,无需任何keys
该工具可以直接使用,无需任何keys

## 4.文生图工具
### 4.1 GenImageTool
[工具地址](../../../sample_standard_app/app/core/tool/gen_image_tool.yaml)
该工具可以基于语段生成图片:
```yaml
name: 'gen_image_tool'
description: '使用该工具可以通过输入一段描述来生成一张图片。
```'
tool_type: 'api'
input_keys: ['input']
metadata:
type: 'TOOL'
module: 'sample_standard_app.app.core.tool.gen_image_tool'
class: 'GenImageTool'
```

该工具可以直接使用,无需任何key,但是为了系统安全,请不要在生产环境使用该工具,使用可参考[gen_image_bot agent](../../../sample_standard_app/app/examples/tool/gen_image_bot.py).
120 changes: 120 additions & 0 deletions docs/guidebook/zh/7_1_1_DND游戏生成案例.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# DND游戏生成案例
## 案例说明
本案例基于DndGamePlanner,搭建了一个生成DND文字冒险游戏的案例。

该案例基于千问大模型和`goolge_search`功能,使用前需要您在环境变量中配置`DASHSCOPE_API_KEY`、`SERPER_API_KEY`。

## 快速开始
### 配置API密钥
比如在agentUniverse管理私有密钥配置的文件`custom_key.toml`中配置密钥信息(讨论组默认使用qwen作为基座模型,serper作为google search工具)
```toml
[KEY_LIST]
# serper google search key
SERPER_API_KEY='xxx'
# openai api key
DASHSCOPE_API_KEY='xxx'
```

### 创建Agent
![dnd_structure](../../../sample_standard_app/app/resources/dnd_structure.jpg)
[demo_dnd_game_agent](../../../sample_standard_app/app/core/agent/dnd_game_case/demo_dnd_game_agent.yaml)
```yaml
info:
name: 'demo_dnd_game_agent'
description: '一位dnd游戏裁判员,可以引导玩家开始一场dnd游戏'
profile:
introduction: 你是一位dnd游戏裁判员,可以引导玩家开始一场dnd游戏。
target: 你的目标是生成dnd游戏背景,引导玩家选择职业。
instruction: |
游戏开始前,先让玩家选择职业(野蛮人、牧师、德鲁伊、战士、游侠、游荡者、术士、邪术士、法师、吟游诗人、圣武士):
- 从上述11个职业中随机选取3个职业,生成人物设定。
- 人物设定包括人物姓名、年龄、性别、职业、家庭背景、个人性格特点、个人经历等信息。
- 人物设定字数不超过200字。

llm_model:
name: 'qwen_llm'
model_name: 'qwen-max'
plan:
planner:
name: 'dnd_game_planner'
participant:
name:
- 'gen_plot_agent'
action:
tool:
- 'google_search_tool'
memory:
name: 'demo_memory'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.dnd_game_case.demo_dnd_game_agent'
class: 'DndGameAgent'
```
[gen_plot_agent](../../../sample_standard_app/app/core/agent/dnd_game_case/gen_plot_agent.yaml)
```yaml
info:
name: 'gen_plot_agent'
description: '一位dnd游戏编剧,可以生成剧情引导玩家进行行动'
profile:
introduction: 你是一位dnd游戏裁判员,可以引导玩家开始一场dnd游戏。
target: 你的目标是随机生成dnd游戏的背景信息和事件,并根据背景信息、玩家每一轮的历史选择继续游戏进程。
instruction: |
玩家已经选择了职业,接下来你来生成游戏随机场景和事件,玩家根据你的描述选择行动:
1. 请详细描述场景中所有的物品、生物,如果场景中有人物在对话或和玩家对话,请把对话内容完整输出来。
2. 如果玩家和场景中的生物互动,请把互动过程详细描述出来。
3. 不要出现重复的场景或对话,故事要要曲折离奇、高潮迭起。
4. 每个场景中至少有一个事件,事件可以是触发的对话、互动、战斗、探索、解谜等。
5. 场景和事件要与玩家的选择相关联,玩家的选择会影响游戏进程。
6. 玩家的职业可以影响游戏进程,每个职业有不同的能力、背景和任务。

## 事件设计原则
1. 注重趣味性,这主要体现在游戏中的语气,请保持轻松、幽默、诙谐的语气。
2. 注重故事性,让玩家在游戏中体验角色的成长和变化,以提高玩家的沉浸感和游戏的连续性。
3. 注重适应性学习,游戏根据玩家的表现和选择,调整难度和内容,提供个性化的关卡和行为选项。
4. 游戏控制在10轮以内,超过7轮时注意加快游戏进程。

历史剧情和玩家选择:
{chat_history}

玩家上一轮的选择是:{choice}

接下来请生成游戏场景,标题中同时包含中文和英文标题:
场景n:中文描述<english description>
背景描述:
物品:
生物:
事件:
对话:
玩家的选择:
llm_model:
name: 'qwen_llm'
model_name: 'qwen-max'
plan:
planner:
name: 'rag_planner'
action:
tool:
- 'google_search_tool'
memory:
name: 'demo_memory'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.dnd_game_case.gen_plot_agent'
class: 'GenPlotAgent'
```

这里使用了google_search_tool与python_runner两个工具,相关工具代码链接如下:
- [google_search_tool](../../../sample_standard_app/app/core/tool/google_search_tool.yaml)

### 代码运行
测试用例运行
直接使用测试代码运行[dnd_game_bot](../../../sample_standard_app/app/examples/dnd_game_bot.py)

### 执行结果
职业选择:
![dnd_example1](../../../sample_standard_app/app/resources/dnd_example1.jpg)

随机事件:
![dnd_example2](../../../sample_standard_app/app/resources/dnd_example2.jpg)
![dnd_example3](../../../sample_standard_app/app/resources/dnd_example3.jpg)
![dnd_example4](../../../sample_standard_app/app/resources/dnd_example4.jpg)
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# !/usr/bin/env python3
# -*- coding:utf-8 -*-

# @Time : 2024/12/15 12:42
# @Author : xutingdong
# @Email : [email protected]
# @FileName: demo_dnd_game_agent.py
from agentuniverse.agent.agent import Agent
from agentuniverse.agent.input_object import InputObject


class DndGameAgent(Agent):
def input_keys(self) -> list[str]:
return ['input']

def output_keys(self) -> list[str]:
return ['output']

def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
agent_input['input'] = input_object.get_data('input')
return agent_input

def parse_result(self, planner_result: dict) -> dict:
return planner_result
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
info:
name: 'demo_dnd_game_agent'
description: '一位dnd游戏裁判员,可以引导玩家开始一场dnd游戏'
profile:
introduction: 你是一位dnd游戏裁判员,可以引导玩家开始一场dnd游戏。
target: 你的目标是生成dnd游戏背景,引导玩家选择职业。
instruction: |
游戏开始前,先让玩家选择职业(野蛮人、牧师、德鲁伊、战士、游侠、游荡者、术士、邪术士、法师、吟游诗人、圣武士):
- 从上述11个职业中随机选取3个职业,生成人物设定。
- 人物设定包括人物姓名、年龄、性别、职业、家庭背景、个人性格特点、个人经历等信息。
- 人物设定字数不超过200字。

llm_model:
name: 'qwen_llm'
model_name: 'qwen-max'
plan:
planner:
name: 'dnd_game_planner'
participant:
name:
- 'gen_plot_agent'
action:
tool:
- 'google_search_tool'
memory:
name: 'demo_memory'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.dnd_game_case.demo_dnd_game_agent'
class: 'DndGameAgent'
24 changes: 24 additions & 0 deletions sample_standard_app/app/core/agent/dnd_game_case/gen_plot_agent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# !/usr/bin/env python3
# -*- coding:utf-8 -*-

# @Time : 2024/12/15 12:42
# @Author : xutingdong
# @Email : [email protected]
# @FileName: demo_dnd_game_agent.py
from agentuniverse.agent.agent import Agent
from agentuniverse.agent.input_object import InputObject


class GenPlotAgent(Agent):
def input_keys(self) -> list[str]:
return ['choice']

def output_keys(self) -> list[str]:
return ['output']

def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
agent_input['choice'] = input_object.get_data('choice')
return agent_input

def parse_result(self, planner_result: dict) -> dict:
return planner_result
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
info:
name: 'gen_plot_agent'
description: '一位dnd游戏编剧,可以生成剧情引导玩家进行行动'
profile:
introduction: 你是一位dnd游戏裁判员,可以引导玩家开始一场dnd游戏。
target: 你的目标是随机生成dnd游戏的背景信息和事件,并根据背景信息、玩家每一轮的历史选择继续游戏进程。
instruction: |
玩家已经选择了职业,接下来你来生成游戏随机场景和事件,玩家根据你的描述选择行动:
1. 请详细描述场景中所有的物品、生物,如果场景中有人物在对话或和玩家对话,请把对话内容完整输出来。
2. 如果玩家和场景中的生物互动,请把互动过程详细描述出来。
3. 不要出现重复的场景或对话,故事要要曲折离奇、高潮迭起。
4. 每个场景中至少有一个事件,事件可以是触发的对话、互动、战斗、探索、解谜等。
5. 场景和事件要与玩家的选择相关联,玩家的选择会影响游戏进程。
6. 玩家的职业可以影响游戏进程,每个职业有不同的能力、背景和任务。

## 事件设计原则
1. 注重趣味性,这主要体现在游戏中的语气,请保持轻松、幽默、诙谐的语气。
2. 注重故事性,让玩家在游戏中体验角色的成长和变化,以提高玩家的沉浸感和游戏的连续性。
3. 注重适应性学习,游戏根据玩家的表现和选择,调整难度和内容,提供个性化的关卡和行为选项。
4. 游戏控制在10轮以内,超过7轮时注意加快游戏进程。

历史剧情和玩家选择:
{chat_history}

玩家上一轮的选择是:{choice}

接下来请生成游戏场景,标题中同时包含中文和英文标题:
场景n:中文描述<english description>
背景描述:
物品:
生物:
事件:
对话:
玩家的选择:
llm_model:
name: 'qwen_llm'
model_name: 'qwen-max'
plan:
planner:
name: 'rag_planner'
action:
tool:
- 'google_search_tool'
memory:
name: 'demo_memory'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.dnd_game_case.gen_plot_agent'
class: 'GenPlotAgent'
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# !/usr/bin/env python3
# -*- coding:utf-8 -*-

# @Time : 2024/12/03 19:10
# @Author : xutingdong
# @Email : [email protected]
# @FileName: demo_gen_image_agent.py

from agentuniverse.agent.agent import Agent
from agentuniverse.agent.input_object import InputObject
from agentuniverse.agent.action.tool.tool_manager import ToolManager


class GenImageAgent(Agent):
def input_keys(self) -> list[str]:
return ['input']

def output_keys(self) -> list[str]:
return ['output']

def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
agent_input['input'] = input_object.get_data('input')
return agent_input

def parse_result(self, planner_result: dict) -> dict:
return {'output': ''}

def execute(self, input_object: InputObject, agent_input: dict) -> dict:
action: dict = self.agent_model.action or dict()
tools: list = action.get('tool') or list()
for tool_name in tools:
tool = ToolManager().get_instance_obj(tool_name)
if tool is None:
continue
tool.run(**input_object.to_dict())
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
info:
name: 'demo_gen_image_agent'
description: 'gen image agent'
action:
tool:
- 'gen_image_tool'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.gen_image_case.demo_gen_image_agent'
class: 'GenImageAgent'
Empty file.
Loading