SkillTool.java
1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.xly.tool;
import com.xly.service.SkillService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* Skill 加载工具(架构 §6,渐进披露)。
*
* <p>system prompt 里只常驻 Skill 的「name + 何时用」摘要;当用户的需求命中某个 Skill 时,agent 调
* {@code load_skill(name)} 拉取该 Skill 的完整 playbook(详细步骤 + 建议工具)再照做。Skill 是无状态、
* 全局的,因此本工具是单例。
*/
@Component
public class SkillTool {
private final SkillService skills;
public SkillTool(SkillService skills) {
this.skills = skills;
}
@Tool("加载某个业务 Skill(playbook)的完整操作指南。当用户的需求匹配 system prompt 中列出的某个 Skill 名时,"
+ "先调用它拿到详细步骤,再按步骤用其它工具完成。入参 = Skill 名称(如 新建报价 / 月度对账 / 库存查询)。")
public String loadSkill(@P("Skill 名称") String name) {
Map<String, Object> s = skills.load(name);
if (s == null) {
return "没有找到名为「" + name + "」的 Skill。可用的 Skill 见系统提示里的清单。";
}
String instr = String.valueOf(s.get("sInstructions"));
Object suggested = s.get("sSuggested");
StringBuilder sb = new StringBuilder();
sb.append("【Skill:").append(s.get("sName")).append("】\n").append(instr);
if (suggested != null && !String.valueOf(suggested).isBlank()) {
sb.append("\n建议用到的工具:").append(suggested);
}
return sb.toString();
}
}