Skip to content

Commit 556ef78

Browse files
committed
Re-bake the xAI Responses adapter with host Grok option keys
1 parent 84fdd45 commit 556ef78

9 files changed

Lines changed: 43 additions & 273 deletions

src/config/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
GROK_RESPONSES_PROVIDER,
3737
GROK_SESSION_ID_OPTION,
3838
GROK_USER_ID_OPTION,
39-
} from "../provider/grok-responses-adapter.js";
39+
} from "../provider/grok-responses.js";
4040
import { BIFROST_PROVIDER } from "../provider/bifrost-adapter.js";
4141
import { isOllamaProviderId, ollamaOpenAIBaseURL } from "../provider/ollama.js";
4242
import { selectableGoModelIds } from "../provider/opencode-go-models.js";

src/provider/grok-responses-adapter.ts

Lines changed: 0 additions & 257 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",
@@ -172,15 +172,19 @@ describe("createGrokResponsesAdapter", () => {
172172

173173
test("treats Responses completed, incomplete, and done events as stream-terminal", () => {
174174
const adapter = createGrokResponsesAdapter(source);
175-
expect(typeof adapter.isStreamTerminal).toBe("function");
175+
const isStreamTerminal = adapter.isStreamTerminal;
176+
expect(typeof isStreamTerminal).toBe("function");
177+
if (typeof isStreamTerminal !== "function") {
178+
throw new Error("expected isStreamTerminal to be a function");
179+
}
176180
for (const type of ["response.completed", "response.incomplete", "response.done"]) {
177-
expect(adapter.isStreamTerminal!(JSON.stringify({ type }))).toBe(true);
181+
expect(isStreamTerminal(JSON.stringify({ type }))).toBe(true);
178182
}
179183
for (const type of ["response.output_text.delta", "response.created", "response.in_progress"]) {
180-
expect(adapter.isStreamTerminal!(JSON.stringify({ type }))).toBe(false);
184+
expect(isStreamTerminal(JSON.stringify({ type }))).toBe(false);
181185
}
182-
expect(adapter.isStreamTerminal!("{not json")).toBe(false);
183-
expect(adapter.isStreamTerminal!("null")).toBe(false);
184-
expect(adapter.isStreamTerminal!('"just a string"')).toBe(false);
186+
expect(isStreamTerminal("{not json")).toBe(false);
187+
expect(isStreamTerminal("null")).toBe(false);
188+
expect(isStreamTerminal('"just a string"')).toBe(false);
185189
});
186190
});

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
@@ -3,12 +3,12 @@ import { loadAdapterRegistry } from "@intx/inference/providers";
33
import * as openaiCompatible from "./openai-compatible-adapter.js";
44
import * as opencodeGo from "./opencode-go-adapter.js";
55
import * as codexResponses from "./codex-responses-adapter.js";
6-
import * as grokResponses from "./grok-responses-adapter.js";
6+
import * as grokResponses from "./grok-responses.js";
77
import * as bifrostAdapter from "./bifrost-adapter.js";
88
import * as openaiResponses from "./openai-responses.js";
99
import * as opencodeGoAnthropic from "./opencode-go-anthropic-adapter.js";
1010
import { CODEX_RESPONSES_PROVIDER, withCodexContentTypeRepair } from "./codex-responses-adapter.js";
11-
import { GROK_RESPONSES_PROVIDER } from "./grok-responses-adapter.js";
11+
import { GROK_RESPONSES_PROVIDER } from "./grok-responses.js";
1212
import { withReplaySanitizer } from "./replay-sanitizer.js";
1313
import { OPENCODE_GO_PROVIDER_ID } from "../../packages/opencode-go/src/index.js";
1414
import { BIFROST_PROVIDER } from "./bifrost-adapter.js";
@@ -37,7 +37,7 @@ const manifest: AdapterManifest = [
3737
},
3838
{
3939
provider: GROK_RESPONSES_PROVIDER,
40-
specifier: "grok-responses-adapter",
40+
specifier: "grok-responses",
4141
export: "createGrokResponsesAdapter",
4242
},
4343
{
@@ -61,7 +61,7 @@ const localModules: Record<string, unknown> = {
6161
"openai-compatible-adapter": openaiCompatible,
6262
"opencode-go-adapter": opencodeGo,
6363
"codex-responses-adapter": codexResponses,
64-
"grok-responses-adapter": grokResponses,
64+
"grok-responses": grokResponses,
6565
"bifrost-adapter": bifrostAdapter,
6666
"openai-responses": openaiResponses,
6767
"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
@@ -7,7 +7,7 @@ import {
77
createCodexResponsesAdapter,
88
tagSignature,
99
} from "./codex-responses-adapter.js";
10-
import { createGrokResponsesAdapter } from "./grok-responses-adapter.js";
10+
import { createGrokResponsesAdapter } from "./grok-responses.js";
1111
import { createOpenAICompatibleAdapter } from "./openai-compatible-adapter.js";
1212
import {
1313
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
/**

tests/unit/codex-responses-adapter.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
CODEX_SESSION_ID_OPTION,
88
CODEX_RESPONSES_PROVIDER,
99
} from "../../src/provider/codex-responses-adapter.js";
10-
import { GROK_RESPONSES_PROVIDER } from "../../src/provider/grok-responses-adapter.js";
10+
import { GROK_RESPONSES_PROVIDER } from "../../src/provider/grok-responses.js";
1111
import { COMPACTED_PREFIX } from "../../src/session/compactor.js";
1212
import { BEARER_CREDENTIAL_SENTINEL } from "@intx/inference";
1313
import type { ConversationTurn, InferenceOptions, LastCycleSource } from "@intx/types/runtime";

tests/unit/grok-responses-adapter.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
createGrokResponsesAdapter,
44
GROK_SESSION_ID_OPTION,
55
GROK_USER_ID_OPTION,
6-
} from "../../src/provider/grok-responses-adapter.js";
6+
} from "../../src/provider/grok-responses.js";
77
import { BEARER_CREDENTIAL_SENTINEL } from "@intx/inference";
88
import type { ConversationTurn, InferenceOptions, LastCycleSource } from "@intx/types/runtime";
99

0 commit comments

Comments
 (0)