opencode serve 命令会运行一个无头(headless)HTTP 服务,暴露一个 OpenAPI 接口,供 OpenCode 客户端调用。
opencode serve [--port <number>] [--hostname <string>] [--cors <origin>]
| 参数 | 说明 | 默认值 |
|---|
--port | 监听端口 | 4096 |
--hostname | 监听主机名 | 127.0.0.1 |
--mdns | 启用 mDNS 服务发现 | false |
--cors | 允许的额外浏览器来源(CORS Origin) | [] |
--cors 可以传多次:
opencode serve --cors http://localhost:5173 --cors https://app.example.com
当你运行 opencode 时,它会同时启动一个 TUI 客户端和一个服务端;TUI 是客户端,通过 HTTP 和服务端通信。服务端暴露一个 OpenAPI 3.1 规范接口,这个接口也用于生成 SDK。
这种架构使得 OpenCode 能同时支持多个客户端,并允许你通过代码与 OpenCode 交互。
你可以单独运行 opencode serve 来启动一个独立的服务。如果 TUI 已经在运行,额外运行 opencode serve 会启动一个新的 Server 实例。
默认情况下,启动 TUI 时会随机分配端口和主机名。你也可以通过 CLI 的 --hostname 和 --port 参数来固定它们,然后使用这些信息连接到同一个服务端。
/tui 接口可以用来通过 Server 远程驱动 TUI,例如预填 Prompt 或直接触发执行。这也是 OpenCode IDE 插件 所使用的方式。
Server 会发布一个 OpenAPI 3.1 规范,可以通过下面地址查看:
http://<hostname>:<port>/doc
例如:http://localhost:4096/doc。你可以使用该规范自动生成客户端、查看请求/响应类型,或在 Swagger 等工具中浏览。
OpenCode Server 暴露的主要 HTTP 接口如下。
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /global/health | 获取服务健康状态和版本信息 | { healthy: true, version: string } |
GET | /global/event | 获取全局事件(SSE 流) | 事件流(Server-Sent Events) |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /path | 获取当前路径 | Path |
GET | /vcs | 获取当前项目的 VCS 信息 | VcsInfo |
| 方法 | 路径 | 说明 | 返回值 |
|---|
POST | /instance/dispose | 销毁当前服务实例 | boolean |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /config | 获取当前配置 | Config |
PATCH | /config | 更新配置 | Config |
GET | /config/providers | 列出提供商及默认模型 | { providers: Provider[], default: { [key: string]: string } } |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /provider | 列出所有提供商 | { all: Provider[], default: {...}, connected: string[] } |
GET | /provider/auth | 获取各提供商支持的认证方式 | { [providerID: string]: ProviderAuthMethod[] } |
POST | /provider/{id}/oauth/authorize | 针对提供商发起 OAuth 授权 | ProviderAuthAuthorization |
POST | /provider/{id}/oauth/callback | 处理提供商的 OAuth 回调 | boolean |
| 方法 | 路径 | 说明 | 备注 |
|---|
GET | /session | 列出所有会话 | 返回 Session[] |
POST | /session | 创建新会话 | body: { parentID?, title? },返回 Session |
GET | /session/status | 获取所有会话的状态 | 返回 { [sessionID: string]: SessionStatus } |
GET | /session/:id | 获取指定会话详情 | 返回 Session |
DELETE | /session/:id | 删除会话及其所有数据 | 返回 boolean |
PATCH | /session/:id | 更新会话属性 | body: { title? },返回 Session |
GET | /session/:id/children | 获取某会话的子会话 | 返回 Session[] |
GET | /session/:id/todo | 获取会话对应的待办列表 | 返回 Todo[] |
POST | /session/:id/init | 分析项目并创建 AGENTS.md | body: { messageID, providerID, modelID },返回 boolean |
POST | /session/:id/fork | 在某条消息处分叉会话 | body: { messageID? },返回 Session |
POST | /session/:id/abort | 中止正在运行的会话 | 返回 boolean |
POST | /session/:id/share | 分享会话 | 返回 Session |
DELETE | /session/:id/share | 取消分享会话 | 返回 Session |
GET | /session/:id/diff | 获取会话的文件 diff | query: messageID?,返回 FileDiff[] |
POST | /session/:id/summarize | 压缩/总结会话 | body: { providerID, modelID },返回 boolean |
POST | /session/:id/revert | 撤销某条消息对应更改 | body: { messageID, partID? },返回 boolean |
POST | /session/:id/unrevert | 恢复所有被撤销的消息 | 返回 boolean |
POST | /session/:id/permissions/:permissionID | 对某条权限请求作出响应 | body: { response, remember? },返回 boolean |
| 方法 | 路径 | 说明 | 备注 |
|---|
GET | /session/:id/message | 列出会话中的所有消息 | query: limit?,返回 { info: Message, parts: Part[]}[] |
POST | /session/:id/message | 发送一条消息并等待完整回复 | body: { messageID?, model?, agent?, noReply?, system?, tools?, parts },返回 { info, parts } |
GET | /session/:id/message/:messageID | 获取单条消息详情 | 返回 { info: Message, parts: Part[]} |
POST | /session/:id/prompt_async | 异步发送消息(不等待返回) | body 同 /session/:id/message,返回 204 No Content |
POST | /session/:id/command | 执行斜杠命令 | body: { messageID?, agent?, model?, command, arguments },返回 { info, parts } |
POST | /session/:id/shell | 运行 Shell 命令 | body: { agent, model?, command },返回 { info, parts } |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /find?pattern=<pat> | 在文件中搜索文本 | 包含 path、lines、line_number、absolute_offset、submatches 的匹配结果数组 |
GET | /find/file?query=<q> | 按名称查找文件或目录 | string[](路径列表) |
GET | /find/symbol?query=<q> | 搜索工作区符号 | Symbol[] |
GET | /file?path=<path> | 列出某路径下的文件和目录 | FileNode[] |
GET | /file/content?path=<path> | 读取文件内容 | FileContent |
GET | /file/status | 获取被跟踪文件的状态 | File[] |
/find/file 的常用查询参数:
query(必填):模糊搜索字符串
type(可选):仅返回 "file" 或 "directory"
directory(可选):覆盖默认项目根目录
limit(可选):最大结果数量(1–200)
dirs(可选):兼容旧用法("false" 时只返回文件)
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /experimental/tool/ids | 列出全部工具 ID | ToolIDs |
GET | /experimental/tool?provider=<p>&model=<m> | 列出某模型可用的工具及其 JSON Schema | ToolList |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /agent | 列出所有可用的 Agents | Agent[] |
| 方法 | 路径 | 说明 | 返回值 |
|---|
POST | /log | 写日志,body: { service, level, message, extra? } | boolean |
| 方法 | 路径 | 说明 | 返回值 |
|---|
POST | /tui/append-prompt | 在输入框后追加文本 | boolean |
POST | /tui/open-help | 打开帮助对话框 | boolean |
POST | /tui/open-sessions | 打开会话选择器 | boolean |
POST | /tui/open-themes | 打开主题选择器 | boolean |
POST | /tui/open-models | 打开模型选择器 | boolean |
POST | /tui/submit-prompt | 提交当前 Prompt | boolean |
POST | /tui/clear-prompt | 清空 Prompt | boolean |
POST | /tui/execute-command | 执行命令({ command }) | boolean |
POST | /tui/show-toast | 显示 toast({ title?, message, variant }) | boolean |
GET | /tui/control/next | 等待下一条控制请求 | 控制请求对象 |
POST | /tui/control/response | 对控制请求进行响应({ body }) | boolean |
| 方法 | 路径 | 说明 | 返回值 |
|---|
PUT | /auth/:id | 设置认证凭据,body 需符合对应 provider 的 schema | boolean |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /event | SSE 事件流。首条事件是 server.connected,之后是总线事件 | Server-Sent Events 事件流 |
| 方法 | 路径 | 说明 | 返回值 |
|---|
GET | /doc | OpenAPI 3.1 规范页面 | 带有 OpenAPI 文档的 HTML 页面 |