Files
Agent-System/internal/ctxmgr/category.go
T

124 lines
3.4 KiB
Go

package ctxmgr
import (
"strings"
)
// Category 常量定义
const (
CategoryMilestone = "milestone"
CategoryFile = "file"
CategoryReview = "review"
CategoryTask = "task"
CategoryConsult = "consult"
CategoryCasual = "casual"
CategorySystem = "system"
CategoryUncategorized = "uncategorized"
)
// IntentCategoryMap 意图到分类的标准映射表 (Single Source of Truth)
var IntentCategoryMap = map[string]string{
"CASUAL_CHAT": CategoryCasual,
"TRIGGER_TASK": CategoryTask,
"ADVANCE_STAGE": CategoryTask,
"TRIGGER_ADHOC_TASK": CategoryTask,
"CONFIRM_ACTION": CategoryTask,
"EXECUTE_STAGE_ADVANCE": CategoryTask,
"DOCGOV_CLAIM": CategoryReview,
"DOCGOV_SUBMIT_REVIEW": CategoryReview,
"DOCGOV_REVIEW_APPROVE": CategoryReview,
"DOCGOV_REVIEW_REJECT": CategoryReview,
"DOCGOV_FINAL_APPROVE": CategoryReview,
"DOCGOV_FINAL_REJECT": CategoryReview,
"DOCGOV_PROPOSAL_DECIDE": CategoryReview,
"QUERY_PROGRESS": CategoryConsult,
"SUPPLEMENT_INFO": CategoryConsult,
"QUERY_REGULATIONS": CategoryConsult,
"QUERY_SIMILAR_CASES": CategoryConsult,
"QUERY_USER_RIGHTS": CategoryConsult,
"QUERY_REJECT_REASON": CategoryConsult,
"DECLINE_EXPECTATION": CategoryConsult,
"SECURITY_FORBIDDEN": CategorySystem,
}
// DeriveMessageCategory 根据消息元信息与意图推导分类 (按优先级短路)
func DeriveMessageCategory(role, intentStr, branch string, meta map[string]any) string {
if meta != nil {
// 1. milestone: 里程碑节点
if mVal, ok := meta["milestone"]; ok {
if b, ok := mVal.(bool); ok && b {
return CategoryMilestone
}
}
// 2. file: 附件上传/导出/下载
if _, ok := meta["attachments"]; ok {
return CategoryFile
}
if fOp, ok := meta["file_op"].(string); ok {
switch fOp {
case "upload", "export", "download":
return CategoryFile
}
}
// 3. review: 包含交互卡片 (驳回门禁/确认卡片)
if _, ok := meta["interactive_card"]; ok {
return CategoryReview
}
// 4. task: 包含任务启动请求
if _, ok := meta["task_request"]; ok {
return CategoryTask
}
// 若外部传入 intent 为空或 uncategorized,优先从 meta["turn_intent"] 继承本轮主意图
if (intentStr == "" || intentStr == "uncategorized") && meta["turn_intent"] != nil {
if ti, ok := meta["turn_intent"].(string); ok && ti != "" {
intentStr = ti
}
}
}
// 5. 根据标准映射表匹配意图
if cat, ok := IntentCategoryMap[intentStr]; ok {
return cat
}
// 6. 兜底匹配:DOCGOV 系列统归 review
if strings.HasPrefix(intentStr, "DOCGOV") {
return CategoryReview
}
// 7. 兜底匹配:模糊引导与参谋摘要归 consult
if branch == "AMBIGUOUS_FALLBACK" || intentStr == "ADVISOR_BRIEF" {
return CategoryConsult
}
// 8. system 角色通知统归 system
if role == "system" {
return CategorySystem
}
return CategoryUncategorized
}
// GetCategoryLabel 返回分类的标准展示中文标签 (单一事实源定稿词表)
func GetCategoryLabel(cat string) string {
switch cat {
case CategoryMilestone:
return "关键节点"
case CategoryReview:
return "审批流转"
case CategoryTask:
return "任务执行"
case CategoryFile:
return "文件收发"
case CategoryConsult:
return "业务咨询"
case CategoryCasual:
return "日常闲聊"
case CategorySystem:
return "系统通知"
default:
return "其他"
}
}