opencode/packages/web/src/content/docs/zh-tw/sdk.mdx
2026-02-10 07:11:19 -06:00

391 lines
15 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 軟件開發工具包
description: opencode 服務器的類型安全 JS 客戶端。
---
import config from "../../../../config.mjs"
export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts`
opencode JS/TS SDK 提供類型安全的客戶端用於與服務器交互。
使用它以編程方式構建集成和控制opencode。
[了解更多](/docs/server) 關於服務器如何工作。例如,查看社區構建的[專案](/docs/ecosystem#projects)。
---
## 安裝
從 npm 安裝 SDK
```bash
npm install @opencode-ai/sdk
```
---
## 創建客戶端
創建 opencode 的實例:
```javascript
import { createOpencode } from "@opencode-ai/sdk"
const { client } = await createOpencode()
```
這會同時啟動服務器和客戶端
#### 選項
| 選項 | 類型 | 描述 | 默認 |
| ---------- | ------------- | ------------------------------ | ----------- |
| `hostname` | `string` | 服務器主機名 | `127.0.0.1` |
| `port` | `number` | 服務器端口 | `4096` |
| `signal` | `AbortSignal` | 取消的中止信號 | `undefined` |
| `timeout` | `number` | 服務器啟動超時(以毫秒為單位) | `5000` |
| `config` | `Config` | 配置對象 | `{}` |
---
## 配置
您可以傳遞配置對象來自定義行為。該實例仍然會選擇您的`opencode.json`,但您可以覆蓋或添加內聯配置:
```javascript
import { createOpencode } from "@opencode-ai/sdk"
const opencode = await createOpencode({
hostname: "127.0.0.1",
port: 4096,
config: {
model: "anthropic/claude-3-5-sonnet-20241022",
},
})
console.log(`Server running at ${opencode.server.url}`)
opencode.server.close()
```
## 僅限客戶
如果您已經有一個正在運行的 opencode 實例,您可以創建一個客戶端實例來連接到它:
```javascript
import { createOpencodeClient } from "@opencode-ai/sdk"
const client = createOpencodeClient({
baseUrl: "http://localhost:4096",
})
```
#### 選項
| 選項 | 類型 | 描述 | 默認 |
| --------------- | ---------- | ---------------------------- | ----------------------- |
| `baseUrl` | `string` | 服務器的 URL | `http://localhost:4096` |
| `fetch` | `function` | 自定義獲取實現 | `globalThis.fetch` |
| `parseAs` | `string` | 響應解析方法 | `auto` |
| `responseStyle` | `string` | 返回樣式:`data` 或 `fields` | `fields` |
| `throwOnError` | `boolean` | 拋出錯誤而不是返回 | `false` |
---
## 類型
SDK 包含所有 API 類型的 TypeScript 定義。直接導入它們:
```typescript
import type { Session, Message, Part } from "@opencode-ai/sdk"
```
所有類型均根據服務器的 OpenAPI 規範生成,並可在 <a href={typesUrl}>types 文件</a>中找到。
---
## 錯誤
SDK 可能會拋出錯誤,您可以捕獲並處理這些錯誤:
```typescript
try {
await client.session.get({ path: { id: "invalid-id" } })
} catch (error) {
console.error("Failed to get session:", (error as Error).message)
}
```
---
## 蜜蜂
SDK 通過類型安全的客戶端公開所有服務器 API。
---
### 全球的
| 方法 | 描述 | 回應 |
| ----------------- | ------------------------ | ------------------------------------ |
| `global.health()` | 檢查服務器健康狀況和版本 | `{ healthy: true, version: string }` |
---
#### 示例
```javascript
const health = await client.global.health()
console.log(health.data.version)
```
---
### 應用程式
| 方法 | 描述 | 回應 |
| -------------- | ------------------ | ------------------------------------------ |
| `app.log()` | 寫入日誌條目 | `boolean` |
| `app.agents()` | 列出所有可用的代理 | <a href={typesUrl}><code>代理[]</code></a> |
---
#### 示例
```javascript
// Write a log entry
await client.app.log({
body: {
service: "my-app",
level: "info",
message: "Operation completed",
},
})
// List available agents
const agents = await client.app.agents()
```
---
### 專案
| 方法 | 描述 | 回應 |
| ------------------- | ------------ | ------------------------------------------ |
| `project.list()` | 列出所有項目 | <a href={typesUrl}><code>項目[]</code></a> |
| `project.current()` | 獲取當前項目 | <a href={typesUrl}><code>項目</code></a> |
---
#### 示例
```javascript
// List all projects
const projects = await client.project.list()
// Get current project
const currentProject = await client.project.current()
```
---
### 小路
| 方法 | 描述 | 回應 |
| ------------ | ------------ | ---------------------------------------- |
| `path.get()` | 獲取當前路徑 | <a href={typesUrl}><code>路徑</code></a> |
---
#### 示例
```javascript
// Get current path information
const pathInfo = await client.path.get()
```
---
### 配置
| 方法 | 描述 | 回應 |
| -------------------- | -------------------- | ----------------------------------------------------------------------------------------------------- |
| `config.get()` | 獲取配置信息 | <a href={typesUrl}><code>配置</code></a> |
| `config.providers()` | 列出提供商和默認模型 | `{ providers: `<a href={typesUrl}><code>Provider[]</code></a>`, default: { [key: string]: string } }` |
---
#### 示例
```javascript
const config = await client.config.get()
const { providers, default: defaults } = await client.config.providers()
```
---
### 會議
| 方法 | 描述 | 筆記 |
| ---------------------------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `session.list()` | 列出會話 | 返回 <a href={typesUrl}><code>Session[]</code></a> |
| `session.get({ path })` | 獲取會話 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `session.children({ path })` | 列出子會話 | 返回 <a href={typesUrl}><code>Session[]</code></a> |
| `session.create({ body })` | 創建會話 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `session.delete({ path })` | 刪除會話 | 返回 `boolean` |
| `session.update({ path, body })` | 更新會話屬性 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `session.init({ path, body })` | 分析應用程式並創建`AGENTS.md` | 返回 `boolean` |
| `session.abort({ path })` | 中止正在運行的會話 | 返回 `boolean` |
| `session.share({ path })` | 分享會 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `session.unshare({ path })` | 取消共享會話 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `session.summarize({ path, body })` | 會議總結 | 返回 `boolean` |
| `session.messages({ path })` | 列出會話中的消息 | 返回 `{ info: `<a href={typesUrl}><code>消息</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}[]` |
| `session.message({ path })` | 獲取消息詳情 | 返回 `{ info: `<a href={typesUrl}><code>消息</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}` |
| `session.prompt({ path, body })` | 發送提示信息 | `body.noReply: true` 返回 UserMessage僅上下文。默認返回帶有 AI 響應的 <a href={typesUrl}><code>AssistantMessage</code></a> |
| `session.command({ path, body })` | 向會話發送命令 | 返回 `{ info: `<a href={typesUrl}><code>AssistantMessage</code></a>`, parts: `<a href={typesUrl}><code>Part[]</code></a>`}` |
| `session.shell({ path, body })` | 運行 shell 命令 | 返回 <a href={typesUrl}><code>AssistantMessage</code></a> |
| `session.revert({ path, body })` | 回复消息 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `session.unrevert({ path })` | 恢復已恢復的消息 | 返回 <a href={typesUrl}><code>Session</code></a> |
| `postSessionByIdPermissionsByPermissionId({ path, body })` | 回復權限請求 | 返回 `boolean` |
---
#### 示例
```javascript
// Create and manage sessions
const session = await client.session.create({
body: { title: "My session" },
})
const sessions = await client.session.list()
// Send a prompt message
const result = await client.session.prompt({
path: { id: session.id },
body: {
model: { providerID: "anthropic", modelID: "claude-3-5-sonnet-20241022" },
parts: [{ type: "text", text: "Hello!" }],
},
})
// Inject context without triggering AI response (useful for plugins)
await client.session.prompt({
path: { id: session.id },
body: {
noReply: true,
parts: [{ type: "text", text: "You are a helpful assistant." }],
},
})
```
---
### 文件
| 方法 | 描述 | 回應 |
| ------------------------- | -------------------- | ----------------------------------------------------------------------------------- |
| `find.text({ query })` | 搜索文件中的文本 | 具有 `path`, `lines`, `line_number`, `absolute_offset`, `submatches` 的匹配對象陣列 |
| `find.files({ query })` | 按名稱查找文件和目錄 | `string[]`(路徑) |
| `find.symbols({ query })` | 查找工作區符號 | <a href={typesUrl}><code>Symbol[]</code></a> |
| `file.read({ query })` | 讀取文件 | `{ type: "raw" \| "patch", content: string }` |
| `file.status({ query? })` | 獲取跟蹤文件的狀態 | <a href={typesUrl}><code>File[]</code></a> |
`find.files` 支持一些可選的查詢字段:
- `type``"file"`或`"directory"`
- `directory`:覆蓋搜索的項目根目錄
- `limit`:最大結果 (1200)
---
#### 示例
```javascript
// Search and read files
const textResults = await client.find.text({
query: { pattern: "function.*opencode" },
})
const files = await client.find.files({
query: { query: "*.ts", type: "file" },
})
const directories = await client.find.files({
query: { query: "packages", type: "directory", limit: 20 },
})
const content = await client.file.read({
query: { path: "src/index.ts" },
})
```
---
### TUI
| 方法 | 描述 | 回應 |
| ------------------------------ | ---------------- | --------- |
| `tui.appendPrompt({ body })` | 將文本附加到提示 | `boolean` |
| `tui.openHelp()` | 打開幫助對話框 | `boolean` |
| `tui.openSessions()` | 打開會話選擇器 | `boolean` |
| `tui.openThemes()` | 打開主題選擇器 | `boolean` |
| `tui.openModels()` | 打開模型選擇器 | `boolean` |
| `tui.submitPrompt()` | 提交當前提示 | `boolean` |
| `tui.clearPrompt()` | 清除提示 | `boolean` |
| `tui.executeCommand({ body })` | 執行命令 | `boolean` |
| `tui.showToast({ body })` | 顯示 toast 通知 | `boolean` |
---
#### 示例
```javascript
// Control TUI interface
await client.tui.appendPrompt({
body: { text: "Add this to prompt" },
})
await client.tui.showToast({
body: { message: "Task completed", variant: "success" },
})
```
---
### 授權
| 方法 | 描述 | 回應 |
| ------------------- | ---------------- | --------- |
| `auth.set({ ... })` | 設置身份驗證憑據 | `boolean` |
---
#### 示例
```javascript
await client.auth.set({
path: { id: "anthropic" },
body: { type: "api", key: "your-api-key" },
})
```
---
### 活動
| 方法 | 描述 | 回應 |
| ------------------- | ------------------ | ------------------ |
| `event.subscribe()` | 服務器發送的事件流 | 服務器發送的事件流 |
---
#### 示例
```javascript
// Listen to real-time events
const events = await client.event.subscribe()
for await (const event of events.stream) {
console.log("Event:", event.type, event.properties)
}
```