2026-02-20 02:44:29 -05:00
import { platform , arch } from "os" ;
2026-03-03 02:46:05 -05:00
function mapStainlessOs ( ) {
switch ( platform ( ) ) {
case "darwin" : return "MacOS" ;
case "win32" : return "Windows" ;
case "linux" : return "Linux" ;
case "freebsd" : return "FreeBSD" ;
default : return ` Other:: ${ platform ( ) } ` ;
}
}
function mapStainlessArch ( ) {
switch ( arch ( ) ) {
case "x64" : return "x64" ;
case "arm64" : return "arm64" ;
case "ia32" : return "x86" ;
default : return ` other:: ${ arch ( ) } ` ;
}
}
2026-03-10 05:16:12 -04:00
// === Gemini CLI Version Constants ===
export const GEMINI _CLI _VERSION = "0.31.0" ;
export const GEMINI _CLI _API _CLIENT = "google-genai-sdk/1.41.0 gl-node/v22.19.0" ;
function mapGeminiCLIOs ( ) {
switch ( platform ( ) ) {
case "darwin" : return "darwin" ;
case "win32" : return "windows" ;
case "linux" : return "linux" ;
case "freebsd" : return "freebsd" ;
default : return platform ( ) ;
}
}
function mapGeminiCLIArch ( ) {
switch ( arch ( ) ) {
case "x64" : return "x64" ;
case "arm64" : return "arm64" ;
case "ia32" : return "x86" ;
default : return arch ( ) ;
}
}
/** Returns User-Agent matching native Gemini CLI format: GeminiCLI/<version>/<model> (<os>; <arch>) */
export function geminiCLIUserAgent ( model = "unknown" ) {
return ` GeminiCLI/ ${ GEMINI _CLI _VERSION } / ${ model || "unknown" } ( ${ mapGeminiCLIOs ( ) } ; ${ mapGeminiCLIArch ( ) } ) ` ;
}
2026-02-24 23:40:50 -05:00
// === GitHub Copilot Version Constants ===
export const GITHUB _COPILOT = {
VSCODE _VERSION : "1.110.0" ,
COPILOT _CHAT _VERSION : "0.38.0" ,
USER _AGENT : "GitHubCopilotChat/0.38.0" ,
API _VERSION : "2025-04-01" ,
} ;
2026-02-20 02:44:29 -05:00
// === Antigravity Binary Alignment: Numeric Enums ===
// Reference: Antigravity binary analysis - google.internal.cloud.code.v1internal.ClientMetadata
// IDE Type enum (numeric values as expected by Cloud Code API)
export const IDE _TYPE = {
UNSPECIFIED : 0 ,
JETSKI : 10 , // Internal codename for Gemini CLI
ANTIGRAVITY : 9 ,
PLUGINS : 7
} ;
// Platform enum (as specified in Antigravity binary)
export const PLATFORM = {
UNSPECIFIED : 0 ,
DARWIN _AMD64 : 1 ,
DARWIN _ARM64 : 2 ,
LINUX _AMD64 : 3 ,
LINUX _ARM64 : 4 ,
WINDOWS _AMD64 : 5
} ;
// Plugin type enum (as specified in Antigravity binary)
export const PLUGIN _TYPE = {
UNSPECIFIED : 0 ,
CLOUD _CODE : 1 ,
GEMINI : 2
} ;
/ * *
* Get the platform enum value based on the current OS .
* @ returns { number } Platform enum value
* /
export function getPlatformEnum ( ) {
const os = platform ( ) ;
const architecture = arch ( ) ;
if ( os === "darwin" ) {
return architecture === "arm64" ? PLATFORM . DARWIN _ARM64 : PLATFORM . DARWIN _AMD64 ;
} else if ( os === "linux" ) {
return architecture === "arm64" ? PLATFORM . LINUX _ARM64 : PLATFORM . LINUX _AMD64 ;
} else if ( os === "win32" ) {
return PLATFORM . WINDOWS _AMD64 ;
}
return PLATFORM . UNSPECIFIED ;
}
/ * *
* Generate platform - specific User - Agent string .
* @ returns { string } User - Agent in format "antigravity/version os/arch"
* /
export function getPlatformUserAgent ( ) {
const os = platform ( ) ;
const architecture = arch ( ) ;
2026-02-24 23:40:50 -05:00
return ` antigravity/1.104.0 ${ os } / ${ architecture } ` ;
2026-02-20 02:44:29 -05:00
}
// Centralized client metadata (used in request bodies for loadCodeAssist, onboardUser, etc.)
// Using numeric enum values as expected by the Cloud Code API
export const CLIENT _METADATA = {
ideType : IDE _TYPE . ANTIGRAVITY , // 9 - identifies as Antigravity client
platform : getPlatformEnum ( ) , // Runtime platform detection
pluginType : PLUGIN _TYPE . GEMINI // 2
} ;
// Internal anti-loop header to identify requests originating from this proxy
export const INTERNAL _REQUEST _HEADER = { name : "x-request-source" , value : "local" } ;
2026-03-03 04:01:10 -05:00
// Antigravity headers (for chat/stream requests)
2026-02-20 02:44:29 -05:00
export const ANTIGRAVITY _HEADERS = {
"X-Client-Name" : "antigravity" ,
"X-Client-Version" : "1.107.0" ,
2026-02-24 23:40:50 -05:00
"x-goog-api-client" : "gl-node/18.18.2 fire/0.8.6 grpc/1.10.x" ,
"User-Agent" : "antigravity/1.107.0 darwin/arm64"
2026-02-20 02:44:29 -05:00
} ;
2026-02-21 11:15:18 -05:00
// Cloud Code Assist API endpoints (for Project ID discovery)
export const CLOUD _CODE _API = {
loadCodeAssist : "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist" ,
onboardUser : "https://cloudcode-pa.googleapis.com/v1internal:onboardUser" ,
} ;
2026-03-03 04:01:10 -05:00
// Headers for loadCodeAssist / onboardUser API calls (matches CLIProxyAPI Go source)
export const LOAD _CODE _ASSIST _HEADERS = {
"Content-Type" : "application/json" ,
"User-Agent" : "google-api-nodejs-client/9.15.1" ,
"X-Goog-Api-Client" : "google-cloud-sdk vscode_cloudshelleditor/0.1" ,
"Client-Metadata" : JSON . stringify ( { ideType : "IDE_UNSPECIFIED" , platform : "PLATFORM_UNSPECIFIED" , pluginType : "GEMINI" } ) ,
} ;
// Metadata body for loadCodeAssist / onboardUser (string enum, matches CLIProxyAPI Go source)
export const LOAD _CODE _ASSIST _METADATA = {
ideType : "IDE_UNSPECIFIED" ,
platform : "PLATFORM_UNSPECIFIED" ,
pluginType : "GEMINI" ,
} ;
2026-01-04 22:37:09 -05:00
// Provider configurations
export const PROVIDERS = {
claude : {
baseUrl : "https://api.anthropic.com/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
2026-03-03 02:46:05 -05:00
"Anthropic-Beta" : "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05" ,
2026-01-04 22:37:09 -05:00
"Anthropic-Dangerous-Direct-Browser-Access" : "true" ,
2026-03-03 02:46:05 -05:00
"User-Agent" : "claude-cli/2.1.63 (external, cli)" ,
2026-01-04 22:37:09 -05:00
"X-App" : "cli" ,
"X-Stainless-Helper-Method" : "stream" ,
"X-Stainless-Retry-Count" : "0" ,
"X-Stainless-Runtime-Version" : "v24.3.0" ,
2026-03-03 02:46:05 -05:00
"X-Stainless-Package-Version" : "0.74.0" ,
2026-01-04 22:37:09 -05:00
"X-Stainless-Runtime" : "node" ,
"X-Stainless-Lang" : "js" ,
2026-03-03 02:46:05 -05:00
"X-Stainless-Arch" : mapStainlessArch ( ) ,
"X-Stainless-Os" : mapStainlessOs ( ) ,
"X-Stainless-Timeout" : "600"
2026-01-04 22:37:09 -05:00
} ,
// Claude OAuth configuration
clientId : "9d1c250a-e61b-44d9-88ed-5944d1962f5e" ,
2026-03-03 02:46:05 -05:00
tokenUrl : "https://api.anthropic.com/v1/oauth/token"
2026-01-04 22:37:09 -05:00
} ,
gemini : {
baseUrl : "https://generativelanguage.googleapis.com/v1beta/models" ,
format : "gemini" ,
clientId : "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com" ,
clientSecret : "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"
} ,
"gemini-cli" : {
baseUrl : "https://cloudcode-pa.googleapis.com/v1internal" ,
format : "gemini-cli" ,
clientId : "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com" ,
clientSecret : "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"
} ,
codex : {
baseUrl : "https://chatgpt.com/backend-api/codex/responses" ,
2026-01-15 06:29:47 -05:00
format : "openai-responses" , // Use OpenAI Responses API format (reuse translator)
2026-01-04 22:37:09 -05:00
headers : {
2026-02-12 06:12:17 -05:00
"originator" : "codex-cli" ,
"User-Agent" : "codex-cli/1.0.18 (macOS; arm64)"
2026-01-04 22:37:09 -05:00
} ,
// OpenAI OAuth configuration
clientId : "app_EMoamEEZ73f0CkXaXp7hrann" ,
clientSecret : "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" ,
tokenUrl : "https://auth.openai.com/oauth/token"
} ,
qwen : {
baseUrl : "https://portal.qwen.ai/v1/chat/completions" ,
format : "openai" ,
headers : {
"User-Agent" : "google-api-nodejs-client/9.15.1" ,
"X-Goog-Api-Client" : "gl-node/22.17.0"
} ,
// Qwen OAuth configuration
clientId : "f0304373b74a44d2b584a3fb70ca9e56" , // From CLIProxyAPI
tokenUrl : "https://chat.qwen.ai/api/v1/oauth2/token" ,
authUrl : "https://chat.qwen.ai/api/v1/oauth2/device/code"
} ,
iflow : {
baseUrl : "https://apis.iflow.cn/v1/chat/completions" ,
format : "openai" ,
headers : {
"User-Agent" : "iFlow-Cli"
} ,
// iFlow OAuth configuration (from CLIProxyAPI)
clientId : "10009311001" ,
clientSecret : "4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW" ,
tokenUrl : "https://iflow.cn/oauth/token" ,
authUrl : "https://iflow.cn/oauth"
} ,
antigravity : {
baseUrls : [
2026-02-26 21:17:49 -05:00
"https://daily-cloudcode-pa.googleapis.com" ,
2026-01-12 03:08:31 -05:00
"https://cloudcode-pa.googleapis.com" ,
2026-01-04 22:37:09 -05:00
] ,
format : "antigravity" ,
headers : {
2026-02-20 02:44:29 -05:00
"User-Agent" : getPlatformUserAgent ( )
2026-01-04 22:37:09 -05:00
} ,
clientId : "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com" ,
clientSecret : "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"
} ,
openrouter : {
baseUrl : "https://openrouter.ai/api/v1/chat/completions" ,
format : "openai" ,
headers : {
"HTTP-Referer" : "https://endpoint-proxy.local" ,
"X-Title" : "Endpoint Proxy"
}
} ,
openai : {
baseUrl : "https://api.openai.com/v1/chat/completions" ,
format : "openai"
} ,
glm : {
baseUrl : "https://api.z.ai/api/anthropic/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
"Anthropic-Beta" : "claude-code-20250219,interleaved-thinking-2025-05-14"
}
} ,
2026-02-08 22:31:38 -05:00
"glm-cn" : {
baseUrl : "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions" ,
format : "openai" ,
headers : { }
} ,
2026-01-04 22:37:09 -05:00
kimi : {
baseUrl : "https://api.kimi.com/coding/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
"Anthropic-Beta" : "claude-code-20250219,interleaved-thinking-2025-05-14"
}
} ,
minimax : {
baseUrl : "https://api.minimax.io/anthropic/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
"Anthropic-Beta" : "claude-code-20250219,interleaved-thinking-2025-05-14"
}
} ,
2026-02-06 03:10:57 -05:00
"minimax-cn" : {
baseUrl : "https://api.minimaxi.com/anthropic/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
"Anthropic-Beta" : "claude-code-20250219,interleaved-thinking-2025-05-14"
}
} ,
2026-02-26 21:33:14 -05:00
alicode : {
baseUrl : "https://coding.dashscope.aliyuncs.com/v1/chat/completions" ,
format : "openai" ,
2026-03-06 22:08:55 -05:00
headers : { }
} ,
"alicode-intl" : {
baseUrl : "https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions" ,
format : "openai" ,
2026-02-26 21:33:14 -05:00
headers : { }
} ,
2026-01-04 22:37:09 -05:00
github : {
baseUrl : "https://api.githubcopilot.com/chat/completions" , // GitHub Copilot API endpoint for chat
2026-02-14 19:40:55 -05:00
responsesUrl : "https://api.githubcopilot.com/responses" ,
2026-01-04 22:37:09 -05:00
format : "openai" , // GitHub Copilot uses OpenAI-compatible format
headers : {
"copilot-integration-id" : "vscode-chat" ,
2026-02-24 23:40:50 -05:00
"editor-version" : ` vscode/ ${ GITHUB _COPILOT . VSCODE _VERSION } ` ,
"editor-plugin-version" : ` copilot-chat/ ${ GITHUB _COPILOT . COPILOT _CHAT _VERSION } ` ,
"user-agent" : GITHUB _COPILOT . USER _AGENT ,
2026-01-04 22:37:09 -05:00
"openai-intent" : "conversation-panel" ,
2026-02-24 23:40:50 -05:00
"x-github-api-version" : GITHUB _COPILOT . API _VERSION ,
2026-01-04 22:37:09 -05:00
"x-vscode-user-agent-library-version" : "electron-fetch" ,
"X-Initiator" : "user" ,
"Accept" : "application/json" ,
"Content-Type" : "application/json"
}
2026-01-15 06:29:47 -05:00
} ,
kiro : {
baseUrl : "https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse" ,
format : "kiro" ,
headers : {
"Content-Type" : "application/json" ,
"Accept" : "application/vnd.amazon.eventstream" ,
"X-Amz-Target" : "AmazonCodeWhispererStreamingService.GenerateAssistantResponse" ,
"User-Agent" : "AWS-SDK-JS/3.0.0 kiro-ide/1.0.0" ,
"X-Amz-User-Agent" : "aws-sdk-js/3.0.0 kiro-ide/1.0.0"
} ,
// Kiro OAuth endpoints
tokenUrl : "https://prod.us-east-1.auth.desktop.kiro.dev/refreshToken" ,
authUrl : "https://prod.us-east-1.auth.desktop.kiro.dev"
2026-02-04 00:07:29 -05:00
} ,
cursor : {
baseUrl : "https://api2.cursor.sh" ,
chatPath : "/aiserver.v1.ChatService/StreamUnifiedChatWithTools" ,
format : "cursor" ,
headers : {
"connect-accept-encoding" : "gzip" ,
"connect-protocol-version" : "1" ,
"Content-Type" : "application/connect+proto" ,
"User-Agent" : "connect-es/1.6.1"
} ,
clientVersion : "1.1.3"
2026-02-20 05:05:46 -05:00
} ,
"kimi-coding" : {
baseUrl : "https://api.kimi.com/coding/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
"Anthropic-Beta" : "claude-code-20250219,interleaved-thinking-2025-05-14"
} ,
clientId : "17e5f671-d194-4dfb-9706-5516cb48c098" ,
tokenUrl : "https://auth.kimi.com/api/oauth/token" ,
refreshUrl : "https://auth.kimi.com/api/oauth/token"
} ,
kilocode : {
baseUrl : "https://api.kilo.ai/api/openrouter/chat/completions" ,
2026-02-27 23:30:21 -05:00
format : "openai" ,
2026-02-20 05:05:46 -05:00
headers : { }
} ,
cline : {
2026-02-27 23:30:21 -05:00
baseUrl : "https://api.cline.bot/api/v1/chat/completions" ,
format : "openai" ,
2026-02-20 05:05:46 -05:00
headers : {
"HTTP-Referer" : "https://cline.bot" ,
2026-02-27 23:30:21 -05:00
"X-Title" : "Cline"
2026-02-20 05:05:46 -05:00
} ,
tokenUrl : "https://api.cline.bot/api/v1/auth/token" ,
refreshUrl : "https://api.cline.bot/api/v1/auth/refresh"
2026-02-24 23:40:50 -05:00
} ,
nvidia : {
baseUrl : "https://integrate.api.nvidia.com/v1/chat/completions" ,
format : "openai"
} ,
anthropic : {
baseUrl : "https://api.anthropic.com/v1/messages" ,
format : "claude" ,
headers : {
"Anthropic-Version" : "2023-06-01" ,
"Anthropic-Beta" : "claude-code-20250219,interleaved-thinking-2025-05-14"
}
} ,
deepseek : {
baseUrl : "https://api.deepseek.com/chat/completions" ,
format : "openai"
} ,
groq : {
baseUrl : "https://api.groq.com/openai/v1/chat/completions" ,
format : "openai"
} ,
xai : {
baseUrl : "https://api.x.ai/v1/chat/completions" ,
format : "openai"
} ,
mistral : {
baseUrl : "https://api.mistral.ai/v1/chat/completions" ,
format : "openai"
} ,
perplexity : {
baseUrl : "https://api.perplexity.ai/chat/completions" ,
format : "openai"
} ,
together : {
baseUrl : "https://api.together.xyz/v1/chat/completions" ,
format : "openai"
} ,
fireworks : {
baseUrl : "https://api.fireworks.ai/inference/v1/chat/completions" ,
format : "openai"
} ,
cerebras : {
baseUrl : "https://api.cerebras.ai/v1/chat/completions" ,
format : "openai"
} ,
cohere : {
baseUrl : "https://api.cohere.ai/v1/chat/completions" ,
format : "openai"
} ,
nebius : {
baseUrl : "https://api.studio.nebius.ai/v1/chat/completions" ,
format : "openai"
} ,
siliconflow : {
baseUrl : "https://api.siliconflow.cn/v1/chat/completions" ,
format : "openai"
} ,
hyperbolic : {
baseUrl : "https://api.hyperbolic.xyz/v1/chat/completions" ,
format : "openai"
} ,
deepgram : {
baseUrl : "https://api.deepgram.com/v1/listen" ,
format : "openai"
} ,
assemblyai : {
baseUrl : "https://api.assemblyai.com/v1/audio/transcriptions" ,
format : "openai"
} ,
nanobanana : {
baseUrl : "https://api.nanobananaapi.ai/v1/chat/completions" ,
format : "openai"
} ,
chutes : {
baseUrl : "https://llm.chutes.ai/v1/chat/completions" ,
format : "openai"
2026-03-12 04:24:10 -04:00
} ,
ollama : {
baseUrl : "https://ollama.com/api/chat" ,
format : "ollama"
} ,
2026-01-04 22:37:09 -05:00
} ;
2026-01-12 03:08:31 -05:00
// Claude system prompt
2026-03-03 02:46:05 -05:00
export const CLAUDE _SYSTEM _PROMPT = "You are a Claude agent, built on Anthropic's Claude Agent SDK." ;
2026-01-12 03:08:31 -05:00
// Antigravity default system prompt (required for API to work)
2026-02-20 02:44:29 -05:00
export const ANTIGRAVITY _DEFAULT _SYSTEM = "You are Antigravity, a powerful agentic AI coding assistant designed by the Google Deepmind team working on Advanced Agentic Coding.You are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.**Absolute paths only****Proactiveness**" ;
2026-01-04 22:37:09 -05:00
// OAuth endpoints
export const OAUTH _ENDPOINTS = {
google : {
token : "https://oauth2.googleapis.com/token" ,
auth : "https://accounts.google.com/o/oauth2/auth"
} ,
openai : {
token : "https://auth.openai.com/oauth/token" ,
auth : "https://auth.openai.com/oauth/authorize"
} ,
anthropic : {
2026-03-03 02:46:05 -05:00
token : "https://api.anthropic.com/v1/oauth/token" ,
auth : "https://api.anthropic.com/v1/oauth/authorize"
2026-01-04 22:37:09 -05:00
} ,
qwen : {
token : "https://chat.qwen.ai/api/v1/oauth2/token" , // From CLIProxyAPI
auth : "https://chat.qwen.ai/api/v1/oauth2/device/code" // From CLIProxyAPI
} ,
iflow : {
token : "https://iflow.cn/oauth/token" ,
auth : "https://iflow.cn/oauth"
} ,
github : {
token : "https://github.com/login/oauth/access_token" ,
auth : "https://github.com/login/oauth/authorize" ,
deviceCode : "https://github.com/login/device/code"
}
} ;
// Cache TTLs (seconds)
export const CACHE _TTL = {
userInfo : 300 , // 5 minutes
modelAlias : 3600 // 1 hour
} ;
// Default max tokens
export const DEFAULT _MAX _TOKENS = 64000 ;
// Minimum max tokens for tool calling (to prevent truncated arguments)
export const DEFAULT _MIN _TOKENS = 32000 ;
2026-03-09 06:36:16 -04:00
// Retry config for 429 responses (used by BaseExecutor)
export const RETRY _CONFIG = {
maxAttempts : 2 ,
delayMs : 2000
} ;
2026-02-06 23:17:06 -05:00
// HTTP status codes
export const HTTP _STATUS = {
BAD _REQUEST : 400 ,
UNAUTHORIZED : 401 ,
PAYMENT _REQUIRED : 402 ,
FORBIDDEN : 403 ,
NOT _FOUND : 404 ,
NOT _ACCEPTABLE : 406 ,
REQUEST _TIMEOUT : 408 ,
RATE _LIMITED : 429 ,
SERVER _ERROR : 500 ,
BAD _GATEWAY : 502 ,
SERVICE _UNAVAILABLE : 503 ,
GATEWAY _TIMEOUT : 504
} ;
// OpenAI-compatible error types mapping
export const ERROR _TYPES = {
[ HTTP _STATUS . BAD _REQUEST ] : { type : "invalid_request_error" , code : "bad_request" } ,
[ HTTP _STATUS . UNAUTHORIZED ] : { type : "authentication_error" , code : "invalid_api_key" } ,
[ HTTP _STATUS . FORBIDDEN ] : { type : "permission_error" , code : "insufficient_quota" } ,
[ HTTP _STATUS . NOT _FOUND ] : { type : "invalid_request_error" , code : "model_not_found" } ,
2026-02-10 07:18:40 -05:00
[ HTTP _STATUS . NOT _ACCEPTABLE ] : { type : "invalid_request_error" , code : "model_not_supported" } ,
2026-02-06 23:17:06 -05:00
[ HTTP _STATUS . RATE _LIMITED ] : { type : "rate_limit_error" , code : "rate_limit_exceeded" } ,
[ HTTP _STATUS . SERVER _ERROR ] : { type : "server_error" , code : "internal_server_error" } ,
[ HTTP _STATUS . BAD _GATEWAY ] : { type : "server_error" , code : "bad_gateway" } ,
[ HTTP _STATUS . SERVICE _UNAVAILABLE ] : { type : "server_error" , code : "service_unavailable" } ,
[ HTTP _STATUS . GATEWAY _TIMEOUT ] : { type : "server_error" , code : "gateway_timeout" }
} ;
// Default error messages per status code
export const DEFAULT _ERROR _MESSAGES = {
[ HTTP _STATUS . BAD _REQUEST ] : "Bad request" ,
[ HTTP _STATUS . UNAUTHORIZED ] : "Invalid API key provided" ,
[ HTTP _STATUS . FORBIDDEN ] : "You exceeded your current quota" ,
[ HTTP _STATUS . NOT _FOUND ] : "Model not found" ,
2026-02-10 07:18:40 -05:00
[ HTTP _STATUS . NOT _ACCEPTABLE ] : "Model not supported" ,
2026-02-06 23:17:06 -05:00
[ HTTP _STATUS . RATE _LIMITED ] : "Rate limit exceeded" ,
[ HTTP _STATUS . SERVER _ERROR ] : "Internal server error" ,
[ HTTP _STATUS . BAD _GATEWAY ] : "Bad gateway - upstream provider error" ,
[ HTTP _STATUS . SERVICE _UNAVAILABLE ] : "Service temporarily unavailable" ,
[ HTTP _STATUS . GATEWAY _TIMEOUT ] : "Gateway timeout"
} ;
2026-01-04 22:37:09 -05:00
// Exponential backoff config for rate limits (like CLIProxyAPI)
export const BACKOFF _CONFIG = {
base : 1000 , // 1 second base
2026-01-14 02:55:47 -05:00
max : 2 * 60 * 1000 , // 2 minutes max
2026-01-04 22:37:09 -05:00
maxLevel : 15 // Cap backoff level
} ;
// Error-based cooldown times (aligned with CLIProxyAPI)
export const COOLDOWN _MS = {
2026-01-14 02:55:47 -05:00
unauthorized : 2 * 60 * 1000 , // 401 → 30 min
paymentRequired : 2 * 60 * 1000 , // 402/403 → 30 min
2026-02-05 23:23:08 -05:00
notFound : 2 * 60 * 1000 , // 404 → 2 minutes
2026-01-04 22:37:09 -05:00
transient : 30 * 1000 , // 408/500/502/503/504 → 1 min
requestNotAllowed : 5 * 1000 , // "Request not allowed" → 5 sec
// Legacy aliases for backward compatibility
2026-01-14 02:55:47 -05:00
rateLimit : 2 * 60 * 1000 ,
serviceUnavailable : 2 * 1000 ,
authExpired : 2 * 60 * 1000
2026-01-04 22:37:09 -05:00
} ;
// Skip patterns - requests containing these texts will bypass provider
export const SKIP _PATTERNS = [
"Please write a 5-10 word title for the following conversation:"
] ;
2026-03-11 23:48:11 -04:00
// Generate Kimi OAuth custom headers
export function buildKimiHeaders ( ) {
const deviceId = ` kimi- ${ Date . now ( ) } ` ;
const platform = "9router" ;
const version = "2.1.2" ;
const deviceModel = typeof process !== "undefined" ? ` ${ process . platform } ${ process . arch } ` : "unknown" ;
return {
"X-Msh-Platform" : platform ,
"X-Msh-Version" : version ,
"X-Msh-Device-Model" : deviceModel ,
"X-Msh-Device-Id" : deviceId
} ;
}