@reconcrap/boss-recommend-mcp 2.1.12 → 2.1.13
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 +2 -0
- package/package.json +1 -1
- package/src/chat-mcp.js +2174 -2174
- package/src/core/reporting/legacy-csv.js +4 -15
- package/src/core/screening/index.js +33 -13
- package/src/domains/chat/run-service.js +83 -83
- package/src/domains/recommend/run-service.js +15 -15
|
@@ -16,9 +16,7 @@ export const LEGACY_RESULT_HEADER = [
|
|
|
16
16
|
"简历来源",
|
|
17
17
|
"原始判定通过",
|
|
18
18
|
"最终判定通过",
|
|
19
|
-
"
|
|
20
|
-
"证据命中数",
|
|
21
|
-
"证据门控降级",
|
|
19
|
+
"LLM thinking_level",
|
|
22
20
|
"错误码",
|
|
23
21
|
"错误信息",
|
|
24
22
|
"候选人ID",
|
|
@@ -182,12 +180,6 @@ function firstBoolean(...values) {
|
|
|
182
180
|
return "";
|
|
183
181
|
}
|
|
184
182
|
|
|
185
|
-
function evidenceCount(llm = {}) {
|
|
186
|
-
if (Number.isFinite(llm.evidence_count)) return llm.evidence_count;
|
|
187
|
-
if (Array.isArray(llm.evidence)) return llm.evidence.length;
|
|
188
|
-
return "";
|
|
189
|
-
}
|
|
190
|
-
|
|
191
183
|
function actionResultText(row = {}) {
|
|
192
184
|
const action = row.post_action || row.action || {};
|
|
193
185
|
if (action.requested === true && !action.skipped) {
|
|
@@ -258,10 +250,10 @@ export function legacyScreenResultRow(row = {}) {
|
|
|
258
250
|
? "passed"
|
|
259
251
|
: "skipped";
|
|
260
252
|
const cot = firstText(
|
|
261
|
-
llm.reasoning_content,
|
|
262
|
-
llm.raw_reasoning_content,
|
|
263
253
|
llm.decision_cot,
|
|
264
254
|
llm.cot,
|
|
255
|
+
llm.reasoning_content,
|
|
256
|
+
llm.raw_reasoning_content,
|
|
265
257
|
llm.raw_model_output,
|
|
266
258
|
llm.raw_content,
|
|
267
259
|
row.decision_cot,
|
|
@@ -276,7 +268,6 @@ export function legacyScreenResultRow(row = {}) {
|
|
|
276
268
|
candidate.source,
|
|
277
269
|
screening.candidate?.source
|
|
278
270
|
);
|
|
279
|
-
const totalEvidence = evidenceCount(llm);
|
|
280
271
|
return [
|
|
281
272
|
identity.name,
|
|
282
273
|
identity.school,
|
|
@@ -290,9 +281,7 @@ export function legacyScreenResultRow(row = {}) {
|
|
|
290
281
|
cvSource,
|
|
291
282
|
rawPassed,
|
|
292
283
|
finalPassed,
|
|
293
|
-
|
|
294
|
-
totalEvidence,
|
|
295
|
-
"",
|
|
284
|
+
firstText(llm.provider?.thinking_level),
|
|
296
285
|
row.error_code || error.code || error.name || (llm.error ? "LLM_SCREENING_ERROR" : ""),
|
|
297
286
|
row.error_message || error.message || llm.error || "",
|
|
298
287
|
candidate.id || row.candidate_id || "",
|
|
@@ -1477,7 +1477,7 @@ export function llmResultToScreening(llmResult, candidate) {
|
|
|
1477
1477
|
}
|
|
1478
1478
|
|
|
1479
1479
|
export function isRecoverableLlmScreeningError(error) {
|
|
1480
|
-
return /(?:LLM response missing boolean passed decision|LLM response was not valid JSON)/i
|
|
1480
|
+
return /(?:LLM response missing boolean passed decision|LLM response missing brief summary|LLM response was not valid JSON)/i
|
|
1481
1481
|
.test(String(error?.message || error || ""));
|
|
1482
1482
|
}
|
|
1483
1483
|
|
|
@@ -1504,6 +1504,7 @@ export function createFailedLlmScreeningResult(error) {
|
|
|
1504
1504
|
export function buildScreeningLlmMessages({
|
|
1505
1505
|
candidate,
|
|
1506
1506
|
criteria,
|
|
1507
|
+
thinkingLevel = "low",
|
|
1507
1508
|
imageEvidence = null,
|
|
1508
1509
|
imagePaths = [],
|
|
1509
1510
|
imageInputs = null,
|
|
@@ -1512,6 +1513,8 @@ export function buildScreeningLlmMessages({
|
|
|
1512
1513
|
}) {
|
|
1513
1514
|
const safeCriteria = normalizeText(criteria || "判断候选人是否符合本次招聘筛选标准");
|
|
1514
1515
|
const safeText = String(candidate?.text?.raw || candidate?.text || "");
|
|
1516
|
+
const normalizedThinkingLevel = normalizeLlmThinkingLevel(thinkingLevel) || "low";
|
|
1517
|
+
const requestSummary = normalizedThinkingLevel === "current";
|
|
1515
1518
|
const images = Array.isArray(imageInputs)
|
|
1516
1519
|
? imageInputs
|
|
1517
1520
|
: buildScreeningLlmImageInputs({
|
|
@@ -1520,6 +1523,11 @@ export function buildScreeningLlmMessages({
|
|
|
1520
1523
|
maxImages,
|
|
1521
1524
|
detail: imageDetail
|
|
1522
1525
|
});
|
|
1526
|
+
const outputShape = requestSummary
|
|
1527
|
+
? "4) 只返回 JSON,格式为:"
|
|
1528
|
+
+ "{\"passed\": true/false, \"summary\": \"少于100个中文词的筛选总结\"}"
|
|
1529
|
+
: "4) 只返回 JSON,格式为:"
|
|
1530
|
+
+ "{\"passed\": true/false}";
|
|
1523
1531
|
const prompt =
|
|
1524
1532
|
`请根据以下标准判断候选人是否通过筛选。\n\n筛选标准:\n${safeCriteria}\n\n`
|
|
1525
1533
|
+ `候选人信息:\n${safeText || "候选人的完整简历信息在后续截图中,请按截图顺序阅读。"}\n\n`
|
|
@@ -1529,9 +1537,10 @@ export function buildScreeningLlmMessages({
|
|
|
1529
1537
|
+ "要求:\n"
|
|
1530
1538
|
+ "1) 只能依据候选人信息或截图中真实出现的内容判断。\n"
|
|
1531
1539
|
+ "2) 若证据不足或截图无法确认,必须返回 passed=false。\n"
|
|
1532
|
-
+
|
|
1533
|
-
|
|
1534
|
-
|
|
1540
|
+
+ (requestSummary
|
|
1541
|
+
? "3) summary 必须为少于100个中文词的简短筛选总结,可包含核心依据和主要风险;不要输出推理过程。\n"
|
|
1542
|
+
: "3) 不要输出评估原因、证据列表、解释或额外文字。\n")
|
|
1543
|
+
+ outputShape;
|
|
1535
1544
|
const userContent = images.length
|
|
1536
1545
|
? [
|
|
1537
1546
|
{ type: "text", text: prompt },
|
|
@@ -1546,7 +1555,9 @@ export function buildScreeningLlmMessages({
|
|
|
1546
1555
|
role: "system",
|
|
1547
1556
|
content:
|
|
1548
1557
|
"你是一位严谨的招聘筛选助手。必须完整阅读输入内容,严禁编造不存在的候选人经历。"
|
|
1549
|
-
+
|
|
1558
|
+
+ (requestSummary
|
|
1559
|
+
? "只能返回严格 JSON。必须包含 passed 和 summary;summary 用中文,少于100个词,只概括筛选结论、核心依据和主要风险,不要输出推理过程。"
|
|
1560
|
+
: "只能返回严格 JSON,不要输出原因、证据或额外文字。")
|
|
1550
1561
|
},
|
|
1551
1562
|
{
|
|
1552
1563
|
role: "user",
|
|
@@ -1608,6 +1619,7 @@ async function callScreeningLlmWithProvider({
|
|
|
1608
1619
|
messages: buildScreeningLlmMessages({
|
|
1609
1620
|
candidate,
|
|
1610
1621
|
criteria,
|
|
1622
|
+
thinkingLevel,
|
|
1611
1623
|
imageInputs
|
|
1612
1624
|
})
|
|
1613
1625
|
};
|
|
@@ -1665,20 +1677,27 @@ async function callScreeningLlmWithProvider({
|
|
|
1665
1677
|
if (passed === null) {
|
|
1666
1678
|
throw new Error(`LLM response missing boolean passed decision: ${content.slice(0, 240)}`);
|
|
1667
1679
|
}
|
|
1680
|
+
const normalizedThinkingLevel = normalizeLlmThinkingLevel(thinkingLevel) || "low";
|
|
1681
|
+
const summary = normalizeBlockText(parsed?.summary || parsed?.screen_summary || parsed?.brief_summary);
|
|
1682
|
+
if (normalizedThinkingLevel === "current" && !summary) {
|
|
1683
|
+
throw new Error(`LLM response missing brief summary for current thinking level: ${content.slice(0, 240)}`);
|
|
1684
|
+
}
|
|
1668
1685
|
const evidence = Array.isArray(parsed?.evidence)
|
|
1669
1686
|
? parsed.evidence.map(normalizeText).filter(Boolean)
|
|
1670
1687
|
: [];
|
|
1671
|
-
const decisionCot =
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1688
|
+
const decisionCot = normalizedThinkingLevel === "current"
|
|
1689
|
+
? summary
|
|
1690
|
+
: (firstReasoningText([
|
|
1691
|
+
parsed?.cot,
|
|
1692
|
+
parsed?.decision_cot,
|
|
1693
|
+
parsed?.reasoning,
|
|
1694
|
+
parsed?.chain_of_thought,
|
|
1695
|
+
reasoningContent
|
|
1696
|
+
].map(normalizeBlockText).filter(Boolean)) || reasoningContent);
|
|
1678
1697
|
const providerName = normalizeText(config.llmProviderName || config.name || config.label || config.id);
|
|
1679
1698
|
const providerIndex = Number.isFinite(Number(config.llmProviderIndex)) ? Number(config.llmProviderIndex) : 0;
|
|
1680
1699
|
const providerCount = Number.isFinite(Number(config.llmProviderCount)) ? Number(config.llmProviderCount) : 1;
|
|
1681
|
-
|
|
1700
|
+
const result = {
|
|
1682
1701
|
ok: true,
|
|
1683
1702
|
provider: {
|
|
1684
1703
|
baseUrl: redactBaseUrl(baseUrl),
|
|
@@ -1708,6 +1727,7 @@ async function callScreeningLlmWithProvider({
|
|
|
1708
1727
|
provider_attempt_count: attempt,
|
|
1709
1728
|
screened_at: nowIso()
|
|
1710
1729
|
};
|
|
1730
|
+
return result;
|
|
1711
1731
|
} catch (error) {
|
|
1712
1732
|
lastError = error;
|
|
1713
1733
|
if (attempt >= maxAttempts || !isRetryableLlmRequestError(error)) {
|
|
@@ -38,11 +38,11 @@ import {
|
|
|
38
38
|
imageEvidenceFilePath,
|
|
39
39
|
measureTiming
|
|
40
40
|
} from "../../core/run/timing.js";
|
|
41
|
-
import {
|
|
42
|
-
callScreeningLlm,
|
|
43
|
-
normalizeText,
|
|
44
|
-
screenCandidate
|
|
45
|
-
} from "../../core/screening/index.js";
|
|
41
|
+
import {
|
|
42
|
+
callScreeningLlm,
|
|
43
|
+
normalizeText,
|
|
44
|
+
screenCandidate
|
|
45
|
+
} from "../../core/screening/index.js";
|
|
46
46
|
import {
|
|
47
47
|
CHAT_BOTTOM_MARKER_SELECTORS,
|
|
48
48
|
CHAT_CARD_SELECTORS,
|
|
@@ -104,11 +104,11 @@ function compactScreening(screening) {
|
|
|
104
104
|
|
|
105
105
|
function compactLlmResult(llmResult) {
|
|
106
106
|
if (!llmResult) return null;
|
|
107
|
-
return {
|
|
108
|
-
ok: Boolean(llmResult.ok),
|
|
109
|
-
provider: llmResult.provider || null,
|
|
110
|
-
passed: llmResult.passed,
|
|
111
|
-
cot: llmResult.cot || llmResult.decision_cot || "",
|
|
107
|
+
return {
|
|
108
|
+
ok: Boolean(llmResult.ok),
|
|
109
|
+
provider: llmResult.provider || null,
|
|
110
|
+
passed: llmResult.passed,
|
|
111
|
+
cot: llmResult.cot || llmResult.decision_cot || "",
|
|
112
112
|
reasoning_content: llmResult.reasoning_content || "",
|
|
113
113
|
raw_model_output: llmResult.raw_model_output || "",
|
|
114
114
|
evidence_count: llmResult.evidence?.length || 0,
|
|
@@ -743,12 +743,12 @@ export async function runChatWorkflow({
|
|
|
743
743
|
safeClickPointEnabled: effectiveHumanBehavior.clickMovement,
|
|
744
744
|
actionCooldownEnabled: effectiveHumanBehavior.actionCooldown
|
|
745
745
|
});
|
|
746
|
-
const humanRestController = createHumanRestController({
|
|
747
|
-
enabled: effectiveHumanRestEnabled,
|
|
748
|
-
shortRestEnabled: effectiveHumanBehavior.shortRest,
|
|
749
|
-
batchRestEnabled: effectiveHumanBehavior.batchRest,
|
|
750
|
-
restLevel: effectiveHumanBehavior.restLevel
|
|
751
|
-
});
|
|
746
|
+
const humanRestController = createHumanRestController({
|
|
747
|
+
enabled: effectiveHumanRestEnabled,
|
|
748
|
+
shortRestEnabled: effectiveHumanBehavior.shortRest,
|
|
749
|
+
batchRestEnabled: effectiveHumanBehavior.batchRest,
|
|
750
|
+
restLevel: effectiveHumanBehavior.restLevel
|
|
751
|
+
});
|
|
752
752
|
const normalizedDetailSource = normalizeDetailSource(detailSource);
|
|
753
753
|
const normalizedScreeningMode = normalizeScreeningMode(screeningMode);
|
|
754
754
|
const useLlmScreening = normalizedScreeningMode !== "deterministic";
|
|
@@ -792,12 +792,12 @@ export async function runChatWorkflow({
|
|
|
792
792
|
let requestedCount = 0;
|
|
793
793
|
let requestSatisfiedCount = 0;
|
|
794
794
|
let requestSkippedCount = 0;
|
|
795
|
-
let contextSetup = {};
|
|
796
|
-
let contextRecoveryAttempts = 0;
|
|
797
|
-
const candidateRecoveryCounts = new Map();
|
|
798
|
-
let lastHumanEvent = null;
|
|
799
|
-
|
|
800
|
-
function recordHumanEvent(event = null) {
|
|
795
|
+
let contextSetup = {};
|
|
796
|
+
let contextRecoveryAttempts = 0;
|
|
797
|
+
const candidateRecoveryCounts = new Map();
|
|
798
|
+
let lastHumanEvent = null;
|
|
799
|
+
|
|
800
|
+
function recordHumanEvent(event = null) {
|
|
801
801
|
if (!event) return lastHumanEvent;
|
|
802
802
|
lastHumanEvent = {
|
|
803
803
|
at: new Date().toISOString(),
|
|
@@ -861,13 +861,13 @@ export async function runChatWorkflow({
|
|
|
861
861
|
...setup.contextSetup,
|
|
862
862
|
initial_top_level_state: initialTopLevelState
|
|
863
863
|
};
|
|
864
|
-
runControl.checkpoint({
|
|
865
|
-
chat_context: contextSetup
|
|
866
|
-
});
|
|
867
|
-
|
|
868
|
-
async function recoverAndReapplyChatContext(reason, error = null, {
|
|
869
|
-
forceRefresh = false
|
|
870
|
-
} = {}) {
|
|
864
|
+
runControl.checkpoint({
|
|
865
|
+
chat_context: contextSetup
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
async function recoverAndReapplyChatContext(reason, error = null, {
|
|
869
|
+
forceRefresh = false
|
|
870
|
+
} = {}) {
|
|
871
871
|
runControl.setPhase("chat:recover_shell");
|
|
872
872
|
contextRecoveryAttempts += 1;
|
|
873
873
|
const shellRecovery = await recoverChatShell(client, {
|
|
@@ -967,12 +967,12 @@ export async function runChatWorkflow({
|
|
|
967
967
|
context_recoveries: contextRecoveryAttempts,
|
|
968
968
|
list_end_reason: listEndReason,
|
|
969
969
|
viewport_checks: viewportGuard.getStats().checks,
|
|
970
|
-
viewport_recoveries: viewportGuard.getStats().recoveries,
|
|
971
|
-
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
972
|
-
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
973
|
-
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
974
|
-
human_rest_enabled: effectiveHumanRestEnabled,
|
|
975
|
-
human_rest_count: humanRestController.getState().rest_count,
|
|
970
|
+
viewport_recoveries: viewportGuard.getStats().recoveries,
|
|
971
|
+
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
972
|
+
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
973
|
+
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
974
|
+
human_rest_enabled: effectiveHumanRestEnabled,
|
|
975
|
+
human_rest_count: humanRestController.getState().rest_count,
|
|
976
976
|
human_rest_ms: humanRestController.getState().total_rest_ms,
|
|
977
977
|
last_human_event: lastHumanEvent
|
|
978
978
|
});
|
|
@@ -997,10 +997,10 @@ export async function runChatWorkflow({
|
|
|
997
997
|
last_human_event: lastHumanEvent,
|
|
998
998
|
list_end_reason: listEndReason,
|
|
999
999
|
target_pass_count: passTarget,
|
|
1000
|
-
process_until_list_end: Boolean(processUntilListEnd),
|
|
1001
|
-
processed_limit: processedLimit,
|
|
1002
|
-
detail_source: normalizedDetailSource,
|
|
1003
|
-
processed: 0,
|
|
1000
|
+
process_until_list_end: Boolean(processUntilListEnd),
|
|
1001
|
+
processed_limit: processedLimit,
|
|
1002
|
+
detail_source: normalizedDetailSource,
|
|
1003
|
+
processed: 0,
|
|
1004
1004
|
screened: 0,
|
|
1005
1005
|
detail_opened: 0,
|
|
1006
1006
|
llm_screened: 0,
|
|
@@ -1501,11 +1501,11 @@ export async function runChatWorkflow({
|
|
|
1501
1501
|
llmResult = createMissingLlmConfigResult();
|
|
1502
1502
|
} else {
|
|
1503
1503
|
try {
|
|
1504
|
-
llmResult = await measureTiming(timings, "vision_model_ms", () => callScreeningLlm({
|
|
1505
|
-
candidate: detailResult.candidate,
|
|
1506
|
-
criteria,
|
|
1507
|
-
config: llmConfig,
|
|
1508
|
-
timeoutMs: llmTimeoutMs,
|
|
1504
|
+
llmResult = await measureTiming(timings, "vision_model_ms", () => callScreeningLlm({
|
|
1505
|
+
candidate: detailResult.candidate,
|
|
1506
|
+
criteria,
|
|
1507
|
+
config: llmConfig,
|
|
1508
|
+
timeoutMs: llmTimeoutMs,
|
|
1509
1509
|
imageEvidence,
|
|
1510
1510
|
maxImages: llmImageLimit,
|
|
1511
1511
|
imageDetail: llmImageDetail
|
|
@@ -1574,10 +1574,10 @@ export async function runChatWorkflow({
|
|
|
1574
1574
|
const llmTimingKey = imageEvidence?.file_paths?.length
|
|
1575
1575
|
? "vision_model_ms"
|
|
1576
1576
|
: "text_model_ms";
|
|
1577
|
-
llmResult = await measureTiming(timings, llmTimingKey, () => callScreeningLlm({
|
|
1578
|
-
candidate: detailResult.candidate,
|
|
1579
|
-
criteria,
|
|
1580
|
-
config: llmConfig,
|
|
1577
|
+
llmResult = await measureTiming(timings, llmTimingKey, () => callScreeningLlm({
|
|
1578
|
+
candidate: detailResult.candidate,
|
|
1579
|
+
criteria,
|
|
1580
|
+
config: llmConfig,
|
|
1581
1581
|
timeoutMs: llmTimeoutMs,
|
|
1582
1582
|
imageEvidence,
|
|
1583
1583
|
maxImages: llmImageLimit,
|
|
@@ -1773,12 +1773,12 @@ export async function runChatWorkflow({
|
|
|
1773
1773
|
context_recoveries: contextRecoveryAttempts,
|
|
1774
1774
|
list_end_reason: listEndReason || null,
|
|
1775
1775
|
viewport_checks: viewportGuard.getStats().checks,
|
|
1776
|
-
viewport_recoveries: viewportGuard.getStats().recoveries,
|
|
1777
|
-
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
1778
|
-
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
1779
|
-
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1780
|
-
human_rest_enabled: effectiveHumanRestEnabled,
|
|
1781
|
-
human_rest_count: humanRestController.getState().rest_count,
|
|
1776
|
+
viewport_recoveries: viewportGuard.getStats().recoveries,
|
|
1777
|
+
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
1778
|
+
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
1779
|
+
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1780
|
+
human_rest_enabled: effectiveHumanRestEnabled,
|
|
1781
|
+
human_rest_count: humanRestController.getState().rest_count,
|
|
1782
1782
|
human_rest_ms: humanRestController.getState().total_rest_ms,
|
|
1783
1783
|
last_human_event: lastHumanEvent,
|
|
1784
1784
|
last_candidate_id: screeningCandidate.id || null,
|
|
@@ -1818,11 +1818,11 @@ export async function runChatWorkflow({
|
|
|
1818
1818
|
compactResult.human_rest = restResult;
|
|
1819
1819
|
addTiming(compactResult.timings, "human_rest_ms", restElapsed);
|
|
1820
1820
|
compactResult.timings.total_ms = Date.now() - candidateStarted;
|
|
1821
|
-
runControl.updateProgress({
|
|
1822
|
-
human_rest_enabled: effectiveHumanRestEnabled,
|
|
1823
|
-
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1824
|
-
human_rest_count: humanRestController.getState().rest_count,
|
|
1825
|
-
human_rest_ms: humanRestController.getState().total_rest_ms,
|
|
1821
|
+
runControl.updateProgress({
|
|
1822
|
+
human_rest_enabled: effectiveHumanRestEnabled,
|
|
1823
|
+
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1824
|
+
human_rest_count: humanRestController.getState().rest_count,
|
|
1825
|
+
human_rest_ms: humanRestController.getState().total_rest_ms,
|
|
1826
1826
|
human_rest_last: restResult,
|
|
1827
1827
|
context_recoveries: contextRecoveryAttempts,
|
|
1828
1828
|
last_human_event: lastHumanEvent
|
|
@@ -1855,10 +1855,10 @@ export async function runChatWorkflow({
|
|
|
1855
1855
|
last_human_event: lastHumanEvent,
|
|
1856
1856
|
list_end_reason: listEndReason || null,
|
|
1857
1857
|
target_pass_count: passTarget,
|
|
1858
|
-
process_until_list_end: Boolean(processUntilListEnd),
|
|
1859
|
-
processed_limit: processedLimit,
|
|
1860
|
-
detail_source: normalizedDetailSource,
|
|
1861
|
-
processed: finalCounters.processed,
|
|
1858
|
+
process_until_list_end: Boolean(processUntilListEnd),
|
|
1859
|
+
processed_limit: processedLimit,
|
|
1860
|
+
detail_source: normalizedDetailSource,
|
|
1861
|
+
processed: finalCounters.processed,
|
|
1862
1862
|
screened: finalCounters.screened,
|
|
1863
1863
|
detail_opened: finalCounters.detail_opened,
|
|
1864
1864
|
llm_screened: finalCounters.llm_screened,
|
|
@@ -1880,10 +1880,10 @@ export function createChatRunService({
|
|
|
1880
1880
|
} = {}) {
|
|
1881
1881
|
const manager = lifecycle || createRunLifecycleManager({ idPrefix, onSnapshot });
|
|
1882
1882
|
|
|
1883
|
-
function startChatRun({
|
|
1884
|
-
runId = "",
|
|
1885
|
-
client,
|
|
1886
|
-
targetUrl = CHAT_TARGET_URL,
|
|
1883
|
+
function startChatRun({
|
|
1884
|
+
runId = "",
|
|
1885
|
+
client,
|
|
1886
|
+
targetUrl = CHAT_TARGET_URL,
|
|
1887
1887
|
job = "",
|
|
1888
1888
|
startFrom = "all",
|
|
1889
1889
|
criteria = "",
|
|
@@ -1929,10 +1929,10 @@ export function createChatRunService({
|
|
|
1929
1929
|
legacyEnabled: humanRestEnabled === true || llmConfig?.humanRestEnabled === true
|
|
1930
1930
|
});
|
|
1931
1931
|
const effectiveHumanRestEnabled = effectiveHumanBehavior.restEnabled;
|
|
1932
|
-
return manager.startRun({
|
|
1933
|
-
runId,
|
|
1934
|
-
name,
|
|
1935
|
-
context: {
|
|
1932
|
+
return manager.startRun({
|
|
1933
|
+
runId,
|
|
1934
|
+
name,
|
|
1935
|
+
context: {
|
|
1936
1936
|
domain: "chat",
|
|
1937
1937
|
target_url: targetUrl,
|
|
1938
1938
|
criteria_present: Boolean(criteria),
|
|
@@ -1962,13 +1962,13 @@ export function createChatRunService({
|
|
|
1962
1962
|
list_settle_ms: listSettleMs,
|
|
1963
1963
|
list_fallback_point: listFallbackPoint,
|
|
1964
1964
|
online_resume_button_timeout_ms: onlineResumeButtonTimeoutMs,
|
|
1965
|
-
image_output_dir: imageOutputDir || "",
|
|
1966
|
-
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
1967
|
-
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
1968
|
-
human_behavior: effectiveHumanBehavior,
|
|
1969
|
-
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1970
|
-
human_rest_enabled: effectiveHumanRestEnabled
|
|
1971
|
-
},
|
|
1965
|
+
image_output_dir: imageOutputDir || "",
|
|
1966
|
+
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
1967
|
+
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
1968
|
+
human_behavior: effectiveHumanBehavior,
|
|
1969
|
+
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1970
|
+
human_rest_enabled: effectiveHumanRestEnabled
|
|
1971
|
+
},
|
|
1972
1972
|
progress: {
|
|
1973
1973
|
card_count: 0,
|
|
1974
1974
|
target_count: targetPassCount || (processUntilListEnd ? "all" : processedLimit),
|
|
@@ -1983,11 +1983,11 @@ export function createChatRunService({
|
|
|
1983
1983
|
requested: 0,
|
|
1984
1984
|
request_satisfied: 0,
|
|
1985
1985
|
request_skipped: 0,
|
|
1986
|
-
context_recoveries: 0,
|
|
1987
|
-
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
1988
|
-
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
1989
|
-
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1990
|
-
human_rest_enabled: effectiveHumanRestEnabled,
|
|
1986
|
+
context_recoveries: 0,
|
|
1987
|
+
human_behavior_enabled: effectiveHumanBehavior.enabled,
|
|
1988
|
+
human_behavior_profile: effectiveHumanBehavior.profile,
|
|
1989
|
+
human_rest_level: effectiveHumanBehavior.restLevel,
|
|
1990
|
+
human_rest_enabled: effectiveHumanRestEnabled,
|
|
1991
1991
|
human_rest_count: 0,
|
|
1992
1992
|
human_rest_ms: 0,
|
|
1993
1993
|
last_human_event: null
|
|
@@ -38,13 +38,13 @@ import {
|
|
|
38
38
|
resolveInfiniteListFallbackPoint
|
|
39
39
|
} from "../../core/infinite-list/index.js";
|
|
40
40
|
import { createViewportRunGuard } from "../../core/self-heal/index.js";
|
|
41
|
-
import {
|
|
42
|
-
callScreeningLlm,
|
|
43
|
-
compactScreeningLlmResult,
|
|
44
|
-
createFailedLlmScreeningResult,
|
|
45
|
-
llmResultToScreening,
|
|
46
|
-
screenCandidate
|
|
47
|
-
} from "../../core/screening/index.js";
|
|
41
|
+
import {
|
|
42
|
+
callScreeningLlm,
|
|
43
|
+
compactScreeningLlmResult,
|
|
44
|
+
createFailedLlmScreeningResult,
|
|
45
|
+
llmResultToScreening,
|
|
46
|
+
screenCandidate
|
|
47
|
+
} from "../../core/screening/index.js";
|
|
48
48
|
import {
|
|
49
49
|
closeRecommendBlockingPanels,
|
|
50
50
|
closeRecommendAvatarPreview,
|
|
@@ -906,8 +906,8 @@ export async function runRecommendWorkflow({
|
|
|
906
906
|
recovery_reason: reason
|
|
907
907
|
});
|
|
908
908
|
return refreshResult;
|
|
909
|
-
}
|
|
910
|
-
|
|
909
|
+
}
|
|
910
|
+
|
|
911
911
|
runControl.setPhase("recommend:cleanup");
|
|
912
912
|
await closeRecommendDetail(client, { attemptsLimit: 2 });
|
|
913
913
|
await closeRecommendAvatarPreview(client, { attemptsLimit: 2 });
|
|
@@ -1334,11 +1334,11 @@ export async function runRecommendWorkflow({
|
|
|
1334
1334
|
const llmTimingKey = detailResult?.image_evidence?.file_paths?.length
|
|
1335
1335
|
? "vision_model_ms"
|
|
1336
1336
|
: "text_model_ms";
|
|
1337
|
-
llmResult = await measureTiming(timings, llmTimingKey, () => callScreeningLlm({
|
|
1338
|
-
candidate: screeningCandidate,
|
|
1339
|
-
criteria,
|
|
1340
|
-
config: llmConfig,
|
|
1341
|
-
timeoutMs: llmTimeoutMs,
|
|
1337
|
+
llmResult = await measureTiming(timings, llmTimingKey, () => callScreeningLlm({
|
|
1338
|
+
candidate: screeningCandidate,
|
|
1339
|
+
criteria,
|
|
1340
|
+
config: llmConfig,
|
|
1341
|
+
timeoutMs: llmTimeoutMs,
|
|
1342
1342
|
imageEvidence: detailResult?.image_evidence || null,
|
|
1343
1343
|
maxImages: llmImageLimit,
|
|
1344
1344
|
imageDetail: llmImageDetail
|
|
@@ -1532,7 +1532,7 @@ export async function runRecommendWorkflow({
|
|
|
1532
1532
|
human_rest: humanRestController.getState(),
|
|
1533
1533
|
last_human_event: lastHumanEvent,
|
|
1534
1534
|
list_end_reason: listEndReason || null,
|
|
1535
|
-
refresh_rounds: refreshRounds,
|
|
1535
|
+
refresh_rounds: refreshRounds,
|
|
1536
1536
|
refresh_attempts: refreshAttempts,
|
|
1537
1537
|
context_recoveries: contextRecoveryAttempts,
|
|
1538
1538
|
...countRecommendResultStatuses(results, { greetCount }),
|