fix(grok-cli): send Grok CLI 1.0.44 so proxy stops returning HTTP 426

This commit is contained in:
Noval Arya Saputra authored and decolua committed 2026-10-01 09:57:54 +07:00
1 parent b3cf3fdef0
commit 6b9dc54dd2
8 files changed
+19 -14

No files matched your search

+4 -1
View File
@@ -1,8 +1,11 @@
export const GROK_CLI_VERSION = "0.2.99"; // cli-chat-proxy rejects older identities with HTTP 426. Keep this on a
// current @xai-official/grok release (1.0.44 as of 2026-10-01; minimum 1.0.13).
export const GROK_CLI_VERSION = "1.0.44";
export const GROK_CLI_MODEL = "grok-build"; export const GROK_CLI_MODEL = "grok-build";
export const GROK_CLI_BASE_URL = "https://cli-chat-proxy.grok.com/v1"; export const GROK_CLI_BASE_URL = "https://cli-chat-proxy.grok.com/v1";
export const GROK_CLI_CLIENT_IDENTIFIER = "grok-shell"; export const GROK_CLI_CLIENT_IDENTIFIER = "grok-shell";
export const GROK_CLI_USER_AGENT = `grok-shell/${GROK_CLI_VERSION} (linux; x86_64)`; export const GROK_CLI_USER_AGENT = `grok-shell/${GROK_CLI_VERSION} (linux; x86_64)`;
export const GROK_CLI_PAGER_USER_AGENT = `grok-pager/${GROK_CLI_VERSION} grok-shell/${GROK_CLI_VERSION} (linux; x86_64)`;
export function supportsGrokCliReasoningEffort(model) { export function supportsGrokCliReasoningEffort(model) {
// ponytail: unknown models omit effort until live metadata reaches dispatch. // ponytail: unknown models omit effort until live metadata reaches dispatch.
+1 -1
View File
@@ -1,7 +1,7 @@
/** /**
* Grok CLI / Grok Build (cli-chat-proxy.grok.com) * Grok CLI / Grok Build (cli-chat-proxy.grok.com)
* *
* Source of truth: wire capture of official @xai-official/grok 0.2.99 * Source of truth: wire capture of official @xai-official/grok 1.0.44
* talking to https://cli-chat-proxy.grok.com (OpenAI Responses API). * talking to https://cli-chat-proxy.grok.com (OpenAI Responses API).
* *
* Distinct from: * Distinct from:
+3 -2
View File
@@ -5,6 +5,7 @@ import { isOpenAICompatibleProvider, isAnthropicCompatibleProvider } from "@/sha
import { getDefaultModel } from "open-sse/config/providerModels.js"; import { getDefaultModel } from "open-sse/config/providerModels.js";
import { resolveOllamaLocalHost, PROVIDERS } from "open-sse/config/providers.js"; import { resolveOllamaLocalHost, PROVIDERS } from "open-sse/config/providers.js";
import { CODEX_CLI_VERSION } from "open-sse/config/appConstants.js"; import { CODEX_CLI_VERSION } from "open-sse/config/appConstants.js";
import { GROK_CLI_PAGER_USER_AGENT, GROK_CLI_VERSION } from "open-sse/config/grokCli.js";
import { import {
refreshProviderCredentials, refreshProviderCredentials,
shouldRefreshCredentials, shouldRefreshCredentials,
@@ -123,10 +124,10 @@ const OAUTH_TEST_CONFIG = {
extraHeaders: { extraHeaders: {
Accept: "application/json", Accept: "application/json",
...(PROVIDERS["grok-cli"]?.headers || { ...(PROVIDERS["grok-cli"]?.headers || {
"User-Agent": "grok-pager/0.2.93 grok-shell/0.2.93 (linux; x86_64)", "User-Agent": GROK_CLI_PAGER_USER_AGENT,
"x-xai-token-auth": "xai-grok-cli", "x-xai-token-auth": "xai-grok-cli",
"x-grok-client-identifier": "grok-pager", "x-grok-client-identifier": "grok-pager",
"x-grok-client-version": "0.2.93", "x-grok-client-version": GROK_CLI_VERSION,
}), }),
}, },
refreshable: true, refreshable: true,
+5 -4
View File
@@ -1,3 +1,4 @@
import { GROK_CLI_PAGER_USER_AGENT, GROK_CLI_VERSION } from "open-sse/config/grokCli.js";
import { GROK_CLI_CONFIG } from "../constants/oauth.js"; import { GROK_CLI_CONFIG } from "../constants/oauth.js";
import { decodeXaiIdTokenEmail, extractEmailFromAccessToken } from "../providerHelpers.js"; import { decodeXaiIdTokenEmail, extractEmailFromAccessToken } from "../providerHelpers.js";
@@ -18,7 +19,7 @@ const grokCli = {
headers: { headers: {
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json", Accept: "application/json",
"User-Agent": "grok-pager/0.2.93 grok-shell/0.2.93 (linux; x86_64)", "User-Agent": GROK_CLI_PAGER_USER_AGENT,
}, },
body, body,
}); });
@@ -36,7 +37,7 @@ const grokCli = {
headers: { headers: {
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json", Accept: "application/json",
"User-Agent": "grok-pager/0.2.93 grok-shell/0.2.93 (linux; x86_64)", "User-Agent": GROK_CLI_PAGER_USER_AGENT,
}, },
body: new URLSearchParams({ body: new URLSearchParams({
grant_type: "urn:ietf:params:oauth:grant-type:device_code", grant_type: "urn:ietf:params:oauth:grant-type:device_code",
@@ -69,9 +70,9 @@ const grokCli = {
headers: { headers: {
Authorization: `Bearer ${tokens.access_token}`, Authorization: `Bearer ${tokens.access_token}`,
Accept: "application/json", Accept: "application/json",
"User-Agent": "grok-pager/0.2.93 grok-shell/0.2.93 (linux; x86_64)", "User-Agent": GROK_CLI_PAGER_USER_AGENT,
"x-xai-token-auth": "xai-grok-cli", "x-xai-token-auth": "xai-grok-cli",
"x-grok-client-version": "0.2.93", "x-grok-client-version": GROK_CLI_VERSION,
}, },
}); });
if (res.ok) return { user: await res.json() }; if (res.ok) return { user: await res.json() };
+3 -3
View File
@@ -417,13 +417,13 @@
"modelsUrl": "https://cli-chat-proxy.grok.com/v1/models", "modelsUrl": "https://cli-chat-proxy.grok.com/v1/models",
"userUrl": "https://cli-chat-proxy.grok.com/v1/user", "userUrl": "https://cli-chat-proxy.grok.com/v1/user",
"billingUrl": "https://cli-chat-proxy.grok.com/v1/billing", "billingUrl": "https://cli-chat-proxy.grok.com/v1/billing",
"clientVersion": "0.2.99", "clientVersion": "1.0.44",
"clientIdentifier": "grok-shell", "clientIdentifier": "grok-shell",
"tokenAuth": "xai-grok-cli", "tokenAuth": "xai-grok-cli",
"headers": { "headers": {
"User-Agent": "grok-shell/0.2.99 (linux; x86_64)", "User-Agent": "grok-shell/1.0.44 (linux; x86_64)",
"x-grok-client-identifier": "grok-shell", "x-grok-client-identifier": "grok-shell",
"x-grok-client-version": "0.2.99" "x-grok-client-version": "1.0.44"
}, },
"usage": { "usage": {
"url": "https://cli-chat-proxy.grok.com/v1/billing?format=credits", "url": "https://cli-chat-proxy.grok.com/v1/billing?format=credits",
+1 -1
View File
@@ -98,7 +98,7 @@ describe("GrokCliExecutor", () => {
expect(headers.Accept).toBe("text/event-stream"); expect(headers.Accept).toBe("text/event-stream");
expect(headers["x-xai-token-auth"]).toBeUndefined(); expect(headers["x-xai-token-auth"]).toBeUndefined();
expect(headers["x-grok-client-identifier"]).toBe("grok-shell"); expect(headers["x-grok-client-identifier"]).toBe("grok-shell");
expect(headers["x-grok-client-version"]).toBe("0.2.99"); expect(headers["x-grok-client-version"]).toBe("1.0.44");
expect(headers["x-grok-session-id"]).toBe("sess-abc"); expect(headers["x-grok-session-id"]).toBe("sess-abc");
expect(headers["x-grok-conv-id"]).toBe("sess-abc"); expect(headers["x-grok-conv-id"]).toBe("sess-abc");
expect(headers["x-grok-req-id"]).toBe("req-xyz"); expect(headers["x-grok-req-id"]).toBe("req-xyz");
+1 -1
View File
@@ -75,6 +75,6 @@ describe("Grok CLI live models", () => {
expect(fetchFn).toHaveBeenCalledTimes(2); expect(fetchFn).toHaveBeenCalledTimes(2);
expect(fetchFn.mock.calls[0][2]).toBe(proxyOptions); expect(fetchFn.mock.calls[0][2]).toBe(proxyOptions);
expect(fetchFn.mock.calls[1][1].headers.Authorization).toBe("Bearer new-token"); expect(fetchFn.mock.calls[1][1].headers.Authorization).toBe("Bearer new-token");
expect(fetchFn.mock.calls[1][1].headers["x-grok-client-version"]).toBe("0.2.99"); expect(fetchFn.mock.calls[1][1].headers["x-grok-client-version"]).toBe("1.0.44");
}); });
}); });
+1 -1
View File
@@ -272,7 +272,7 @@ describe("getUsageForProvider(grok-cli)", () => {
expect(billingCall[0]).toContain("/v1/billing"); expect(billingCall[0]).toContain("/v1/billing");
expect(billingCall[1].headers.Authorization).toBe("Bearer test-token"); expect(billingCall[1].headers.Authorization).toBe("Bearer test-token");
expect(billingCall[1].headers["x-xai-token-auth"]).toBe("xai-grok-cli"); expect(billingCall[1].headers["x-xai-token-auth"]).toBe("xai-grok-cli");
expect(billingCall[1].headers["x-grok-client-version"]).toBe("0.2.99"); expect(billingCall[1].headers["x-grok-client-version"]).toBe("1.0.44");
expect(billingCall[1].headers["x-grok-client-identifier"]).toBe("grok-shell"); expect(billingCall[1].headers["x-grok-client-identifier"]).toBe("grok-shell");
expect(billingCall[1].headers["x-userid"]).toBe( expect(billingCall[1].headers["x-userid"]).toBe(
"d84768dd-224d-4052-ba49-0d336fa9160c", "d84768dd-224d-4052-ba49-0d336fa9160c",