Skip to content

Commit 6711db3

Browse files
author
Foundups Agent
committed
fix(reddog): honor Kimi K3 runtime budgets
1 parent 9b0b303 commit 6711db3

2 files changed

Lines changed: 102 additions & 19 deletions

File tree

scripts/advisory_model_once.py

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
DEEPSEEK_CRITIC_MODEL = "deepseek/deepseek-v4-pro"
3636
KIMI_CODE_PANEL_MODEL = "moonshotai/kimi-k2.7-code"
3737
KIMI_PANEL_MODEL = "moonshotai/kimi-k3"
38+
# Historical constant name retained because the extension contract inspects the
39+
# bridge as text. The K3 budget applies to every direct completion role.
3840
KIMI_K3_PANEL_MAX_TOKENS = 4096
3941
DEFAULT_LEAD_MODEL = GLM_PRINCIPAL_MODEL
4042
DEFAULT_PANEL_MODELS = (DEEPSEEK_CRITIC_MODEL, KIMI_CODE_PANEL_MODEL, KIMI_PANEL_MODEL)
@@ -138,7 +140,7 @@ def _chat_completion(
138140
body: dict[str, Any] = {
139141
"model": model,
140142
"messages": messages,
141-
"max_tokens": max_tokens,
143+
"max_tokens": _effective_max_tokens(model, max_tokens),
142144
"stream": False,
143145
}
144146
if model == KIMI_PANEL_MODEL:
@@ -153,6 +155,33 @@ def _chat_completion(
153155
return str(content), retry_meta
154156

155157

158+
def _effective_max_tokens(model: str, requested_max_tokens: int) -> int:
159+
"""Return the provider-compatible output budget for one model call."""
160+
161+
if model == KIMI_PANEL_MODEL:
162+
return max(requested_max_tokens, KIMI_K3_PANEL_MAX_TOKENS)
163+
return requested_max_tokens
164+
165+
166+
def _fusion_token_budgets(
167+
lead_model: str,
168+
panel_models: list[str],
169+
requested_max_tokens: int,
170+
) -> tuple[dict[str, Any], dict[str, int]]:
171+
"""Build truthful effective token budgets for every Fusion role."""
172+
173+
panel = {
174+
model: _effective_max_tokens(model, requested_max_tokens)
175+
for model in panel_models
176+
}
177+
roles: dict[str, Any] = {
178+
"lead": _effective_max_tokens(lead_model, requested_max_tokens),
179+
"panel": panel,
180+
"synthesis": _effective_max_tokens(lead_model, requested_max_tokens),
181+
}
182+
return roles, panel
183+
184+
156185
def _clean_history(value: object) -> list[dict[str, str]]:
157186
if not isinstance(value, list):
158187
return []
@@ -220,6 +249,27 @@ def _format_panel(lead_model: str, lead_text: str, panel_results: dict[str, str]
220249
return "\n\n".join(parts)
221250

222251

252+
def _synthesis_user_prompt(
253+
redacted_prompt: str,
254+
lead_text: str,
255+
panel_results: dict[str, str],
256+
) -> str:
257+
"""Assemble the bounded lead and panel evidence for synthesis."""
258+
259+
panel_text = "\n\n".join(
260+
_model_label(model) + " critique:\n" + text[:8000]
261+
for model, text in panel_results.items()
262+
)
263+
return (
264+
"Original task:\n"
265+
+ redacted_prompt
266+
+ "\n\nLead answer:\n"
267+
+ lead_text[:12000]
268+
+ "\n\nPanel critiques:\n"
269+
+ panel_text
270+
)
271+
272+
223273
def _none_like_model_text(value: object) -> bool:
224274
text = str(value or "").strip()
225275
lowered = text.lower()
@@ -283,6 +333,7 @@ def _fusion_quorum_packet(
283333
lead_model: str,
284334
panel_models: list[str],
285335
panel_models_truncated: bool,
336+
role_max_tokens: dict[str, Any] | None = None,
286337
panel_max_tokens: dict[str, int] | None = None,
287338
missing_required_evidence: list[str] | None = None,
288339
challenging_critics: list[str] | None = None,
@@ -307,6 +358,7 @@ def _fusion_quorum_packet(
307358
"lead_model": lead_model,
308359
"panel_models": panel_models,
309360
"panel_models_truncated": panel_models_truncated,
361+
"role_max_tokens": dict(role_max_tokens or {}),
310362
"panel_max_tokens": dict(panel_max_tokens or {}),
311363
"fusion_panel_quorum": quorum,
312364
},
@@ -383,10 +435,9 @@ def _run_foundups_fusion(
383435
temperature = _bounded_temperature(payload.get("temperature"), 0.2)
384436
lead_model = _model_slug(payload.get("lead_model"), DEFAULT_LEAD_MODEL)
385437
panel_models, panel_models_truncated = _panel_models_with_meta(payload.get("panel_models"))
386-
panel_max_tokens = {
387-
model: (max(max_tokens, KIMI_K3_PANEL_MAX_TOKENS) if model == KIMI_PANEL_MODEL else max_tokens)
388-
for model in panel_models
389-
}
438+
role_max_tokens, panel_max_tokens = _fusion_token_budgets(
439+
lead_model, panel_models, max_tokens
440+
)
390441
base_system = _system_prompt(payload)
391442
response_contract = str(payload.get("response_contract") or "")
392443
strict_json_contract = response_contract.startswith("strict_json")
@@ -401,6 +452,7 @@ def _run_foundups_fusion(
401452
lead_model=lead_model,
402453
panel_models=panel_models,
403454
panel_models_truncated=panel_models_truncated,
455+
role_max_tokens=role_max_tokens,
404456
panel_max_tokens=panel_max_tokens,
405457
missing_required_evidence=missing_evidence,
406458
)
@@ -422,7 +474,7 @@ def _run_foundups_fusion(
422474
api_key,
423475
lead_model,
424476
lead_messages,
425-
max_tokens=max_tokens,
477+
max_tokens=role_max_tokens["lead"],
426478
temperature=temperature,
427479
timeout=timeout,
428480
)
@@ -439,6 +491,7 @@ def _run_foundups_fusion(
439491
lead_model=lead_model,
440492
panel_models=panel_models,
441493
panel_models_truncated=panel_models_truncated,
494+
role_max_tokens=role_max_tokens,
442495
panel_max_tokens=panel_max_tokens,
443496
)
444497

@@ -492,6 +545,7 @@ def _run_foundups_fusion(
492545
lead_model=lead_model,
493546
panel_models=panel_models,
494547
panel_models_truncated=panel_models_truncated,
548+
role_max_tokens=role_max_tokens,
495549
panel_max_tokens=panel_max_tokens,
496550
challenging_critics=[],
497551
)
@@ -506,18 +560,7 @@ def _run_foundups_fusion(
506560
base_system
507561
+ "\n\nSynthesis pass: resolve panel disagreement, preserve useful dissent, and return the best actionable WSP-compliant recommendation. The final section must be WSP_15 Priority followed by Next safest step."
508562
)
509-
panel_text = "\n\n".join(
510-
_model_label(model) + " critique:\n" + text[:8000]
511-
for model, text in panel_results.items()
512-
)
513-
synthesis_user = (
514-
"Original task:\n"
515-
+ redacted_prompt
516-
+ "\n\nLead answer:\n"
517-
+ lead_text[:12000]
518-
+ "\n\nPanel critiques:\n"
519-
+ panel_text
520-
)
563+
synthesis_user = _synthesis_user_prompt(redacted_prompt, lead_text, panel_results)
521564
_progress("synthesis_start", "Synthesis request started: " + lead_model)
522565
try:
523566
synthesis, _syn_retry = _chat_completion(
@@ -527,7 +570,7 @@ def _run_foundups_fusion(
527570
{"role": "system", "content": synthesis_system},
528571
{"role": "user", "content": synthesis_user},
529572
],
530-
max_tokens=max_tokens,
573+
max_tokens=role_max_tokens["synthesis"],
531574
temperature=temperature,
532575
timeout=timeout,
533576
)
@@ -538,6 +581,7 @@ def _run_foundups_fusion(
538581
lead_model=lead_model,
539582
panel_models=panel_models,
540583
panel_models_truncated=panel_models_truncated,
584+
role_max_tokens=role_max_tokens,
541585
panel_max_tokens=panel_max_tokens,
542586
challenging_critics=challenging_critics,
543587
)
@@ -561,6 +605,8 @@ def _run_foundups_fusion(
561605
"lead_model": lead_model,
562606
"panel_models": panel_models,
563607
"panel_models_truncated": panel_models_truncated,
608+
"requested_max_tokens": max_tokens,
609+
"role_max_tokens": role_max_tokens,
564610
"panel_max_tokens": panel_max_tokens,
565611
"redacted_prompt": redacted_prompt,
566612
"lead_excerpt": lead_text[:4000],

scripts/tests/test_advisory_model_once_hardening.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ def test_kimi_k3_completion_uses_mandatory_max_reasoning_without_temperature(sel
8282

8383
self.assertEqual(content, "ok")
8484
body = post.call_args.args[1]
85+
self.assertEqual(body["max_tokens"], 4096)
8586
self.assertEqual(body["reasoning"], {"effort": "max"})
8687
self.assertNotIn("temperature", body)
8788

@@ -449,6 +450,42 @@ def fake_chat(api_key, model, messages, **kwargs): # noqa: ANN001, ARG001
449450
{"moonshotai/kimi-k3": 4096},
450451
)
451452

453+
def test_fusion_kimi_k3_principal_uses_and_records_4096_for_both_passes(self) -> None:
454+
calls: list[tuple[str, int]] = []
455+
456+
def fake_chat(api_key, model, messages, **kwargs): # noqa: ANN001, ARG001
457+
calls.append((model, kwargs["max_tokens"]))
458+
system = str(messages[0]["content"])
459+
if "Panel critic pass" in system:
460+
return (
461+
"Challenge: the evidence framing is unsupported and the WSP_15 "
462+
"priority needs verification.",
463+
{"retry_count": 0},
464+
)
465+
return "Evidence-backed result with WSP_15 priority.", {"retry_count": 0}
466+
467+
with mock.patch.object(bridge, "_chat_completion", side_effect=fake_chat):
468+
result = bridge._run_foundups_fusion(
469+
"key",
470+
"prompt",
471+
[],
472+
{
473+
"lead_model": "moonshotai/kimi-k3",
474+
"panel_models": ["critic-a"],
475+
"max_tokens": 1200,
476+
},
477+
)
478+
479+
self.assertTrue(result["ok"])
480+
self.assertEqual(calls.count(("moonshotai/kimi-k3", 4096)), 2)
481+
self.assertIn(("critic-a", 1200), calls)
482+
packet = result["review_packet"]
483+
self.assertEqual(packet["requested_max_tokens"], 1200)
484+
self.assertEqual(
485+
packet["role_max_tokens"],
486+
{"lead": 4096, "panel": {"critic-a": 1200}, "synthesis": 4096},
487+
)
488+
452489
def test_fusion_strict_json_contract_reaches_lead_and_synthesis_prompts(self) -> None:
453490
systems: list[str] = []
454491

0 commit comments

Comments
 (0)