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.
- package/README.md +10 -0
- package/dist/constants/updateChannel.js +44 -0
- package/dist/constants/updateChannel.js.map +1 -0
- package/dist/handlers/adminConfigHandler.js +30 -0
- package/dist/handlers/adminConfigHandler.js.map +1 -1
- package/dist/handlers/batchSummaryHandler.js +15 -8
- package/dist/handlers/batchSummaryHandler.js.map +1 -1
- package/dist/handlers/studentHandler.js +1 -1
- package/dist/handlers/studentHandler.js.map +1 -1
- package/dist/handlers/teachingSummaryHandler.js +38 -9
- package/dist/handlers/teachingSummaryHandler.js.map +1 -1
- package/dist/handlers/versionHandler.js +2 -1
- package/dist/handlers/versionHandler.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/models/aiConfig.js +15 -2
- package/dist/models/aiConfig.js.map +1 -1
- package/dist/models/studentSummary.js +13 -0
- package/dist/models/studentSummary.js.map +1 -1
- package/dist/models/teachingSummary.js +2 -0
- package/dist/models/teachingSummary.js.map +1 -1
- package/dist/services/analyzers/errorClusterAnalyzer.js +1 -0
- package/dist/services/analyzers/errorClusterAnalyzer.js.map +1 -1
- package/dist/services/analyzers/findingConsolidator.js +172 -0
- package/dist/services/analyzers/findingConsolidator.js.map +1 -0
- package/dist/services/batchSummaryService.js +85 -51
- package/dist/services/batchSummaryService.js.map +1 -1
- package/dist/services/openaiClient.js +59 -28
- package/dist/services/openaiClient.js.map +1 -1
- package/dist/services/promptService.js +49 -24
- package/dist/services/promptService.js.map +1 -1
- package/dist/services/teachingAnalysisService.js +13 -2
- package/dist/services/teachingAnalysisService.js.map +1 -1
- package/dist/services/teachingSuggestionService.js +43 -44
- package/dist/services/teachingSuggestionService.js.map +1 -1
- package/dist/services/telemetryService.js +8 -1
- package/dist/services/telemetryService.js.map +1 -1
- package/dist/services/updateService.js +106 -11
- package/dist/services/updateService.js.map +1 -1
- package/dist/services/versionService.js +88 -61
- package/dist/services/versionService.js.map +1 -1
- package/dist/utils/semver.js +75 -0
- package/dist/utils/semver.js.map +1 -0
- package/frontend/admin/BudgetConfigForm.tsx +1 -1
- package/frontend/admin/ConfigPanel.tsx +53 -3
- package/frontend/admin/EndpointManager.tsx +1 -1
- package/frontend/admin/FeedbackForm.tsx +1 -1
- package/frontend/admin/JailbreakLogsViewer.tsx +1 -1
- package/frontend/admin/ScenarioModelSelector.tsx +238 -0
- package/frontend/admin/TelemetrySettings.tsx +1 -1
- package/frontend/admin/VersionBadge.tsx +26 -1
- package/frontend/admin/configTypes.ts +9 -0
- package/frontend/batchSummary/BatchSummaryPanel.tsx +29 -1
- package/frontend/batchSummary/StudentSummaryView.tsx +47 -14
- package/frontend/batchSummary/SummaryCard.tsx +1 -1
- package/frontend/batchSummary/useBatchSummary.ts +26 -8
- package/frontend/components/AIHelperDashboard.tsx +1 -1
- package/frontend/components/ErrorBoundary.tsx +1 -1
- package/frontend/components/ScoreboardTabContainer.tsx +1 -1
- package/frontend/generated/localeFallback.ts +1502 -0
- package/frontend/problem_detail.page.tsx +1 -1
- package/frontend/student/AIAssistantPanel.tsx +1 -1
- package/frontend/student/ChatInput.tsx +1 -1
- package/frontend/student/ChatMessageList.tsx +1 -1
- package/frontend/student/ThinkingBlock.tsx +1 -1
- package/frontend/student/hooks/useChatSession.ts +1 -1
- package/frontend/teacher/AnalyticsPage.tsx +1 -1
- package/frontend/teacher/ClassAnalyticsTable.tsx +1 -1
- package/frontend/teacher/ConversationDetail.tsx +1 -1
- package/frontend/teacher/ConversationDetailModal.tsx +1 -1
- package/frontend/teacher/ConversationList.tsx +1 -1
- package/frontend/teacher/CostDashboard.tsx +1 -1
- package/frontend/teacher/ExportDialog.tsx +1 -1
- package/frontend/teacher/MetricsPanel.tsx +1 -1
- package/frontend/teacher/ProblemAnalyticsTable.tsx +1 -1
- package/frontend/teacher/StudentAnalyticsTable.tsx +1 -1
- package/frontend/teacher/analyticsTypes.ts +1 -1
- package/frontend/teachingSummary/TeachingReviewPanel.tsx +1 -1
- package/frontend/teachingSummary/TeachingSummaryPanel.tsx +525 -175
- package/frontend/teachingSummary/useTeachingSummary.ts +10 -0
- package/frontend/utils/i18n.ts +32 -0
- package/frontend/utils/i18nFallbackCore.ts +30 -0
- package/locales/en.yaml +43 -6
- package/locales/zh.yaml +43 -6
- 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":"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"}
|
|
@@ -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
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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
|
|
245
|
-
|
|
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(
|
|
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:
|
|
281
|
-
|
|
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.
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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":";AAAA;;;;GAIG;;;AAMH,2DAAqF;AAerF,gFAAgF;AAEhF,MAAM,UAAU,GAA2B;IACzC,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;IACR,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,SAAS;CACd,CAAC;AAEF,4EAA4E;AAC5E,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,iFAAiF;AAEjF,SAAS,iBAAiB,CAAC,MAAc,EAAE,YAAoB,EAAE,QAAgB;IAC/E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;;;;;SAKF,YAAY;qCACgB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4BpB,CAAC;IACxB,CAAC;IAED,OAAO;;;;;oBAKW,YAAY;mFACmD,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;+GA2BoB,CAAC;AAChH,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,eAAe,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,qBAAqB,CAAC;AAC5D,CAAC;AAED,iFAAiF;AAEjF,SAAS,uBAAuB,CAAC,SAA4B;IAC3D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACvC,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC;IACvC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACtD,CAAC,MAAM,CAAC;IACT,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC;WACjD,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACrD,CAAC,MAAM,CAAC;IACT,IAAI,UAAU,KAAK,aAAa,IAAI,WAAW,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACnE,IAAI,MAAM,IAAI,aAAa,GAAG,GAAG;QAAE,OAAO,GAAG,CAAC;IAC9C,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACxE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,SAA4B;IAQvD,MAAM,IAAI,GAAsB,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAC/E,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;YAC/B,YAAY,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC;QACrC,CAAC;aAAM,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,CAAC;QACX,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,IAAI;gBAAG,IAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,WAAW,EAAE,MAAM;QACnB,iBAAiB,EAAE,YAAY;QAC/B,aAAa,EAAE,SAAS,CAAC,MAAM;QAC/B,WAAW,EAAE,OAAO;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA+B;IAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;IAC1J,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;IAC1J,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5G,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC;QAC7C,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACtJ,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;IAEtH,MAAM,GAAG,GAAG;QACV,mBAAmB,EAAE,OAAO,CAAC,MAAM;QACnC,WAAW,EAAE,GAAG,OAAO,KAAK,OAAO,EAAE;QACrC,gBAAgB,EAAE,eAAe;QACjC,iBAAiB,EAAE,WAAW;QAC9B,WAAW,EAAE,MAAM,CAAC,gBAAgB,IAAI,EAAE;QAC1C,mBAAmB,EAAE,cAAc;KACpC,CAAC;IACF,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtB,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CACtB,QAAuB,EACvB,aAAwC;IAExC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,aAAa,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,eAAe,OAAO,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CACR,cAAc,GAAG,CAAC,QAAQ,UAAU,GAAG,CAAC,SAAS,UAAU,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAC7G,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,iFAAiF;AAEjF,MAAa,mBAAmB;IAa9B,YACE,EAAM,EACN,QAA8B,EAC9B,YAAiC,EACjC,QAAa,EACb,eAAoB,EACpB,YAAkB;IAClB,8DAA8D;IAC9D,iBAAuB;IACvB,8DAA8D;IAC9D,aAAmB;QAEnB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,qCAAiB,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CACX,GAAoB,EACpB,QAAuB,EACvB,OAAkC,EAClC,WAAW,GAAG,KAAK,EACnB,WAAiC;QAEjC,8BAA8B;QAC9B,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;QAC1F,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAErD,qCAAqC;QACrC,MAAM,SAAS,GAAG,WAAW;YAC3B,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;YACnD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;QAC/B,IAAI,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,CAAC;QAEhD,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,uEAAuE;QACvE,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE1F,6CAA6C;QAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YACjC,2CAA2C;YAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzD,IAAI,UAAU,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;gBACrC,6DAA6D;gBAC7D,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1D,OAAO,CAAC;oBACN,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,cAAc;oBACzB,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YAEvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CACxG,CAAC;YAEF,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,cAAc,EAAE,CAAC;oBACjB,WAAW,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,WAAW,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;YAED,kEAAkE;YAClE,oEAAoE;YACpE,mEAAmE;YACnE,mEAAmE;YACnE,sDAAsD;YACtD,IAAI,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,GAAG,eAAe,EAAE,CAAC;gBACpE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CACV,yBAAyB,WAAW,IAAI,KAAK,CAAC,MAAM,kDAAkD,WAAW,EAAE,CACpH,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,OAAO,CAAC;gBACN,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,cAAc;gBACzB,KAAK;gBACL,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,MAAM,WAAW,GAAG,cAAc,GAAG,CAAC,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrF,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACvD,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,gDAAgD;QAChD,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;YACxD,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;QAC5F,CAAC;QAED,OAAO,CAAC;YACN,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,cAAc;YACzB,MAAM,EAAE,WAAW;YACnB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc,CAC1B,GAAoB,EACpB,OAAuB,EACvB,QAAuB,EACvB,YAAoB,EACpB,OAAkC,EAClC,WAAiC;QAEjC,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEpD,yDAAyD;YACzD,0EAA0E;YAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACvF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE;iBAC7B,UAAU,CAAC,QAAQ,CAAC;iBACpB,IAAI,CAAC;gBACJ,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,GAAG,EAAE,OAAO,CAAC,MAAM;gBACnB,GAAG,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;aAC1B,CAAC;iBACD,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;iBACpB,OAAO,EAAE,CAAC;YAEb,uBAAuB;YACvB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACtD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;YAED,wBAAwB;YACxB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;YACtD,MAAM,gBAAgB,GAAsB,EAAE,CAAC;YAE/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACvD,MAAM,cAAc,GAAoB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBAClE,QAAQ,EAAE,CAAC,CAAC,GAAG;oBACf,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;oBAClB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;oBAChD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK;oBACrB,SAAS,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE;oBAClC,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;oBACpB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;iBACtB,CAAC,CAAC,CAAC;gBAEJ,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC;gBAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBAC/D,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBAE7C,gBAAgB,CAAC,IAAI,CAAC;oBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,eAAe,EAAE,YAAY,CAAC,eAAe;oBAC7C,kBAAkB,EAAE,YAAY,CAAC,kBAAkB;oBACnD,WAAW,EAAE,YAAY,CAAC,WAAW;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;YAE3D,+BAA+B;YAC/B,IAAI,cAAc,GAAkB,IAAI,CAAC;YACzC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC3F,cAAc,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,gDAAgD;YAChD,MAAM,WAAW,GAAG,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC;YAClF,IAAI,UAAU,GAAG,QAAQ,WAAW,MAAM,CAAC;YAC3C,UAAU,IAAI,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACvD,UAAU,IAAI,0BAA0B,QAAQ,aAAa,CAAC;YAC9D,IAAI,cAAc,EAAE,CAAC;gBACnB,UAAU,IAAI,+CAA+C,cAAc,8IAA8I,CAAC;YAC5N,CAAC;YAED,aAAa;YACb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EACvC,YAAY,CACb,CAAC;YAEF,MAAM,WAAW,GAAW,QAAQ,CAAC,OAAO,CAAC;YAC7C,MAAM,YAAY,GAAW,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;YAChE,MAAM,gBAAgB,GAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC,CAAC;YAExE,kBAAkB;YAClB,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CACrC,OAAO,CAAC,GAAG,EACX,WAAW,EACX,gBAAgB,EAChB,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,CACvD,CAAC;YAEF,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;YAC3E,yEAAyE;YACzE,4EAA4E;YAC5E,iEAAiE;YAEjE,qEAAqE;YACrE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;gBACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;oBACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,YAAY,EAAE,GAAG,CAAC,YAAY;oBAC9B,KAAK,EAAE,GAAG,CAAC,GAAG;oBACd,GAAG,KAAK;oBACR,gBAAgB,EAAE,MAAM;oBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACpB,CAAC,CAAC,KAAK,CAAC,CAAC,OAAY,EAAE,EAAE;oBACxB,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,OAAO,CAAC,CAAC;gBAChF,CAAC,CAAC,CAAC;YACP,CAAC;YAED,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEhD,6BAA6B;YAC7B,OAAO,CAAC;gBACN,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;YAEH,OAAO,YAAY,GAAG,gBAAgB,CAAC;QACzC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE7C,OAAO,CAAC;gBACN,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;YAEH,OAAO,CAAC,KAAK,CAAC,2CAA2C,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;YAEjF,0EAA0E;YAC1E,wEAAwE;YACxE,uEAAuE;YACvE,0DAA0D;YAC1D,IAAI,CAAC;gBACH,IAAI,CAAC,aAAa,EAAE,OAAO,CACzB,gBAAgB,EAAE,eAAe,EACjC,YAAY,EACZ,SAAS,EACT,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC5C,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CACnD,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAE7B,yDAAyD;YACzD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AA3TD,kDA2TC"}
|
|
@@ -547,8 +547,17 @@ class MultiModelClient {
|
|
|
547
547
|
}
|
|
548
548
|
const errors = [];
|
|
549
549
|
const skippedEndpoints = new Set();
|
|
550
|
-
// L3: 全 fallback
|
|
551
|
-
|
|
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
|
-
|
|
776
|
-
const
|
|
777
|
-
|
|
778
|
-
const
|
|
779
|
-
if (
|
|
780
|
-
|
|
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
|
-
|
|
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
|
-
|
|
800
|
-
|
|
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
|
// 回退到旧版单端点配置
|