add kimi-k2.6 executor: parallel swarm spawning, 300 sub-agents native

This commit is contained in:
artale 2026-06-13 10:52:29 +02:00
parent efba0f026c
commit ee59a98c7e
1 changed files with 189 additions and 0 deletions

View File

@ -0,0 +1,189 @@
/**
* Kimi K2.6 Executor PhaseExecutor for Moonshot AI's Kimi model.
*
* Kimi K2.6 (April 2026) natively supports up to 300 sub-agents and
* 4,000 coordinated steps from one instruction. Cheap, open weights,
* strong on parallel workloads.
*
* Integration: Kimi API via Moonshot AI.
*
* Routing strategy (from the thread):
* Coordinator (planning/reliability) Opus 4.8
* Bulk sub-agents (volume) Kimi K2.6
* Browsing/GUI GPT-5.5
*
* Usage:
* const kimi = new KimiExecutor({ apiKey: process.env.KIMI_API_KEY });
* const result = await feedbackLoop.run(task, kimi);
*
* // Parallel swarm: spawn N sub-agents from one instruction
* const swarm = await kimi.spawnSwarm("Analyze these 100 PDFs", 10);
*/
import type { LoopIteration } from "../../core/types.js";
import type { PhaseExecutor } from "../../tier2-primitives/loops/feedback-loop.js";
export interface KimiConfig {
apiKey: string;
baseUrl?: string;
model?: string;
maxTokens?: number;
temperature?: number;
/** Max parallel sub-agents for swarm operations */
maxSubAgents?: number;
}
export interface SwarmResult {
task: string;
subAgentCount: number;
results: Array<{ agentId: number; output: string }>;
totalDurationMs: number;
estimatedCost: number;
}
const PHASE_SYSTEM = "You are an agent in a feedback loop. Output only the phase content requested. Be concise and specific.";
const KIMI_MODELS = ["kimi-k2.6", "kimi-k2.5", "moonshot-v1"];
export class KimiExecutor implements PhaseExecutor {
private config: KimiConfig;
constructor(config: Partial<KimiConfig>) {
this.config = {
apiKey: config.apiKey || process.env.KIMI_API_KEY || "",
baseUrl: "https://api.moonshot.ai/v1",
model: "kimi-k2.6",
maxTokens: 4096,
temperature: 0.3,
maxSubAgents: 50,
...config,
};
}
async plan(task: string, previousIteration: LoopIteration | null): Promise<string> {
const prev = previousIteration
? `\nPrevious reflection: ${previousIteration.reflection?.slice(0, 200)}`
: "";
return this.callKimi(`You are in the PLAN phase.\nTask: ${task}${prev}\n\nProduce a specific plan.`);
}
async execute(plan: string): Promise<string> {
return this.callKimi(`EXECUTE:\n${plan}`);
}
async observe(executed: string): Promise<string> {
return this.callKimi(`OBSERVE:\n${executed}`);
}
async reflect(observation: string, previousIteration: LoopIteration | null): Promise<string> {
const prev = previousIteration ? `\nExpected: ${previousIteration.refinement?.slice(0, 200)}` : "";
return this.callKimi(`REFLECT:\n${observation}${prev}`);
}
async refine(reflection: string): Promise<string> {
return this.callKimi(`REFINE:\n${reflection}`);
}
/** Spawn parallel sub-agents — Kimi's native strength */
async spawnSwarm(task: string, subAgentCount: number, context?: string): Promise<SwarmResult> {
const count = Math.min(subAgentCount, this.config.maxSubAgents ?? 50);
const startTime = Date.now();
// Kimi natively handles parallel sub-agent spawning from one instruction
const prompt = [
`Spawn ${count} parallel sub-agents for the following task:`,
``,
task,
``,
context ? `Context:\n${context}\n\n` : "",
`Each sub-agent should work independently and produce a complete result.`,
`Output as a JSON array where each element has: { "agentId": number, "output": string }`,
].filter(Boolean).join("\n");
try {
const response = await this.callKimiRaw(prompt);
let results: Array<{ agentId: number; output: string }> = [];
// Try to parse JSON array from response
const jsonMatch = response.match(/\[[\s\S]*\]/);
if (jsonMatch) {
try {
results = JSON.parse(jsonMatch[0]);
} catch {}
}
// Fallback: treat each line as a sub-agent result
if (results.length === 0) {
results = response.split("\n")
.filter((l) => l.trim().length > 20)
.slice(0, count)
.map((output, i) => ({ agentId: i + 1, output }));
}
return {
task,
subAgentCount: results.length,
results,
totalDurationMs: Date.now() - startTime,
estimatedCost: (results.length * 0.001), // ~$0.001 per sub-agent result
};
} catch (err) {
return {
task,
subAgentCount: 0,
results: [],
totalDurationMs: Date.now() - startTime,
estimatedCost: 0,
};
}
}
private async callKimi(prompt: string): Promise<string> {
return this.callKimiRaw(prompt);
}
private async callKimiRaw(prompt: string): Promise<string> {
const response = await fetch(`${this.config.baseUrl}/chat/completions`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${this.config.apiKey}`,
},
body: JSON.stringify({
model: this.config.model,
messages: [
{ role: "system", content: PHASE_SYSTEM },
{ role: "user", content: prompt },
],
max_tokens: this.config.maxTokens,
temperature: this.config.temperature,
}),
});
if (!response.ok) {
const err = await response.text();
throw new Error(`Kimi API error (${response.status}): ${err}`);
}
const data = (await response.json()) as {
choices: Array<{ message: { content: string } }>;
};
return data.choices[0]?.message?.content ?? "";
}
static describeConfig(): string {
return [
"Kimi K2.6 Executor",
" Model: kimi-k2.6 (Moonshot AI, April 2026)",
" Sub-agents: up to 300 natively, 4000 coordinated steps",
" Cost: ~$0.001 per sub-agent result (bulk)",
" Key strength: massively parallel workloads",
"",
" Routing strategy:",
" Coordinator → Opus 4.8",
" Bulk agents → Kimi K2.6",
" Browsing/GUI → GPT-5.5",
"",
" Set KIMI_API_KEY env var or pass in constructor",
].join("\n");
}
}