第12章 专属SubAgent, 处理旅游规划专业Skills
12-1 行程规划Agent挂裁Skills

远程智能体就是行程规划智能体它是如何能够将skills这个专业流程挂载到自己的智能体上。 我们看一下官方文档https://java.agentscope.io/zh/task/agent-skill.html,agentscope它是如何将这个skill挂载到智能体里面的,创建skills有3中方式。这里通过读取文件的方式,通过**SkillBox中的registerSkill方法**来注册,通过**ReActAgent中的skillBox来挂载技能**。
@Component
public class TripPlannerAgent {
@Bean
public ReActAgent getTripPlannerAgent() {
//构建Skitl
SkillBox skillBox = new SkillBox();
// 以文件形式读取Skitl.md
AgentSkillRepository repo = new FileSystemSkillRepository(Path.of("./skills"));
//景点推荐技能
AgentSkill SuggestSightsSkill = repo.getSkill("Suggest_Sights");
//表格制作技能
AgentSkill MakeATableSkill = repo.getSkill("Make_A_Table")
skillBox.registerSkill(SuggestSightsSkill);
skillBox.registerSkill(MakeATableSkill);
//行程规划Agent Builder
ReActAgent.Builder builder = AgentUtils
.getReActAgentBuilder("TripPlannerAgent", "擅长处理景点行程规划")
//挂载Skitls
.skillBox(skillBox);
return builder.build();
}
}在远程的行程规划智能体下resources/skills目录下有两个skills的文件夹Suggest_Sights和Make_A_Table
12-2 有限预算内规划精彩旅行的Skills
编写景点推荐技能Suggest_Sights在resources/skills创建:
Suggest_Sights/
├── SKILL.md # 必需: 入口文件,包含 YAML frontmatter 和指令
├── references/ # 可选: 详细参考文档。主要存放的一些知识类的文件,例如这个技能需要用到一些酒店的信息,那么这里的酒店的一些参考信息。
└── scripts/ # 可选: 可执行脚本,存放一些脚本文件,通过API去查询一些内容的脚本
└── weather_check.py # 查询当地天气的脚本编写SKILL.md内容
---
name: Suggest-Sights
description: 擅长在有限预算内规划出精彩的旅行体验
---
## 核心能力
### 1.免费景点推荐
- 推荐自然风光、历史古迹、特色街区
- 提供最佳游览时间和小众路线
- 分享避开人群的技巧
### 2.美食探索
- 推荐当地特色小吃和地道餐厅
- 侧重性价比高的本地美食
- 分享当地人常去的隐瞒美食店
### 3.打卡点推荐
- 推荐网红打卡点和拍照圣地
- 分享小众但出片的秘密景点
### 4. 住宿建议
提供住宿方案:
- **经济型**:青旅、民宿
- **舒适型**:连锁酒店
### 工作流程
1. **分析规划**:综合考虑距离、时间、费用、景点分布因素
2. **方案输出**:提供景点推荐、美食指南、住宿方案
## 回答原则
1. **务实优先**:所有建议要考虑实际可行性和经济性
2. **信息准确**:提供具体的地址、价格区间、开放时间
3. **因地制宜**:根据季节、天气给出适当的建议12-3 表格制作Skills
根据官方文档Classpath 仓库 (只读)加载
用于从 classpath 资源中加载预打包的 Skills (只读)。自动兼容标准 JAR 和 Spring Boot Fat JAR。
try (ClasspathSkillRepository repository = new ClasspathSkillRepository("skills")) {
AgentSkill skill = repository.getSkill("data-analysis");
List<AgentSkill> allSkills = repository.getAllSkills();
} catch //...资源目录结构: src/main/resources/skills/ 下放置多个 Skill 子目录,每个子目录包含 SKILL.md
注意:
JarSkillRepositoryAdapter已废弃,请使用ClasspathSkillRepository。
所以这里使用(1.0.8)使用JarSkillRepositoryAdapter
// 以文件形式读取Skill.md
JarSkillRepositoryAdapter repo = new JarSkillRepositoryAdapter("skills");
//景点推荐技能
AgentSkill SuggestSightsSkill = repo.getSkill(name:"Suggest_Sights");
//表格制作技能
AgentSkill MakeATableSkill = repo.getSkill(name:"Make_A_Table")
....有赞Skills聚合平: https://skill0.io/zh
import pandas as pd
# Read Excel
df = pd.read_excel('file.xlsx') # Default: first sheet
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # All sheets as dict
# Analyze
df.head() # Preview data
df.info() # Column info
df.describe() # Statistics
# Write Excel
df.to_excel('output.xlsx', index=False)编写SKILL.md内容
---
name: Make-A-Table
description: 电子表格工具集(.xlsx/.csv格式),用于电子表格处理与分析。
---
## 核心能力
### 1.创建表格
### 2.编辑表格
### 3.公式与格式设置
### 4.数据分析12-4 Skills实现Agent工具的渐进式加裁

通过SkillBox实现工具和skill渐进式加裁
/**
* description: 行程规划Agent
*/
@Component
public class TripPlannerAgent {
@Bean
public ReActAgent getTripPlannerAgent() {
Toolkit toolkit = new Toolkit();
//构建Skill,并将工具包和Skill结合
SkillBox skillBox = new SkillBox(toolkit);
....
// 可以通过这种方式注册工具和skill,这里的Calculate是一个Tools工具
skillBox.registration().tool(new Calculate())://.skill()
//行程规划Agent Builder
ReActAgent.Builder builder = AgentUtils
.getReActAgentBuilder("TripPlannerAgent", "擅长处理景点行程规划")
//挂载工具包
.toolkit(toolkit)
//挂载Skills
.skillBox(skillBox);
return builder.build();
}12-5 景点推荐SubAgent执行景点推荐任务

在行程规划智能体下需要一个子智能体,这里的景点推荐技能Skills和mcp都是挂载在这个子智能体下的,所有这里的行程规划智能体需要修改,先建立子智能体
创建子智能体参考文档: Agent as Tool:https://java.agentscope.io/zh/task/agent-as-tool.html,推荐使用 lambda 表达式,确保每次调用创建新实例。
/**
* 景点推荐Agent
*/
public class SuggestSightsAgent {
//创建景点推荐Agent
public ReActAgent getSuggestSightAgent() {
Toolkit toolkit = new Toolkit();
//构建Skill,并将工具包和Skill结合
SkillBox skillBox = new SkillBox(toolkit);
// 以文件形式读取Skill.md
JarSkillRepositoryAdapter repo = null;
try {
repo = new JarSkillRepositoryAdapter("skills");
} catch (IOException e) {
throw new RuntimeException(e);
}
//景点推荐技能
AgentSkill SuggestSightsSkill = repo.getSkill("Suggest_Sights");
//表格制作技能
// AgentSkill MakeATableSkill = repo.getSkill("Make_A_Table");
skillBox.registerSkill(SuggestSightsSkill);
// skillBox.registerSkill(MakeATableSkill);
// 可以通过这种方式注册工具和skill,这里的Calculate是一个Tools工具
// skillBox.registration().tool(new Calculate()).skill();
ReActAgent.Builder builder = AgentUtils
.getReActAgentBuilder("SuggestSightAgent", "擅长景点推荐")
//挂载工具包
.toolkit(toolkit)
//挂载Skills
.skillBox(skillBox);
return builder.build();
}
}再修改行程规划智能体
@Component
public class TripPlannerAgent {
@Bean
public ReActAgent getTripPlannerAgent() {
Toolkit toolkit = new Toolkit();
SuggestSightsAgent suggestSightsAgent = new SuggestSightsAgent();
//将智能体(子Agent)作为工具
toolkit.registration().subAgent(() -> suggestSightsAgent.getSuggestSightAgent()).apply();
//行程规划Agent Builder
ReActAgent.Builder builder = AgentUtils
.getReActAgentBuilder("TripPlannerAgent", "擅长处理景点行程规划")
.toolkit(toolkit);
return builder.build();
}
}