第 13 章 高級

SDK 與開發者擴展

使用官方 SDK 開發擴展、建立外掛、整合編輯器,成為 opencode 生態的貢獻者

摘要

本章是所有章節的巔峰——從消費者變成創造者。你將學習如何使用 @opencode-ai/sdk 建立自己的工具與應用,理解 opencode 的 HTTP API 架構,開發自訂外掛,並將 opencode 整合到 Zed、JetBrains、Neovim 等編輯器中。無論你想為 opencode 生態貢獻外掛,還是將 opencode 嵌入自家產品,本章都會給你完整的指引。

學習目標

@opencode-ai/sdk 安裝與客戶端建立

@opencode-ai/sdk 是 opencode 的官方 Node.js SDK,提供程式化操作 opencode 所有功能的 API。

安裝

npm install @opencode-ai/sdk

建立客戶端

import { OpenCode } from '@opencode-ai/sdk'

const client = new OpenCode({
  apiKey: process.env.ANTHROPIC_API_KEY,
  // 可選:指定自訂伺服器位址
  baseUrl: 'http://localhost:8080'
})

// 快速測試連線
const info = await client.app.info()
console.log(info.version)

SDK 支援 TypeScript 型別定義,提供完整的 IDE 自動完成支援。

核心 API 分類

SDK 的 API 按照功能領域分類,每個分類對應不同的操作場景:

分類 說明 常用方法
global 全域設定與狀態 getConfig()setConfig()
app 應用程式資訊與生命週期 info()version()restart()
project 專案層級操作 open()close()getInfo()
session 工作階段管理 list()get()export()import()
file 檔案讀寫 read()write()edit()search()
find 全文搜尋 grep()glob()
tui TUI 介面控制 showMessage()showProgress()prompt()
auth 認證與權限 login()logout()checkPermission()
event 事件監聽與發送 on()emit()listEvents()

實際使用範例

import { OpenCode } from '@opencode-ai/sdk'

const oc = new OpenCode({ apiKey: process.env.ANTHROPIC_API_KEY })

// 列出所有工作階段
const sessions = await oc.session.list()
console.log(`共有 ${sessions.length} 個工作階段`)

// 在目前專案中搜尋
const results = await oc.find.grep('TODO', { include: '*.ts' })
console.log(`找到 ${results.length} 個 TODO`)

// 讀取並編輯檔案
const content = await oc.file.read('src/app.ts')
await oc.file.write('src/app.ts', content + '\n// updated by SDK')

// 監聽事件
oc.event.on('session:created', (session) => {
  console.log('新工作階段開始:', session.id)
})

結構化輸出(JSON Schema)

opencode 支援 結構化輸出,讓你可以要求 AI 回應符合特定 JSON Schema 的資料,而非自然語言。這對於程式化處理回應特別有用。

在 SDK 中使用

import { OpenCode } from '@opencode-ai/sdk'

const oc = new OpenCode({ apiKey: process.env.ANTHROPIC_API_KEY })

const result = await oc.app.complete({
  prompt: '分析此專案的 package.json,列出所有過時的依賴',
  responseSchema: {
    type: 'object',
    properties: {
      dependencies: {
        type: 'array',
        items: {
          type: 'object',
          properties: {
            name: { type: 'string' },
            current: { type: 'string' },
            latest: { type: 'string' },
            severity: { type: 'string', enum: ['low', 'medium', 'high'] }
          },
          required: ['name', 'current', 'latest', 'severity']
        }
      }
    },
    required: ['dependencies']
  }
})

console.log(JSON.stringify(result, null, 2))

支援的 Schema 功能

伺服器架構

opencode 本身可以作為 HTTP 伺服器執行,提供 RESTful API 供外部工具呼叫。

啟動 HTTP 伺服器

opencode serve --port 8080 --api-key sk-internal-key

API 端點

啟動後可透過 HTTP 呼叫所有 SDK 功能。例如:

# 取得應用資訊
curl http://localhost:8080/api/app/info \
  -H "Authorization: Bearer sk-internal-key"

# 送出提示
curl -X POST http://localhost:8080/api/app/complete \
  -H "Authorization: Bearer sk-internal-key" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "解釋這個專案的架構",
    "responseSchema": { "type": "object" }
  }'

OpenAPI 3.1 文件

啟動伺服器後,可透過以下路徑取得完整的 OpenAPI 3.1 規格文件:

# OpenAPI JSON
curl http://localhost:8080/api/openapi.json

# Swagger UI
# 瀏覽器開啟 http://localhost:8080/api/docs

這份文件可以用於自動產生客戶端程式碼、匯入 Postman 或整合到 API Gateway。

認證保護

HTTP API 支援多種認證方式:

# 啟動時指定認證方式
opencode serve \
  --port 8080 \
  --api-key sk-internal-key \
  --tls-cert server.crt \
  --tls-key server.key \
  --mtls-ca ca.crt

外掛系統深入

opencode 的外掛系統讓你可以擴展幾乎任何功能。每個外掛本質上就是一個目錄,包含 opencode-plugin.json 設定檔與實作程式碼。

事件類型

外掛可以訂閱以下事件類別:

事件 觸發時機 負載範例
session:start 工作階段開始 { sessionId, project }
session:end 工作階段結束 { sessionId, duration, tokens }
message:beforeSend 訊息送往 AI 前 { content, files }
message:afterReceive 收到 AI 回應後 { content, toolCalls }
tool:beforeCall 工具被呼叫前 { tool, args }
tool:afterCall 工具回傳結果後 { tool, result, duration }
file:write 檔案被寫入時 { path, size }
error 發生錯誤時 { error, context }

開發範例:日誌記錄外掛

以下是一個完整的外掛範例,記錄所有工作階段的開始與結束:

{
  "name": "session-logger",
  "version": "1.0.0",
  "description": "記錄所有工作階段",
  "events": ["session:start", "session:end"],
  "main": "index.js"
}
// index.js
const fs = require('fs')
const logFile = '/tmp/opencode-sessions.log'

module.exports = {
  async 'session:start'({ sessionId, project }) {
    const entry = `[${new Date().toISOString()}] START ${sessionId} in ${project}\n`
    fs.appendFileSync(logFile, entry)
  },

  async 'session:end'({ sessionId, duration, tokens }) {
    const entry = `[${new Date().toISOString()}] END ${sessionId} (${duration}ms, ${tokens} tokens)\n`
    fs.appendFileSync(logFile, entry)
  }
}

安裝外掛

# 本地外掛
opencode plugin add ./path/to/session-logger

# 從 npm 安裝
opencode plugin add @company/opencode-session-logger

ACP 支援

ACP(Agent Communication Protocol) 是 opencode 定義的通訊協定,讓外部編輯器可以與 opencode 互動。ACP 支援以下編輯器:

Zed

Zed 是對 opencode 支援最完善的編輯器之一,原生整合 ACP:

# 在 Zed 設定中啟用
// ~/.config/zed/settings.json
{
  "agent": {
    "opencode": {
      "enabled": true,
      "apiKey": "sk-ant-xxxxx"
    }
  }
}

JetBrains(IntelliJ IDEA、WebStorm 等)

透過 OpenCode ACP Plugin 安裝:

# 從 JetBrains Marketplace 安裝外掛
# 或手動安裝
opencode acp install jetbrains

安裝後可在 JetBrains 的工具視窗中找到 opencode 面板,支援程式碼選取、內嵌編輯、問題提問等功能。

Neovim

Neovim 用戶可以透過社群外掛整合:

-- 使用 lazy.nvim 安裝
{
  "opencode-ai/opencode.nvim",
  config = function()
    require('opencode').setup({
      api_key = vim.env.ANTHROPIC_API_KEY,
      keymaps = {
        ask = 'aa',
        edit = 'ae',
        explain = 'ax',
      }
    })
  end
}

自訂 ACP 客戶端

你也可以透過 SDK 建立自訂 ACP 客戶端:

import { ACPClient } from '@opencode-ai/sdk/acp'

const client = new ACPClient({
  endpoint: 'http://localhost:8080/acp',
  apiKey: 'sk-key'
})

// 傳送選取的程式碼給 opencode
const result = await client.ask({
  selection: 'function add(a,b){return a+b}',
  prompt: '為此函數添加 TypeScript 型別'
})

生態系統

opencode 擁有活躍且快速成長的生態系統,以下是一些值得關注的資源:

知名外掛

相關專案

社群資源

實戰練習

練習 1:使用 SDK 查詢工作階段

安裝 @opencode-ai/sdk,建立一個小型 Node.js 腳本,列出所有工作階段並顯示每個工作階段的持續時間與 token 用量。將結果輸出為 JSON 檔案。

練習 2:開發一個程式碼審查外掛

建立一個 opencode 外掛,訂閱 file:write 事件。每當 JavaScript/TypeScript 檔案被寫入時,自動執行 ESLint 檢查並將結果記錄到日誌檔案。

練習 3:啟動 HTTP API 伺服器

使用 opencode serve 啟動 API 伺服器,用 curl 測試 /api/app/info 端點。然後使用 Swagger UI 瀏覽完整的 API 文件。

練習 4:整合編輯器 ACP

選擇一個你常用的編輯器(Zed、JetBrains 或 Neovim),按照 ACP 整合指引完成設定。成功後,在編輯器中選取一段程式碼,使用 opencode 進行重構。