autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
187 lines (186 loc) • 6.22 kB
TypeScript
/**
* Strategies — Agent 执行策略
*
* 核心思想: "如何组织工作" 与 "能做什么" 正交。
*
* 四种策略:
* 1. SingleStrategy — 单次 ReAct 循环 (最简单,用于对话)
* 2. PipelineStrategy — 顺序多阶段 + 质量门控 (分析→提交)
* 3. FanOutStrategy — 并行执行 + 合并 (多维度冷启动)
* 4. AdaptiveStrategy — 运行时自动选择策略 (智能模式)
*
* 这就是为什么 "冷启动" 和 "扫描" 产出一致:
* - 冷启动 = FanOut(items=dimensions, itemStrategy=Pipeline(analyze→gate→produce))
* - 扫描 = Pipeline(analyze→gate→produce)
* - 唯一区别: 作用域 (全项目 vs 单目录) 和并行度
*
* 借鉴:
* - Anthropic: Prompt Chaining, Parallelization, Orchestrator-Worker
* - LangGraph: StateGraph, parallel branches
* - AutoGen: Sequential/Parallel teams
*
* @module strategies
*/
import { AgentMessage } from './AgentMessage.js';
/** Minimal runtime interface used by strategies (avoids circular import with AgentRuntime) */
interface StrategyRuntime {
id: string;
reactLoop(prompt: string, opts?: Record<string, unknown>): Promise<StrategyResult>;
}
/** Strategy execution result */
interface StrategyResult {
reply: string;
toolCalls: Array<Record<string, unknown>>;
tokenUsage: {
input: number;
output: number;
};
iterations: number;
[key: string]: unknown;
}
/** Fan-out sub-task item descriptor */
interface FanOutItem {
id: string;
label: string;
tier?: number;
prompt?: string;
guide?: string;
}
/** Result of a single fan-out item execution */
interface ItemResult {
id: string;
label: string;
status: 'completed' | 'failed';
reply: string;
toolCalls: Array<Record<string, unknown>>;
tokenUsage: {
input: number;
output: number;
};
iterations?: number;
error?: string;
[key: string]: unknown;
}
/** FanOutStrategy constructor options */
interface FanOutOpts {
itemStrategy?: Strategy;
tiers?: Record<string, {
concurrency: number;
}>;
merge?: (results: ItemResult[]) => StrategyResult;
}
/** Options passed to FanOutStrategy.execute */
interface FanOutExecuteOpts {
items?: FanOutItem[];
dimension?: FanOutItem;
[key: string]: unknown;
}
/** AdaptiveStrategy constructor options */
interface AdaptiveStrategies {
single?: Strategy;
pipeline?: Strategy;
fanOut?: Strategy;
}
/** Options for strategy execution with routing context */
interface StrategyExecuteOpts {
items?: FanOutItem[];
[key: string]: unknown;
}
/** Strategy 基类 — 定义 Agent 如何组织工作 */
export declare class Strategy {
get name(): string;
/**
* 执行策略
*
* @param _runtime AgentRuntime 实例
* @param _message 输入消息
* @param [_opts] 策略特定选项
*/
execute(_runtime: StrategyRuntime, _message: AgentMessage, _opts?: Record<string, unknown>): Promise<StrategyResult>;
}
/**
* 最简单的策略: 直接运行 ReAct 循环。
*
* 适合: 用户对话、简单分析、任何单步骤任务。
*
* 等价于 Anthropic 的 "Augmented LLM" 模式。
*/
export declare class SingleStrategy extends Strategy {
get name(): string;
execute(runtime: StrategyRuntime, message: AgentMessage, opts?: Record<string, unknown>): Promise<StrategyResult>;
}
/**
* 并行执行多个子任务,每个子任务使用 itemStrategy (通常是 Pipeline)。
* 支持分层并发控制 (Tier)。
*
* 适合: 冷启动多维度、批量分析
*
* 等价于 Anthropic 的 "Parallelization" + "Orchestrator-Worker" 组合。
*
* @example
* new FanOutStrategy({
* itemStrategy: new PipelineStrategy({
* stages: [
* { name: 'analyze', capabilities: ['code_analysis'], budget: { maxIterations: 24 } },
* { name: 'gate', gate: { minEvidenceLength: 500, minFileRefs: 3 } },
* { name: 'produce', capabilities: ['knowledge_production'], budget: { maxIterations: 24 },
* promptTransform: (_, prev) => `将以下分析转为知识候选:\n${prev.analyze.reply}` },
* ],
* }),
* tiers: { 1: { concurrency: 3 }, 2: { concurrency: 2 }, 3: { concurrency: 1 } },
* })
*/
export declare class FanOutStrategy extends Strategy {
#private;
/**
* @param opts.itemStrategy 每个子任务使用的策略
* @param [opts.tiers] { 1: { concurrency: 3 }, 2: { concurrency: 2 }, ... }
* @param [opts.merge] 自定义合并函数 (results[]) => finalResult
*/
constructor({ itemStrategy, tiers, merge }?: FanOutOpts);
get name(): string;
/**
* @param opts.items 子任务列表
*/
execute(runtime: StrategyRuntime, message: AgentMessage, opts?: FanOutExecuteOpts): Promise<StrategyResult>;
}
/**
* 根据输入复杂度自动选择合适的策略。
*
* 判断逻辑:
* - 简单问答 → SingleStrategy
* - 单模块深度分析 → PipelineStrategy
* - 多维度/全项目 → FanOutStrategy
*
* 等价于 LangGraph 的 Router 节点 + 条件边。
*
* @example
* new AdaptiveStrategy({
* single: new SingleStrategy(),
* pipeline: new PipelineStrategy({ stages: [...] }),
* fanOut: new FanOutStrategy({ itemStrategy: ..., tiers: ... }),
* })
*/
export declare class AdaptiveStrategy extends Strategy {
#private;
constructor(strategies?: AdaptiveStrategies);
get name(): string;
execute(runtime: StrategyRuntime, message: AgentMessage, opts?: StrategyExecuteOpts): Promise<StrategyResult>;
}
export declare const StrategyRegistry: {
_registry: Map<string, typeof Strategy>;
create(name: string, opts?: Record<string, unknown>): Strategy;
register(name: string, cls: typeof Strategy): void;
};
declare const _default: {
Strategy: typeof Strategy;
SingleStrategy: typeof SingleStrategy;
FanOutStrategy: typeof FanOutStrategy;
AdaptiveStrategy: typeof AdaptiveStrategy;
StrategyRegistry: {
_registry: Map<string, typeof Strategy>;
create(name: string, opts?: Record<string, unknown>): Strategy;
register(name: string, cls: typeof Strategy): void;
};
};
export default _default;