124 lines
3.4 KiB
Go
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 "其他"
|
|
}
|
|
}
|