SkillTool.java 1.71 KB
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();
    }
}