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 .github/workflows/auto-cleanup-fixup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,6 @@ jobs:
FAILED_RUN_ID: ${{ github.event.workflow_run.id }}
run: |
bunx mux@next run \
--model anthropic:claude-opus-4-7 \
--model anthropic:claude-opus-4-8 \
--thinking xhigh \
< .github/prompts/auto-cleanup-fixup.md
2 changes: 1 addition & 1 deletion .github/workflows/auto-cleanup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,6 @@ jobs:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
bunx mux@next run \
--model anthropic:claude-opus-4-7 \
--model anthropic:claude-opus-4-8 \
--thinking xhigh \
< .github/prompts/auto-cleanup.md
4 changes: 2 additions & 2 deletions .github/workflows/nightly-terminal-bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:
workflow_dispatch:
inputs:
models:
description: 'Models to test (comma-separated, or "all" for opus-4-7 + gpt-5.5 + google/gemini-3-pro-preview + google/gemini-3-flash-preview + google/gemini-3.5-flash)'
description: 'Models to test (comma-separated, or "all" for opus-4-8 + gpt-5.5 + google/gemini-3-pro-preview + google/gemini-3-flash-preview + google/gemini-3.5-flash)'
required: false
default: "all"
type: string
Expand Down Expand Up @@ -129,7 +129,7 @@ jobs:
INPUT_MODELS: ${{ inputs.models }}
run: |
if [ "$INPUT_MODELS" = "all" ] || [ -z "$INPUT_MODELS" ]; then
echo 'models=["anthropic/claude-opus-4-7","openai/gpt-5.5","google/gemini-3-pro-preview","google/gemini-3-flash-preview","google/gemini-3.5-flash"]' >> "$GITHUB_OUTPUT"
echo 'models=["anthropic/claude-opus-4-8","openai/gpt-5.5","google/gemini-3-pro-preview","google/gemini-3-flash-preview","google/gemini-3.5-flash"]' >> "$GITHUB_OUTPUT"
else
# Convert comma-separated to JSON array
models_json=$(echo "$INPUT_MODELS" | jq -R -s -c 'split(",") | map(gsub("^\\s+|\\s+$"; ""))')
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/terminal-bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
workflow_call:
inputs:
model_name:
description: "Model to use (e.g., anthropic/claude-opus-4-7, openai/gpt-5.5)"
description: "Model to use (e.g., anthropic/claude-opus-4-8, openai/gpt-5.5)"
required: false
type: string
dataset:
Expand Down Expand Up @@ -98,7 +98,7 @@ on:
required: false
type: string
model_name:
description: "Model to use (e.g., anthropic/claude-opus-4-7, openai/gpt-5.5)"
description: "Model to use (e.g., anthropic/claude-opus-4-8, openai/gpt-5.5)"
required: false
type: string
mux_run_args:
Expand Down
2 changes: 1 addition & 1 deletion docs/config/models.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Mux ships with curated models kept up to date with the frontier. Use any custom

| Model | ID | Aliases | Default |
| ---------------------- | ----------------------------- | ------------------------------------------------------------ | ------- |
| Opus 4.7 | anthropic:claude-opus-4-7 | `opus` | ✓ |
| Opus 4.8 | anthropic:claude-opus-4-8 | `opus` | ✓ |
| Sonnet 4.6 | anthropic:claude-sonnet-4-6 | `sonnet` | |
| Haiku 4.5 | anthropic:claude-haiku-4-5 | `haiku` | |
| GPT-5.5 | openai:gpt-5.5 | `gpt`, `gpt-5.5` | |
Expand Down
2 changes: 1 addition & 1 deletion docs/guides/github-actions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ jobs:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
bunx mux@next run \
--model anthropic:claude-opus-4-7 \
--model anthropic:claude-opus-4-8 \
--thinking xhigh \
< .github/prompts/auto-cleanup.md
```
Expand Down
4 changes: 2 additions & 2 deletions src/browser/features/ChatInput/useCreationWorkspace.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -801,7 +801,7 @@ describe("useCreationWorkspace", () => {
});
expect(onWorkspaceCreated.mock.calls[0][1]).toEqual({
autoNavigate: true,
pendingStreamModel: "anthropic:claude-opus-4-7",
pendingStreamModel: "anthropic:claude-opus-4-8",
markPendingInitialSend: false,
});
});
Expand Down Expand Up @@ -1196,7 +1196,7 @@ describe("useCreationWorkspace", () => {
expect(onWorkspaceCreated.mock.calls.length).toBe(1);
expect(onWorkspaceCreated.mock.calls[0][1]).toEqual({
autoNavigate: true,
pendingStreamModel: "anthropic:claude-opus-4-7",
pendingStreamModel: "anthropic:claude-opus-4-8",
markPendingInitialSend: true,
});
});
Expand Down
2 changes: 1 addition & 1 deletion src/browser/hooks/useModelsFromSettings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ describe("useModelsFromSettings provider availability gating", () => {
apiKeySet: true,
isEnabled: true,
isConfigured: true,
models: ["claude-opus-4.7"],
models: ["claude-opus-4.8"],
},
};
routePriority = ["github-copilot", "direct"];
Expand Down
2 changes: 1 addition & 1 deletion src/cli/run.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ describe("mux CLI", () => {
test("shows default model as opus", async () => {
const result = await runCli(["run", "--help"]);
expect(result.exitCode).toBe(0);
expect(result.stdout).toContain("anthropic:claude-opus-4-7");
expect(result.stdout).toContain("anthropic:claude-opus-4-8");
});

test("--service-tier has no default auto", async () => {
Expand Down
2 changes: 1 addition & 1 deletion src/cli/run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ import type { GoalRecordV1 } from "@/common/types/goal";

// Display labels for CLI help (OFF, LOW, MED, HIGH, MAX).
// Deduplicate because xhigh and max both display as "MAX" for default/Anthropic
// models; the distinction only matters at the provider boundary (OpenAI / Opus 4.7).
// models; the distinction only matters at the provider boundary (OpenAI / Opus 4.7+).
const THINKING_LABELS_LIST = [...new Set(Object.values(THINKING_DISPLAY_LABELS))].join(", ");

type CLIMode = "plan" | "exec";
Expand Down
5 changes: 3 additions & 2 deletions src/common/constants/knownModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,11 @@ interface KnownModel extends KnownModelDefinition {
const MODEL_DEFINITIONS = {
OPUS: {
provider: "anthropic",
providerModelId: "claude-opus-4-7",
providerModelId: "claude-opus-4-8",
Comment thread
ammar-agent marked this conversation as resolved.
aliases: ["opus"],
warm: true,
// Opus 4.7 tokenizer not yet available upstream; reuse 4.6 for approximate counting
// Opus 4.8 tokenizer not yet available upstream; reuse 4.5 for approximate counting
// (Opus 4.6/4.7 also reused 4.5 — tokenization is unchanged across the 4.x line).
tokenizerOverride: "anthropic/claude-opus-4.5",
},
SONNET: {
Expand Down
1 change: 1 addition & 0 deletions src/common/utils/ai/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ export type Anthropic1MContextMode = "none" | "beta" | "native";

const OPTIONAL_VERSION_SUFFIX = String.raw`(?:-(?:\d{8}|\d{4}-\d{2}-\d{2}))?`;
const ANTHROPIC_NATIVE_1M_PATTERNS = [
new RegExp(`^claude-opus-4-8${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-opus-4-7${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-opus-4-6${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-sonnet-4-6${OPTIONAL_VERSION_SUFFIX}$`, "i"),
Expand Down
21 changes: 21 additions & 0 deletions src/common/utils/tokens/models-extra.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,27 @@ export const modelsExtra: Record<string, ModelData> = {
supports_pdf_input: true,
},

// Claude Opus 4.8 - Released May 28, 2026
// Same pricing/shape as Opus 4.7: $5/M input, $25/M output, native 1M context,
// 128K max output, native xhigh effort level. Defaults to high effort on all
// surfaces; "fast mode" (separate provider tier) is billed at 2× standard rates
// ($10/$50) and is not exposed as its own first-class entry yet.
"claude-opus-4-8": {
max_input_tokens: 1000000,
max_output_tokens: 128000,
input_cost_per_token: 0.000005, // $5 per million input tokens
output_cost_per_token: 0.000025, // $25 per million output tokens
cache_creation_input_token_cost: 0.00000625, // $6.25 per million tokens
cache_read_input_token_cost: 0.0000005, // $0.50 per million tokens
litellm_provider: "anthropic",
mode: "chat",
supports_function_calling: true,
supports_vision: true,
supports_pdf_input: true,
supports_reasoning: true,
supports_response_schema: true,
},

// Claude Opus 4.7 - Released April 2026
// Native 1M context at standard pricing: $5/M input, $25/M output.
// 128K max output tokens. Supports native xhigh effort level.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2376,7 +2376,7 @@ export const BUILTIN_SKILL_FILES: Record<string, Record<string, string>> = {
"",
"| Model | ID | Aliases | Default |",
"| ---------------------- | ----------------------------- | ------------------------------------------------------------ | ------- |",
"| Opus 4.7 | anthropic:claude-opus-4-7 | `opus` | ✓ |",
"| Opus 4.8 | anthropic:claude-opus-4-8 | `opus` | ✓ |",
"| Sonnet 4.6 | anthropic:claude-sonnet-4-6 | `sonnet` | |",
"| Haiku 4.5 | anthropic:claude-haiku-4-5 | `haiku` | |",
"| GPT-5.5 | openai:gpt-5.5 | `gpt`, `gpt-5.5` | |",
Expand Down Expand Up @@ -3834,7 +3834,7 @@ export const BUILTIN_SKILL_FILES: Record<string, Record<string, string>> = {
" GH_TOKEN: ${{ steps.app-token.outputs.token }}",
" run: |",
" bunx mux@next run \\",
" --model anthropic:claude-opus-4-7 \\",
" --model anthropic:claude-opus-4-8 \\",
" --thinking xhigh \\",
" < .github/prompts/auto-cleanup.md",
"```",
Expand Down
2 changes: 1 addition & 1 deletion src/node/services/providerService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1169,7 +1169,7 @@ describe("ProviderService.setConfig", () => {
const providersConfig = config.loadProvidersConfig();
expect(providersConfig?.["mux-gateway"]?.models).toEqual([
"anthropic/claude-sonnet-4-6",
"anthropic/claude-opus-4-7",
"anthropic/claude-opus-4-8",
"openai/gpt-5.5",
]);
expect(providersConfig?.["mux-gateway"]?.models).not.toContain("openai/gpt-5.2-codex");
Expand Down
2 changes: 1 addition & 1 deletion src/node/services/providerService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1075,7 +1075,7 @@ export class ProviderService {
if (existingModels.length === 0) {
providerConfig.models = [
"anthropic/claude-sonnet-4-6",
"anthropic/claude-opus-4-7",
"anthropic/claude-opus-4-8",
"openai/gpt-5.5",
];
}
Expand Down
4 changes: 2 additions & 2 deletions tests/e2e/scenarios/slashCommands.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ test.describe("slash command flows", () => {
await ui.projects.openFirstWorkspace();

const modeToggles = page.locator('[data-component="ChatModeToggles"]');
// Default model is Opus 4.7 - displayed as formatted name
await expect(modeToggles.getByText("Opus 4.7", { exact: true })).toBeVisible();
// Default model is Opus 4.8 - displayed as formatted name
await expect(modeToggles.getByText("Opus 4.8", { exact: true })).toBeVisible();

await ui.chat.sendMessage("/model sonnet");
await ui.chat.expectStatusMessageContains("Model changed to anthropic:claude-sonnet-4-6");
Expand Down
Loading