feat(web): AI 意图规划置信度阈值与动作策略细化
- workbenchAiIntentPlannerModel 新增 WORKBENCH_AI_INTENT_CONFIDENCE_THRESHOLD 与 isLowConfidenceTravelApplicationPlan,shouldRequestWorkbenchAiIntentPlan 增加业务关键词前置过滤 - resolveExecutableTravelApplicationPlan 区分 requestedSubmit 与提交确认(submitRequiresConfirmation),autoSubmit 不再直接置真 - workbenchIntentActionPolicy 改用 policyDecision 路由(need_confirmation/query_candidates),透传 riskLevel/requiresSelection/requiresConfirmation - workbenchIntentFrameModel 补充 query 动作识别,usePersonalWorkbenchAiMode/useWorkbenchAiActionRouter/useWorkbenchAiApplicationPreviewFlow 接入低置信度与确认流程 - 更新 intent-planner-model/intent-frame-model/application-gate-model/fast-preview 测试
This commit is contained in:
@@ -22,6 +22,12 @@ test('workbench intent frame resolves contextual draft deletion as confirm-only
|
||||
assert.equal(frame?.objectType, 'draft')
|
||||
assert.equal(frame?.targetMode, 'current_context')
|
||||
assert.equal(frame?.safetyLevel, 'confirm_required')
|
||||
assert.equal(frame?.riskLevel, 'high')
|
||||
assert.equal(frame?.requiresCandidateSearch, false)
|
||||
assert.equal(frame?.requiresSelection, false)
|
||||
assert.equal(frame?.requiresConfirmation, true)
|
||||
assert.equal(frame?.executionMode, 'need_confirmation')
|
||||
assert.equal(frame?.policyDecision, 'need_confirmation')
|
||||
assert.equal(frame?.filters.status?.label, '草稿')
|
||||
assert.equal(frame?.normalizedQuery, '我的草稿单据')
|
||||
})
|
||||
@@ -34,11 +40,19 @@ test('workbench intent frame sends filtered draft deletion to candidate search',
|
||||
assert.equal(frame?.objectType, 'draft')
|
||||
assert.equal(frame?.targetMode, 'filtered_candidates')
|
||||
assert.equal(frame?.safetyLevel, 'confirm_required')
|
||||
assert.equal(frame?.riskLevel, 'high')
|
||||
assert.equal(frame?.requiresCandidateSearch, true)
|
||||
assert.equal(frame?.requiresSelection, true)
|
||||
assert.equal(frame?.requiresConfirmation, true)
|
||||
assert.equal(frame?.executionMode, 'query_candidates')
|
||||
assert.equal(frame?.policyDecision, 'query_candidates')
|
||||
assert.equal(frame?.filters.timeRange?.start, '2026-06-21')
|
||||
assert.equal(frame?.filters.timeRange?.end, '2026-06-21')
|
||||
assert.equal(frame?.normalizedQuery, '我的 3天前 草稿单据')
|
||||
assert.equal(route.nextStep, 'query_candidates')
|
||||
assert.equal(route.queryPrompt, '我的 3天前 草稿单据')
|
||||
assert.equal(route.requiresSelection, true)
|
||||
assert.equal(route.requiresConfirmation, true)
|
||||
})
|
||||
|
||||
test('workbench intent frame preserves application draft deletion filters', () => {
|
||||
@@ -52,6 +66,11 @@ test('workbench intent frame preserves application draft deletion filters', () =
|
||||
assert.equal(frame?.filters.status?.label, '草稿')
|
||||
assert.equal(frame?.targetMode, 'filtered_candidates')
|
||||
assert.equal(frame?.safetyLevel, 'confirm_required')
|
||||
assert.equal(frame?.riskLevel, 'high')
|
||||
assert.equal(frame?.requiresCandidateSearch, true)
|
||||
assert.equal(frame?.requiresSelection, true)
|
||||
assert.equal(frame?.requiresConfirmation, true)
|
||||
assert.equal(frame?.executionMode, 'query_candidates')
|
||||
assert.equal(route.queryPrompt, '我的 草稿 申请单')
|
||||
assert.equal(queryIntent?.source, 'mine')
|
||||
assert.equal(queryIntent?.documentType, 'application')
|
||||
@@ -99,11 +118,19 @@ test('workbench intent frame resolves compliant no-risk approval request as filt
|
||||
assert.equal(frame?.objectType, 'application')
|
||||
assert.equal(frame?.targetMode, 'filtered_candidates')
|
||||
assert.equal(frame?.safetyLevel, 'confirm_required')
|
||||
assert.equal(frame?.riskLevel, 'high')
|
||||
assert.equal(frame?.requiresCandidateSearch, true)
|
||||
assert.equal(frame?.requiresSelection, true)
|
||||
assert.equal(frame?.requiresConfirmation, true)
|
||||
assert.equal(frame?.executionMode, 'query_candidates')
|
||||
assert.equal(frame?.policyDecision, 'query_candidates')
|
||||
assert.equal(frame?.filters.risk?.level, 'none')
|
||||
assert.equal(frame?.filters.documentType, 'application')
|
||||
assert.equal(frame?.normalizedQuery, '待我审核 无风险 申请单')
|
||||
assert.equal(route.nextStep, 'query_candidates')
|
||||
assert.equal(route.queryPrompt, '待我审核 无风险 申请单')
|
||||
assert.equal(route.requiresSelection, true)
|
||||
assert.equal(route.requiresConfirmation, true)
|
||||
})
|
||||
|
||||
test('workbench intent frame keeps approval policy questions out of document actions', () => {
|
||||
@@ -112,5 +139,30 @@ test('workbench intent frame keeps approval policy questions out of document act
|
||||
|
||||
assert.equal(frame?.action, 'ask_policy')
|
||||
assert.equal(frame?.safetyLevel, 'read_only')
|
||||
assert.equal(frame?.riskLevel, 'read_only')
|
||||
assert.equal(frame?.requiresCandidateSearch, false)
|
||||
assert.equal(frame?.requiresSelection, false)
|
||||
assert.equal(frame?.requiresConfirmation, false)
|
||||
assert.equal(frame?.executionMode, 'answer_only')
|
||||
assert.equal(frame?.policyDecision, 'answer_only')
|
||||
assert.equal(route.nextStep, 'pass_through')
|
||||
})
|
||||
|
||||
test('workbench intent frame keeps rules as policy guardrails instead of executable side effects', () => {
|
||||
const highRiskFrame = resolveWorkbenchIntentFrame('审核合规没有风险的申请', { today })
|
||||
const highRiskRoute = resolveWorkbenchIntentActionRoute(highRiskFrame)
|
||||
const queryFrame = resolveWorkbenchIntentFrame('查3天前的申请单', { today })
|
||||
const queryRoute = resolveWorkbenchIntentActionRoute(queryFrame)
|
||||
|
||||
assert.equal(highRiskFrame?.policyDecision, 'query_candidates')
|
||||
assert.equal(highRiskFrame?.requiresSelection, true)
|
||||
assert.equal(highRiskFrame?.requiresConfirmation, true)
|
||||
assert.notEqual(highRiskRoute.nextStep, 'execute_allowed')
|
||||
|
||||
assert.equal(queryFrame?.riskLevel, 'read_only')
|
||||
assert.equal(queryFrame?.requiresCandidateSearch, true)
|
||||
assert.equal(queryFrame?.requiresSelection, false)
|
||||
assert.equal(queryFrame?.requiresConfirmation, false)
|
||||
assert.equal(queryFrame?.policyDecision, 'query_candidates')
|
||||
assert.equal(queryRoute.nextStep, 'query_candidates')
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user