feat(xai): prefilled OAuth device link, SuperGrok login label, trimmed model list (#6734)

- Use verification_uri_complete from the xAI device-code response so the
  login link opens with the user code prefilled (https-validated)
- Add OAuthAuth.loginLabel and show "Sign in with SuperGrok or X Premium"
  in the xAI auth-type selector (threaded through lazyOAuth)
- Remove grok-3, grok-3-fast, grok-4.20 variants and grok-code-fast-1
  from the built-in xAI catalog and default to grok-4.5

Co-authored-by: Jaaneek <Jaaneek@users.noreply.github.com>
This commit is contained in:
Milosz Jankiewicz
2026-07-16 17:59:54 +01:00
committed by GitHub
parent c2c32febb0
commit a01baaaea7
15 changed files with 75 additions and 102 deletions
+1 -1
View File
@@ -263,7 +263,7 @@ describe("Context overflow error handling", () => {
describe.skipIf(!process.env.XAI_API_KEY)("xAI", () => {
it("grok-3-fast - should detect overflow via isContextOverflow", async () => {
const model = getModel("xai", "grok-3-fast");
const model = getModel("xai", "grok-4.3");
const result = await testContextOverflow(model, process.env.XAI_API_KEY!);
logResult(result);
+1 -1
View File
@@ -247,7 +247,7 @@ describe("AI Providers Empty Message Tests", () => {
});
describe.skipIf(!process.env.XAI_API_KEY)("xAI Provider Empty Messages", () => {
const llm = getModel("xai", "grok-3");
const llm = getModel("xai", "grok-4.3");
it("should handle empty content array", { retry: 3, timeout: 30000 }, async () => {
await testEmptyMessage(llm);
+1 -1
View File
@@ -543,7 +543,7 @@ describe("Generate E2E Tests", () => {
});
describe.skipIf(!process.env.XAI_API_KEY)("xAI Provider (grok-code-fast-1 via OpenAI Completions)", () => {
const llm = getModel("xai", "grok-code-fast-1");
const llm = getModel("xai", "grok-4.3");
it("should complete basic text generation", { retry: 3 }, async () => {
await basicTextGeneration(llm);
+1 -1
View File
@@ -132,7 +132,7 @@ describe("Token Statistics on Abort", () => {
});
describe.skipIf(!process.env.XAI_API_KEY)("xAI Provider", () => {
const llm = getModel("xai", "grok-3-fast");
const llm = getModel("xai", "grok-4.3");
it("should include token stats when aborted mid-stream", { retry: 3, timeout: 30000 }, async () => {
await testTokensOnAbort(llm);
@@ -143,7 +143,7 @@ describe("Tool Call Without Result Tests", () => {
});
describe.skipIf(!process.env.XAI_API_KEY)("xAI Provider", () => {
const model = getModel("xai", "grok-3-fast");
const model = getModel("xai", "grok-4.3");
it("should filter out tool calls without corresponding tool results", { retry: 3, timeout: 30000 }, async () => {
await testToolCallWithoutResult(model);
+1 -1
View File
@@ -248,7 +248,7 @@ describe("totalTokens field", () => {
"grok-3-fast - should return totalTokens equal to sum of components",
{ retry: 3, timeout: 60000 },
async () => {
const llm = getModel("xai", "grok-3-fast");
const llm = getModel("xai", "grok-4.3");
console.log(`\nxAI / ${llm.id}:`);
const { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.XAI_API_KEY });
+1 -1
View File
@@ -450,7 +450,7 @@ describe("AI Providers Unicode Surrogate Pair Tests", () => {
});
describe.skipIf(!process.env.XAI_API_KEY)("xAI Provider Unicode Handling", () => {
const llm = getModel("xai", "grok-3");
const llm = getModel("xai", "grok-4.3");
it("should handle emoji in tool results", { retry: 3, timeout: 30000 }, async () => {
await testEmojiInToolResults(llm);
+45
View File
@@ -173,6 +173,51 @@ describe("xAI OAuth device flow", () => {
expect(pollTimes).toEqual([startTime.getTime() + 5000]);
});
it("prefers verification_uri_complete when the server provides it", async () => {
vi.useFakeTimers();
vi.stubGlobal(
"fetch",
vi.fn(async (input: unknown) => {
if (requestUrl(input) === "https://auth.x.ai/oauth2/device/code") {
return jsonResponse(
deviceCodeResponse({
verification_uri_complete: "https://accounts.x.ai/oauth2/device?user_code=ABCD-1234",
}),
);
}
return jsonResponse(tokenResponse());
}),
);
const deviceCodes: DeviceCodeInfo[] = [];
const loginPromise = loginXaiForTest({ onDeviceCode: (info) => deviceCodes.push(info) });
await vi.advanceTimersByTimeAsync(5000);
await loginPromise;
expect(deviceCodes).toEqual([
{
userCode: "ABCD-1234",
verificationUri: "https://accounts.x.ai/oauth2/device?user_code=ABCD-1234",
intervalSeconds: 5,
expiresInSeconds: 900,
},
]);
});
it("rejects a non-https verification_uri_complete", async () => {
vi.stubGlobal(
"fetch",
vi.fn(async () =>
jsonResponse(
deviceCodeResponse({
verification_uri_complete: "http://accounts.x.ai/oauth2/device?user_code=ABCD-1234",
}),
),
),
);
await expect(loginXaiForTest({ onDeviceCode: () => {} })).rejects.toThrow("Untrusted verification URI");
});
it.each(["http://accounts.x.ai/oauth2/device", "file:///etc/passwd", "not a url"])(
"rejects a non-https verification URI: %s",
async (verificationUri) => {