7 minute read

1. 智能体引擎概述

OpenClaw 智能体引擎是基于 @mariozechner/pi-agent-core 构建的完整 AI 智能体执行系统,提供从简单的单智能体执行到复杂的多智能体协作的完整功能。它支持多种工具类型、安全沙箱执行、详细的会话管理和高度可扩展的架构。

2. 核心架构组件

2.1 主要入口文件

文件 功能
pi-embedded-runner.ts 智能体引擎主入口,导出所有核心功能
pi-embedded-runner/run.ts 核心执行逻辑,处理智能体运行流程
pi-embedded.ts 整合所有智能体相关功能的统一入口
agent-scope.ts 智能体配置解析和管理
workspace.ts 智能体工作区管理

2.2 核心执行流程

// 主执行函数
runEmbeddedPiAgent()
   buildEmbeddedRunPayloads()  // 构建运行 payload
   runEmbeddedAttempt()        // 执行单次尝试
     resolveModel()            // 解析模型配置
     工具调用和交互
     结果处理和清理

3. 智能体引擎工作流程详解

3.1 初始化阶段

// 位置: src/agents/pi-embedded-runner/run.ts
export async function runEmbeddedPiAgent(params: RunEmbeddedPiAgentParams) {
  // 1. 解析会话和通道信息
  const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId);
  const globalLane = resolveGlobalLane(params.lane);

  // 2. 初始化工作区
  const workspaceResolution = resolveRunWorkspaceDir({
    workspaceDir: params.workspaceDir,
    sessionKey: params.sessionKey,
    agentId: params.agentId,
    config: params.config,
  });

  // 3. 解析模型配置
  const { model, error, authStorage, modelRegistry } = resolveModel(
    provider,
    modelId,
    agentDir,
    params.config,
  );

  // 4. 初始化认证
  const authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
  const profileOrder = resolveAuthProfileOrder({
    cfg: params.config,
    store: authStore,
    provider,
    preferredProfile: preferredProfileId,
  });
}

3.2 执行阶段

// 位置: src/agents/pi-embedded-runner/run/attempt.ts
export async function runEmbeddedAttempt(params: EmbeddedRunAttemptParams) {
  // 1. 解析沙箱上下文
  const sandbox = await resolveSandboxContext({
    config: params.config,
    sessionKey: sandboxSessionKey,
    workspaceDir: resolvedWorkspace,
  });

  // 2. 加载技能和环境变量
  const skillEntries = loadWorkspaceSkillEntries(effectiveWorkspace);
  restoreSkillEnv = applySkillEnvOverrides({
    skills: skillEntries ?? [],
    config: params.config,
  });

  // 3. 创建工具实例
  const toolsRaw = createOpenClawCodingTools({
    exec: {
      ...params.execOverrides,
      elevated: params.bashElevated,
    },
    sandbox,
    messageProvider: params.messageChannel ?? params.messageProvider,
    // ... 其他配置
  });

  // 4. 构建系统提示
  const appendPrompt = buildEmbeddedSystemPrompt({
    workspaceDir: effectiveWorkspace,
    defaultThinkLevel: params.thinkLevel,
    reasoningLevel: params.reasoningLevel ?? "off",
    extraSystemPrompt: params.extraSystemPrompt,
    // ... 其他配置
  });

  // 5. 创建会话
  const { session } = await createAgentSession({
    cwd: resolvedWorkspace,
    agentDir,
    authStorage: params.authStorage,
    modelRegistry: params.modelRegistry,
    model: params.model,
    thinkingLevel: mapThinkingLevel(params.thinkLevel),
    tools: builtInTools,
    customTools: allCustomTools,
    sessionManager,
    settingsManager,
  });

  // 6. 处理提示和执行
  await activeSession.prompt(effectivePrompt, { images: imageResult.images });
}

3.3 工具调用和交互阶段

// 位置: src/agents/pi-tools.ts
export function createOpenClawCodingTools(options?: {
  // ... 配置选项
}): AnyAgentTool[] {
  // 1. 解析工具策略
  const {
    agentId,
    globalPolicy,
    globalProviderPolicy,
    agentPolicy,
    agentProviderPolicy,
    profile,
    providerProfile,
    profileAlsoAllow,
    providerProfileAlsoAllow,
  } = resolveEffectiveToolPolicy({
    config: options?.config,
    sessionKey: options?.sessionKey,
    modelProvider: options?.modelProvider,
    modelId: options?.modelId,
  });

  // 2. 创建编码工具
  const base = (codingTools as unknown as AnyAgentTool[]).flatMap((tool) => {
    if (tool.name === readTool.name) {
      return [createReadTool(workspaceRoot)];
    }
    // ... 其他工具创建
  });

  // 3. 创建系统工具
  const execTool = createExecTool({
    // ... 配置
  });
  const processTool = createProcessTool({
    // ... 配置
  });

  // 4. 应用工具策略
  const toolsByAuthorization = applyOwnerOnlyToolPolicy(tools, senderIsOwner);
  const subagentFiltered = applyToolPolicyPipeline({
    tools: toolsByAuthorization,
    toolMeta: (tool) => getPluginToolMeta(tool),
    warn: logWarn,
    steps: [
      // ... 策略步骤
    ],
  });

  return withAbort;
}

3.4 结果处理和清理阶段

// 位置: src/agents/pi-embedded-runner/run.ts
export async function runEmbeddedPiAgent(params: RunEmbeddedPiAgentParams) {
  // ... 执行逻辑 ...

  // 处理执行结果
  const payloads = buildEmbeddedRunPayloads({
    assistantTexts: attempt.assistantTexts,
    toolMetas: attempt.toolMetas,
    lastAssistant: attempt.lastAssistant,
    lastToolError: attempt.lastToolError,
    config: params.config,
    sessionKey: params.sessionKey ?? params.sessionId,
    provider: activeErrorContext.provider,
    model: activeErrorContext.model,
    // ... 其他配置
  });

  // 标记认证配置文件状态
  if (lastProfileId) {
    await markAuthProfileGood({
      store: authStore,
      provider,
      profileId: lastProfileId,
      agentDir: params.agentDir,
    });
    await markAuthProfileUsed({
      store: authStore,
      profileId: lastProfileId,
      agentDir: params.agentDir,
    });
  }

  return {
    payloads: payloads.length ? payloads : undefined,
    meta: {
      durationMs: Date.now() - started,
      agentMeta,
      aborted,
      systemPromptReport: attempt.systemPromptReport,
      stopReason: attempt.clientToolCall ? "tool_calls" : undefined,
      pendingToolCalls: attempt.clientToolCall
        ? [
            {
              id: `call_${Date.now()}`,
              name: attempt.clientToolCall.name,
              arguments: JSON.stringify(attempt.clientToolCall.params),
            },
          ]
        : undefined,
    },
    // ... 其他返回信息
  };
}

4. 智能体引擎关键功能

4.1 工具系统

工具类型

工具类别 功能
编码工具 read、write、edit、apply-patch
Bash 工具 exec、process
通道工具 消息发送、媒体处理
OpenClaw 工具 Web 搜索、图像处理、会话管理、子智能体工具、浏览器工具、定时任务工具

工具策略

// 位置: src/agents/pi-tools.policy.ts
export function resolveEffectiveToolPolicy(params: {
  config?: OpenClawConfig;
  sessionKey?: string;
  modelProvider?: string;
  modelId?: string;
}): EffectiveToolPolicy {
  // 解析全局策略
  const globalPolicy = params.config?.tools?.allow;
  const globalProviderPolicy = params.config?.tools?.[params.modelProvider]?.allow;

  // 解析智能体策略
  const agentPolicy = resolveAgentConfig(params.config, agentId)?.tools?.allow;
  const agentProviderPolicy = resolveAgentConfig(params.config, agentId)?.tools?.[params.modelProvider]?.allow;

  // 解析配置文件策略
  const profilePolicy = resolveToolProfilePolicy(profile);
  const providerProfilePolicy = resolveToolProfilePolicy(providerProfile);

  return {
    agentId,
    globalPolicy,
    globalProviderPolicy,
    agentPolicy,
    agentProviderPolicy,
    profile,
    providerProfile,
    profileAlsoAllow: profile?.alsoAllow,
    providerProfileAlsoAllow: providerProfile?.alsoAllow,
  };
}

4.2 沙箱系统

// 位置: src/agents/sandbox/config.ts
export async function resolveSandboxContext(params: {
  config: OpenClawConfig;
  sessionKey: string;
  workspaceDir: string;
}): Promise<SandboxContext | null> {
  const sandboxConfig = params.config?.agents?.defaults?.sandbox;
  if (!sandboxConfig?.enabled) {
    return null;
  }

  const containerName = `openclaw-sandbox-${hashString(params.sessionKey).slice(0, 8)}`;
  const workspaceDir = params.workspaceDir;

  return {
    enabled: true,
    containerName,
    workspaceDir,
    containerWorkdir: "/workspace",
    docker: {
      image: sandboxConfig.image ?? "openclaw/sandbox:latest",
      env: sandboxConfig.env ?? {},
    },
    fsBridge: createSandboxFsBridge(containerName, workspaceDir),
    browser: {
      bridgeUrl: `http://localhost:${sandboxConfig.browserPort ?? 9222}`,
    },
    browserAllowHostControl: sandboxConfig.browserAllowHostControl ?? false,
    workspaceAccess: sandboxConfig.workspaceAccess ?? "rw",
    tools: sandboxConfig.tools,
  };
}

4.3 会话管理

// 位置: src/agents/session-manager-init.ts
export async function prepareSessionManagerForRun(params: {
  sessionManager: ReturnType<typeof SessionManager.open>;
  sessionFile: string;
  hadSessionFile: boolean;
  sessionId: string;
  cwd: string;
}): Promise<void> {
  // 初始化会话管理器
  if (!params.hadSessionFile) {
    params.sessionManager.init();
  }

  // 设置工作区
  params.sessionManager.setWorkspace(params.cwd);

  // 配置会话参数
  params.sessionManager.setSessionId(params.sessionId);
}

4.4 内存管理

// 位置: src/agents/compaction.ts
export async function compactEmbeddedPiSessionDirect(params: CompactEmbeddedPiSessionParams) {
  const sessionManager = SessionManager.open(params.sessionFile);
  const settingsManager = SettingsManager.create(params.workspaceDir, params.agentDir);

  // 压缩会话上下文
  const compactResult = await sessionManager.compact({
    reserveTokens: resolveCompactionReserveTokensFloor(params.config),
    maxTokens: params.maxTokens,
  });

  return {
    compacted: compactResult.compacted,
    reason: compactResult.reason,
  };
}

5. 智能体引擎配置文件

智能体引擎使用以下配置文件(位于工作区):

文件 功能
AGENTS.md 智能体定义
SOUL.md 智能体个性和行为
TOOLS.md 工具配置和策略
IDENTITY.md 身份信息
USER.md 用户信息
HEARTBEAT.md 心跳配置
BOOTSTRAP.md 引导配置
MEMORY.md 记忆存储

6. 执行流程示例

import { runEmbeddedPiAgent } from "./src/agents/pi-embedded-runner";

// 简单的智能体执行示例
async function runSimpleAgent() {
  const result = await runEmbeddedPiAgent({
    sessionId: "test-session",
    prompt: "请帮我创建一个简单的 Node.js 服务器",
    config: {},
    agentId: "default",
    workspaceDir: "./workspace",
    thinkLevel: "off",
    verboseLevel: "off",
  });

  console.log("智能体响应:", result.payloads);
}

// 带工具调用的智能体执行示例
async function runAgentWithTools() {
  const result = await runEmbeddedPiAgent({
    sessionId: "tool-session",
    prompt: "请列出当前目录的文件并创建一个 package.json 文件",
    config: {},
    agentId: "default",
    workspaceDir: "./workspace",
    thinkLevel: "off",
    verboseLevel: "off",
  });

  console.log("智能体响应:", result.payloads);
}

7. 扩展性和定制

7.1 插件开发

// 示例插件
import { OpenClawPlugin } from "./src/plugin-sdk";

export class MyPlugin implements OpenClawPlugin {
  name = "my-plugin";

  async beforeAgentStart(params: BeforeAgentStartParams) {
    console.log("智能体即将启动");
    return {
      systemPrompt: "这是我的自定义系统提示",
    };
  }

  async afterAgentEnd(params: AfterAgentEndParams) {
    console.log("智能体执行完成");
  }
}

7.2 自定义工具

// 示例自定义工具
import { createAgentTool } from "./src/agents/pi-tools";

export const myCustomTool = createAgentTool({
  name: "my-custom-tool",
  description: "我的自定义工具",
  parameters: {
    type: "object",
    properties: {
      input: { type: "string" },
    },
    required: ["input"],
  },
  async execute(params: { input: string }) {
    return {
      output: `你输入了: ${params.input}`,
    };
  },
});

8. 测试系统

8.1 单元测试

// 位置: src/agents/pi-embedded-runner/run.test.ts
import { describe, it, expect } from "vitest";
import { runEmbeddedPiAgent } from "./run";

describe("智能体引擎", () => {
  it("应该能够执行简单的智能体", async () => {
    const result = await runEmbeddedPiAgent({
      sessionId: "test-session",
      prompt: "请说你好",
      config: {},
      agentId: "default",
      workspaceDir: "./workspace",
      thinkLevel: "off",
      verboseLevel: "off",
    });

    expect(result.payloads).toBeDefined();
    expect(result.payloads.length).toBeGreaterThan(0);
  });
});

8.2 E2E 测试

// 位置: src/agents/pi-embedded-runner/run.e2e.test.ts
import { describe, it, expect } from "vitest";
import { runEmbeddedPiAgent } from "./run";

describe("智能体引擎 E2E 测试", () => {
  it("应该能够执行带工具调用的智能体", async () => {
    const result = await runEmbeddedPiAgent({
      sessionId: "e2e-session",
      prompt: "请列出当前目录的文件",
      config: {},
      agentId: "default",
      workspaceDir: "./workspace",
      thinkLevel: "off",
      verboseLevel: "off",
    });

    expect(result.payloads).toBeDefined();
    expect(result.payloads.length).toBeGreaterThan(0);
  });
});

9. 性能优化

9.1 会话压缩与上下文管理

OpenClaw 智能体引擎通过会话压缩技术来优化长时间运行会话的性能,防止上下文窗口溢出。

// 位置: src/agents/compaction.ts

// 会话压缩的核心算法
export async function summarizeInStages(params: {
  messages: AgentMessage[];
  model: NonNullable<ExtensionContext["model"]>;
  apiKey: string;
  signal: AbortSignal;
  reserveTokens: number;
  maxChunkTokens: number;
  contextWindow: number;
  customInstructions?: string;
  previousSummary?: string;
  parts?: number;
  minMessagesForSplit?: number;
}): Promise<string> {
  // 1. 检查是否需要分阶段处理
  const minMessagesForSplit = Math.max(2, params.minMessagesForSplit ?? 4);
  const parts = normalizeParts(params.parts ?? DEFAULT_PARTS, messages.length);
  const totalTokens = estimateMessagesTokens(messages);

  // 2. 如果不需要分阶段,直接使用 fallback 方法
  if (parts <= 1 || messages.length < minMessagesForSplit ||
      totalTokens <= params.maxChunkTokens) {
    return summarizeWithFallback(params);
  }

  // 3. 分阶段总结
  const splits = splitMessagesByTokenShare(messages, parts).filter((chunk) => chunk.length > 0);
  const partialSummaries: string[] = [];

  for (const chunk of splits) {
    partialSummaries.push(
      await summarizeWithFallback({
        ...params,
        messages: chunk,
        previousSummary: undefined,
      }),
    );
  }

  // 4. 合并部分总结
  const summaryMessages: AgentMessage[] = partialSummaries.map((summary) => ({
    role: "user",
    content: summary,
    timestamp: Date.now(),
  }));

  return summarizeWithFallback({
    ...params,
    messages: summaryMessages,
    customInstructions: MERGE_SUMMARIES_INSTRUCTIONS,
  });
}

压缩策略特点:

  • 自适应分块:根据消息大小和数量自动决定是否分阶段处理
  • 安全边界检查:防止单消息过大导致的压缩失败
  • 渐进式 fallback:从完整总结到部分总结再到最终 fallback
  • 令牌估算优化:考虑估算误差,添加安全边际

9.2 上下文修剪(Context Pruning)

上下文修剪是一种轻量级的性能优化技术,用于在会话进行中动态减少上下文大小。

// 位置: src/agents/pi-extensions/context-pruning/pruner.ts

export function pruneContextMessages(params: {
  messages: AgentMessage[];
  settings: EffectiveContextPruningSettings;
  ctx: Pick<ExtensionContext, "model">;
  isToolPrunable?: (toolName: string) => boolean;
  contextWindowTokensOverride?: number;
}): AgentMessage[] {
  // 1. 估算上下文大小
  const charWindow = contextWindowTokens * CHARS_PER_TOKEN_ESTIMATE;
  const totalCharsBefore = estimateContextChars(messages);

  // 2. 检查是否需要修剪
  if (totalCharsBefore / charWindow < settings.softTrimRatio) {
    return messages;
  }

  // 3. 识别可修剪的工具结果
  const prunableToolIndexes: number[] = [];
  for (let i = pruneStartIndex; i < cutoffIndex; i++) {
    const msg = messages[i];
    if (msg?.role === "toolResult" && isToolPrunable(msg.toolName)) {
      prunableToolIndexes.push(i);
    }
  }

  // 4. 软修剪:保留工具结果的头部和尾部
  for (const i of prunableToolIndexes) {
    const trimmed = softTrimToolResultMessage({
      msg: messages[i] as unknown as ToolResultMessage,
      settings,
    });
    if (trimmed) {
      // 替换原始消息为修剪后的版本
    }
  }

  // 5. 硬修剪:完全清除工具结果内容
  if (totalChars / charWindow >= settings.hardClearRatio) {
    for (const i of prunableToolIndexes) {
      (next ?? messages)[i] = {
        ...messages[i],
        content: [asText(settings.hardClear.placeholder)],
      };
    }
  }

  return next ?? messages;
}

上下文修剪特性:

  • 工具级别的精细控制:可配置哪些工具结果可以被修剪
  • 渐进式修剪策略:从软修剪到硬修剪的梯度控制
  • 保护关键上下文:保留最后N个助手消息不被修剪
  • 图像处理优化:对包含图像的工具结果特殊处理

9.3 令牌估算与上下文窗口管理

// 位置: src/agents/compaction.ts

// 自适应块比例计算
export function computeAdaptiveChunkRatio(messages: AgentMessage[], contextWindow: number): number {
  const totalTokens = estimateMessagesTokens(messages);
  const avgTokens = totalTokens / messages.length;

  // 应用安全边际以应对估算不准确
  const safeAvgTokens = avgTokens * SAFETY_MARGIN;
  const avgRatio = safeAvgTokens / contextWindow;

  // 如果平均消息大小超过上下文的10%,减少块比例
  if (avgRatio > 0.1) {
    const reduction = Math.min(avgRatio * 2, BASE_CHUNK_RATIO - MIN_CHUNK_RATIO);
    return Math.max(MIN_CHUNK_RATIO, BASE_CHUNK_RATIO - reduction);
  }

  return BASE_CHUNK_RATIO;
}

// 超大消息检查
export function isOversizedForSummary(msg: AgentMessage, contextWindow: number): boolean {
  const tokens = estimateTokens(msg) * SAFETY_MARGIN;
  return tokens > contextWindow * 0.5;
}

9.4 性能优化策略总结

OpenClaw 智能体引擎采用了多层次的性能优化策略:

优化层级 核心技术 实现位置 主要作用
会话管理 分阶段总结 compaction.ts 处理长会话上下文压缩
上下文修剪 动态消息修剪 context-pruning/ 防止上下文窗口溢出
资源管理 令牌估算与控制 compaction.ts 优化 API 调用成本

这些优化技术共同确保了 OpenClaw 智能体引擎在长时间运行和高负载场景下的稳定性和效率。

10. 总结

OpenClaw 智能体引擎是一个完整且复杂的系统,提供了从简单的单智能体执行到复杂的多智能体协作的完整功能。它支持多种工具类型、安全沙箱执行、详细的会话管理和高度可扩展的架构。

主要特性:

  • 多智能体支持
  • 子智能体系统
  • 工具调用和策略管理
  • 安全沙箱执行
  • 会话管理和压缩
  • 高度可扩展的插件系统
  • 详细的错误处理和恢复机制

通过对智能体引擎的分析,我们可以看到 OpenClaw 提供了一个强大且灵活的 AI 智能体执行平台,适用于各种应用场景。

Updated: