Intent.java 2.8 KB
package com.xly.agent;

import java.util.ArrayList;
import java.util.List;

/**
 * 第 0 阶段「意图 + 实体」抽取结果(架构 §5 的 intent gate)。
 *
 * <p>由 {@code IntentService} 用受约束 JSON 一次得出:把一句自然语言压成
 * {意图, 单据/实体类型, 带业务角色的实体清单, 还缺什么}。下游据此做**确定性路由**:
 * 新增→确定性表单、操作已有单据→写槽位抽取+确定性 proposeWrite、查询/其他→ReAct agent。
 * 具体写动作(update/invalid/examine…)由路由层从原话推出,不在门里细分。
 */
public class Intent {

    /** 操作意图(4 类)。 */
    public static final String QUERY = "查询";
    public static final String CREATE = "新增";
    public static final String OPERATE = "操作已有单据";
    public static final String OTHER = "其他";

    public static class Entity {
        public String value;
        public String role; // 客户/产品/物料/供应商/数量/尺寸/日期/金额/其他/未知
        public Entity() {}
        public Entity(String value, String role) { this.value = value; this.role = role; }
    }

    /** 写操作(修改/删除/审核)的专用槽位:比通用 entities 更贴合 propose* 工具的入参。 */
    public static class WriteSlots {
        public String entityType = ""; // 记录所属实体:客户/供应商/物料/产品/单据…
        public String record = "";     // 要操作的记录名(公司名/物料名/单号)
        public String field = "";      // 要修改的字段中文名(删除/审核留空)
        public String newValue = "";   // 修改后的新值(删除/审核留空)
    }

    public String intent = OTHER;
    public String danju = "";              // 单据/实体类型,如 报价/客户/物料/销售订单
    public List<Entity> entities = new ArrayList<>();
    public List<String> missing = new ArrayList<>(); // 完成该意图还缺的关键信息

    /** 取某业务角色的第一个实体值(如「客户」「产品」),没有则返回 null。 */
    public String firstValueByRole(String role) {
        for (Entity e : entities) {
            if (e != null && role.equals(e.role) && e.value != null && !e.value.isBlank()) {
                return e.value.trim();
            }
        }
        return null;
    }

    /** 所有实体值拼接(用于给下游 agent 做 grounding 描述)。 */
    public String describeEntities() {
        StringBuilder sb = new StringBuilder();
        for (Entity e : entities) {
            if (e == null || e.value == null || e.value.isBlank()) continue;
            if (sb.length() > 0) sb.append(",");
            sb.append(e.value).append("(").append(e.role == null ? "未知" : e.role).append(")");
        }
        return sb.toString();
    }
}