feat(agents): v1.0 post-completion re-evaluation with forceReassess parameter

When users correct or update personal info after assessment completion,
Coordinator can now re-run run_professional_assessment with forceReassess: true
to bypass the 30-day dedup and produce an updated report.

Changes:
- Add forceReassess boolean param to run_professional_assessment tool definition
- Skip already_assessed check when forceReassess=true in handler
- Add prompt rules for identifying info corrections and triggering re-evaluation
- Document the re-evaluation flow in sections 3.5 and 4.4

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-08 17:30:24 -08:00
parent a72e718510
commit aa9f31ff20
3 changed files with 27 additions and 4 deletions

View File

@ -493,6 +493,7 @@ invoke_assessment_expert 仅用于内部快速分析,结果不保存,不作
- userInfo agenationalityeducation_levelwork_experience_years
- targetCategories
- conversationContext
- forceReassess**** true30
- ** status **
- **payment_required** generate_payment
- **info_incomplete** missingFieldLabels
@ -643,7 +644,7 @@ run_professional_assessment 会返回带 status 字段的结果,按以下方
3. **status: 'already_assessed'** 30
-
- existingReport
- 30
- 使 forceReassess: true
4. **status: 'completed'**
-
@ -663,6 +664,17 @@ run_professional_assessment 会返回带 status 字段的结果,按以下方
b. **create_timeline**
3. "我已经为您生成了材料准备清单和申请时间规划,供您参考。"
****
"其实我工作经验是12年不是10年""我忘了说我有博士学位"
1. ****
2. **** run_professional_assessment** userInfo** **forceReassess: true**
3. ****"您提供了新的信息,我正在用更新后的资料为您重新评估……"
4. 线
5. ****
****

View File

@ -544,6 +544,12 @@ export const DIRECT_TOOLS: ToolDefinition[] = [
type: 'string',
description: '最近几轮对话的简要摘要,帮助评估专家理解背景',
},
forceReassess: {
type: 'boolean',
description:
'强制重新评估(仅当用户在评估完成后更正了个人信息时使用)。' +
'设为 true 时跳过30天限制用更新后的信息重新评估。',
},
},
required: ['userInfo'],
},

View File

@ -1437,16 +1437,17 @@ export class ImmigrationToolsService {
context: ConversationContext,
onProgress?: (text: string) => void,
): Promise<unknown> {
const { userInfo, targetCategories, conversationContext } = input as {
const { userInfo, targetCategories, conversationContext, forceReassess } = input as {
userInfo: Record<string, unknown>;
targetCategories?: string[];
conversationContext?: string;
forceReassess?: boolean;
};
const tenantId = this.tenantContext.getCurrentTenantId() || '';
const userId = context.userId;
console.log(`[Tool:run_professional_assessment] User ${userId} - Starting assessment pipeline`);
console.log(`[Tool:run_professional_assessment] User ${userId} - Starting assessment pipeline (force=${!!forceReassess})`);
// ── Step 1: Check existing assessment ──
const existingReport = await this.artifactRepo.findOne({
@ -1454,7 +1455,7 @@ export class ImmigrationToolsService {
order: { updatedAt: 'DESC' },
});
if (existingReport) {
if (existingReport && !forceReassess) {
const daysSinceReport = (Date.now() - existingReport.updatedAt.getTime()) / (1000 * 60 * 60 * 24);
if (daysSinceReport < 30) {
@ -1475,6 +1476,10 @@ export class ImmigrationToolsService {
console.log(`[Tool:run_professional_assessment] Existing report is ${daysSinceReport.toFixed(1)} days old, allowing re-assessment`);
}
if (forceReassess && existingReport) {
console.log(`[Tool:run_professional_assessment] Force re-assessment requested — skipping 30-day check`);
}
// ── Step 2: Validate payment ──
if (!this.paymentClient) {
return {