feat(leave): 裸意图直达表单 + 按身份分离请假表单 + 下拉代取通道
build / build-push (push) Successful in 51s

- 新增 IntentShortcut:说「我要请假」这类只有意图的短句时,
  编排器在调模型前先做窄匹配(去空白标点 + 剥前后缀后正好等于标准说法、
  且原句 ≤12 字),命中即直接下发表单并跳过 LLM,消除「偶尔不准」。
- 请假拆两个工具:leave.submit(type=2 学生申请,待审核)与
  leave.register(type=1 教师帮助登记,免审,必填 classId+stuId)。
  RolePolicy 分别归入 STUDENT_ONLY / STAFF_ONLY,模型视野里只有一个。
- ToolDef.fixed 由 Map<String,String> 改为 Map<String,Object>:
  type/continuousLeave 必须按数字下发,字符串会被模块侧 Jackson 判非法。
- ToolParam/FormField 新增 optionsKeys(valueKey,labelKey) 与 dependsOn:
  下拉改为下发 BrowserCall optionCall(含 {{占位符}}),由前端带用户登录态
  代取后按 valueKey/labelKey 映射;stuId 依赖 classId,选完班级才解锁。
  ToolExecutor#prepareOptionCall 不做必填校验,只拼占位查询串。
- 修 leave.types/myClasses/classStudents 描述,明确「填表时不要先调它」。
- README:4.2 能力划分更新 + 新增「请假为何分两个工具」;5.1 增加
  5.1.0 裸意图直达(含身份对照表)与表单 JSON 示例。
- 测试:新增 IntentDirectFormTest(5)、LeaveIntentFormTest(9),
  以「被调用即失败」的假 LLM 断言「我要请假」不经过大模型;
  RolePermissionTest 补 leave.submit/register 的互斥断言。全量 62/62 通过。
This commit is contained in:
lijing
2026-10-12 17:49:55 +08:00
parent 61a3000bee
commit c11d331371
12 changed files with 896 additions and 46 deletions
@@ -49,4 +49,24 @@ public class FormField {
/** 下拉选项 [{value,label}] */
private List<Map<String, String>> options = new ArrayList<>();
/* ==================== 动态选项(浏览器代取 + 联动) ==================== */
/**
* 「浏览器代取选项」的调用描述:业务模块的字典接口(班级、学生名单…)只认浏览器 CAS 会话,
* 服务端代取必然 302,所以把地址下发前端,由前端用**用户自己的登录态**取回原始字典再渲染下拉。
*
* <p>地址串里可能含 {@code {{字段名}}} 占位符(见 {@link #dependsOn}),
* 前端在依赖字段有值时做替换(值需 URL 编码)后才发起请求。
*/
private com.yunhai.agent.model.BrowserToolRequest.BrowserCall optionCall;
/** 本字段选项依赖的先序字段名(如「学生」依赖「班级」);依赖未填时前端应清空并提示先选 */
private List<String> dependsOn = new ArrayList<>();
/** 从字典返回对象里取哪个字段作为选项「值」(如 classId / stuId) */
private String valueKey;
/** 从字典返回对象里取哪个字段作为选项「显示名」(如 className / stuName) */
private String labelKey;
}