feat(sisyphus): add Kimi K2.x prompt variant

- New src/agents/sisyphus/kimi-k2-6.ts based on gpt-5-4.ts 8-block architecture
- New src/agents/sisyphus-junior/kimi-k2-6.ts worker variant
- Preserves 4 pillars: intent gate + verbalization, parallel tools, verification
- Adds <re_entry_rule>: suppress re-verbalization for already-resolved turns
- Adds <exploration_budget>: hard stop conditions alongside aggressive parallelism
- Tiered <verification_loop> (V1/V2/V3): V3 keeps full rigor with harsh enforcement
- Adds <token_economy>: verbalization explicitly excluded from trim mandate
- isKimiK2Model in types.ts: matches kimi, k2p5/k2p6 variants (case-insensitive)
- Routing in sisyphus.ts + sisyphus-junior/agent.ts
- Tests: 3 new kimi routing cases in sisyphus-junior/index.test.ts (all pass)

Motivation: K2.x was post-trained with Toggle RL (~25-30% token reduction) and a
GRM scoring appropriate detail + intent inference. Reusing Claude-style prompts
double-taxes the model — external strictness on top of RL-learned strictness causes
over-deliberation on already-resolved requests. The re-entry rule and exploration
budget fix this without weakening verification rigor.

Refs: kimi.com/blog/kimi-k2-6, arxiv 2602.02276 §4.4.2 (Toggle, GRM)
This commit is contained in:
YeonGyu-Kim
2026-04-28 14:57:17 +09:00
parent 886845b703
commit 7a3a835a22
8 changed files with 863 additions and 1 deletions
+17
View File
@@ -101,6 +101,23 @@ export function isClaudeOpus47Model(model: string): boolean {
return modelName.includes("claude-opus-4-7");
}
/**
* Kimi K2.x model detection (K2.5 / K2.6 family).
*
* Matches model IDs containing any of:
* - "kimi" (provider/family signal — kimi-k2.6, moonshotai/Kimi-K2.6, etc.)
* - "k2p5" / "k2-p5" / "k2.p5"
* - "k2p6" / "k2-p6" / "k2.p6"
*
* Match is case-insensitive on the model name (last path segment).
*/
export function isKimiK2Model(model: string): boolean {
const modelName = extractModelName(model).toLowerCase();
if (modelName.includes("kimi")) return true;
if (/k2[-.]?p[56]/.test(modelName)) return true;
return false;
}
const GEMINI_PROVIDERS = ["google/", "google-vertex/"];
export function isMiniMaxModel(model: string): boolean {