hydro-ai-helper 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +10 -0
  2. package/dist/constants/updateChannel.js +44 -0
  3. package/dist/constants/updateChannel.js.map +1 -0
  4. package/dist/handlers/adminConfigHandler.js +30 -0
  5. package/dist/handlers/adminConfigHandler.js.map +1 -1
  6. package/dist/handlers/batchSummaryHandler.js +15 -8
  7. package/dist/handlers/batchSummaryHandler.js.map +1 -1
  8. package/dist/handlers/studentHandler.js +1 -1
  9. package/dist/handlers/studentHandler.js.map +1 -1
  10. package/dist/handlers/teachingSummaryHandler.js +38 -9
  11. package/dist/handlers/teachingSummaryHandler.js.map +1 -1
  12. package/dist/handlers/versionHandler.js +2 -1
  13. package/dist/handlers/versionHandler.js.map +1 -1
  14. package/dist/index.js +3 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/models/aiConfig.js +15 -2
  17. package/dist/models/aiConfig.js.map +1 -1
  18. package/dist/models/studentSummary.js +13 -0
  19. package/dist/models/studentSummary.js.map +1 -1
  20. package/dist/models/teachingSummary.js +2 -0
  21. package/dist/models/teachingSummary.js.map +1 -1
  22. package/dist/services/analyzers/errorClusterAnalyzer.js +1 -0
  23. package/dist/services/analyzers/errorClusterAnalyzer.js.map +1 -1
  24. package/dist/services/analyzers/findingConsolidator.js +172 -0
  25. package/dist/services/analyzers/findingConsolidator.js.map +1 -0
  26. package/dist/services/batchSummaryService.js +85 -51
  27. package/dist/services/batchSummaryService.js.map +1 -1
  28. package/dist/services/openaiClient.js +59 -28
  29. package/dist/services/openaiClient.js.map +1 -1
  30. package/dist/services/promptService.js +49 -24
  31. package/dist/services/promptService.js.map +1 -1
  32. package/dist/services/teachingAnalysisService.js +13 -2
  33. package/dist/services/teachingAnalysisService.js.map +1 -1
  34. package/dist/services/teachingSuggestionService.js +43 -44
  35. package/dist/services/teachingSuggestionService.js.map +1 -1
  36. package/dist/services/telemetryService.js +8 -1
  37. package/dist/services/telemetryService.js.map +1 -1
  38. package/dist/services/updateService.js +106 -11
  39. package/dist/services/updateService.js.map +1 -1
  40. package/dist/services/versionService.js +88 -61
  41. package/dist/services/versionService.js.map +1 -1
  42. package/dist/utils/semver.js +75 -0
  43. package/dist/utils/semver.js.map +1 -0
  44. package/frontend/admin/BudgetConfigForm.tsx +1 -1
  45. package/frontend/admin/ConfigPanel.tsx +53 -3
  46. package/frontend/admin/EndpointManager.tsx +1 -1
  47. package/frontend/admin/FeedbackForm.tsx +1 -1
  48. package/frontend/admin/JailbreakLogsViewer.tsx +1 -1
  49. package/frontend/admin/ScenarioModelSelector.tsx +238 -0
  50. package/frontend/admin/TelemetrySettings.tsx +1 -1
  51. package/frontend/admin/VersionBadge.tsx +26 -1
  52. package/frontend/admin/configTypes.ts +9 -0
  53. package/frontend/batchSummary/BatchSummaryPanel.tsx +29 -1
  54. package/frontend/batchSummary/StudentSummaryView.tsx +47 -14
  55. package/frontend/batchSummary/SummaryCard.tsx +1 -1
  56. package/frontend/batchSummary/useBatchSummary.ts +26 -8
  57. package/frontend/components/AIHelperDashboard.tsx +1 -1
  58. package/frontend/components/ErrorBoundary.tsx +1 -1
  59. package/frontend/components/ScoreboardTabContainer.tsx +1 -1
  60. package/frontend/generated/localeFallback.ts +1502 -0
  61. package/frontend/problem_detail.page.tsx +1 -1
  62. package/frontend/student/AIAssistantPanel.tsx +1 -1
  63. package/frontend/student/ChatInput.tsx +1 -1
  64. package/frontend/student/ChatMessageList.tsx +1 -1
  65. package/frontend/student/ThinkingBlock.tsx +1 -1
  66. package/frontend/student/hooks/useChatSession.ts +1 -1
  67. package/frontend/teacher/AnalyticsPage.tsx +1 -1
  68. package/frontend/teacher/ClassAnalyticsTable.tsx +1 -1
  69. package/frontend/teacher/ConversationDetail.tsx +1 -1
  70. package/frontend/teacher/ConversationDetailModal.tsx +1 -1
  71. package/frontend/teacher/ConversationList.tsx +1 -1
  72. package/frontend/teacher/CostDashboard.tsx +1 -1
  73. package/frontend/teacher/ExportDialog.tsx +1 -1
  74. package/frontend/teacher/MetricsPanel.tsx +1 -1
  75. package/frontend/teacher/ProblemAnalyticsTable.tsx +1 -1
  76. package/frontend/teacher/StudentAnalyticsTable.tsx +1 -1
  77. package/frontend/teacher/analyticsTypes.ts +1 -1
  78. package/frontend/teachingSummary/TeachingReviewPanel.tsx +1 -1
  79. package/frontend/teachingSummary/TeachingSummaryPanel.tsx +525 -175
  80. package/frontend/teachingSummary/useTeachingSummary.ts +10 -0
  81. package/frontend/utils/i18n.ts +32 -0
  82. package/frontend/utils/i18nFallbackCore.ts +30 -0
  83. package/locales/en.yaml +43 -6
  84. package/locales/zh.yaml +43 -6
  85. package/package.json +3 -1
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /**
3
+ * Finding Consolidator — 发现项整合器
4
+ *
5
+ * 规则引擎的 11 个维度常对同一现象从不同角度各出一条发现,教师会看到大量重复内容:
6
+ * commonError 与 errorCluster 对同一题目各出一条、crossCorrelation 把 atRisk 的
7
+ * 学生集合重新切一遍再出一条。本模块在 LLM 调用与前端展示之前做三件事:
8
+ *
9
+ * 1. 合并:同题且学生集合高度重叠的 errorCluster 并入 commonError,
10
+ * 错误签名与代码样本随主发现保留;
11
+ * 2. 折叠:学生集合基本被某个主发现覆盖的 crossCorrelation 降级为该发现的
12
+ * supplements 补充说明,不再单独成条;
13
+ * 3. 排序限量:按严重度 + 影响人数排序,前 MAX_PRIMARY 条为重点问题,
14
+ * 其余标记 isSecondary(前端在"其他观察"中一行带过)。
15
+ * progress(正向进展)不参与排序限量,固定排在最后由前端另行展示。
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.MAX_PRIMARY = void 0;
19
+ exports.consolidateFindings = consolidateFindings;
20
+ exports.MAX_PRIMARY = 5;
21
+ /** errorCluster 并入 commonError 所需的最小学生重叠率(占较小集合的比例) */
22
+ const MERGE_OVERLAP_THRESHOLD = 0.5;
23
+ /** crossCorrelation 折叠为补充说明所需的最小学生包含率 */
24
+ const FOLD_CONTAINMENT_THRESHOLD = 0.8;
25
+ const SEVERITY_RANK = {
26
+ high: 2,
27
+ medium: 1,
28
+ low: 0,
29
+ };
30
+ function overlapRatio(a, b) {
31
+ if (a.length === 0 || b.length === 0)
32
+ return 0;
33
+ const setB = new Set(b);
34
+ let shared = 0;
35
+ for (const uid of a) {
36
+ if (setB.has(uid))
37
+ shared++;
38
+ }
39
+ return shared / Math.min(a.length, b.length);
40
+ }
41
+ /** |a ∩ b| / |a| — a 被 b 覆盖的比例 */
42
+ function containmentRatio(a, b) {
43
+ if (a.length === 0)
44
+ return 0;
45
+ const setB = new Set(b);
46
+ let shared = 0;
47
+ for (const uid of a) {
48
+ if (setB.has(uid))
49
+ shared++;
50
+ }
51
+ return shared / a.length;
52
+ }
53
+ function maxSeverity(a, b) {
54
+ return SEVERITY_RANK[a] >= SEVERITY_RANK[b] ? a : b;
55
+ }
56
+ /** 从错误签名提取状态标签(如 "WA:tests[3,4]" → "WA") */
57
+ function signatureStatusLabel(signature) {
58
+ if (!signature)
59
+ return null;
60
+ const idx = signature.indexOf(':');
61
+ return idx > 0 ? signature.slice(0, idx) : signature;
62
+ }
63
+ function pushSupplement(host, text) {
64
+ if (!host.supplements)
65
+ host.supplements = [];
66
+ if (!host.supplements.includes(text))
67
+ host.supplements.push(text);
68
+ }
69
+ /**
70
+ * Step 1: 将 errorCluster 并入同题、学生高度重叠的 commonError。
71
+ * 优先选择标题含有相同错误状态标签(WA/TLE/...)的宿主。
72
+ */
73
+ function mergeErrorClusters(findings) {
74
+ const commonErrors = findings.filter(f => f.dimension === 'commonError');
75
+ const dropped = new Set();
76
+ for (const cluster of findings) {
77
+ if (cluster.dimension !== 'errorCluster')
78
+ continue;
79
+ const pid = cluster.evidence.affectedProblems[0];
80
+ if (pid === undefined)
81
+ continue;
82
+ const candidates = commonErrors
83
+ .filter(host => host.evidence.affectedProblems.length === 1
84
+ && host.evidence.affectedProblems[0] === pid)
85
+ .map(host => ({
86
+ host,
87
+ overlap: overlapRatio(cluster.evidence.affectedStudents, host.evidence.affectedStudents),
88
+ }))
89
+ .filter(({ overlap }) => overlap >= MERGE_OVERLAP_THRESHOLD);
90
+ if (candidates.length === 0)
91
+ continue;
92
+ // 同状态标签的宿主优先,其次按重叠率
93
+ const statusLabel = signatureStatusLabel(cluster.errorSignature);
94
+ candidates.sort((a, b) => {
95
+ if (statusLabel) {
96
+ const aMatch = a.host.title.includes(statusLabel) ? 1 : 0;
97
+ const bMatch = b.host.title.includes(statusLabel) ? 1 : 0;
98
+ if (aMatch !== bMatch)
99
+ return bMatch - aMatch;
100
+ }
101
+ return b.overlap - a.overlap;
102
+ });
103
+ const host = candidates[0].host;
104
+ host.severity = maxSeverity(host.severity, cluster.severity);
105
+ host.needsDeepDive = host.needsDeepDive || cluster.needsDeepDive;
106
+ if (!host.errorSignature)
107
+ host.errorSignature = cluster.errorSignature;
108
+ if (!host.evidence.samples?.code?.length && cluster.evidence.samples?.code?.length) {
109
+ host.evidence.samples = cluster.evidence.samples;
110
+ }
111
+ const clusterSize = cluster.evidence.affectedStudents.length;
112
+ host.evidence.metrics.sameSignatureCount = clusterSize;
113
+ pushSupplement(host, `${clusterSize} 名学生的最后一次提交失败在同一处(错误签名 ${cluster.errorSignature || '相同错误模式'}),大概率是同一个知识点没讲透`);
114
+ dropped.add(cluster.id);
115
+ }
116
+ return findings.filter(f => !dropped.has(f.id));
117
+ }
118
+ /**
119
+ * Step 2: 学生集合基本被某主发现覆盖的 crossCorrelation 折叠为其补充说明。
120
+ */
121
+ function foldCrossCorrelations(findings) {
122
+ const hosts = findings.filter(f => f.dimension !== 'crossCorrelation' && f.dimension !== 'progress');
123
+ const dropped = new Set();
124
+ for (const cross of findings) {
125
+ if (cross.dimension !== 'crossCorrelation')
126
+ continue;
127
+ if (cross.evidence.affectedStudents.length === 0)
128
+ continue;
129
+ let best = null;
130
+ let bestContainment = 0;
131
+ for (const host of hosts) {
132
+ const containment = containmentRatio(cross.evidence.affectedStudents, host.evidence.affectedStudents);
133
+ if (containment > bestContainment) {
134
+ bestContainment = containment;
135
+ best = host;
136
+ }
137
+ }
138
+ if (best && bestContainment >= FOLD_CONTAINMENT_THRESHOLD) {
139
+ pushSupplement(best, cross.title);
140
+ dropped.add(cross.id);
141
+ }
142
+ }
143
+ return findings.filter(f => !dropped.has(f.id));
144
+ }
145
+ /**
146
+ * Step 3: 排序限量。progress 固定最后且不占重点名额。
147
+ */
148
+ function rankAndCap(findings) {
149
+ const progress = findings.filter(f => f.dimension === 'progress');
150
+ const rest = findings.filter(f => f.dimension !== 'progress');
151
+ rest.sort((a, b) => {
152
+ const sev = SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity];
153
+ if (sev !== 0)
154
+ return sev;
155
+ return b.evidence.affectedStudents.length - a.evidence.affectedStudents.length;
156
+ });
157
+ rest.forEach((f, idx) => {
158
+ if (idx >= exports.MAX_PRIMARY)
159
+ f.isSecondary = true;
160
+ });
161
+ return [...rest, ...progress];
162
+ }
163
+ /**
164
+ * 主入口:合并 → 折叠 → 排序限量。
165
+ * 就地修改传入的 finding 对象(宿主吸收补充信息),返回整合后的新数组。
166
+ */
167
+ function consolidateFindings(findings) {
168
+ const merged = mergeErrorClusters(findings);
169
+ const folded = foldCrossCorrelations(merged);
170
+ return rankAndCap(folded);
171
+ }
172
+ //# sourceMappingURL=findingConsolidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findingConsolidator.js","sourceRoot":"","sources":["../../../src/services/analyzers/findingConsolidator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AA0KH,kDAIC;AA1KY,QAAA,WAAW,GAAG,CAAC,CAAC;AAE7B,uDAAuD;AACvD,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,yCAAyC;AACzC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,MAAM,aAAa,GAAgD;IACjE,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,SAAS,YAAY,CAAC,CAAW,EAAE,CAAW;IAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,kCAAkC;AAClC,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAClB,CAA8B,EAC9B,CAA8B;IAE9B,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,4CAA4C;AAC5C,SAAS,oBAAoB,CAAC,SAAkB;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,IAAqB,EAAE,IAAY;IACzD,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,QAA2B;IACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,cAAc;YAAE,SAAS;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAEhC,MAAM,UAAU,GAAG,YAAY;aAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,CACb,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;eACxC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;aAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,IAAI;YACJ,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;SACzF,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC;QAE/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEtC,oBAAoB;QACpB,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACjE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,IAAI,MAAM,KAAK,MAAM;oBAAE,OAAO,MAAM,GAAG,MAAM,CAAC;YAChD,CAAC;YACD,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnF,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnD,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,GAAG,WAAW,CAAC;QACvD,cAAc,CAAC,IAAI,EACjB,GAAG,WAAW,0BAA0B,OAAO,CAAC,cAAc,IAAI,QAAQ,iBAAiB,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,QAA2B;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU,CACtE,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,SAAS,KAAK,kBAAkB;YAAE,SAAS;QACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE3D,IAAI,IAAI,GAA2B,IAAI,CAAC;QACxC,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,gBAAgB,CAClC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAC/B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAC/B,CAAC;YACF,IAAI,WAAW,GAAG,eAAe,EAAE,CAAC;gBAClC,eAAe,GAAG,WAAW,CAAC;gBAC9B,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,IAAI,IAAI,eAAe,IAAI,0BAA0B,EAAE,CAAC;YAC1D,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAA2B;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;IAE9D,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAC1B,OAAO,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,IAAI,mBAAW;YAAE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,QAA2B;IAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
@@ -22,67 +22,81 @@ const STATUS_MAP = {
22
22
  11: 'Compiling',
23
23
  12: 'Judging',
24
24
  };
25
+ // Adaptive-concurrency floor — never drop below this many parallel AI calls
26
+ const MIN_CONCURRENCY = 2;
25
27
  // ─── Prompt builders ──────────────────────────────────────────────────────────
26
28
  function buildSystemPrompt(locale, contestTitle, domainId) {
27
29
  if (locale === 'zh') {
28
- return `你是一位充满热情、深谙教育心理学(特别是"成长型思维")的资深编程教师。你的任务是根据学生在 OJ 平台上的近期作业表现和历史数据,写一段个性化、有温度的学习总结。
30
+ return `你是一位充满热情、深谙教育心理学(特别是"成长型思维")的资深编程教师。你的任务是根据学生在 OJ 平台上本次作业的提交数据和历史表现,写一份学生自己会认真读完的学习总结:先逐题讲清完成情况,再给一段让他有动力继续学的整体评价。
29
31
 
30
32
  当前环境:
31
- - 输出语言:中文
33
+ - 输出语言:中文,直接对学生说话(称"你")
32
34
  - 平台名称:HydroOJ
33
35
  - 作业名称:${contestTitle}
34
36
  - 提交链接格式:[提交 #rXXXX] — 前端会自动解析为 /d/${domainId}/record/XXXX 的可点击链接
35
37
 
38
+ 【输出结构】固定三部分,除表格外的文字总计不超过 250 字:
39
+
40
+ 一、逐题回顾 — 用 Markdown 表格逐题呈现,一题一行,必须覆盖本次作业的每一道题:
41
+ | 题目 | 完成情况 | 点评与建议 |
42
+ |---|---|---|
43
+ - "完成情况"固定用以下写法之一:✅ 一次通过 / ✅ N 次尝试后通过 / 🔶 尝试 N 次未通过 / ⬜ 未提交
44
+ - "点评与建议"限一句话,按情况写:
45
+ - 已通过:肯定过程中的具体行为(如关键的一次调试改动,可引用 [提交 #rXXXX]);若代码有明显优化空间(更简洁的写法、更低的复杂度、更清晰的命名),顺带半句点出方向,不写代码。
46
+ - 未通过:指出最接近的一次尝试离通过只差哪个知识点,语气是"差一步"而不是"失败"。
47
+ - 未提交:不指责,一句话降低门槛邀请尝试(如"和你已通过的某题思路相通")。
48
+
49
+ 二、整体评价 — 2~4 句自然段:结合提交行为(尝试次数、调试韧性、时间投入、历史进步)给出以正面鼓励为主的总评;表扬必须落在具体行为和策略上,不空喊"你真棒",不与其他同学比较。
50
+
51
+ 三、下一步 — 最后单独一行,以 "💡 下一步:" 开头,给一条具体、微小、可执行的建议(如复习某个知识点、重做某道题、画个流程图)。
52
+
36
53
  【核心教育理念】
37
54
  1. 过程胜于结果:赞美学生的努力、策略调整和坚持,而不是聪明或天赋。
38
55
  2. 错误是学习的数据:将 Bug 视为探索过程中的必然,而非失败。
39
- 3. 真实且具体:表扬必须基于具体的代码表现或行为数据,拒绝空泛的"你真棒"。
40
-
41
- 【写作风格与语气】
42
- - 语气自然、对话感强:就像老师在课后把学生叫到身边,面对面、平等的交流。
43
- - 拒绝生搬硬套的模板:不要使用生硬的标题(如"闪光点"、"解题历程"等),段落过渡要自然。
44
- - 长度灵活:根据学生表现的丰富程度决定篇幅。简单情况 100 字即可,复杂调试过程可以展开(不超过 500 字)。
45
- - 强制引用格式:引用学生提交时使用 [提交 #rXXXX] 格式。
56
+ 3. 真实且具体:每句表扬都要能对应到具体的提交数据;严禁编造数据中不存在的提交、分数或行为。
46
57
 
47
58
  【情境触发策略(根据学生数据动态调整侧重点)】
48
- 请分析传入的学生数据,识别其属于以下哪种典型情境,并据此决定侧重点:
49
- - 情境 A [经历大量调试后最终 AC]:重点表扬"死磕到底"的韧性和解决问题的过程。
50
- - 情境 B [全部/大部分一次性 AC,用时极短]:简单肯定基础扎实,重点给出进阶挑战(如优化复杂度),避免其停留在舒适区。
59
+ 请分析传入的学生数据,识别其属于以下哪种典型情境,并据此决定整体评价的侧重点:
60
+ - 情境 A [经历大量调试后最终 AC]:重点表扬"死磕到底"的韧性,还原他的调试路径。
61
+ - 情境 B [全部/大部分一次性 AC,用时极短]:简单肯定基础扎实,把重心放在"点评与建议"列的进阶方向上(如优化复杂度),避免其停留在舒适区。
51
62
  - 情境 C [多次失败后放弃(未 AC)]:提供情感支持,肯定前期思考,指出卡住的核心概念,降低难度期望,鼓励下次再战。
52
- - 情境 D [历史数据对比有明显进步]:结合"历史背景"强调纵向成长。
53
- (注意:学生可能同时符合多个情境,请综合判断。)
54
-
55
- 【硬性要求】
56
- 在总结的最后,你必须自然地融入一条"下一步建议"。这必须是一个具体、微小、可执行的建议(如复习某个知识点、画个流程图、挑战某类型的题)。用 "💡 下一步:" 标记这句话。`;
63
+ - 情境 D [历史数据对比有明显进步]:结合"历史背景"用数据点出纵向成长(如"WA 占比明显下降")。
64
+ (注意:学生可能同时符合多个情境,请综合判断。)`;
57
65
  }
58
- return `You are a passionate, senior programming teacher deeply versed in educational psychology, particularly "Growth Mindset". Your task is to write a personalized, warm learning summary based on a student's recent homework performance and historical data on an Online Judge (OJ) platform.
66
+ return `You are a passionate, senior programming teacher deeply versed in educational psychology, particularly "Growth Mindset". Your task is to write a learning summary the student will actually read: first a per-problem review, then an encouraging overall evaluation, based on their submissions for this homework and historical data on an Online Judge (OJ) platform.
59
67
 
60
68
  Current environment:
61
- - Output language: English
69
+ - Output language: English, speaking directly to the student ("you")
62
70
  - Platform: HydroOJ
63
71
  - Homework title: ${contestTitle}
64
72
  - Submission link format: [Submission #rXXXX] — frontend will auto-parse into /d/${domainId}/record/XXXX clickable links
65
73
 
74
+ [Output Structure] Exactly three parts; prose outside the table must not exceed 150 words:
75
+
76
+ 1. Per-problem review — a Markdown table, one row per problem, covering EVERY problem in this homework:
77
+ | Problem | Result | Comment & Suggestion |
78
+ |---|---|---|
79
+ - "Result" must be one of: ✅ First-try AC / ✅ AC after N attempts / 🔶 N attempts, not passed / ⬜ Not attempted
80
+ - "Comment & Suggestion" is one sentence:
81
+ - Passed: praise a specific behavior (e.g. the key debugging change, cite [Submission #rXXXX]); if the code has clear room for improvement (simpler style, lower complexity, better naming), add half a sentence pointing the direction — no code.
82
+ - Not passed: name the single concept that separated their closest attempt from passing; frame it as "one step away", never as failure.
83
+ - Not attempted: no blame; one low-barrier invitation to try (e.g. "shares its approach with a problem you already solved").
84
+
85
+ 2. Overall evaluation — 2-4 natural sentences: combine submission behavior (attempt counts, debugging resilience, time invested, historical progress) into a mostly positive evaluation; praise specific behaviors and strategies, no generic fluff, no comparison with other students.
86
+
87
+ 3. Next step — final line starting with "💡 Next step: ", one concrete, tiny, actionable suggestion.
88
+
66
89
  [Core Educational Philosophy]
67
90
  1. Process over Product: Praise effort, strategic adjustments, and persistence, not intelligence or talent.
68
91
  2. Errors are Just Data: Frame bugs as necessary steps in exploration, not failures.
69
- 3. Authentic and Specific: All praise must be grounded in specific code behaviors or submission data. No generic fluff.
70
-
71
- [Writing Style & Tone]
72
- - Natural and Conversational: Write as if talking to the student face-to-face after class.
73
- - No Rigid Templates: Do NOT use stiff headings. Let paragraphs flow naturally.
74
- - Flexible Length: Simple one-shot AC ~ 100 words. Complex debugging journey up to 500 words.
75
- - Mandatory citation: Reference submissions using [Submission #rXXXX] format.
92
+ 3. Authentic and Specific: Every claim must trace back to actual submission data; never invent submissions, scores, or behaviors.
76
93
 
77
94
  [Situational Triggers (Adapt focus based on data)]
78
95
  Analyze the student data and identify which scenario applies:
79
96
  - Scenario A [Heavy debugging then AC]: Focus on praising grit, resilience, and problem-solving process.
80
- - Scenario B [Most/All first-try AC, very fast]: Briefly acknowledge solid foundation, focus on stretch goals.
97
+ - Scenario B [Most/All first-try AC, very fast]: Briefly acknowledge solid foundation, shift weight to the stretch goals in the Comment column.
81
98
  - Scenario C [Multiple failures then gave up]: Strong emotional support, validate thinking, point out the stuck concept, encourage retry.
82
- - Scenario D [Clear improvement from historical data]: Emphasize longitudinal growth using historical context.
83
-
84
- [Strict Requirement]
85
- At the end of your summary, naturally integrate one "Actionable Next Step". Mark it with "💡 Next step: ".`;
99
+ - Scenario D [Clear improvement from historical data]: Emphasize longitudinal growth using historical context.`;
86
100
  }
87
101
  const CONTENT_TOKEN_BUDGET = 2000;
88
102
  const CHARS_PER_TOKEN = 3.5;
@@ -212,7 +226,9 @@ function buildUserPrompt(problems, sampleResults) {
212
226
  class BatchSummaryService {
213
227
  constructor(db, jobModel, summaryModel, aiClient, tokenUsageModel, historyModel,
214
228
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
215
- featureStatsModel) {
229
+ featureStatsModel,
230
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
231
+ errorReporter) {
216
232
  this.db = db;
217
233
  this.jobModel = jobModel;
218
234
  this.summaryModel = summaryModel;
@@ -220,6 +236,7 @@ class BatchSummaryService {
220
236
  this.tokenUsageModel = tokenUsageModel;
221
237
  this.historyModel = historyModel || null;
222
238
  this.featureStatsModel = featureStatsModel || null;
239
+ this.errorReporter = errorReporter || null;
223
240
  this.sampler = new submissionSampler_1.SubmissionSampler();
224
241
  }
225
242
  /**
@@ -235,14 +252,15 @@ class BatchSummaryService {
235
252
  ? await this.summaryModel.findPendingByJob(job._id)
236
253
  : await this.summaryModel.findAllByJob(job._id);
237
254
  const total = summaries.length;
238
- const concurrency = job.config?.concurrency ?? 10;
255
+ let concurrency = job.config?.concurrency ?? 10;
239
256
  let completedCount = 0;
240
257
  let failedCount = 0;
241
258
  let totalTokens = 0;
242
259
  // Build system prompt once (invariant across all students in this job)
243
260
  const systemPrompt = buildSystemPrompt(job.config.locale, job.contestTitle, job.domainId);
244
- // Step 3: Process in batches of `concurrency`
245
- for (let i = 0; i < summaries.length; i += concurrency) {
261
+ // Step 3: Process in rounds of `concurrency`
262
+ let cursor = 0;
263
+ while (cursor < summaries.length) {
246
264
  // Check if job was stopped between batches
247
265
  const currentJob = await this.jobModel.findById(job._id);
248
266
  if (currentJob?.status === 'stopped') {
@@ -255,8 +273,10 @@ class BatchSummaryService {
255
273
  });
256
274
  return;
257
275
  }
258
- const batch = summaries.slice(i, i + concurrency);
276
+ const batch = summaries.slice(cursor, cursor + concurrency);
277
+ cursor += batch.length;
259
278
  const results = await Promise.allSettled(batch.map((summary) => this.processStudent(job, summary, problems, systemPrompt, onEvent, userNameMap)));
279
+ let roundFailed = 0;
260
280
  for (const result of results) {
261
281
  if (result.status === 'fulfilled') {
262
282
  completedCount++;
@@ -264,8 +284,18 @@ class BatchSummaryService {
264
284
  }
265
285
  else {
266
286
  failedCount++;
287
+ roundFailed++;
267
288
  }
268
289
  }
290
+ // Adaptive back-off: when most of a round fails (typically the AI
291
+ // endpoint timing out under load), halve the concurrency instead of
292
+ // keeping ten parallel calls hammering an endpoint that is already
293
+ // struggling — fewer in-flight requests give each remaining call a
294
+ // better shot at finishing inside its timeout budget.
295
+ if (roundFailed * 2 > batch.length && concurrency > MIN_CONCURRENCY) {
296
+ concurrency = Math.max(MIN_CONCURRENCY, Math.floor(concurrency / 2));
297
+ console.warn(`[BatchSummaryService] ${roundFailed}/${batch.length} failed in one round — reducing concurrency to ${concurrency}`);
298
+ }
269
299
  // Emit progress after each batch
270
300
  onEvent({
271
301
  type: 'progress',
@@ -277,8 +307,11 @@ class BatchSummaryService {
277
307
  // Step 4: Finalize job status
278
308
  const finalStatus = completedCount > 0 || failedCount === 0 ? 'completed' : 'failed';
279
309
  await this.jobModel.updateStatus(job._id, finalStatus);
280
- // Health signal: a job that produced at least one summary is a success.
281
- if (completedCount > 0) {
310
+ // Health signal: only count the run as a success when at most half the
311
+ // students failed. The previous "at least one summary" rule marked a run
312
+ // with 1/50 completions healthy, so an AI outage that failed nearly every
313
+ // student never surfaced in per-feature health.
314
+ if (completedCount > 0 && completedCount >= failedCount) {
282
315
  this.featureStatsModel?.recordSuccess('batch_summary').catch(() => { });
283
316
  }
284
317
  onEvent({
@@ -370,19 +403,12 @@ class BatchSummaryService {
370
403
  const completionTokens = response.usage?.completion_tokens ?? 0;
371
404
  // f. Save summary
372
405
  await this.summaryModel.completeSummary(summary._id, summaryText, problemSnapshots, { prompt: promptTokens, completion: completionTokens });
373
- // g. Record token usage
374
- try {
375
- await this.tokenUsageModel.record({
376
- domainId: job.domainId,
377
- jobId: job._id,
378
- userId: summary.userId,
379
- promptTokens,
380
- completionTokens,
381
- });
382
- }
383
- catch (tokenErr) {
384
- console.warn('[BatchSummaryService] Failed to record token usage:', tokenErr);
385
- }
406
+ // g. Token counts are already persisted on the summary via completeSummary
407
+ // above. Batch jobs are admin background tasks, not per-student chats, so
408
+ // they are intentionally NOT written to TokenUsageModel (whose recordUsage
409
+ // is keyed by conversationId/messageId for per-student budget tracking).
410
+ // A previous `tokenUsageModel.record(...)` call here was a no-op that threw
411
+ // "record is not a function" on every student (~870×) — removed.
386
412
  // g2. Save historical context record (fire-and-forget, non-blocking)
387
413
  if (this.historyModel) {
388
414
  const stats = computeStudentStats(problemSnapshots);
@@ -420,6 +446,14 @@ class BatchSummaryService {
420
446
  error: errorMessage,
421
447
  });
422
448
  console.error(`[BatchSummaryService] Failed for userId=${summary.userId}:`, err);
449
+ // Telemetry: per-student failures previously only reached Mongo + SSE, so
450
+ // a batch where every student timed out looked healthy on the platform.
451
+ // The reporter dedupes by stack fingerprint, so N students failing the
452
+ // same way become one entry with count=N — no flood risk.
453
+ try {
454
+ this.errorReporter?.capture('background_job', 'batch_summary', errorMessage, undefined, err instanceof Error ? err.stack : undefined, { jobId: String(job._id), domainId: job.domainId });
455
+ }
456
+ catch { /* best-effort */ }
423
457
  // Re-throw so Promise.allSettled registers as 'rejected'
424
458
  throw err;
425
459
  }
@@ -1 +1 @@
1
- {"version":3,"file":"batchSummaryService.js","sourceRoot":"","sources":["../../src/services/batchSummaryService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batchSummaryService.js","sourceRoot":"","sources":["../../src/services/batchSummaryService.ts"],"names":[],"mappings":"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"}
@@ -547,8 +547,17 @@ class MultiModelClient {
547
547
  }
548
548
  const errors = [];
549
549
  const skippedEndpoints = new Set();
550
- // L3: 全 fallback 链总超时 取配置值与默认值中的较大者
551
- const totalTimeoutMs = Math.max(RETRY.TOTAL_TIMEOUT_MS, this.clients[0].config.timeoutSeconds * 1000);
550
+ // L3: 全 fallback 链总超时。预算 = 首端点用满全部重试(含退避上限)+ 其余每个
551
+ // fallback 端点至少一次完整尝试,下限 TOTAL_TIMEOUT_MS。旧实现固定取
552
+ // max(60s, 首端点 timeoutSeconds):默认 30s/请求 + 2 次重试时,第 2 次重试
553
+ // 中途即被掐断、fallback 端点永远轮不到——慢端点上的长文生成稳定死于
554
+ // 「AI 服务总超时」,而重试与 fallback 正是为这种场景配置的。
555
+ const backoffAllowanceMs = Array.from({ length: RETRY.MAX_RETRIES }, (_, attempt) => Math.min(RETRY.BASE_DELAY_MS * 2 ** attempt, RETRY.MAX_DELAY_MS) * (1 + RETRY.JITTER)).reduce((sum, ms) => sum + ms, 0);
556
+ const [primary, ...fallbacks] = this.clients;
557
+ const budgetMs = primary.config.timeoutSeconds * 1000 * (RETRY.MAX_RETRIES + 1)
558
+ + backoffAllowanceMs
559
+ + fallbacks.reduce((sum, c) => sum + c.config.timeoutSeconds * 1000, 0);
560
+ const totalTimeoutMs = Math.max(RETRY.TOTAL_TIMEOUT_MS, budgetMs);
552
561
  const totalAc = new AbortController();
553
562
  let timedOut = false;
554
563
  const totalTimer = setTimeout(() => { timedOut = true; totalAc.abort(); }, totalTimeoutMs);
@@ -761,43 +770,65 @@ class MultiModelClient {
761
770
  }
762
771
  }
763
772
  exports.MultiModelClient = MultiModelClient;
773
+ /**
774
+ * 将模型链(endpointId+modelName)解析为可用的 ResolvedModelConfig 列表
775
+ * 跳过不存在/禁用的端点和解密失败的 Key
776
+ */
777
+ function resolveModelChain(config, chain) {
778
+ const resolvedModels = [];
779
+ for (const selected of chain) {
780
+ const endpoint = (config.endpoints || []).find(ep => ep.id === selected.endpointId);
781
+ if (!endpoint || !endpoint.enabled) {
782
+ continue;
783
+ }
784
+ let apiKey;
785
+ try {
786
+ apiKey = (0, crypto_1.decrypt)(endpoint.apiKeyEncrypted);
787
+ }
788
+ catch {
789
+ console.warn(`[MultiModelClient] 端点 "${endpoint.name}" 的 API Key 解密失败,跳过`);
790
+ continue;
791
+ }
792
+ resolvedModels.push({
793
+ endpointId: endpoint.id,
794
+ endpointName: endpoint.name,
795
+ apiBaseUrl: endpoint.apiBaseUrl,
796
+ apiKey,
797
+ modelName: selected.modelName,
798
+ timeoutSeconds: config.timeoutSeconds || 30
799
+ });
800
+ }
801
+ return resolvedModels;
802
+ }
764
803
  /**
765
804
  * 从数据库配置创建 MultiModelClient
766
805
  * 支持多端点、多模型 fallback
806
+ *
807
+ * @param scenario 可选的调用场景。若管理员为该场景配置了专属模型链则优先使用;
808
+ * 未配置(或场景链中的端点均不可用)时回退到全局 selectedModels。
767
809
  */
768
- async function createMultiModelClientFromConfig(ctx, existingConfig) {
810
+ async function createMultiModelClientFromConfig(ctx, existingConfig, scenario) {
769
811
  const aiConfigModel = ctx.get('aiConfigModel');
770
812
  const config = existingConfig ?? await aiConfigModel.getConfig();
771
813
  if (!config) {
772
814
  throw new Error('AI 服务尚未配置,请联系管理员在控制面板中完成配置。');
773
815
  }
774
- // 优先使用新版多端点配置
775
- if (config.endpoints && config.endpoints.length > 0 && config.selectedModels && config.selectedModels.length > 0) {
776
- const resolvedModels = [];
777
- for (const selected of config.selectedModels) {
778
- const endpoint = config.endpoints.find(ep => ep.id === selected.endpointId);
779
- if (!endpoint || !endpoint.enabled) {
780
- continue;
781
- }
782
- let apiKey;
783
- try {
784
- apiKey = (0, crypto_1.decrypt)(endpoint.apiKeyEncrypted);
816
+ if (config.endpoints && config.endpoints.length > 0) {
817
+ // 1) 场景专属模型链(若配置且可解析)
818
+ const scenarioChain = scenario ? config.scenarioModels?.[scenario] : undefined;
819
+ if (scenarioChain && scenarioChain.length > 0) {
820
+ const resolvedScenarioModels = resolveModelChain(config, scenarioChain);
821
+ if (resolvedScenarioModels.length > 0) {
822
+ return new MultiModelClient(resolvedScenarioModels);
785
823
  }
786
- catch {
787
- console.warn(`[MultiModelClient] 端点 "${endpoint.name}" 的 API Key 解密失败,跳过`);
788
- continue;
789
- }
790
- resolvedModels.push({
791
- endpointId: endpoint.id,
792
- endpointName: endpoint.name,
793
- apiBaseUrl: endpoint.apiBaseUrl,
794
- apiKey,
795
- modelName: selected.modelName,
796
- timeoutSeconds: config.timeoutSeconds || 30
797
- });
824
+ console.warn(`[MultiModelClient] 场景 "${scenario}" 配置的模型均不可用,回退到全局模型配置`);
798
825
  }
799
- if (resolvedModels.length > 0) {
800
- return new MultiModelClient(resolvedModels);
826
+ // 2) 全局多端点配置
827
+ if (config.selectedModels && config.selectedModels.length > 0) {
828
+ const resolvedModels = resolveModelChain(config, config.selectedModels);
829
+ if (resolvedModels.length > 0) {
830
+ return new MultiModelClient(resolvedModels);
831
+ }
801
832
  }
802
833
  }
803
834
  // 回退到旧版单端点配置