fix: 去掉 runtime.GOOS/GOARCH — 服务器是 Linux,真实用户在桌面
Some checks failed
CI / test (push) Failing after 5s
CI / golangci-lint (push) Failing after 5s
Security Scan / backend-security (push) Failing after 6s
Security Scan / frontend-security (push) Failing after 5s

Antigravity:
- UA: 固定 darwin/arm64(不用 runtime),匹配真实 macOS 桌面用户
- x-goog-api-client: 硬编码 go1.27(不用 runtime.Version())
- 环境变量 ANTIGRAVITY_PLATFORM_OS/ARCH 可覆盖

Gemini CLI:
- UA: 固定 darwin/arm64(Node.js process.platform/arch 格式)
- 注意: Node.js 用 x64 不是 amd64,arm64 两者一致
- 环境变量 GEMINI_CLI_PLATFORM_OS/ARCH 可覆盖

删除 runtime 包依赖,所有平台标识改为可配置的硬编码默认值。
This commit is contained in:
win 2026-03-27 13:13:59 +08:00
parent 088a508e60
commit e4697aa421
3 changed files with 41 additions and 9 deletions

View File

@ -12,7 +12,6 @@ import (
"net"
"net/http"
"net/url"
"runtime"
"strings"
"time"
@ -32,9 +31,9 @@ func (e *ForbiddenError) Error() string {
// GetGoogAPIClient 返回 x-goog-api-client 头的值(导出供心跳等外部使用)
// 格式与真实 Antigravity 的 Go SDK 一致: gl-go/{goVersion} gax-go/v2 grpc-go/1.81.0-dev
// 注意: 不使用 runtime.Version() — 服务器编译的 Go 版本 ≠ 真实 Antigravity 的 Go 版本
func GetGoogAPIClient() string {
goVer := runtime.Version() // e.g. "go1.22.0"
return fmt.Sprintf("gl-go/%s gax-go/v2 grpc-go/1.81.0-dev", goVer)
return "gl-go/go1.27 gax-go/v2 grpc-go/1.81.0-dev"
}
// setAntigravityHeaders 设置与真实 Antigravity IDE 一致的 HTTP 请求头

View File

@ -9,7 +9,6 @@ import (
"net/http"
"net/url"
"os"
"runtime"
"strings"
"sync"
"time"
@ -56,6 +55,14 @@ const (
// defaultUserAgentVersion 可通过环境变量 ANTIGRAVITY_USER_AGENT_VERSION 配置,默认 0.2.0(匹配真实 extension 版本)
var defaultUserAgentVersion = "0.2.0"
// defaultPlatformOS 和 defaultPlatformArch 模拟真实客户端的操作系统和架构
// 真实 Antigravity IDE 运行在用户桌面macOS/Windows不是 Linux 服务器
// 可通过环境变量 ANTIGRAVITY_PLATFORM_OS / ANTIGRAVITY_PLATFORM_ARCH 覆盖
var (
defaultPlatformOS = "darwin"
defaultPlatformArch = "arm64"
)
// defaultClientSecret 可通过环境变量 ANTIGRAVITY_OAUTH_CLIENT_SECRET 配置
var defaultClientSecret = "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"
@ -68,13 +75,19 @@ func init() {
if secret := os.Getenv(AntigravityOAuthClientSecretEnv); secret != "" {
defaultClientSecret = secret
}
// 从环境变量读取模拟平台(真实 Antigravity 运行在桌面 OS不是 Linux 服务器)
if p := os.Getenv("ANTIGRAVITY_PLATFORM_OS"); p != "" {
defaultPlatformOS = p
}
if a := os.Getenv("ANTIGRAVITY_PLATFORM_ARCH"); a != "" {
defaultPlatformArch = a
}
}
// GetUserAgent 返回当前配置的 User-Agent匹配真实 Antigravity 格式: antigravity/{version} {os}/{arch}
// 注意: 不使用 runtime.GOOS/GOARCH — 服务器是 Linux但真实用户在 macOS/Windows 桌面
func GetUserAgent() string {
osName := runtime.GOOS // darwin, linux, windows
arch := runtime.GOARCH // arm64, amd64
return fmt.Sprintf("antigravity/%s %s/%s", defaultUserAgentVersion, osName, arch)
return fmt.Sprintf("antigravity/%s %s/%s", defaultUserAgentVersion, defaultPlatformOS, defaultPlatformArch)
}
func getClientSecret() (string, error) {

View File

@ -4,7 +4,6 @@ package geminicli
import (
"fmt"
"os"
"runtime"
"time"
)
@ -62,27 +61,48 @@ const (
// GoogleAuthLibraryUA 模拟 google-auth-library 的 User-Agent
// 真实 Gemini CLI token exchange 由 google-auth-library 发起
GoogleAuthLibraryUA = "google-api-nodejs-client"
// FakePlatformOS 和 FakePlatformArch 模拟真实客户端的操作系统和架构
// 真实 Gemini CLI 运行在用户桌面,不是 Linux 服务器
// Node.js process.platform: darwin, linux, win32
// Node.js process.arch: arm64, x64 (注意: Node.js 用 x64不是 amd64)
FakePlatformOS = "darwin"
FakePlatformArch = "arm64"
)
// defaultGeminiCLIVersion 可通过环境变量 GEMINI_CLI_VERSION 覆盖
var defaultGeminiCLIVersion = "0.33.1"
// defaultFakePlatformOS/Arch 可通过环境变量覆盖
var (
defaultFakePlatformOS = FakePlatformOS
defaultFakePlatformArch = FakePlatformArch
)
func init() {
if v := os.Getenv("GEMINI_CLI_VERSION"); v != "" {
defaultGeminiCLIVersion = v
}
if p := os.Getenv("GEMINI_CLI_PLATFORM_OS"); p != "" {
defaultFakePlatformOS = p
}
if a := os.Getenv("GEMINI_CLI_PLATFORM_ARCH"); a != "" {
defaultFakePlatformArch = a
}
}
// GetGeminiCLIUserAgent 返回匹配真实 Gemini CLI 格式的 User-Agent
// 真实格式: GeminiCLI/{version}/{model} ({platform}; {arch})
// 示例: GeminiCLI/0.33.1/gemini-2.5-pro (darwin; arm64)
// 注意: 不使用 runtime.GOOS/GOARCH — 服务器是 Linux但要模拟桌面客户端
// 注意: Node.js 用 x64 不是 amd64arm64 两者一致
func GetGeminiCLIUserAgent(model ...string) string {
m := "unknown"
if len(model) > 0 && model[0] != "" {
m = model[0]
}
return fmt.Sprintf("GeminiCLI/%s/%s (%s; %s)",
defaultGeminiCLIVersion, m, runtime.GOOS, runtime.GOARCH)
defaultGeminiCLIVersion, m, defaultFakePlatformOS, defaultFakePlatformArch)
}
// GetGeminiCLIGoogAPIClient 返回 x-goog-api-client 头的值