@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.
@@ -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
- totalEvidence,
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
- + "3) 不要输出评估原因、证据列表、解释或额外文字。\n"
1533
- + "4) 只返回 JSON,格式为:"
1534
- + "{\"passed\": true/false}";
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
- + "只能返回严格 JSON,不要输出原因、证据或额外文字。"
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 = firstReasoningText([
1672
- parsed?.cot,
1673
- parsed?.decision_cot,
1674
- parsed?.reasoning,
1675
- parsed?.chain_of_thought,
1676
- reasoningContent
1677
- ].map(normalizeBlockText).filter(Boolean)) || reasoningContent;
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
- return {
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 }),