Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ RUN --mount=type=cache,id=s/92ca8a61-c1ba-421f-a389-d48ac7258c2d-apt-cache,targe
# build, not the floating `@latest`.
RUN --mount=type=cache,id=s/92ca8a61-c1ba-421f-a389-d48ac7258c2d-npm-cache,target=/root/.npm \
npm install -g --no-audit --no-fund \
@openai/codex@0.156.1 \
@openai/codex@0.159.2 \
@anthropic-ai/claude-code@2.1.260 \
droid@0.212.0 \
openclaw@2026.9.1
Expand Down
1 change: 1 addition & 0 deletions changelog.d/features/15192-codex-gpt-6-1-sol.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- **feat(codex):** add GPT-6.1 Sol support across execution and pricing pipelines — register `gpt-6.1-sol` and reasoning effort variants (`ultra`, `max`, `xhigh`, `high`, `medium`, `low`), bump Codex client version header to `0.159.2` to resolve upstream ChatGPT account tier-gating, surface upstream `detail` error diagnostics, retain Responses Lite parallel tool calls, and wire 2.5x Fast mode pricing.
17 changes: 17 additions & 0 deletions open-sse/config/providers/registry/codex/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,23 @@ export const codexProvider: RegistryEntry = {
},
{ id: "gpt-6-sol-medium", name: "GPT 6 Sol (Medium)", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6-sol-low", name: "GPT 6 Sol (Low)", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6.1-sol", name: "GPT 6.1 Sol", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6.1-sol-ultra", name: "GPT 6.1 Sol (Ultra)", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6.1-sol-max", name: "GPT 6.1 Sol (Max)", ...GPT_5_6_CODEX_CAPABILITIES },
{
id: "gpt-6.1-sol-xhigh",
name: "GPT 6.1 Sol (xHigh)",
...GPT_5_6_CODEX_CAPABILITIES,
timeoutMs: 1200000,
},
{
id: "gpt-6.1-sol-high",
name: "GPT 6.1 Sol (High)",
...GPT_5_6_CODEX_CAPABILITIES,
timeoutMs: 1200000,
},
{ id: "gpt-6.1-sol-medium", name: "GPT 6.1 Sol (Medium)", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6.1-sol-low", name: "GPT 6.1 Sol (Low)", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6-luna", name: "GPT 6 Luna", ...GPT_5_6_CODEX_CAPABILITIES },
{ id: "gpt-6-luna-max", name: "GPT 6 Luna (Max)", ...GPT_5_6_CODEX_CAPABILITIES },
{
Expand Down
1 change: 1 addition & 0 deletions open-sse/config/providers/registry/openai/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export const openaiProvider: RegistryEntry = {
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", ...GPT_5_6_API_CAPABILITIES },
{ id: "gpt-5.6-terra", name: "GPT-5.6 Terra", ...GPT_5_6_API_CAPABILITIES },
{ id: "gpt-5.6-luna", name: "GPT-5.6 Luna", ...GPT_5_6_API_CAPABILITIES },
{ id: "gpt-6.1-sol", name: "GPT 6.1 Sol", ...GPT_5_6_API_CAPABILITIES },
{ id: "gpt-5.5", name: "GPT-5.5", contextLength: 1050000 },
// #5842: *-pro reasoning models are responses-only upstream — /v1/chat/completions
// 404s ("only supported in v1/responses"). targetFormat routes them natively.
Expand Down
5 changes: 3 additions & 2 deletions open-sse/executors/codex/reasoningSuffix.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ export const CODEX_MAX_ALIAS_MODELS = new Set([
"gpt-5.6-terra",
"gpt-5.6-luna",
"gpt-6-astra",
"gpt-6.1-sol",
"gpt-6-sol",
"gpt-6-luna",
]);
export const CODEX_ULTRA_ALIAS_MODELS = new Set([
"gpt-5.6-sol",
"gpt-5.6-terra",
"gpt-6-astra",
"gpt-6.1-sol",
"gpt-6-sol",
]);

Expand All @@ -39,8 +41,7 @@ export function splitCodexReasoningSuffix(model: unknown): {
if (maxTierMatch) {
const [, baseModel, hyphenEffort, parenthesizedEffort] = maxTierMatch;
const effort = hyphenEffort ?? parenthesizedEffort;
const supportedModels =
effort === "ultra" ? CODEX_ULTRA_ALIAS_MODELS : CODEX_MAX_ALIAS_MODELS;
const supportedModels = effort === "ultra" ? CODEX_ULTRA_ALIAS_MODELS : CODEX_MAX_ALIAS_MODELS;
if (supportedModels.has(baseModel)) {
return { baseModel, effort: effort as CodexEffortLevel };
}
Expand Down
7 changes: 7 additions & 0 deletions open-sse/services/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,13 @@ export const CODEX_NATIVE_UNPREFIXED_MODELS = new Set([
"gpt-6-astra-high",
"gpt-6-astra-medium",
"gpt-6-astra-low",
"gpt-6.1-sol",
"gpt-6.1-sol-ultra",
"gpt-6.1-sol-max",
"gpt-6.1-sol-xhigh",
"gpt-6.1-sol-high",
"gpt-6.1-sol-medium",
"gpt-6.1-sol-low",
"gpt-5.6-sol",
"gpt-5.6-sol-ultra",
"gpt-5.6-sol-max",
Expand Down
2 changes: 1 addition & 1 deletion open-sse/translator/request/openai-responses/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function imageUrlToText(value: unknown): string {
}

const CODEX_MAX_EFFORT_MODEL_PATTERN =
/^(?:gpt-5\.6-(?:sol|terra|luna)|gpt-6-(?:astra|sol|luna))(?:-(?:none|low|medium|high|xhigh|max|ultra))?$/;
/^(?:gpt-5\.6-(?:sol|terra|luna)|gpt-6(?:\.1)?-(?:astra|sol|luna))(?:-(?:none|low|medium|high|xhigh|max|ultra))?$/;
const KIRO_GPT_5_6_MODEL_PATTERN =
/^(?:kiro|kr)\/gpt-5\.6-(?:sol|terra|luna)(?:-(?:none|low|medium|high|xhigh|max))?$/;

Expand Down
1 change: 1 addition & 0 deletions open-sse/utils/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -859,6 +859,7 @@ export async function parseUpstreamError(response: Response, provider: string |
? clinepassEnvError.message
: json.error?.message ||
json.message ||
(typeof json.detail === "string" ? json.detail : null) ||
(typeof json.error === "string" ? json.error : null);
message =
typeof extractedMessage === "string"
Expand Down
4 changes: 2 additions & 2 deletions src/lib/usage/costCalculator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ export function getCodexFastCostMultiplier(
const compactModelKey = modelKey.replace(/-/g, "");
// Codex GPT-6 Fast is 2.5x Standard (https://developers.openai.com/codex/pricing).
if (
/^gpt-6-(?:astra|sol|luna)$/.test(modelKey) ||
/^gpt6(?:astra|sol|luna)$/.test(compactModelKey)
/^gpt-6(?:\.1)?-(?:astra|sol|luna)$/.test(modelKey) ||
/^gpt6(?:\.1)?(?:astra|sol|luna)$/.test(compactModelKey)
) {
return 2.5;
}
Expand Down
4 changes: 2 additions & 2 deletions src/lib/vscode/reasoningMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export type VscodeCatalogModel = {

const STANDARD_EFFORT_SUFFIX_PATTERN = /-(xhigh|high|medium|low|none)$/i;
const CODEX_EXTENDED_EFFORT_SUFFIX_PATTERN =
/^(.*gpt-(?:5\.6-(?:sol|terra|luna)|6-(?:astra|sol|luna)))-(max|ultra)$/i;
/^(.*gpt-(?:5\.6-(?:sol|terra|luna)|6(?:\.1)?-(?:astra|sol|luna)))-(max|ultra)$/i;
const DEFAULT_REASONING_EFFORT = "none";
const KNOWN_REASONING_EFFORTS = new Set(["none", "low", "medium", "high", "xhigh", "max", "ultra"]);

Expand Down Expand Up @@ -191,7 +191,7 @@ function getCodexGpt56DefaultReasoningEffort(model: VscodeCatalogModel) {
.trim()
.toLowerCase();
const match = providerModelId.match(
/^gpt-(?:5\.6-(sol|terra|luna)|6-(?:astra|sol|luna))(?:-(?:none|low|medium|high|xhigh|max|ultra))?$/
/^gpt-(?:5\.6-(sol|terra|luna)|6(?:\.1)?-(?:astra|sol|luna))(?:-(?:none|low|medium|high|xhigh|max|ultra))?$/
);
if (!match) return undefined;
// The live catalog defaults GPT-5.6 Sol to low and every other model here to medium.
Expand Down
2 changes: 1 addition & 1 deletion src/shared/constants/codexClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// refresh this so the fingerprint OpenAI sees from the OAuth/Responses face
// matches the real client version. Overridable per-deployment via
// CODEX_CLIENT_VERSION.
export const DEFAULT_CODEX_CLIENT_VERSION = "0.156.1";
export const DEFAULT_CODEX_CLIENT_VERSION = "0.159.2";
export const CODEX_CLI_RS_ORIGINATOR = "codex_cli_rs";

export function getCodexCliRsHeaders(
Expand Down
1 change: 1 addition & 0 deletions src/shared/constants/modelSpecs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ export const MODEL_SPECS: Record<string, ModelSpec> = {
...GPT_5_6_MODEL_SPEC,
aliases: ["openai/gpt-6-astra"],
},
"gpt-6.1-sol": GPT_5_6_MODEL_SPEC,
"gpt-5.6": {
...GPT_5_6_MODEL_SPEC,
aliases: ["openai/gpt-5.6"],
Expand Down
2 changes: 2 additions & 0 deletions src/shared/constants/pricing/frontier-labs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
import {
GPT_6_ASTRA_PRICING,
GPT_6_SOL_PRICING,
GEMINI_3_7_FLASH_PROMO_PRICING,
GPT_5_5_PRICING,
GPT_5_6_LUNA_PRICING,
Expand All @@ -22,6 +23,7 @@ import {
export const DEFAULT_PRICING_FRONTIER = {
openai: {
"gpt-6-astra": GPT_6_ASTRA_PRICING,
"gpt-6.1-sol": GPT_6_SOL_PRICING,
"gpt-5.6": GPT_5_6_SOL_PRICING,
"gpt-5.6-sol": GPT_5_6_SOL_PRICING,
"gpt-5.6-terra": GPT_5_6_TERRA_PRICING,
Expand Down
15 changes: 15 additions & 0 deletions src/shared/constants/pricing/oauth-subscriptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ const GPT_6_SOL_CODEX_PRICING = {
reasoning: 10.0,
cache_creation: 2.5,
};
// GPT-6.1 Sol Standard: 50 / 2.5 / 250 credits per MTok (input / cached / output).
// Keep GPT-6 Sol's 5-credit cached rate separate. Dollar equivalents below use
// this table's existing 25 credits/USD convention, not included-plan usage.
// https://learn.chatgpt.com/docs/pricing#token-rates (checked 2026-10-07)
const GPT_6_1_SOL_CODEX_PRICING = {
...GPT_6_SOL_CODEX_PRICING,
cached: 0.1,
};
const GPT_6_LUNA_CODEX_PRICING = {
input: 0.1,
output: 0.5,
Expand Down Expand Up @@ -122,6 +130,13 @@ export const DEFAULT_PRICING_OAUTH = {
"gpt-6-sol-high": GPT_6_SOL_CODEX_PRICING,
"gpt-6-sol-medium": GPT_6_SOL_CODEX_PRICING,
"gpt-6-sol-low": GPT_6_SOL_CODEX_PRICING,
"gpt-6.1-sol": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6.1-sol-ultra": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6.1-sol-max": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6.1-sol-xhigh": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6.1-sol-high": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6.1-sol-medium": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6.1-sol-low": GPT_6_1_SOL_CODEX_PRICING,
"gpt-6-luna": GPT_6_LUNA_CODEX_PRICING,
"gpt-6-luna-max": GPT_6_LUNA_CODEX_PRICING,
"gpt-6-luna-xhigh": GPT_6_LUNA_CODEX_PRICING,
Expand Down
8 changes: 8 additions & 0 deletions src/shared/constants/pricing/shared-tiers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ export const GPT_6_ASTRA_PRICING = {
cache_creation: 12.5,
};

export const GPT_6_SOL_PRICING = {
input: 2.0,
output: 10.0,
cached: 0.1,
reasoning: 10.0,
cache_creation: 2.5,
};

export const GPT_5_3_CODEX_PRICING = {
input: 5.0,
output: 20.0,
Expand Down
2 changes: 1 addition & 1 deletion src/shared/reasoning/effortStandardization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export function extendCodexGpt56EffortValues(
}

const match = normalizedModel.match(
/^gpt-(?:5\.6-(sol|terra|luna)|6-(astra|sol|luna))(?:-(?:none|low|medium|high|xhigh|max|ultra))?$/
/^gpt-(?:5\.6-(sol|terra|luna)|6(?:\.1)?-(astra|sol|luna))(?:-(?:none|low|medium|high|xhigh|max|ultra))?$/
);
if (!match) return values;

Expand Down
1 change: 1 addition & 0 deletions stryker.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"tests/unit/combo-error-code-terminal.test.ts",
"tests/unit/model-validation-runner.test.ts",
"tests/unit/bare-403-neutral.test.ts",
"tests/unit/codex-gpt61-sol.test.ts",
"tests/unit/chat-noauth-model-cooldown.test.ts",
"tests/unit/combo-ref-capabilities-14232.test.ts",
"tests/unit/intelligent-routing-weight-edit.test.ts",
Expand Down
12 changes: 6 additions & 6 deletions tests/snapshots/provider/translate-path.json
Original file line number Diff line number Diff line change
Expand Up @@ -1334,23 +1334,23 @@
"Authorization": "Bearer <TOK>",
"Content-Type": "application/json",
"Openai-Beta": "responses_websockets=2026-02-06",
"User-Agent": "codex-cli/0.156.1 (<OS>; <ARCH>)",
"Version": "0.156.1"
"User-Agent": "codex-cli/0.159.2 (<OS>; <ARCH>)",
"Version": "0.159.2"
},
"nonStream": {
"Authorization": "Bearer <TOK>",
"Content-Type": "application/json",
"Openai-Beta": "responses_websockets=2026-02-06",
"User-Agent": "codex-cli/0.156.1 (<OS>; <ARCH>)",
"Version": "0.156.1"
"User-Agent": "codex-cli/0.159.2 (<OS>; <ARCH>)",
"Version": "0.159.2"
},
"oauth": {
"Accept": "text/event-stream",
"Authorization": "Bearer <TOK>",
"Content-Type": "application/json",
"Openai-Beta": "responses_websockets=2026-02-06",
"User-Agent": "codex-cli/0.156.1 (<OS>; <ARCH>)",
"Version": "0.156.1"
"User-Agent": "codex-cli/0.159.2 (<OS>; <ARCH>)",
"Version": "0.159.2"
}
},
"url": {
Expand Down
Loading
Loading