diff --git a/docs/architecture/m-ai-08-learning-analysis-migration-contract.md b/docs/architecture/m-ai-08-learning-analysis-migration-contract.md new file mode 100644 index 0000000..da41783 --- /dev/null +++ b/docs/architecture/m-ai-08-learning-analysis-migration-contract.md @@ -0,0 +1,462 @@ +# M-AI-08 学习综合分析迁移契约 + +> 审计日期:2026-06-22 +> 契约状态:冻结(待 M-AI-08-01 验收) +> 对应里程碑:M-AI-08 学习综合分析、学习建议与 AI 迁移闭环 + +--- + +## 目录 + +1. [当前链路审计](#1-当前链路审计) +2. [目标链路](#2-目标链路) +3. [数据源矩阵](#3-数据源矩阵) +4. [聚合窗口](#4-聚合窗口) +5. [Snapshot Schema](#5-snapshot-schema) +6. [Output Schema](#6-output-schema) +7. [Evidence Schema](#7-evidence-schema) +8. [触发模型](#8-触发模型) +9. [幂等契约](#9-幂等契约) +10. [Artifact 矩阵](#10-artifact-矩阵) +11. [权限与隐私](#11-权限与隐私) +12. [Feature Flag](#12-feature-flag) +13. [回滚流程](#13-回滚流程) +14. [架构异常与不确定项](#14-架构异常与不确定项) + +--- + +## 1. 当前链路审计 + +### 1.1 四种 Runtime 作业类型 + +| Job Type | 产出实体 | promptVersion | outputSchemaVersion | 现状 | +|----------|---------|---------------|---------------------|------| +| `learning_state_analysis` | AiLearningAnalysis | learning_state_v1 | analysis_output_v1 | Runtime 轮询 | +| `weak_point_analysis` | WeakPointCandidate | weak_point_v1 | weak_point_output_v1 | Runtime 轮询 | +| `next_action_planning` | NextActionRecommendation | next_action_v1 | next_action_output_v1 | Runtime 轮询 | +| `flashcard_generation` | Flashcard | flashcard_gen_v1 | flashcard_output_v1 | Runtime 轮询 | + +### 1.2 当前时序(Runtime 轮询路径) + +```text +POST /api/ai/jobs { jobType: "learning_state_analysis", targetType, targetId } +→ UserAiService.createAnalysisJob() + `src/modules/ai-runtime/user-ai.service.ts:199` + ├─ settings 检查 (:201-206) + ├─ jobType 验证 (:210-214) + ├─ 幂等检查 (:225-233) + ├─ 配额+预算 (:252-267) + ├─ SnapshotBuilderService.buildSnapshot() (:270) + │ `src/modules/ai-runtime/snapshot-builder.service.ts:75` + │ ├─ fetchBehaviorData() — DailyLearningActivity, LearningSession + │ ├─ aggregateProgress() — MaterialReadingProgress + │ ├─ aggregateContent() — KnowledgeItem(可选) + │ ├─ calculateScores() — Quiz/Review/ActiveRecall/Feynman metrics + │ ├─ computeSignals() — engagement/consistency/streaks/patterns + │ └─ buildDeviceContext() — 平台/时区/设备 + ├─ PriorityRulesService.computeJobPriority() (:279) + └─ aiRuntimeJob.create (:282-299) + +外部 Runtime 轮询 +→ POST /internal/runtime/jobs/poll → pollJobs() (:22) +→ POST /internal/runtime/jobs/:id/lock → lockJob() (:85) +→ GET /internal/runtime/jobs/:id/snapshot → getSnapshot() (:153) +→ Runtime 执行 AI 调用(prompt/schema 外部管理) +→ POST /internal/runtime/jobs/:id/result → submitResult() (:220) + └─ persistResult() (:286) + ├─ learning_state_analysis → AiLearningAnalysis.create (:295-311) + ├─ weak_point_analysis → WeakPointCandidate.create (:313-337) + └─ next_action_planning → NextActionRecommendation.create (:339-365) +``` + +### 1.3 数据模型 + +**AiLearningAnalysis** (`schema.prisma:2173-2194`): +```text +id, userId, jobId, snapshotId, targetType, targetId, +learningState, summary, riskLevel, confidence, evidence (Json), +nextActionIds (Json), promptVersion, schemaVersion +``` + +**WeakPointCandidate** (`schema.prisma:2198-2216`): +```text +id, userId, jobId, snapshotId, targetType, targetId, +knowledgePointId, title, reason, confidence, evidence (Json), +status (active/resolved) +``` + +**NextActionRecommendation** (`schema.prisma:2220-2239`): +```text +id, userId, jobId, snapshotId, actionType, targetType, targetId, +title, reason, priority, estimatedMinutes, deviceSuitability, +status (active/resolved) +``` + +**LearningAnalysisSnapshot** (`schema.prisma:2058-2083`): +```text +id, userId, scopeType, scopeId, snapshotVersion, sourceDataVersion, +privacyScope, userProfile, aiSettings, deviceContext, +learningBehaviorSummary, materialProgressSummary, contentStructureSummary, +behaviorSignals, scoreSignals, constraints, allowedModelFields +``` + +### 1.4 拓扑(冻结) + +审计确认:`learning_state_analysis`、`weak_point_analysis`、`next_action_planning` 三者**各自独立调用模型**,由外部 Runtime 分别执行。 + +**M-AI-08 迁移决策**:将三者合并为一个 `learning_analysis` Job,一次模型调用同时产出综合分析 + 薄弱点 + 建议。 + +```text +单一 learning_analysis Job + → 一次 AiGateway 调用 + → LearningAnalysisProjector + → AiLearningAnalysis(综合分析) + → WeakPointCandidate × N(薄弱点) + → NextActionRecommendation × N(建议) + → AiJobArtifact × N +``` + +`flashcard_generation` 保持独立(不属于"学习分析"范畴)。 + +### 1.5 数据来源分类 + +| 数据 | 来源 | 可信度 | Snapshot 处理 | +|------|------|:---:|------| +| userId | JWT | 可信 | 直接包含 | +| learningGoal | UserLearningProfile | 可信 | 直接包含 | +| dailyAvailableMinutes | UserLearningProfile | 可信 | 聚合 | +| qualityPreference | UserAiSettings | 可信 | 直接包含 | +| 学习时长 | DailyLearningActivity | 可信 | **仅聚合后进入** | +| 活跃天数 | DailyLearningActivity | 可信 | 聚合指标 | +| 复习完成率 | ReviewCard + ReviewLog | 可信 | 聚合指标 | +| Quiz 正确率 | QuizAttempt | 可信 | 聚合指标 | +| Active Recall 表现 | AiAnalysisResult | 可信 | 聚合指标 | +| Feynman 弱点 | FocusItem + AiAnalysisResult | 可信 | 聚合指标 | +| 知识点进度 | KnowledgeItem + MaterialReadingProgress | 可信 | 列表(限量+截断) | +| 设备/时区 | DeviceContext(服务端推断) | 可信 | 直接包含 | +| 学习时长(客户端声明) | — | **不可信** | **禁止进入** | +| 掌握度(客户端声明) | — | **不可信** | **禁止进入** | +| JWT / API Key | Request Header | — | **禁止进入** | +| 完整对话历史 | — | — | **禁止进入** | + +### 1.6 副作用矩阵 + +| 副作用 | 当前 | Unified | +|--------|------|---------| +| 配额消耗 | quota.incrementJobCount | 保持 | +| UsageLog | Runtime 记录 | Engine 记录 | +| 更新用户画像 | 否 | 否 | +| 更新知识点掌握度 | 否 | 否 | +| 创建通知 | 否 | 否 | +| 自动生成复习卡 | 否 | 否 | +| 自动执行建议 | 否 | 否(禁止) | +| Snapshot 创建 | SnapshotBuilderService | SnapshotBuilder(复用) | + +--- + +## 2. 目标链路 + +```text +手动/定时触发 +→ LearningAnalysisExecutionRouter + ├─ [legacy] → UserAiService.createAnalysisJob() + └─ [unified] → + LearningAnalysisSnapshotBuilder.build() + → AiJobCreationService.createJob() + → Job + Snapshot + Outbox + → BullMQ (ai-background) + → Worker → AiJobExecutionEngine + EXECUTE: LearningAnalysisExecutor (AiGateway) + VALIDATE: SchemaValidator + EvidenceValidator + BusinessValidator + PROJECT: LearningAnalysisProjector + → AiLearningAnalysis + WeakPointCandidate × N + + NextActionRecommendation × N + Artifact + → markSucceeded +``` + +--- + +## 3. 数据源矩阵 + +| 数据源 | Prisma 模型 | Snapshot 包含方式 | +|--------|-----------|-----------------| +| 用户学习目标 | UserLearningProfile | 直接字段 | +| AI 设置 | UserAiSettings | 直接字段 | +| 每日学习活动 | DailyLearningActivity | 聚合(totalDuration/activeDays/sessionCount) | +| 学习会话 | LearningSession | 聚合(avgSessionDuration/completionRate) | +| 阅读进度 | MaterialReadingProgress | 列表(限量 50,仅标题+进度) | +| 知识项 | KnowledgeItem | 列表(限量 200,仅标题+摘要) | +| 复习记录 | ReviewCard + ReviewLog | 聚合(dueCount/completedCount/accuracy/overdue) | +| Quiz 结果 | QuizAttempt + QuizAnswer | 聚合(accuracy/byType/byKnowledgeItem) | +| Active Recall | AiAnalysisResult | 聚合(count/avgScore/weaknesses) | +| Feynman 评估 | AiAnalysisResult + FocusItem | 聚合(count/weaknesses/focusItems) | +| 设备上下文 | 服务端推断 | 直接字段(platform/timezone) | +| 连续学习 | StreakRecord | 聚合指标 | + +--- + +## 4. 聚合窗口 + +| 参数 | 默认值 | 说明 | +|------|--------|------| +| windowStart | 请求时确定 | Snapshot 固定,不漂移 | +| windowEnd | 请求时确定 | 与 windowStart 配对 | +| timezone | 服务端推断 | 用户设备时区 | +| sourceCutoffAt | 请求时 | 数据截止时间 | +| aggregationVersion | 语义版本 | 算法版本,变化时重新分析 | +| 行为窗口 | 7 天 | 学习行为数据 | +| 成绩窗口 | 30 天 | Quiz/复习/Active Recall 成绩 | + +--- + +## 5. Snapshot Schema + +```typescript +interface LearningAnalysisSnapshot { + schemaVersion: string; // "learning-analysis-v1" + snapshot: { + userId: string; + triggerType: 'manual' | 'scheduled'; + operationId: string; + windowStart: string; // ISO8601 + windowEnd: string; + timezone: string; // IANA + aggregationVersion: string; + sourceCutoffAt: string; + + learningGoal?: string; + qualityPreference?: string; + dailyAvailableMinutes?: number; + + studyMetrics: { + totalStudyDuration: number; + activeDays: number; + sessionCount: number; + averageSessionDuration: number; + completionRate: number; + }; + + reviewMetrics: { + reviewDueCount: number; + reviewCompletedCount: number; + reviewAccuracy: number; + overdueCount: number; + retentionTrend: number; // -1 to 1 + }; + + quizMetrics: { + quizCount: number; + attemptCount: number; + accuracy: number; + accuracyByQuestionType: Record; + }; + + activeRecallMetrics: { + count: number; + avgScore: number; + weaknessCount: number; + }; + + feynmanMetrics: { + count: number; + weaknessCount: number; + focusItemCount: number; + }; + + knowledgeProgress: { + totalItems: number; + completedItems: number; + inProgressItems: number; + weakItems: Array<{ id: string; title: string }>; + }; + + dataQuality: { + availableSources: string[]; + missingSources: string[]; + sampleSize: number; + coverageStart?: string; + coverageEnd?: string; + insufficientDataReasons: string[]; + }; + + promptKey: string; + promptVersion: string; + modelTier: string; + inputSchemaVersion: string; + outputSchemaVersion: string; + createdAt: string; + }; +} +``` + +--- + +## 6. Output Schema + +```typescript +interface LearningAnalysisOutput { + summary: string; + strengths: Array<{ + title: string; + description: string; + evidenceRefs: EvidenceRef[]; + }>; + weaknesses: Array<{ + title: string; + description: string; + knowledgePointId?: string; + evidenceRefs: EvidenceRef[]; + }>; + trends: Array<{ + metricKey: string; + direction: 'improving' | 'declining' | 'stable'; + description: string; + evidenceRefs: EvidenceRef[]; + }>; + risks: Array<{ + title: string; + severity: 'low' | 'medium' | 'high'; + description: string; + evidenceRefs: EvidenceRef[]; + }>; + recommendations: Array<{ + actionType: string; + title: string; + reason: string; + priority: number; + estimatedMinutes?: number; + targetType?: string; + targetId?: string; + evidenceRefs: EvidenceRef[]; + }>; + confidence: number; // 0.0-1.0 + dataQuality: { + overall: 'sufficient' | 'limited' | 'insufficient'; + }; + insufficientData: boolean; +} +``` + +--- + +## 7. Evidence Schema + +每个结论必须附带 evidenceRefs: + +```typescript +interface EvidenceRef { + sourceType: 'study_metric' | 'review_metric' | 'quiz_metric' + | 'active_recall' | 'feynman' | 'knowledge_progress'; + metricKey: string; // e.g. "reviewAccuracy", "quizAccuracy" + entityId?: string; // knowledgeItemId / quizId / analysisResultId + windowStart: string; + windowEnd: string; +} +``` + +--- + +## 8. 触发模型 + +| 触发类型 | 幂等键 | 说明 | +|---------|--------|------| +| manual | `learning-analysis:manual:` | 用户手动触发,同一操作重试相同 Job | +| scheduled | `learning-analysis:scheduled::::` | 定时触发,同一窗口唯一 | + +--- + +## 9. 幂等契约 + +### 请求级 +- 同一 operationId → 同一 Job +- 同一 scheduled window → 同一 Job +- 禁止 Date.now()/random 回退 + +### 投影级 +- analysisId = deterministic(jobId) +- recommendationId = deterministic(jobId + ordinal) +- 入口 Artifact 检查 + P2002 catch + +--- + +## 10. Artifact 矩阵 + +| 实体 | artifactType | artifactId | +|------|-------------|-----------| +| AiLearningAnalysis | `learning_analysis` | analysis.id | +| WeakPointCandidate | `weak_point` | candidate.id | +| NextActionRecommendation | `recommendation` | recommendation.id | +| Flashcard (单独) | `flashcard` | flashcard.id | + +注:M-AI-02 已冻结 `learning_analysis`、`recommendation` 等 artifactType。 + +--- + +## 11. 权限与隐私 + +- 所有数据必须属于同一 userId +- 禁止其他用户数据进入 Snapshot +- 禁止跨用户 evidenceRefs +- 公开错误不泄漏 Snapshot/validatedOutput +- Admin 可查看所有(现有权限制) + +--- + +## 12. Feature Flag + +```text +Flag Name: LEARNING_ANALYSIS_ENGINE_MODE +Values: legacy | unified +Default: legacy +``` + +--- + +## 13. 回滚流程 + +```text +unified → legacy: + 1. 修改 Flag → legacy + 2. 新触发走 Legacy Runtime 轮询 + 3. 已创建 Unified Job 继续完成 + 4. 已生成分析保留 + 5. 无需数据库回滚 +``` + +--- + +## 14. 架构异常与不确定项 + +### 阻塞项 + +| # | 异常 | 说明 | 处理 | +|---|------|------|------| +| A1 | 无 learning_state/weak_point/next_action Prompt 模板 | 当前由 Runtime 管理 | M-AI-08-03 需新增内联 Prompt | +| A2 | 无对应 Output Schema | 同上 | M-AI-08-03 需新增 Zod Schema | +| A3 | flashcard_generation prompt/schema 缺失 | 同 Quiz 模式 | 延期或并入 M-AI-08 | + +### 不确定项 + +| 项 | 问题 | 建议 | +|----|------|------| +| 三个 Job Type 合并策略 | 当前三者独立,合并为一个 learning_analysis 需验证业务合理性 | M-AI-08-01 中确认后冻结 | +| flashcard_generation 归属 | 语义上更接近 Quiz 生成而非学习分析 | 建议纳入 M-AI-08 作为独立 Definition | + +--- + +## 附录:关键文件索引 + +| 用途 | 路径 | 关键行号 | +|------|------|---------| +| 分析入口 | `src/modules/ai-runtime/user-ai.service.ts` | `:199` createAnalysisJob, `:11-17` JOB_TYPE_CONFIG | +| Runtime 持久化 | `src/modules/ai-runtime/internal/runtime-internal.service.ts` | `:286` persistResult, `:295-365` 四种类型分支 | +| Snapshot 构建 | `src/modules/ai-runtime/snapshot-builder.service.ts` | `:75` buildSnapshot, `:259` aggregateBehavior | +| Priority 规则 | `src/modules/ai-runtime/priority-rules.service.ts` | `:45` computePriorityRules | +| AiLearningAnalysis | `prisma/schema.prisma` | `:2173-2194` | +| WeakPointCandidate | `prisma/schema.prisma` | `:2198-2216` | +| NextActionRecommendation | `prisma/schema.prisma` | `:2220-2239` | +| LearningAnalysisSnapshot | `prisma/schema.prisma` | `:2058-2083` | +| UserLearningProfile | `prisma/schema.prisma` | `:1912-1932` | +| UserAiSettings | `prisma/schema.prisma` | `:1936-1953` | +| 学习趋势 Workflow | `src/modules/ai/workflows/learning-trend.workflow.ts` | `:30` execute | +| 学习趋势 Prompt | `src/modules/ai/prompts/learning-trend.prompt.ts` | `:1` system prompt | diff --git a/docs/architecture/m-ai-migration-inventory.md b/docs/architecture/m-ai-migration-inventory.md new file mode 100644 index 0000000..7676492 --- /dev/null +++ b/docs/architecture/m-ai-migration-inventory.md @@ -0,0 +1,109 @@ +# M-AI 迁移盘点:AI Workflow 全量清单 + +> 审计日期:2026-06-22 +> 基线:M-AI-07 PASS(commit `ec2379e`) + +--- + +## 一、全量 AI Workflow 清单 + +| # | Workflow | 公开入口 | 模型调用方 | 当前执行方式 | 已迁移 | 里程碑 | 后续处理 | +|---|----------|---------|-----------|-------------|:---:|--------|---------| +| 1 | Active Recall 分析 | `POST /ai-analysis` / `POST /active-recalls/:id/submit` | ActiveRecallExecutor / AiAnalysisWorker | Unified Engine + 旧 Worker 双路径 | ✅ | M-AI-04 | 旧 Worker 待退役 | +| 2 | Feynman 评估 | `POST /ai-analysis/feynman` | FeynmanExecutor / AiAnalysisWorker | Unified Engine + 旧 Worker 双路径 | ✅ | M-AI-05 | 旧 Worker 待退役 | +| 3 | ReviewCard 生成 | `POST /ai/analysis/feynman`(子Job) | ReviewCardGenerationExecutor / ReviewCardGenerationWorkflow | Unified Child Job + Legacy EventBus 双路径 | ✅ | M-AI-06 | 旧 Subscriber 待退役 | +| 4 | Quiz 生成 | `POST /api/ai/jobs`(jobType=quiz_generation) | QuizGenerationExecutor / 外部 Runtime | Unified Engine + 旧 Runtime 轮询双路径 | ✅ | M-AI-07 | 旧 Runtime 待退役 | +| 5 | **学习状态分析** | `POST /api/ai/jobs`(jobType=learning_state_analysis) | **外部 Runtime** | 旧 Runtime 轮询 → aiRuntimeJob 表 | ❌ | **M-AI-08** | 本批迁移 | +| 6 | **薄弱点分析** | `POST /api/ai/jobs`(jobType=weak_point_analysis) | **外部 Runtime** | 旧 Runtime 轮询 → aiRuntimeJob 表 | ❌ | **M-AI-08** | 本批迁移 | +| 7 | **下一步行动规划** | `POST /api/ai/jobs`(jobType=next_action_planning) | **外部 Runtime** | 旧 Runtime 轮询 → aiRuntimeJob 表 | ❌ | **M-AI-08** | 本批迁移 | +| 8 | **闪卡生成** | `POST /api/ai/jobs`(jobType=flashcard_generation) | **外部 Runtime** | 旧 Runtime 轮询 → Flashcard | ❌ | **M-AI-08** | 本批迁移 | +| 9 | 学习趋势分析 | `GET /api/activity/trend` | LearningTrendWorkflow → AiGateway | Legacy Workflow 直接调用 AiGateway | ❌ | 延期 | 非核心首版功能 | +| 10 | 知识导入 | `POST /api/knowledge-bases/:kbId/items/import` | KnowledgeImportWorkflow → AiGateway | Legacy Workflow 直接调用 AiGateway | ❌ | 延期 | 非核心首版功能 | +| 11 | RAG 聊天 | WebSocket / `POST /api/rag-chat` | RagChatService → AiGateway | 独立服务,不在 Job Engine 中 | ❌ | 延期 | 独立系统,非 Job 模型 | +| 12 | 向量 Rerank | 内部(RAG 管道) | VectorService → AiGateway | 独立服务调用 | ❌ | 延期 | 独立系统,非 Job 模型 | +| 13 | Admin Hermes Chat | Admin 内部 | AdminAiChatService → 直接 HTTP | 绕过 AiGateway(直接 fetch) | ❌ | 延期 | Admin 工具,非生产用户路径 | +| 14 | Synthetic Job | 测试 | SyntheticResultProjector → Engine | Unified Engine(NODE_ENV=test) | ✅ | M-AI-03 | 测试工具 | +| 15 | Legacy AiAnalysisWorker | BullMQ ai-analysis 队列 | ActiveRecallAnalysisWorkflow / FeynmanEvaluationWorkflow → AiGateway | 旧 Worker(双路径中的 Legacy 分支) | ⚠️ | M-AI-04/05 | 保留至 Legacy 退役 | +| 16 | ReviewCardSubscriber | EventBus ai.analysis.completed | ReviewCardGenerationWorkflow → AiGateway | EventBus 订阅(Legacy 分支) | ⚠️ | M-AI-06 | 保留至 Legacy 退役 | + +--- + +## 二、分类汇总 + +### 已迁移(6) + +| # | Workflow | Milestone | +|---|----------|-----------| +| 1 | Active Recall | M-AI-04 | +| 2 | Feynman | M-AI-05 | +| 3 | ReviewCard | M-AI-06 | +| 4 | Quiz | M-AI-07 | +| 14 | Synthetic | M-AI-03 | +| * | (Engine 基础设施) | M-AI-03 | + +### M-AI-08 范围(4) + +| # | Workflow | 当前模型 | 当前数据表 | 优先级 | +|---|----------|---------|-----------|--------| +| 5 | learning_state_analysis | 外部 Runtime | AiLearningAnalysis | 高 | +| 6 | weak_point_analysis | 外部 Runtime | WeakPointCandidate | 高 | +| 7 | next_action_planning | 外部 Runtime | NextActionRecommendation | 高 | +| 8 | flashcard_generation | 外部 Runtime | Flashcard | 中 | + +这四个作业类型均通过外部 Runtime 轮询机制执行,使用 `AiRuntimeJob` 表而非统一 `AiJob` 表。需要内联 Prompt/Schema 并通过 AiGateway 调用。 + +### 明确延期(5) + +| # | Workflow | 原因 | +|---|----------|------| +| 9 | 学习趋势 | 短期可视化,非核心分析 | +| 10 | 知识导入 | 独立功能链 | +| 11 | RAG 聊天 | 独立系统,非 Job 模型 | +| 12 | 向量 Rerank | 独立管道 | +| 13 | Admin Chat | Admin 工具 | + +### 待退役(2) + +| # | Workflow | 何时退役 | +|---|----------|---------| +| 15 | Legacy AiAnalysisWorker | M-AI-09 Heavy Runtime 退场 | +| 16 | ReviewCardSubscriber (Legacy) | M-AI-09 Heavy Runtime 退场 | + +--- + +## 三、闭环判定 + +### 核心生产 AI Workflow 状态 + +```text +已迁移到 Unified Engine: 6 个 +M-AI-08 范围内(本批): 4 个 +明确延期(非阻塞): 5 个 +待退役(Legacy 双路径): 2 个 +───────────────────────────────── +总计: 17 个 +``` + +### 判定 + +``` +M-AI-08 是否为最后一个核心业务迁移里程碑:是 + +理由: +- M-AI-08 覆盖剩余 4 个核心生产 AI Workflow(均通过 Runtime 轮询) +- 延期的 5 个为非核心/独立系统,不阻塞业务迁移主线 +- Legacy 双路径(Active Recall/Feynman)在 Engine 层面已完成迁移, + 仅待 M-AI-09 退役旧 Worker +``` + +--- + +## 四、未登记模型调用检查 + +| 检查项 | 状态 | 证据 | +|--------|:--:|------| +| 是否存在未登记的生产模型调用 | **否** | 全部 17 个 Workflow 已盘点 | +| 是否存在 Controller 直连 Provider | **否** | 所有调用通过 AiGateway 或外部 Runtime | +| 是否存在 Service 绕过 AiGateway | **仅 Admin Chat** | Admin 工具,非生产用户路径 | +| 是否存在生产 Worker 绕过统一 Job | **Runtime 4 个** | 本批 M-AI-08 迁移 | +| 是否存在无主人的 Legacy AI Queue | **ai-analysis** | 仍有双路径,M-AI-09 退役 |