Skip to content

Commit 7f60a43

Browse files
committed
Re-bake the xAI Responses adapter with host Grok option keys
1 parent 45cba51 commit 7f60a43

9 files changed

Lines changed: 43 additions & 294 deletions

src/config/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import {
4646
GROK_RESPONSES_PROVIDER,
4747
GROK_SESSION_ID_OPTION,
4848
GROK_USER_ID_OPTION,
49-
} from "../provider/grok-responses-adapter.js";
49+
} from "../provider/grok-responses.js";
5050
import { BIFROST_PROVIDER } from "../provider/bifrost-adapter.js";
5151
import { isOllamaProviderId, ollamaOpenAIBaseURL } from "../provider/ollama.js";
5252
import { selectableGoModelIds } from "../provider/opencode-go-models.js";

src/provider/grok-responses-adapter.ts

Lines changed: 0 additions & 278 deletions
This file was deleted.

src/provider/grok-responses-adapter.test.ts renamed to src/provider/grok-responses.test.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, expect, test } from "bun:test";
22
import type { ConversationTurn, LastCycleSource } from "@intx/types/runtime";
3-
import { createGrokResponsesAdapter } from "./grok-responses-adapter.js";
3+
import { createGrokResponsesAdapter } from "./grok-responses.js";
44

55
const source: LastCycleSource = {
66
sourceId: "xai/test",
@@ -199,15 +199,19 @@ describe("createGrokResponsesAdapter", () => {
199199

200200
test("treats Responses completed, incomplete, and done events as stream-terminal", () => {
201201
const adapter = createGrokResponsesAdapter(source);
202-
expect(typeof adapter.isStreamTerminal).toBe("function");
202+
const isStreamTerminal = adapter.isStreamTerminal;
203+
expect(typeof isStreamTerminal).toBe("function");
204+
if (typeof isStreamTerminal !== "function") {
205+
throw new Error("expected isStreamTerminal to be a function");
206+
}
203207
for (const type of ["response.completed", "response.incomplete", "response.done"]) {
204-
expect(adapter.isStreamTerminal!(JSON.stringify({ type }))).toBe(true);
208+
expect(isStreamTerminal(JSON.stringify({ type }))).toBe(true);
205209
}
206210
for (const type of ["response.output_text.delta", "response.created", "response.in_progress"]) {
207-
expect(adapter.isStreamTerminal!(JSON.stringify({ type }))).toBe(false);
211+
expect(isStreamTerminal(JSON.stringify({ type }))).toBe(false);
208212
}
209-
expect(adapter.isStreamTerminal!("{not json")).toBe(false);
210-
expect(adapter.isStreamTerminal!("null")).toBe(false);
211-
expect(adapter.isStreamTerminal!('"just a string"')).toBe(false);
213+
expect(isStreamTerminal("{not json")).toBe(false);
214+
expect(isStreamTerminal("null")).toBe(false);
215+
expect(isStreamTerminal('"just a string"')).toBe(false);
212216
});
213217
});

src/provider/grok-responses.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { responsesAdapterFactory } from "@corbits/openai-responses";
2+
import { XAI_USER_ID_OPTION, xaiResponsesQuirks } from "@corbits/xai-provider";
3+
import type { AdapterFactory } from "@intx/inference";
4+
5+
export const GROK_RESPONSES_PROVIDER = "grok-responses";
6+
7+
export const GROK_USER_ID_OPTION = "grokUserId";
8+
export const GROK_SESSION_ID_OPTION = "grokSessionId";
9+
10+
// Spread xAI quirks and remap only host option keys. Config still writes
11+
// grokUserId / grokSessionId / reasoning_effort; wrapping buildRequest to
12+
// alias those would hide the mismatch instead of baking the host names.
13+
export const createGrokResponsesAdapter: AdapterFactory = responsesAdapterFactory({
14+
...xaiResponsesQuirks,
15+
sessionIdOption: GROK_SESSION_ID_OPTION,
16+
headers: {
17+
...xaiResponsesQuirks.headers,
18+
fromOption: (xaiResponsesQuirks.headers?.fromOption ?? []).map((entry) =>
19+
entry.optionKey === XAI_USER_ID_OPTION ? { ...entry, optionKey: GROK_USER_ID_OPTION } : entry,
20+
),
21+
},
22+
reasoning: { ...xaiResponsesQuirks.reasoning, effortOption: "reasoning_effort" },
23+
});

src/provider/inference-dependencies.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import { loadAdapterRegistry } from "@intx/inference/providers";
77
import * as openaiCompatible from "./openai-compatible-adapter.js";
88
import * as opencodeGo from "./opencode-go-adapter.js";
99
import * as codexResponses from "./codex-responses-adapter.js";
10-
import * as grokResponses from "./grok-responses-adapter.js";
10+
import * as grokResponses from "./grok-responses.js";
1111
import * as bifrostAdapter from "./bifrost-adapter.js";
1212
import * as openaiResponses from "./openai-responses.js";
1313
import * as opencodeGoAnthropic from "./opencode-go-anthropic-adapter.js";
1414
import {
1515
CODEX_RESPONSES_PROVIDER,
1616
withCodexContentTypeRepair,
1717
} from "./codex-responses-adapter.js";
18-
import { GROK_RESPONSES_PROVIDER } from "./grok-responses-adapter.js";
18+
import { GROK_RESPONSES_PROVIDER } from "./grok-responses.js";
1919
import { withReplaySanitizer } from "./replay-sanitizer.js";
2020
import { OPENCODE_GO_PROVIDER_ID } from "../../packages/opencode-go/src/index.js";
2121
import { BIFROST_PROVIDER } from "./bifrost-adapter.js";
@@ -44,7 +44,7 @@ const manifest: AdapterManifest = [
4444
},
4545
{
4646
provider: GROK_RESPONSES_PROVIDER,
47-
specifier: "grok-responses-adapter",
47+
specifier: "grok-responses",
4848
export: "createGrokResponsesAdapter",
4949
},
5050
{
@@ -68,7 +68,7 @@ const localModules: Record<string, unknown> = {
6868
"openai-compatible-adapter": openaiCompatible,
6969
"opencode-go-adapter": opencodeGo,
7070
"codex-responses-adapter": codexResponses,
71-
"grok-responses-adapter": grokResponses,
71+
"grok-responses": grokResponses,
7272
"bifrost-adapter": bifrostAdapter,
7373
"openai-responses": openaiResponses,
7474
"opencode-go-anthropic-adapter": opencodeGoAnthropic,

src/provider/replay-sanitizer.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
createCodexResponsesAdapter,
99
tagSignature,
1010
} from "./codex-responses-adapter.js";
11-
import { createGrokResponsesAdapter } from "./grok-responses-adapter.js";
11+
import { createGrokResponsesAdapter } from "./grok-responses.js";
1212
import { createOpenAICompatibleAdapter } from "./openai-compatible-adapter.js";
1313
import {
1414
sanitizeReplayTurns,

src/subagent/provider-family.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { GROK_RESPONSES_PROVIDER } from "../provider/grok-responses-adapter.js";
1+
import { GROK_RESPONSES_PROVIDER } from "../provider/grok-responses.js";
22
import { isXaiProviderName } from "../config/xai-providers.js";
33

44
/**

0 commit comments

Comments
 (0)