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: 2 additions & 0 deletions packages/coding-agent/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

### Changed

- Automatic startup selection for the built-in OpenAI and Codex providers now defaults to GPT-5.6 Sol instead of GPT-5.5. Explicitly saved GPT-5.5 selections remain supported.

### Removed

## [2026.8.22] - 2026-08-22
Expand Down
18 changes: 18 additions & 0 deletions packages/coding-agent/src/core/changes.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# changes

## 2026-08-22 - Retarget OpenAI automatic defaults to GPT-5.6 Sol

### What changed

- `packages/coding-agent/src/core/model-resolver.ts`: retargeted the `openai` and `openai-codex` provider defaults from `gpt-5.5` to `gpt-5.6-sol` while retaining GPT-5.5 in catalogs and explicit settings resolution.

### Why

- Automatic startup recommendation should follow the current recommended GPT-5.6 Sol model; saved GPT-5.5 selections remain explicitly selectable.

### Why an extension could not handle it

- `defaultModelPerProvider` is consumed by core initial-model resolution before extension recommendations are applied.

### Expected merge conflict zones

- LOW: the OpenAI provider entries in `packages/coding-agent/src/core/model-resolver.ts`.

## 2026-08-22 - emit agent_idle after settlement-deferred turns resolve

### What changed
Expand Down
4 changes: 2 additions & 2 deletions packages/coding-agent/src/core/model-resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ export const defaultModelPerProvider: Record<KnownProvider, string> = {
"amazon-bedrock": "us.anthropic.claude-opus-4-6-v1",
"ant-ling": "Ring-2.6-1T",
anthropic: "claude-opus-4-8",
openai: "gpt-5.5",
openai: "gpt-5.6-sol",
"azure-openai-responses": "gpt-5.4",
"openai-codex": "gpt-5.5",
"openai-codex": "gpt-5.6-sol",
ollama: "qwen3.5:397b",
// Cursor ships no models until its chat protocol is ported; "auto" matches
// the Cursor agent's native model auto-selection once models exist.
Expand Down
14 changes: 7 additions & 7 deletions packages/coding-agent/test/model-resolver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -697,8 +697,8 @@ describe("resolveCliModel", () => {

describe("default model selection", () => {
test("openai defaults track current models", () => {
expect(defaultModelPerProvider.openai).toBe("gpt-5.5");
expect(defaultModelPerProvider["openai-codex"]).toBe("gpt-5.5");
expect(defaultModelPerProvider.openai).toBe("gpt-5.6-sol");
expect(defaultModelPerProvider["openai-codex"]).toBe("gpt-5.6-sol");
});

test("zai, minimax, cerebras, and ant-ling defaults track current models", () => {
Expand Down Expand Up @@ -931,8 +931,8 @@ describe("default model selection", () => {
};
const custom: Model<"anthropic-messages"> = {
...openAiDefault,
id: "custom-model",
provider: "custom",
id: "grok-4.5",
provider: "xai",
};
const runtime = {
getModels: () => [openAiDefault, custom],
Expand All @@ -957,8 +957,8 @@ describe("default model selection", () => {
const settings = await findInitialModel({
scopedModels: [],
isContinuing: false,
defaultProvider: "custom",
defaultModelId: "custom-model",
defaultProvider: "xai",
defaultModelId: "grok-4.5",
modelRuntime: runtime,
});
const providerDefault = await findInitialModel({
Expand All @@ -968,7 +968,7 @@ describe("default model selection", () => {
});
const firstAvailableRuntime = {
...runtime,
getAvailable: async () => [custom],
getAvailable: async () => [openAiDefault],
} as unknown as Parameters<typeof findInitialModel>[0]["modelRuntime"];
const firstAvailable = await findInitialModel({
scopedModels: [],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { getModels } from "@earendil-works/pi-ai/compat";
import { describe, expect, test } from "vitest";
import { findInitialModel } from "../src/core/model-resolver.ts";

describe("OpenAI provider defaults", () => {
test("prefers GPT-5.6 Sol automatically while preserving explicit GPT-5.5", async () => {
const openAiModels = getModels("openai");
const codexModels = getModels("openai-codex");
const availableModels = [
openAiModels.find((model) => model.id === "gpt-5.6-sol"),
codexModels.find((model) => model.id === "gpt-5.6-sol"),
codexModels.find((model) => model.id === "gpt-5.5"),
].filter((model) => model !== undefined);
const runtime = {
getAvailableSnapshot: () => availableModels,
getModel: (provider: string, modelId: string) =>
availableModels.find((model) => model.provider === provider && model.id === modelId),
hasConfiguredAuth: () => true,
} as unknown as Parameters<typeof findInitialModel>[0]["modelRuntime"];

const automatic = await findInitialModel({ scopedModels: [], isContinuing: false, modelRuntime: runtime });
const explicit = await findInitialModel({
scopedModels: [],
isContinuing: false,
defaultProvider: "openai-codex",
defaultModelId: "gpt-5.5",
modelRuntime: runtime,
});

expect(automatic.model?.id).toBe("gpt-5.6-sol");
expect(automatic.provenance).toBe("provider-default");
expect(explicit.model?.id).toBe("gpt-5.5");
expect(explicit.provenance).toBe("settings");
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ describe("InteractiveMode scoped-setting caller compatibility", () => {

it("keeps post-auth default model selection on the global-setting setter", async () => {
// Given: authentication completes while the session still has the unknown placeholder model.
const defaultModel = { provider: "openai", id: "gpt-5.5" };
const defaultModel = { provider: "openai", id: "gpt-5.6-sol" };
const setModel = vi.fn(async () => undefined);
const setSessionModel = vi.fn(async () => undefined);
const fakeThis = {
Expand Down