mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-09-21 01:17:59 +00:00
fix(adapter): send x-opencode-* identity headers so zen stops returning empty tool-call replies
zen fingerprints clients via UA + x-opencode-client/session/request/project headers; requests without them are routed as anonymous and fail with a single-chunk network_error stream (tools+stream) or 503 Endpoint is unavailable (non-stream), which the adapter laundered into empty-but-valid replies. Derive per-request session/request ids from build_headers meta (sandbox has no os/math), bump UA to the real client format, map zen reasoning field to reasoning_content, and set stream_options.include_usage.
This commit is contained in:
@ -115,12 +115,31 @@ func TestOpenCodeAdapterFingerprint(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer vm.Stop()
|
||||
hdrs, err := vm.BuildHeaders("opencode", map[string]interface{}{"api_key": "public"})
|
||||
hdrs, err := vm.BuildHeaders("opencode", map[string]interface{}{
|
||||
"api_key": "public",
|
||||
"timestamp": 1700000000,
|
||||
"body": `{"model":"x"}`,
|
||||
"url": "https://opencode.ai/zen/v1/chat/completions",
|
||||
"method": "POST",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("build headers: %v", err)
|
||||
}
|
||||
if ua := hdrs["User-Agent"]; ua != "opencode/0.1.0" {
|
||||
t.Fatalf("opencode adapter must send the opencode client UA, got %q", ua)
|
||||
// zen 按客户端指纹路由请求池:UA 必须是 opencode 真实格式,
|
||||
// 且必须携带 x-opencode-* 身份头,否则带 tools 的请求会被上游
|
||||
// 判为匿名客户端并返回 network_error 空流(表现为空回复)。
|
||||
if ua := hdrs["User-Agent"]; !strings.HasPrefix(ua, "opencode/") ||
|
||||
!strings.Contains(ua, "ai-sdk/provider-utils/") {
|
||||
t.Fatalf("opencode adapter must send the real opencode client UA, got %q", ua)
|
||||
}
|
||||
for _, h := range []string{"x-opencode-client", "x-opencode-project", "x-opencode-session", "x-opencode-request"} {
|
||||
if hdrs[h] == "" {
|
||||
t.Fatalf("opencode adapter must send %q (zen client fingerprint), got %v", h, hdrs)
|
||||
}
|
||||
}
|
||||
hdrs2, _ := vm.BuildHeaders("opencode", map[string]interface{}{"api_key": "public", "timestamp": 1700000001, "body": `{"model":"y"}`, "method": "POST"})
|
||||
if hdrs["x-opencode-request"] == hdrs2["x-opencode-request"] {
|
||||
t.Fatalf("x-opencode-request must vary per request, got %q twice", hdrs["x-opencode-request"])
|
||||
}
|
||||
if hdrs["Authorization"] != "" {
|
||||
t.Fatalf("opencode adapter must not hardcode Authorization (config api_key supplies it), got %q", hdrs["Authorization"])
|
||||
|
||||
Reference in New Issue
Block a user