autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
455 lines (454 loc) • 15.7 kB
TypeScript
/**
* Presets — 命名的 Agent 配置组合
*
* 核心思想: Agent 不分"类型",只有"配置"。
* Preset 是 Capability + Strategy + Policy 的命名组合。
*
* 这是统一架构的最终体现:
*
* | 使用场景 | Capabilities | Strategy | Policies |
* |------------------|--------------------------|--------------|---------------------|
* | chat | Conv + Analysis | Single | StandardBudget |
* | insight | Analysis + Production | FanOut+Pipe | DeepBudget+Quality |
* | remote-exec | Conv + Analysis + System | Single | ShortBudget+Safety |
*
* 注意:
* - "飞书聊天" 用 chat preset,不需要单独的 Agent
* - "飞书远程执行" 用 remote-exec preset,Safety 由 Policy 提供
* - "冷启动" 和 "扫描" 统一使用 insight preset,仅编排层不同
*
* @module presets
*/
import { evolutionGateEvaluator, insightGateEvaluator } from './domain/insight-gate.js';
import { producerRejectionGateEvaluator } from './domain/insight-producer.js';
import { BudgetPolicy, QualityGatePolicy, SafetyPolicy } from './policies.js';
import { type Strategy } from './strategies.js';
/** Policy factory configuration */
interface PolicyFactoryConfig {
maxIterations?: number;
maxTokens?: number;
temperature?: number;
timeoutMs?: number;
minEvidenceLength?: number;
minFileRefs?: number;
minToolCalls?: number;
}
/** Minimal pipeline stage shape (compatible with PipelineStrategy's PipelineStage) */
interface MinimalStage {
name: string;
[key: string]: unknown;
}
/** Strategy-level merge result (structurally matches StrategyResult from strategies.ts) */
interface StrategyMergeResult {
reply: string;
toolCalls: Array<Record<string, unknown>>;
tokenUsage: {
input: number;
output: number;
};
iterations: number;
[key: string]: unknown;
}
/** Declarative strategy configuration (resolved by resolveStrategy) */
interface StrategyConfig {
type: string;
stages?: MinimalStage[];
maxRetries?: number;
itemStrategy?: StrategyConfig;
tiers?: Record<string, {
concurrency: number;
}>;
merge?: (...args: unknown[]) => StrategyMergeResult;
single?: StrategyConfig;
pipeline?: StrategyConfig;
fanOut?: StrategyConfig;
}
/** 所有内置 Preset */
export declare const PRESETS: Readonly<{
chat: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
};
policies: ((config?: PolicyFactoryConfig) => BudgetPolicy)[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
mode: string;
tiers: string[];
};
};
insight: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
maxRetries: number;
stages: ({
name: string;
capabilities: string[];
budget: {
maxIterations: number;
temperature: number;
timeoutMs: number;
};
systemPrompt: string;
promptBuilder: (ctx: Record<string, unknown>) => Promise<string>;
retryPromptBuilder: (retryCtx: {
reason?: string;
}, _origPrompt: string, prev: Record<string, unknown>) => string;
gate?: undefined;
retryBudget?: undefined;
skipOnDegrade?: undefined;
} | {
name: string;
gate: {
evaluator: typeof insightGateEvaluator;
maxRetries: number;
};
capabilities?: undefined;
budget?: undefined;
systemPrompt?: undefined;
promptBuilder?: undefined;
retryPromptBuilder?: undefined;
retryBudget?: undefined;
skipOnDegrade?: undefined;
} | {
name: string;
capabilities: string[];
budget: {
temperature: number;
timeoutMs: number;
maxIterations: number;
searchBudget: number;
searchBudgetGrace: number;
maxSubmits: number;
softSubmitLimit: number;
idleRoundsToExit: number;
};
systemPrompt: string;
promptBuilder: (ctx: Record<string, unknown>) => string;
retryBudget: {
maxIterations: number;
temperature: number;
timeoutMs: number;
};
retryPromptBuilder: (retryCtx: {
reason?: string;
}, _origPrompt: string, prev: Record<string, unknown>) => string;
skipOnDegrade: boolean;
gate?: undefined;
} | {
name: string;
gate: {
evaluator: typeof producerRejectionGateEvaluator;
maxRetries: number;
};
skipOnDegrade: boolean;
capabilities?: undefined;
budget?: undefined;
systemPrompt?: undefined;
promptBuilder?: undefined;
retryPromptBuilder?: undefined;
retryBudget?: undefined;
})[];
};
policies: (((config?: PolicyFactoryConfig) => BudgetPolicy) | ((config?: PolicyFactoryConfig) => QualityGatePolicy))[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
};
};
evolution: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
maxRetries: number;
stages: ({
name: string;
capabilities: string[];
budget: {
temperature: number;
timeoutMs: number;
maxIterations: number;
searchBudget: number;
searchBudgetGrace: number;
maxSubmits: number;
softSubmitLimit: number;
idleRoundsToExit: number;
};
systemPrompt: string;
promptBuilder: (ctx: Record<string, unknown>) => string;
gate?: undefined;
} | {
name: string;
gate: {
evaluator: typeof evolutionGateEvaluator;
maxRetries: number;
};
capabilities?: undefined;
budget?: undefined;
systemPrompt?: undefined;
promptBuilder?: undefined;
})[];
};
policies: ((config?: PolicyFactoryConfig) => BudgetPolicy)[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
};
};
lark: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
};
policies: (((config?: PolicyFactoryConfig) => BudgetPolicy) | (() => SafetyPolicy))[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
mode: string;
tiers: string[];
};
};
'remote-exec': {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
};
policies: (((config?: PolicyFactoryConfig) => BudgetPolicy) | (() => SafetyPolicy))[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
mode: string;
tiers: string[];
};
};
}>;
/**
* 将 Preset 配置中的 strategy 声明式配置转换为实际 Strategy 实例
*
* @param strategyConfig { type: 'single'|'pipeline'|'fan_out'|'adaptive', ...opts }
*/
export declare function resolveStrategy(strategyConfig: StrategyConfig | null | undefined): Strategy;
/**
* 获取 Preset 并展开为可用配置
*
* @param [overrides] 覆盖 preset 中的特定字段
* @returns }
*/
export declare function getPreset(presetName: string, overrides?: Record<string, unknown>): Record<string, unknown>;
declare const _default: {
PRESETS: Readonly<{
chat: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
};
policies: ((config?: PolicyFactoryConfig) => BudgetPolicy)[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
mode: string;
tiers: string[];
};
};
insight: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
maxRetries: number;
stages: ({
name: string;
capabilities: string[];
budget: {
maxIterations: number;
temperature: number;
timeoutMs: number;
};
systemPrompt: string;
promptBuilder: (ctx: Record<string, unknown>) => Promise<string>;
retryPromptBuilder: (retryCtx: {
reason?: string;
}, _origPrompt: string, prev: Record<string, unknown>) => string;
gate?: undefined;
retryBudget?: undefined;
skipOnDegrade?: undefined;
} | {
name: string;
gate: {
evaluator: typeof insightGateEvaluator;
maxRetries: number;
};
capabilities?: undefined;
budget?: undefined;
systemPrompt?: undefined;
promptBuilder?: undefined;
retryPromptBuilder?: undefined;
retryBudget?: undefined;
skipOnDegrade?: undefined;
} | {
name: string;
capabilities: string[];
budget: {
temperature: number;
timeoutMs: number;
maxIterations: number;
searchBudget: number;
searchBudgetGrace: number;
maxSubmits: number;
softSubmitLimit: number;
idleRoundsToExit: number;
};
systemPrompt: string;
promptBuilder: (ctx: Record<string, unknown>) => string;
retryBudget: {
maxIterations: number;
temperature: number;
timeoutMs: number;
};
retryPromptBuilder: (retryCtx: {
reason?: string;
}, _origPrompt: string, prev: Record<string, unknown>) => string;
skipOnDegrade: boolean;
gate?: undefined;
} | {
name: string;
gate: {
evaluator: typeof producerRejectionGateEvaluator;
maxRetries: number;
};
skipOnDegrade: boolean;
capabilities?: undefined;
budget?: undefined;
systemPrompt?: undefined;
promptBuilder?: undefined;
retryPromptBuilder?: undefined;
retryBudget?: undefined;
})[];
};
policies: (((config?: PolicyFactoryConfig) => BudgetPolicy) | ((config?: PolicyFactoryConfig) => QualityGatePolicy))[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
};
};
evolution: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
maxRetries: number;
stages: ({
name: string;
capabilities: string[];
budget: {
temperature: number;
timeoutMs: number;
maxIterations: number;
searchBudget: number;
searchBudgetGrace: number;
maxSubmits: number;
softSubmitLimit: number;
idleRoundsToExit: number;
};
systemPrompt: string;
promptBuilder: (ctx: Record<string, unknown>) => string;
gate?: undefined;
} | {
name: string;
gate: {
evaluator: typeof evolutionGateEvaluator;
maxRetries: number;
};
capabilities?: undefined;
budget?: undefined;
systemPrompt?: undefined;
promptBuilder?: undefined;
})[];
};
policies: ((config?: PolicyFactoryConfig) => BudgetPolicy)[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
};
};
lark: {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
};
policies: (((config?: PolicyFactoryConfig) => BudgetPolicy) | (() => SafetyPolicy))[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
mode: string;
tiers: string[];
};
};
'remote-exec': {
name: string;
description: string;
capabilities: string[];
strategy: {
type: string;
};
policies: (((config?: PolicyFactoryConfig) => BudgetPolicy) | (() => SafetyPolicy))[];
persona: {
role: string;
description: string;
};
memory: {
enabled: boolean;
mode: string;
tiers: string[];
};
};
}>;
resolveStrategy: typeof resolveStrategy;
getPreset: typeof getPreset;
};
export default _default;