--- summary: "Feishu 的每用户代理隔离,为每个 DM 用户提供自己的工作区和代理" read_when: - "运行公共 Feishu 机器人,其中每个用户都需要一个私人助理" - "配置 `dynamicAgentCreation` 或 `session.dmScope`" title: "Feishu 动态代理" sidebarTitle: "动态代理" --- 每用户代理隔离:为每个 Feishu DM 发送者提供自己的工作区、引导文件和对话历史记录。 ## 按用户隔离智能体(动态智能体创建) 启用 `dynamicAgentCreation` 为每个 DM 用户自动创建 **隔离代理实例**。每个用户都有自己的: - 独立工作区目录 - 单独的 `USER.md` / `SOUL.md` / `MEMORY.md` - 私有对话历史 - 隔离的技能和状态 对于希望每个用户都拥有自己私有 AI 助手体验的公共机器人来说,这一点至关重要。 动态绑定包括规范化的 Feishu `accountId`,因此默认帐户和命名帐户会将每个发件人路由到正确的动态代理。 如果某个命名账户在旧版本中创建了一个未限定范围的动态智能体,该旧智能体仍会计入 `maxAgents`。在删除它之前,请确认默认账户不会使用它,或者临时提高 `maxAgents`;OpenClaw 无法安全地推断哪个账户拥有这种歧义的旧状态。 ### 快速设置 ```json5 { channels: { feishu: { dmPolicy: "open", allowFrom: ["*"], dynamicAgentCreation: { enabled: true, workspaceTemplate: "~/.openclaw/workspace-{agentId}", agentDirTemplate: "~/.openclaw/agents/{agentId}/agent", }, }, }, session: { // Critical: makes each user's DM their "main session" // Automatically loads USER.md / SOUL.md / MEMORY.md // For stronger isolation, use "per-channel-peer" instead dmScope: "main", }, } ``` ### 工作原理 当新用户发送第一个 DM 时: 1. 该频道会生成一个唯一的 `agentId`:默认账户为 `feishu-{user_open_id}`,命名账户则为带有账户前缀的受限身份摘要 2. 在 `workspaceTemplate` 路径下创建新的工作区 3. 注册该智能体并为此用户创建绑定 4. 工作区帮助程序在首次访问时创建丢失的引导文件(`AGENTS.md`、`SOUL.md`、`USER.md` 等) 5. 将该用户未来的所有消息路由到其专属智能体 ### 配置选项 | 设置 | 描述 | 默认值 | | -------------------------------------------------------- | ------------------------------------------ | ------------------------------------ | | `channels.feishu.dynamicAgentCreation.enabled` | 启用自动每用户代理创建 | `false` | | `channels.feishu.dynamicAgentCreation.workspaceTemplate` | 动态代理工作区的路径模板 | `~/.openclaw/workspace-{agentId}` | | `channels.feishu.dynamicAgentCreation.agentDirTemplate` | 代理目录名称模板 | `~/.openclaw/agents/{agentId}/agent` | | `channels.feishu.dynamicAgentCreation.maxAgents` | 创建的动态代理的最大数量 | 无限 | 模板变量: - `{agentId}` - 生成的代理 ID(e.g.、`feishu-ou_xxxxxx` 或 `feishu-support-`) - `{userId}` - 发送方的Feishu open_id(e.g.,`ou_xxxxxx`) ### 会话范围 `session.dmScope` 控制私信如何映射到智能体会话。这是一个**全局设置**,会影响所有频道。 | 值 | 行为 | 最适合 | | ---------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------ | | `"main"` | 每个用户的 DM 映射到其代理的主会话 | 您希望自动加载 `USER.md` / `SOUL.md` 的单用户机器人 | | `"per-peer"` | 每个对端获得一个独立会话(与频道无关) | 仅按发送者身份进行隔离 | | `"per-channel-peer"` | 每个(频道 + 用户)组合获得一个独立会话 | 需要更强隔离的公共多用户机器人 | | `"per-account-channel-peer"` | 每个(账户 + 频道 + 用户)组合获得一个独立会话 | 需要账户级会话隔离的多账户机器人 | **权衡**:使用 `"main"` 可以启用引导文件的自动加载(`USER.md`、`SOUL.md`、`MEMORY.md`),但这意味着所有频道的所有私信都会共享相同的会话键模式。对于更看重隔离而不是引导自动加载的公共多用户机器人,建议使用 `"per-channel-peer"` 并手动管理引导文件。 当命名为 Feishu 的帐户应为同一发件人保留单独的会话时,请使用 `"per-account-channel-peer"`。动态绑定保留帐户范围。 ### 典型多用户部署 ```json5 { channels: { feishu: { appId: "cli_xxx", appSecret: "xxx", dmPolicy: "open", allowFrom: ["*"], groupPolicy: "open", requireMention: true, dynamicAgentCreation: { enabled: true, workspaceTemplate: "~/.openclaw/workspace-{agentId}", agentDirTemplate: "~/.openclaw/agents/{agentId}/agent", }, }, }, session: { // Choose dmScope based on your isolation needs: // "main" for bootstrap auto-loading, "per-channel-peer" for stronger isolation dmScope: "main", }, bindings: [], // Empty - dynamic agents auto-bind } ``` ### 验证 检查网关日志,确认动态创建是否正常工作: ```text feishu: creating dynamic agent "feishu-ou_xxxxxx" for user ou_xxxxxx workspace: /home/user/.openclaw/workspace-feishu-ou_xxxxxx agentDir: /home/user/.openclaw/agents/feishu-ou_xxxxxx/agent ``` 列出所有已创建的工作区: ```bash ls -la ~/.openclaw/workspace-* ``` ### 说明 - **工作区隔离**:每个用户都会获得自己的工作区目录和智能体实例。在正常消息交互流程中,用户无法看到彼此的对话历史或文件。 - **安全边界**:这是一种消息上下文隔离机制,不是恶意共租户的安全边界。智能体进程和宿主环境是共享的。 - **必须保持配置写入开启**:动态智能体创建会将智能体和绑定写入配置;当 `channels.feishu.configWrites` 为 `false` 时会跳过(默认:开启)。 - **`bindings` 应为空**:动态智能体会自动注册自己的绑定 - **升级路径**:现有的手动绑定可以与动态智能体并存 - **`session.dmScope` 是全局的**:这会影响所有通道,而不仅仅是 Feishu