Skip to content

引擎内置插件(如 memory-core)显示未安装,亟需推动动态插件接口 #251

@friendfish

Description

@friendfish

[需求] 提供接口动态获取所有已加载的插件列表,消除下游系统的硬编码依赖

业务背景

目前,第三方管理面板(如 ClawPanel)在判断内置/核心插件(如 memory-core, anthropic, ollama 等)的安装状态时存在极大的局限性。

由于 OpenClaw 当前未提供可直接拉取“当前已加载插件完整列表”的结构化接口,下游应用只能采用脆弱的静态推断方案:

  1. 物理扫描 ~/.openclaw/extensions/ 目录寻找外部插件包。
  2. 读取 openclaw.json 中的 plugins.entries,并与代码中硬编码的“已知内置插件白名单”进行比对。

存在的问题

当 OpenClaw 引擎引入新的核心组件(例如通过 Slot 默认加载的 memory-core)时,这些组件无需外部 NPM 包,也不强制在配置文件中显式声明 enabled: true
这导致面板的静态推断逻辑失效。即便 memory-core 在引擎中运行完全正常,GUI 也会因为白名单缺失而将其错误标记为“未安装”。

如果继续维持现状,上游每增加或调整一个内置组件,所有下游管理系统都必须被迫跟随发版更新硬编码列表,维护成本极高。

解决方案探讨

为了将插件状态的解释权收敛至引擎自身,建议由 OpenClaw 提供一层动态状态暴露机制。以下是几种可能的实现路径供社区探讨:

方案一:扩充现有 CLI 命令(成本最低)
在现有的 openclaw status --json 输出中,直接补充完整的 active_pluginsplugins 数组节点。

方案二:新增专用的 CLI 查询指令(职责最清晰)
新增类似 openclaw plugins list --json 的命令,专注返回标准化的插件状态结构,例如:

{
  "plugins": [
    {
      "id": "memory-core",
      "builtin": true,
      "enabled": true,
      "source": "slot-default"
    },
    {
      "id": "feishu",
      "builtin": false,
      "enabled": false,
      "version": "1.0.0"
    }
  ]
}

方案三:RPC / WebSocket API 直接查询(交互体验最佳)
在 Gateway 暴露一个获取系统状态的 RPC 方法或 HTTP Endpoint(例如 GET /api/system/plugins),供 Panel 或其他外部应用实时调用。这样彻底摆脱了通过子进程拉起 CLI 查状态的性能损耗,是最长远的架构解法。

架构价值

无论采用上述哪种方式,其核心都在于由引擎统一收敛状态的解释权。这将彻底消除下游生态的文件目录扫描和硬编码依赖,确保在未来的版本迭代中,上下游系统能够解耦并天然保持兼容。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions