Skip to content

OpenCode LLM 层

核心文件

text
packages/llm/src/
├── llm.ts              # LLM.request/stream/client
├── route/
│   ├── protocol.ts     # API 协议定义
│   ├── endpoint.ts     # Endpoint 构造
│   ├── auth.ts         # 认证
│   └── framing.ts      # 字节流解帧
└── providers/          # Provider 实现

Route Decomposition

OpenCode 最精巧的设计是 LLM Route 的四层分解:

typescript
interface Route<Protocol, Endpoint, Auth, Framing> {
  protocol: Protocol;   // e.g. OpenAIChatProtocol
  endpoint: Endpoint;   // e.g. URL builder
  auth: Auth;           // e.g. Bearer token
  framing: Framing;     // e.g. SSE parsing
}

四层含义

作用示例
Protocol定义 API 语义OpenAI Chat、Anthropic Messages
Endpoint构造请求 URLbaseURL + /chat/completions
Auth每个请求认证Bearer sk-xxxx-api-key
Framing字节流 → 帧SSE、AWS Event Stream

为什么这很妙?

为 DeepSeek 添加支持只需:

typescript
const DeepSeekRoute = Route.make(
  OpenAIChatProtocol,          // 和 OpenAI 一样的协议
  Endpoint.make("https://api.deepseek.com/v1"), // 只换 URL
  Auth.bearer("sk-xxx"),       // 自己的 key
  Framing.sse(),               // 相同的 SSE 解帧
);

5 行代码。而 Hermes 要写完整的 adapter 类,Pi 要写整个 provider 文件。

统一 LLM Client

LLM.request()

Route → Protocol.toRequest()

fetch() with Auth

Framing.parse() → stream of frames

Protocol.fromResponse() → Message[]

对比

维度OpenCodeHermesPi
抽象方式Route decompositionOpenAI SDK + transportAI interface
新增 Provider5-15 行transport 类 + adapterprovider 文件
复杂度高(4 层抽象)中(2 层)低(1 层)
扩展性极好一般
最佳适用需要接大量 provider以 OpenAI 为主以主流 provider 为主

Powered by VitePress