Logo
热心市民王先生

解决方案设计

技术研究 OpenCode 架构设计

解析 OpenCode Server 与 CLI 的架构关系、设计动机与典型应用场景

架构解析

客户端-服务器架构

OpenCode 采用客户端-服务器架构,这是理解 Server 功能的核心:

┌─────────────────────────────────────────────────────────────┐
│                        OpenCode 整体架构                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    │
│   │   TUI 客户端  │    │  Web 客户端  │    │  IDE 插件   │    │
│   │  (Terminal)  │    │  (Browser)  │    │ (VSCode等)  │    │
│   └──────┬──────┘    └──────┬──────┘    └──────┬──────┘    │
│          │                  │                  │            │
│          └──────────────────┼──────────────────┘            │
│                             │                               │
│                             ▼                               │
│   ┌─────────────────────────────────────────────────────┐   │
│   │              OpenCode Server (HTTP)                  │   │
│   │                                                      │   │
│   │   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐ │   │
│   │   │ Session 管理 │  │ Message 处理 │  │ File 操作   │ │   │
│   │   └─────────────┘  └─────────────┘  └─────────────┘ │   │
│   │                                                      │   │
│   │   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐ │   │
│   │   │  MCP 管理   │  │  LSP 服务   │  │  Provider   │ │   │
│   │   └─────────────┘  └─────────────┘  └─────────────┘ │   │
│   └─────────────────────────────────────────────────────┘   │
│                             │                               │
│                             ▼                               │
│   ┌─────────────────────────────────────────────────────┐   │
│   │              AI Provider (Claude/GPT/etc.)           │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

默认行为解析

当执行 opencode 命令(无参数)时:

  1. 同时启动 TUI 和 Server:TUI 作为客户端连接到 Server
  2. 随机端口分配:Server 监听随机端口
  3. 本地回环地址:默认绑定 127.0.0.1

当执行 opencode serve 时:

  1. 仅启动 Server:无 TUI 界面
  2. 指定端口:默认 4096
  3. 可配置绑定地址:支持 0.0.0.0 远程访问

通信协议

客户端 ◄───────► Server

         ├── HTTP/1.1 (REST API)
         ├── Server-Sent Events (事件流)
         └── WebSocket (未来可能支持)

为什么会有这个特性

设计动机

1. 多客户端支持

问题:传统的 CLI 工具通常只能通过单一终端界面使用。

解决:客户端-服务器架构允许多种客户端:

  • TUI(终端用户界面)
  • Web 界面(opencode web
  • IDE 插件(VSCode、Zed 等)
  • 自定义客户端(通过 HTTP API)
# 示例:多客户端同时连接同一 Server
# Terminal 1: 启动 Server
opencode serve --port 4096 --hostname 0.0.0.0

# Terminal 2: TUI 客户端连接
opencode attach http://localhost:4096

# Browser: Web 界面访问
# http://localhost:4096

2. 远程开发场景

问题:开发者在本地机器上运行 AI 编码助手,但项目代码可能在远程服务器上。

解决:Server 可部署在远程机器,客户端从本地连接:

┌─────────────────┐          ┌─────────────────┐
│   本地开发机      │          │   远程服务器      │
│                 │          │                 │
│  ┌───────────┐  │   HTTP   │  ┌───────────┐  │
│  │ TUI/Web   │◄─┼──────────┼─►│  Server   │  │
│  │  客户端    │  │          │  │           │  │
│  └───────────┘  │          │  │  ┌─────┐   │  │
│                 │          │  │  │代码库│   │  │
│                 │          │  │  └─────┘   │  │
│                 │          │  │  ┌─────┐   │  │
│                 │          │  │  │ LSP │   │  │
│                 │          │  │  └─────┘   │  │
└─────────────────┘          │  └───────────┘  │
                             └─────────────────┘

3. 程序化访问

问题:需要通过脚本或程序调用 AI 编码助手的能力。

解决:HTTP API 支持完整的程序化访问:

# 示例:通过 curl 创建会话并发送消息
SESSION_ID=$(curl -s -X POST http://localhost:4096/session | jq -r '.id')

curl -X POST "http://localhost:4096/session/$SESSION_ID/message" \
  -H "Content-Type: application/json" \
  -d '{"parts": [{"type": "text", "text": "解释 Go 语言中的闭包"}]}'

4. 资源共享

问题:MCP 服务器、LSP 服务启动耗时较长,每次启动 CLI 都需要重新初始化。

解决:Server 保持运行,客户端可随时连接,避免重复初始化:

首次启动: opencode serve (加载 MCP、LSP 等,耗时约 10-30 秒)
后续连接: opencode run --attach http://localhost:4096 (毫秒级连接)

5. 企业部署

问题:企业需要集中管理 AI 编码助手,控制成本和访问权限。

解决

  • Server 可部署在内部服务器
  • 通过 HTTP Basic Auth 控制访问
  • 统一管理 API Key 和模型配置

与 CLI 工具的关系

关系图谱

组件角色启动方式用途
opencodeCLI 入口opencode启动 TUI + Server
TUI客户端自动启动终端交互界面
Server后端服务自动启动 或 opencode serve提供核心能力
opencode serve独立 Server手动启动无界面服务模式
opencode attach客户端连接手动执行连接已有 Server
opencode webWeb 服务手动启动Server + Web UI

命令对比

# 标准模式:TUI + Server(本地)
opencode

# Server 模式:仅 Server(本地/远程)
opencode serve --port 4096 --hostname 0.0.0.0

# Web 模式:Server + Web UI
opencode web --port 4096

# 附加模式:TUI 连接到已有 Server
opencode attach http://remote-server:4096

# 运行模式:非交互式执行命令
opencode run "解释这段代码" --attach http://localhost:4096

参考资料