UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

126 lines (125 loc) 5.95 kB
/** * AgentRuntime — 统一 Agent 执行引擎 (The Brain) * * 核心思想: 不存在类型分野,只有 ONE Runtime。 * 只有 ONE Runtime,由 Capability + Strategy + Policy 配置驱动。 * * AgentRuntime 是: * - ReAct 循环的宿主 (Thought → Action → Observation) * - Capability 的组合容器 (加载哪些技能) * - Policy 的执行者 (遵守哪些约束) * - Strategy 的被委托者 (Strategy 调用 runtime.reactLoop()) * * 认知架构 (CoALA): * Perception → Working Memory → Reasoning → Action → Reflection * │ │ │ │ │ * AgentMessage history+memory LLM call Tools Policy.validateAfter * * 引擎级能力: * - ContextWindow: 三级递进压缩,动态 token 预算 (可选注入) * - ExplorationTracker: 阶段状态机 + 信号收集 + Nudge + Graceful exit (可选注入) * - AI 错误恢复: consecutiveAiErrors 2-strike → context reset → forced summary * - 空响应重试: consecutiveEmptyResponses + rollback (system 场景) * - 熔断器感知: _circuitState === 'OPEN' → 直接合成摘要 * - 工具调用数量限制: MAX_TOOL_CALLS_PER_ITER = 8 * - 提交去重: submittedTitles / submittedPatterns * - cleanFinalAnswer: 去除 nudge 噪声 * * @module AgentRuntime */ import { AgentEventBus } from './AgentEventBus.js'; import type { AgentMessage } from './AgentMessage.js'; import { type AgentResult, type FileCacheEntry, type ReactLoopOpts, type RuntimeConfig, type ToolCallEntry, type ToolCallHook } from './AgentRuntimeTypes.js'; import { AgentState } from './AgentState.js'; import { Capability } from './capabilities.js'; import { PolicyEngine } from './policies.js'; export type { AgentResult, AiError, FileCacheEntry, FunctionCall, LLMResult, ProgressEvent, ReactLoopOpts, RuntimeConfig, ToolCallEntry, ToolCallHook, ToolMetadata, } from './AgentRuntimeTypes.js'; export { MAX_TOOL_CALLS_PER_ITER } from './AgentRuntimeTypes.js'; export declare class AgentRuntime { #private; onToolCall: ToolCallHook | null; id: string; presetName: string; state: AgentState; bus: AgentEventBus; aiProvider: import("../external/ai/AiProvider.js").AiProvider; toolRegistry: import("./tools/ToolRegistry.js").ToolRegistry; container: Record<string, unknown> | null; capabilities: Capability[]; strategy: import("./strategies.js").Strategy; policies: PolicyEngine; persona: Record<string, unknown>; memoryConfig: Record<string, unknown>; onProgress: ((event: import("./AgentRuntimeTypes.js").ProgressEvent) => void) | null; lang: string | null; logger: import("winston").Logger; iterationCount: number; toolCallHistory: ToolCallEntry[]; tokenUsage: { input: number; output: number; }; startTime: number; constructor(config: RuntimeConfig); /** * 执行 Agent — 入口 * * @param message 统一消息 * @param [opts] 策略特定选项 (如 FanOut 的 items) */ execute(message: AgentMessage, opts?: Record<string, unknown>): Promise<AgentResult>; /** * 核心 ReAct 循环。Strategy 调用此方法执行实际的 LLM + Tool 交互。 * * 引擎级能力通过可选参数注入: * - contextWindow → 三级递进压缩 + 动态工具结果限额 * - tracker → ExplorationTracker 阶段管理 + Nudge + Graceful exit * - trace → ActiveContext 推理链记录 * - memoryCoordinator → 缓存/动态提示/观察记录 * - sharedState → 提交去重 { submittedTitles, submittedPatterns } * - source → 'user' | 'system' (影响错误恢复 + 强制摘要行为) * * 向后兼容: 以上参数均为可选。不提供时退化为原始裸循环。 * * @param prompt 用户/系统提示 * @param [opts.history] 对话历史 * @param [opts.context] 额外上下文 * @param [opts.capabilityOverride] 临时覆盖 capability (Pipeline 阶段用) * @param [opts.budgetOverride] 临时覆盖 budget * @param [opts.systemPromptOverride] 完全覆盖系统提示词 (Bootstrap 阶段专用) * @param [opts.onToolCall] 本轮独立的工具调用钩子,优先于 runtime 级 * @param [opts.contextWindow] 上下文窗口管理器 * @param [opts.tracker] ExplorationTracker 实例 * @param [opts.trace] ActiveContext 实例 * @param [opts.memoryCoordinator] MemoryCoordinator 实例 * @param [opts.sharedState] 共享状态 { submittedTitles, submittedPatterns } * @param [opts.source] 'user' | 'system' * @param [opts.toolChoiceOverride] 首轮 toolChoice 覆盖 ('required'/'auto'/'none') * 首轮强制 LLM 生成 tool call(LLM 自行决定调哪个工具、传什么参数)。 * 这不是替 LLM 做决定,而是告诉 LLM "你必须调用某个工具"。 * 仅在第一轮生效,后续轮次恢复正常 toolChoice 逻辑。 */ reactLoop(prompt: string, opts?: ReactLoopOpts): Promise<{ reply: string; toolCalls: any[]; tokenUsage: { input: number; output: number; }; iterations: number; }>; /** 中止执行 */ abort(reason?: string): void; /** * 注入内存文件缓存(bootstrap 场景: allFiles 已在内存中,避免重复磁盘读取) * @param files [{ relativePath, content, name }] */ setFileCache(files: FileCacheEntry[] | null): void; /** 项目根目录 (供 ToolExecutionPipeline 等访问) */ get projectRoot(): string; /** 文件缓存 (供 ToolExecutionPipeline 等访问) */ get fileCache(): FileCacheEntry[] | null; /** 发送进度事件 (公开方法,供 ToolExecutionPipeline 中间件调用) */ emitProgress(type: string, data?: Record<string, unknown>): void; } export default AgentRuntime;