You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
3033afb fix(provider): normalize Mistral family tool call IDs — 工具调用 ID 规范化
5a8ee27 fix(provider): update muse-spark reasoning default and system prompt — provider 选项调整
1. 请求流程(时序)
opencode 存在两条并行路径:
路径
适用范围
AI SDK 主路径
大多数 provider(通过 Vercel AI SDK)
Native LLM 路径
OpenAI / Anthropic / opencode 自有
Native LLM 路径时序
sequenceDiagram
participant S as Session/Prompt
participant P as LLMRequestPrep.prepare<br/>(session/llm/request.ts)
participant N as LLMNative.request<br/>(native-request.ts)
participant C as LLMClient.compile<br/>(llm/route/client.ts)
participant A as Auth.apply<br/>(route/auth.ts)
participant T as HttpTransport.jsonRequestParts<br/>(transport/http.ts)
participant E as RequestExecutor<br/>(executor.ts)
S->>P: prepare(input)
Note over P: 1.合并system/params<br/>2.插件触发chat.headers<br/>3.注入User-Agent/session头
P-->>S: Prepared{headers,params,...}
S->>N: LLMNative.request(model,messages,headers)
N-->>S: LLMRequest(含model/route对象)
S->>C: compile(LLMRequest)
Note over C: resolveRequestOptions<br/>合并 RouteDefaults/ModelDefaults
C->>C: route.body.from(request) → provider body
C->>T: route.prepareTransport(body, request)
T->>A: Auth.toEffect(auth)(authInput)
Note over A: apiKey选项→env变量Config<br/>→设置鉴权Header
A-->>T: Headers(含鉴权)
T->>T: set content-type:application/json
T-->>C: HttpPrepared{request,framing}
C->>E: execute(HttpClientRequest)
Note over E: 重试逻辑max 2次<br/>处理429/503/504/529
E-->>S: SSE Stream → LLMEvent
本次变更提示
近期同步提交中与请求流程相关:
3033afb fix(provider): normalize Mistral family tool call IDs— 工具调用 ID 规范化5a8ee27 fix(provider): update muse-spark reasoning default and system prompt— provider 选项调整1. 请求流程(时序)
opencode 存在两条并行路径:
Native LLM 路径时序
sequenceDiagram participant S as Session/Prompt participant P as LLMRequestPrep.prepare<br/>(session/llm/request.ts) participant N as LLMNative.request<br/>(native-request.ts) participant C as LLMClient.compile<br/>(llm/route/client.ts) participant A as Auth.apply<br/>(route/auth.ts) participant T as HttpTransport.jsonRequestParts<br/>(transport/http.ts) participant E as RequestExecutor<br/>(executor.ts) S->>P: prepare(input) Note over P: 1.合并system/params<br/>2.插件触发chat.headers<br/>3.注入User-Agent/session头 P-->>S: Prepared{headers,params,...} S->>N: LLMNative.request(model,messages,headers) N-->>S: LLMRequest(含model/route对象) S->>C: compile(LLMRequest) Note over C: resolveRequestOptions<br/>合并 RouteDefaults/ModelDefaults C->>C: route.body.from(request) → provider body C->>T: route.prepareTransport(body, request) T->>A: Auth.toEffect(auth)(authInput) Note over A: apiKey选项→env变量Config<br/>→设置鉴权Header A-->>T: Headers(含鉴权) T->>T: set content-type:application/json T-->>C: HttpPrepared{request,framing} C->>E: execute(HttpClientRequest) Note over E: 重试逻辑max 2次<br/>处理429/503/504/529 E-->>S: SSE Stream → LLMEvent关键步骤
session/llm/request.ts→LLMRequestPrep.preparesession/llm/native-request.ts→LLMNative.requestllm/route/client.ts→compile()llm/route/auth.ts→Auth.toEffectllm/route/transport/http.ts→jsonRequestPartsllm/route/executor.ts→retryStatusFailuresllm/route/client.ts→streamPrepared2. 请求 Header 明细
通用 Header(所有 provider)
content-typeapplication/jsonprotocols/shared.ts:322→jsonPost()User-Agentopencode/<version>session/llm/request.ts→USER_AGENTx-session-affinitysession/llm/request.tsheaders 块X-Session-IdAnthropic
端点:`(api.anthropic.com/redacted)
x-api-keyapiKey选项 →ANTHROPIC_API_KEYproviders/anthropic.ts:13-17anthropic-version"2023-06-01"(硬编码)protocols/anthropic-messages.ts:852OpenAI
端点:
(api.openai.com/redacted)/chat/completions`authorizationBearer <key>,apiKey→OPENAI_API_KEYroute/auth-options.ts→AuthOptions.bearerOpenAI 兼容(cerebras/deepseek/groq 等)
端点:用户配置
baseURL+/chat/completionsauthorizationBearer <key>providers/openai-compatible.ts→AuthOptions.bearer(input, [])Amazon Bedrock
端点:
(bedrockruntime/redacted)<region>.amazonaws.com/model/<modelId>/converse-streamauthorizationprotocols/utils/bedrock-auth.ts→AwsV4Signerx-amz-datex-amz-security-tokencontent-typeapplication/jsonbedrock-auth.ts:32)Google(Gemini)
端点:`(generativelanguage.googleapis.com/redacted)
x-goog-api-keyapiKey→GOOGLE_GENERATIVE_AI_API_KEYproviders/google.ts:14-18Azure OpenAI
端点:
https://(resource).openai.azure.com/openai/v1/responses?api-version=v1api-keyapiKey→AZURE_OPENAI_API_KEYproviders/azure.ts:65-71;先移除authorizationGitHub Copilot
端点:调用方必须显式传入
baseURLauthorizationBearer (key)providers/github-copilot.ts→AuthOptions.bearer(options, [])路由选择:GPT-5+ 走 Responses API,其余走 Chat API(
shouldUseResponsesApi)OpenRouter
端点:`(openrouter.ai/redacted)
authorizationBearer <key>→OPENROUTER_API_KEYproviders/openrouter.tsxAI(Grok)
端点:`(api.x.ai/redacted)
authorizationBearer (key)→XAI_API_KEYproviders/xai.tsopencode 自有路由专用
x-opencode-projectx-opencode-sessionx-opencode-requestx-opencode-client3. 鉴权机制
凭据解析优先级
核心:
packages/llm/src/route/auth-options.ts→AuthOptions.bearer()ANTHROPIC_API_KEYx-api-keyOPENAI_API_KEYauthorizationauthorizationGOOGLE_GENERATIVE_AI_API_KEYx-goog-api-keyAZURE_OPENAI_API_KEYapi-keyauthorizationOPENROUTER_API_KEYauthorizationXAI_API_KEYauthorizationBedrock SigV4(
protocols/utils/bedrock-auth.ts):使用aws4fetch库对 POST body+URL+headers 整体签名,支持临时凭证(sessionToken)。若配置了apiKey则退化为 Bearer Token。OAuth(OpenAI):
native-runtime.ts中通过自定义fetch函数注入 OAuth access token。4. 关键代码位置索引
packages/llm/src/route/client.tscompile,LLMClient.layerpackages/llm/src/route/executor.tsRequestExecutor,retryStatusFailurespackages/llm/src/route/auth.tsAuth,Credential,bearer,headerpackages/llm/src/route/auth-options.tsAuthOptions.bearerpackages/llm/src/route/transport/http.tshttpJson,jsonRequestPartspackages/llm/src/protocols/anthropic-messages.ts:845routeanthropic-version头)packages/llm/src/protocols/openai-chat.ts:497routepackages/llm/src/protocols/openai-responses.ts:984route,webSocketRoutepackages/llm/src/protocols/bedrock-converse.ts:658route,sigV4Authpackages/llm/src/protocols/gemini.ts:500routepackages/llm/src/protocols/utils/bedrock-auth.tssigV4,signRequestpackages/llm/src/protocols/shared.ts:320jsonPostcontent-type: application/jsonpackages/llm/src/providers/azure.ts:65authapi-keyheader 鉴权packages/llm/src/providers/amazon-bedrock.tsconfiguredRoutepackages/opencode/src/session/llm/request.tsLLMRequestPrep.preparepackages/opencode/src/session/llm/native-request.tsLLMNative.request,modelpackages/opencode/src/session/llm/native-runtime.tsNativeRuntime.streampackages/opencode/src/provider/auth.tsProviderAuth.Service