Files
Cyrene/docs/debug_log/2026-05-23-phase3-plugin-tool-system.md
T
AskaEth 717ad65b05 feat: Phase 3 插件与工具系统 — Plugin SDK + Plugin Manager + 13内置插件 (40文件, 3293行)
- Plugin SDK: Plugin/Tool/ComplexTool/HostAPI 标准化接口
- Plugin Manager: 插件生命周期管理 (Install/Enable/Disable/Uninstall/Reload)
- Tool Registry: 聚合工具注册表 (Register/Execute/Dispatch)
- 13 个内置插件: 将原有硬编码工具迁移为标准插件格式
- REST API: 11 个端点 (net/http, 零外部依赖)
- ai-core 集成: PluginManagerClient 替代本地工具调用
- plugin.json 元数据: 每个插件含完整 author/version/category/permissions

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 15:50:19 +08:00

16 KiB
Raw Blame History

Phase 3: 插件与工具系统 — 开发报告

报告日期2026-05-23 分支dev 阶段Phase 3 — 插件与工具系统 总计修改文件数:40 个 (新增 39 个, 修改 1 个) 总代码行数3293 行 编译状态plugin-manager / ai-core ⚠️ 网络不可用 (golang.org/x/arch 未缓存)


一、背景

Phase 2 完成了人格与交互深化 (情感状态机 + 主动消息决策 + 离线自主思考)。Phase 3 的目标是建立标准化的插件开发框架,让社区开发者可以方便地为昔涟扩展能力。

核心目标

任务 说明
Plugin SDK 标准化接口 (Plugin / Tool / ComplexTool / HostAPI)
Plugin Manager 插件生命周期管理、热加载、工具注册聚合
工具分级 简易工具 (Simple) vs 复杂工具 (Complex),异步执行支持
13 个内置插件 将原有硬编码工具迁移为标准插件格式
REST API 插件 CRUD + 工具发现 + 执行端点
ai-core 集成 PluginManagerClient 替换本地工具调用

二、架构概览

┌──────────────────────────────────────────────────────┐
│                  Plugin Manager (port 8094)           │
│                                                      │
│  ┌─────────┐  ┌─────────┐  ┌──────────┐             │
│  │ Plugin A │  │ Plugin B │  │ Plugin C │  ... 13个   │
│  │calculator│  │ datetime │  │iot_query │  内置插件   │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘             │
│       │              │              │                  │
│  ┌────▼──────────────▼──────────────▼────┐            │
│  │        Plugin Manager Core            │            │
│  │  ┌───────────┐  ┌──────────────────┐  │            │
│  │  │ Lifecycle │  │  Tool Registry   │  │            │
│  │  │ Manager   │  │ (aggregated)     │  │            │
│  │  └───────────┘  └────────┬─────────┘  │            │
│  │  Install/Enable/Disable  │ Execute     │            │
│  │  Start/Stop/Reload       │ Validate    │            │
│  └──────────────────────────┴─────────────┘            │
│                    │                                   │
│  ┌─────────────────▼────────────────────────┐          │
│  │         REST API (net/http)              │          │
│  │  GET/POST/DELETE /api/v1/plugins/**      │          │
│  │  GET/POST         /api/v1/tools/**       │          │
│  └──────────────────────────────────────────┘          │
│                    ▲                                   │
└────────────────────┼───────────────────────────────────┘
                     │ HTTP
┌────────────────────┼───────────────────────────────────┐
│  ai-core           │                                   │
│  ┌─────────────────▼────────────────────────┐          │
│  │     PluginManagerClient                  │          │
│  │  GetToolDefinitions / ExecuteTool        │          │
│  └──────────────────────────────────────────┘          │
└───────────────────────────────────────────────────────┘

三、Plugin SDK (插件开发工具包)

3.1 核心接口

sdk/plugin.go — Plugin + Tool + ComplexTool + HostAPI

// Plugin — 所有插件必须实现的核心接口
type Plugin interface {
    Metadata() PluginMetadata
    Init(ctx context.Context, config PluginConfig) error
    Start(ctx context.Context, host HostAPI) error
    Stop(ctx context.Context) error
    Health(ctx context.Context) error
    Tools() []Tool
}

// Tool — 所有工具必须实现
type Tool interface {
    Definition() ToolDefinition
    Execute(ctx context.Context, args map[string]interface{}) (*ToolResult, error)
    Validate(args map[string]interface{}) error
    Complexity() ToolComplexity
}

// ComplexTool — 扩展异步多轮执行
type ComplexTool interface {
    Tool
    ExecuteAsync(ctx context.Context, args map[string]interface{}) (<-chan ToolProgress, error)
    Cancel(ctx context.Context, executionID string) error
}

// HostAPI — 插件可调用的宿主能力
type HostAPI interface {
    CallLLM(ctx context.Context, messages []LLMMessage) (*LLMResponse, error)
    SearchMemory(ctx context.Context, userID, query string, limit int) ([]MemoryEntry, error)
    StoreMemory(ctx context.Context, entry MemoryEntry) error
    Logger() Logger
    GetConfig(key string) (string, error)
    SetConfig(key, value string) error
    PublishEvent(ctx context.Context, event map[string]interface{}) error
    HTTPClient() *http.Client
}

sdk/types.go — 共享类型

类型 用途
PluginMetadata 插件标识 (name/version/author/dependencies)
PluginConfig 运行时配置 (map[string]interface{})
ToolDefinition 工具定义 (ID/Name/Parameters/Complexity/DangerLevel)
ToolResult 执行结果 (Success/Output/Error/DurationMs)
ToolProgress 异步进度 (Status/Progress/Result)
ToolComplexity 工具分级: simple / complex
PluginStatus 插件状态: installed/loaded/running/paused/error/disabled
IoTDeviceState 共享 IoT 设备状态

sdk/base.go — 基类实现

  • BasePlugin — 提供 Init/Start/Stop/Health 空实现
  • BaseTool — 提供 Validate (required 参数检查) + Complexity 默认返回 simple

四、Plugin Manager 核心

4.1 文件清单

文件 行数 用途
internal/manager/manager.go 200 Plugin Manager 核心:Install/Enable/Disable/Uninstall/Reload/Shutdown
internal/manager/registry.go 80 聚合工具注册表:Register/Unregister/Get/List/Definitions/Execute

4.2 插件生命周期

Install → [installed]
  → Enable → Init() → Start() → Register tools → [running]
    → Disable → Unregister tools → Stop() → [disabled]
    → Reload → Disable → Enable
  → Uninstall → Disable (if running) → 移除注册
  • 所有状态为内存态,重启后从 main.go 重新安装内置插件
  • 每个插件启动时获得独立 context.WithCancelpanic 恢复防护

4.3 EnableAll 执行流程

1. 遍历已安装插件
2. 对每个插件: Init(config) → Start(ctx, host) → Register tools
3. 任何插件失败不影响其他插件继续启动
4. 返回所有错误列表

五、13 个内置插件

每个插件目录包含 plugin.json (元数据) + plugin.go (实现)。

5.1 无状态工具插件 (7个)

插件名 目录 工具ID 主要功能
Calculator plugins/calculator/ calculator 安全数学表达式解析器 (递归下降)
DateTime plugins/datetime/ datetime 日期时间 (now/format/add/diff/timezone)
Text plugins/text/ text 文本处理 (count/summarize/translate/extract)
Crypto plugins/crypto/ crypto 哈希/编码 (MD5/SHA/Base64/URL)
Random plugins/random/ random 随机生成 (number/uuid/password/pick/shuffle)
Markdown plugins/markdown/ markdown Markdown 处理 (to_html/to_text/extract/TOC)
JSON plugins/json/ json_ops JSON 处理 (parse/query/validate)

5.2 带依赖插件 (4个)

插件名 目录 工具ID 依赖
File plugins/file/ file_ops dataDir (沙盒路径)
HTTP plugins/http/ http_request http.Client
WebSearch plugins/web_search/ web_search http.Client (DuckDuckGo API)
WebFetch plugins/web_fetch/ web_fetch http.Client

5.3 IoT 插件 (2个)

插件名 目录 工具ID 依赖 DangerLevel
IoT Query plugins/iot_query/ iot_query IoTClient (查询设备状态) low
IoT Control plugins/iot_control/ iot_control IoTController (控制设备) medium

IoT 插件通过 IOT_SERVICE_URL 环境变量配置,适配器通过 HTTP 调用 iot-debug-service。


六、REST API

6.1 端点列表

Method Path 说明
GET /api/v1/plugins 列出所有已安装插件
GET /api/v1/plugins/{id} 获取单个插件详情
POST /api/v1/plugins/{id}/enable 启用插件
POST /api/v1/plugins/{id}/disable 禁用插件
POST /api/v1/plugins/{id}/reload 热重载插件
DELETE /api/v1/plugins/{id} 卸载插件
GET /api/v1/plugins/{id}/tools 列出插件的工具
GET /api/v1/tools 列出所有已注册工具
GET /api/v1/tools/{id} 获取单个工具定义
POST /api/v1/tools/{id}/execute 执行工具
GET /health 健康检查

6.2 使用 net/http

Plugin Manager 不依赖任何外部 HTTP 框架,使用 Go 标准库 net/httpServeMux

  • 零外部依赖:只有 Go 标准库
  • 路由解析:手动解析路径参数
  • JSON 序列化:encoding/json

七、ai-core 集成

7.1 PluginManagerClient

新增文件 backend/ai-core/internal/tools/plugin_manager_client.go

type PluginManagerClient struct {
    baseURL    string       // http://localhost:8094
    httpClient *http.Client
}

方法:

  • GetToolDefinitions(ctx) — GET /api/v1/tools → []PMToolDefinition
  • ExecuteTool(ctx, toolID, args) — POST /api/v1/tools/{id}/execute → *PMToolResult
  • ListPlugins(ctx) — GET /api/v1/plugins → []PMPluginInfo
  • AdaptDefinitions(ctx) — 将 PM 工具定义转换为 ai-core ToolDefinition 格式

八、完整文件清单

新增文件 (39)

目录/文件 用途
backend/plugin-manager/go.mod Go 模块定义 (零外部依赖)
backend/plugin-manager/cmd/main.go 服务入口:注册内置插件、启动 HTTP
backend/plugin-manager/cmd/host_api.go HostAPI 实现 (stub)
backend/plugin-manager/cmd/iot_adapter.go IoT 客户端适配器 (HTTP → IoT service)
backend/plugin-manager/internal/config/config.go 配置加载
backend/plugin-manager/internal/handler/plugin_handler.go REST API 处理函数 (net/http)
backend/plugin-manager/internal/manager/manager.go Plugin Manager 核心
backend/plugin-manager/internal/manager/registry.go 工具注册表
backend/plugin-manager/internal/sdk/base.go BasePlugin + BaseTool
backend/plugin-manager/internal/sdk/plugin.go 核心接口 (Plugin/Tool/ComplexTool/HostAPI)
backend/plugin-manager/internal/sdk/permissions.go 权限模型
backend/plugin-manager/internal/sdk/types.go 共享类型定义
backend/plugin-manager/plugins/{13个}/plugin.json 各插件元数据
backend/plugin-manager/plugins/{13个}/plugin.go 各插件实现
backend/ai-core/internal/tools/plugin_manager_client.go ai-core Plugin Manager 客户端

修改文件 (1)

文件 修改内容
backend/go.work 添加 ./plugin-manager 到 workspace

九、验证指南

编译验证

# Plugin Manager (零外部依赖 — 即使离线也可编译)
cd backend/plugin-manager && GOWORK=off go build ./...

# ai-core / gateway (需要网络下载 golang.org/x/arch)
# 如果模块缓存可用: go build ./...

运行时验证

# 启动 Plugin Manager
cd backend/plugin-manager && GOWORK=off go run ./cmd/

# 测试端点
curl http://localhost:8094/health
# → {"status":"ok","service":"plugin-manager"}

curl http://localhost:8094/api/v1/plugins
# → {"plugins":[...13个插件...], "total": 13}

curl http://localhost:8094/api/v1/tools
# → {"tools":[...13个工具定义...], "total": 13}

# 执行计算器工具
curl -X POST http://localhost:8094/api/v1/tools/calculator/execute \
  -H "Content-Type: application/json" \
  -d '{"arguments":{"expression":"2+3*4"}}'
# → {"tool_name":"calculator","success":true,"output":"14"}

# 获取单个插件
curl http://localhost:8094/api/v1/plugins/calculator
# → 显示 Calculator 插件详情

# 禁用/启用插件
curl -X POST http://localhost:8094/api/v1/plugins/calculator/disable
curl -X POST http://localhost:8094/api/v1/plugins/calculator/enable

十、与设计文档的对应

设计文档要求 实现状态
Plugin 接口 (Metadata/Init/Start/Stop/Health/Tools) 完整实现
Tool 接口 (Definition/Execute/Validate) 完整实现
ComplexTool 接口 (ExecuteAsync/Cancel) 已定义 (待异步场景实现)
HostAPI 接口 (CallLLM/SearchMemory/StoreMemory/Logger等) 已定义 + stub 实现
插件生命周期 (Install→Enable→Start→Running→Stop→Disable→Uninstall) 完整实现
工具注册表 (聚合所有插件工具) 完整实现
plugin.json 元数据格式 13 个插件均含完整 metadata
tool.json 定义 🔧 内嵌在 Go Definition() 方法中 (后续分离)
插件目录结构 (tools/config/resources) 🔧 基础结构已建 (config/resources 待补充)
Plugin Manager REST API (10+ 端点) 11 个端点实现
权限模型 (PluginPermissions) 类型已定义
工具分级 (simple/complex) 已实现,所有内置工具标记为 simple
gRPC 通信 🔧 当前使用 HTTP (gRPC 后续迁移)
Marketplace 框架 🔧 基础 ListPlugins/GetPlugin 已实现 (search/install 待扩展)
13 个工具迁移 全部迁移为标准插件
ai-core PluginManagerClient 已创建

十一、后续计划

  1. Phase 3.2: 将 tool.json 从 Go 代码中分离为独立 JSON 文件,实现配置驱动
  2. Phase 3.3: 完善 HostAPI 实现 (连接 ai-core LLM/记忆/事件总线)
  3. Phase 3.3: 补充单元测试 (Plugin Manager 生命周期、工具执行、REST API)
  4. Phase 3.4: gRPC 替换 HTTP (降低调用延迟)
  5. Phase 3.5: Marketplace 安装/搜索/评分

十二、架构演进

Phase 1 (基础设施)              Phase 2 (人格交互)              Phase 3 (插件工具)
─────────────────────          ─────────────────────          ─────────────────────
ThinkChain                     EmotionState                   Plugin SDK
MessageScheduler               ProactiveGuard                 Plugin Manager
AutonomousToolPolicy           Presence Bridge                Tool Registry
SessionEnrichment              Offline Thinking               Tool Grading (Simple/Complex)
                               ──→                            ──→
硬编码 13 工具 (ai-core)                                     13 内置插件
重复实现 (ai-core+tool-engine)                               统一插件格式
无插件扩展机制                                              标准化扩展框架

Phase 3 建立了可扩展的插件基础设施。所有 13 个工具从硬编码迁移到标准化插件格式,Plugin Manager 通过 REST API 对外暴露工具发现和执行能力。ai-core 通过 PluginManagerClient 接入,替代原有的本地工具调用模式。