Skip to content

[opencode 请求流程分析] OpenCode 请求流程与请求 Header 分析(2026-07-20) #11

Description

@github-actions

⚠️ 近期相关变更

SHA 描述
67caf89 fix(opencode): increase OpenAI header timeout (#37770)OPENAI_HEADER_TIMEOUT_DEFAULT 从 10,000 ms → 300,000 ms(provider/provider.ts:35)
6a28842 go: support openai route — Go 客户端支持 OpenAI 路由

1. 请求流程(时序)

sequenceDiagram
    participant S as Session/Prompt
    participant R as LLMRequest.prepare<br/>(session/llm/request.ts)
    participant C as LLMClient.compile()<br/>(llm/route/client.ts)
    participant E as protocol.body.from()<br/>(protocols/*.ts)
    participant T as HttpTransport.prepare()<br/>(transport/http.ts)
    participant A as Auth.apply()<br/>(route/auth.ts)
    participant X as RequestExecutor<br/>(route/executor.ts)
    participant API as LLM Provider

    S->>R: PrepareInput(model, messages, tools, auth, flags)
    R->>R: 合并 system prompt / options<br/>注入 User-Agent / x-session-* header
    R->>C: LLMRequest { model, messages, http:{headers} }
    C->>C: resolveRequestOptions() 合并 routeDefaults+modelDefaults
    C->>E: route.body.from(request) 构造 provider-native body
    E-->>C: Body JSON
    C->>T: prepareTransport(body, request)
    T->>T: jsonRequestParts() 渲染 URL / body overlay
    T->>A: Auth.apply(url, body, headers)
    A-->>T: Headers(含鉴权 header)
    T->>T: jsonPost() 设置 content-type: application/json
    T-->>C: HttpPrepared { request, framing }
    C->>X: RequestExecutor.execute(httpRequest)
    X->>X: 重试 429/503/504/529,最多 2 次,指数退避
    X->>API: HTTP POST (SSE 流)
    API-->>X: SSE 事件流
    X-->>S: Stream<LLMEvent>
Loading

关键步骤:

步骤 文件 & 符号
Provider/Model 解析 packages/opencode/src/provider/provider.tsProvider.Service
凭据获取 packages/opencode/src/provider/auth.tsProviderAuth.Service
请求头/参数构造 packages/opencode/src/session/llm/request.tsprepare()
Route defaults 合并 packages/llm/src/route/client.tsresolveRequestOptions() / compile()
Body 构造 packages/llm/src/protocols/*.tsprotocol.body.from()
Header 组装 + Auth 注入 packages/llm/src/route/transport/http.tsjsonRequestParts()
content-type 设置 packages/llm/src/protocols/shared.ts:322jsonPost()
执行 + 重试 packages/llm/src/route/executor.tsretryStatusFailures()

2. 请求 Header 明细

通用 Header(所有 Provider)

Header 取值来源 说明
content-type protocols/shared.ts:322 固定 application/json
User-Agent session/llm/request.ts:18 USER_AGENT = \opencode/\${InstallationVersion}`` 客户端版本标识
x-session-affinity request.ts:197 会话亲和(外部 provider)
X-Session-Id request.ts:198 会话 ID(外部 provider)
x-parent-session-id request.ts:199(可选) 父会话 ID
x-opencode-project request.ts:190(opencode provider 专用) 项目 ID
x-opencode-session request.ts:191(opencode provider 专用) 会话 ID
x-opencode-request request.ts:192(opencode provider 专用) 请求 ID
x-opencode-client request.ts:193(opencode provider 专用) 客户端类型

Anthropic

端点:`(api.anthropic.com/redacted)

Header 取值来源 说明
x-api-key providers/anthropic.ts:13 Auth.header("x-api-key");优先级:apiKey 选项 → ANTHROPIC_API_KEY env API 鉴权密钥
anthropic-version protocols/anthropic-messages.ts:852 固定 "2023-06-01" API 版本锁定

OpenAI

端点:(api.openai.com/redacted) API)/ /chat/completions`

Header 取值来源 说明
authorization route/auth-options.ts:46 Bearer <apiKey>;优先级:apiKey 选项 → OPENAI_API_KEY env Bearer 鉴权

OAuth 模式:provider.ts:539 自定义 fetch 注入 Bearer token,并启用 headerTimeout=300_000ms 超时保护。

Azure OpenAI

端点:https://<resource>.openai.azure.com/openai/v1/responses,Query: api-version=v1

Header 取值来源 说明
api-key providers/azure.ts:auth() Auth.header("api-key");优先级:apiKey 选项 → AZURE_OPENAI_API_KEY env Azure 专用鉴权 header(非 Bearer)

注意:Azure 路由主动 Auth.remove("authorization") 删除默认 Bearer header,防止冲突。

Amazon Bedrock

端点:(bedrockruntime/redacted)<region>.amazonaws.com/model/<modelId>/converse-stream

Header 取值来源 说明
authorization protocols/utils/bedrock-auth.ts:sigV4()AwsV4Signer 生成 AWS4-HMAC-SHA256 Credential=... AWS SigV4 签名鉴权
x-amz-date AwsV4Signer 自动生成 签名时间戳
x-amz-security-token AwsV4Signer(有 sessionToken 时) STS 临时凭据
content-type bedrock-auth.ts:43签名前 设置 必须参与 SigV4 签名计算

指定 apiKey 时退化为标准 Bearer 模式。

Google Gemini

端点:`(generativelanguage.googleapis.com/redacted)

Header 取值来源 说明
x-goog-api-key providers/google.ts:13 Auth.header("x-goog-api-key");优先级:apiKey 选项 → GOOGLE_GENERATIVE_AI_API_KEY env Google AI API 鉴权密钥

GitHub Copilot

端点:由调用方显式配置(无公开默认 URL);协议:openai-responses(GPT-5+)/ openai-chat

Header 取值来源 说明
authorization providers/github-copilot.ts AuthOptions.bearer(options, []);token 来自 OAuth 流程(provider/auth.ts) OAuth Bearer 鉴权

OpenAI 兼容(OpenRouter / xAI / Groq / DeepSeek 等)

Header 取值来源 说明
authorization route/auth-options.ts:46 Bearer;各 provider env 变量:OPENROUTER_API_KEY / XAI_API_KEY Bearer 鉴权

3. 鉴权机制

Provider 方式 关键代码
Anthropic API Key → x-api-key providers/anthropic.ts:11-17
OpenAI Bearer;OAuth 时使用 access token route/auth-options.ts:46;provider/provider.ts:539
Azure API Key → api-key(非 Bearer) providers/azure.ts:auth()
Bedrock AWS SigV4(默认)或 Bearer(指定 apiKey) protocols/utils/bedrock-auth.ts:sigV4()
Google API Key → x-goog-api-key providers/google.ts:11-16
GitHub Copilot OAuth Bearer providers/github-copilot.ts;provider/auth.ts
OpenRouter/xAI/兼容 Bearer providers/openrouter.ts;providers/xai.ts

Auth 框架核心(packages/llm/src/route/auth.ts):

  • Credential:封装异步加载,.orElse() 支持降级链
  • Auth:封装 header 注入,.andThen() 顺序应用,.orElse() 降级
  • 敏感 header 在错误日志中自动脱敏(executor.ts SENSITIVE_NAME 正则匹配 authorization|api-key|token|secret|signature...)

4. 关键代码位置索引

文件 关键符号 说明
packages/llm/src/route/client.ts compile()resolveRequestOptions() 请求编译主流程
packages/llm/src/route/auth.ts Authbearer()header()custom() 鉴权框架
packages/llm/src/route/auth-options.ts:46 AuthOptions.bearer() 标准 Bearer 构建
packages/llm/src/route/transport/http.ts jsonRequestParts()httpJson() Header 最终组装
packages/llm/src/route/executor.ts retryStatusFailures()SENSITIVE_NAME HTTP 执行、重试、脱敏
packages/llm/src/protocols/shared.ts:320-322 jsonPost() 设置 content-type
packages/llm/src/protocols/anthropic-messages.ts:852 route headers 注入 anthropic-version
packages/llm/src/protocols/utils/bedrock-auth.ts sigV4() AWS SigV4 签名
packages/llm/src/providers/anthropic.ts:11-17 auth() Anthropic 鉴权
packages/llm/src/providers/azure.ts auth()routeAuth Azure 鉴权
packages/llm/src/providers/google.ts:11-16 auth() Google 鉴权
packages/opencode/src/session/llm/request.ts:18,186-201 USER_AGENT、headers 构造 会话 Header 注入
packages/opencode/src/provider/provider.ts:35 OPENAI_HEADER_TIMEOUT_DEFAULT=300_000 OpenAI 首字节超时

Generated by Daily Upstream Sync + Request-Flow Analysis · 89.3 AIC · ⌖ 7.04 AIC · ⊞ 5.9K ·

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions