diff --git a/src/config/claudeDesktopProviderPresets.ts b/src/config/claudeDesktopProviderPresets.ts index 5ab0541d8..7862f7107 100644 --- a/src/config/claudeDesktopProviderPresets.ts +++ b/src/config/claudeDesktopProviderPresets.ts @@ -1722,4 +1722,25 @@ export const claudeDesktopProviderPresets: ClaudeDesktopProviderPreset[] = [ icon: "aicodewith", iconColor: "#3A3B40", }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + category: "aggregator", + baseUrl: "https://ai.soruxgpt.com", + mode: "direct", + apiFormat: "anthropic", + modelRoutes: mappedRoutes( + "claude-sonnet-5-5", + "claude-opus-5-5", + "claude-haiku-4-5-20251001", + ), + endpointCandidates: [ + "https://ai.soruxgpt.com", + "https://api-cf.soruxgpt.com", + "https://api-host.soruxgpt.com", + "https://api-node6.soruxgpt.com", + "https://api-node3.soruxgpt.com", + ], + }, ]; diff --git a/src/config/claudeProviderPresets.ts b/src/config/claudeProviderPresets.ts index 698aa644c..6858f9a29 100644 --- a/src/config/claudeProviderPresets.ts +++ b/src/config/claudeProviderPresets.ts @@ -1888,6 +1888,9 @@ export const providerPresets: ProviderPreset[] = [ ANTHROPIC_DEFAULT_HAIKU_MODEL: "grok-4.5", ANTHROPIC_DEFAULT_SONNET_MODEL: "grok-4.5", ANTHROPIC_DEFAULT_OPUS_MODEL: "grok-4.5", + // Claude Code falls back to 200K for non-Claude model ids; grok-4.5 + // has a 500K window (same as grok_config::DEFAULT_CONTEXT_WINDOW). + CLAUDE_CODE_MAX_CONTEXT_TOKENS: "500000", }, }, category: "third_party", @@ -2121,4 +2124,23 @@ export const providerPresets: ProviderPreset[] = [ endpointCandidates: ["https://moark.com/anthropic"], icon: "moark", }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + settingsConfig: { + env: { + ANTHROPIC_BASE_URL: "https://ai.soruxgpt.com", + ANTHROPIC_AUTH_TOKEN: "", + }, + }, + endpointCandidates: [ + "https://ai.soruxgpt.com", + "https://api-cf.soruxgpt.com", + "https://api-host.soruxgpt.com", + "https://api-node6.soruxgpt.com", + "https://api-node3.soruxgpt.com", + ], + category: "aggregator", + }, ]; diff --git a/src/config/codexProviderPresets.ts b/src/config/codexProviderPresets.ts index 0bcfe35ed..5e1ae0096 100644 --- a/src/config/codexProviderPresets.ts +++ b/src/config/codexProviderPresets.ts @@ -3693,4 +3693,23 @@ base_url = "https://cc-api.pipellm.ai/v1"`, category: "aggregator", icon: "moark", }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + category: "aggregator", + auth: generateThirdPartyAuth(""), + config: generateThirdPartyConfig( + "soruxgpt", + "https://ai.soruxgpt.com/v1", + "gpt-5.6-sol", + ), + endpointCandidates: [ + "https://ai.soruxgpt.com/v1", + "https://api-cf.soruxgpt.com/v1", + "https://api-host.soruxgpt.com/v1", + "https://api-node6.soruxgpt.com/v1", + "https://api-node3.soruxgpt.com/v1", + ], + }, ]; diff --git a/src/config/geminiProviderPresets.ts b/src/config/geminiProviderPresets.ts index 24dacf732..2e5302826 100644 --- a/src/config/geminiProviderPresets.ts +++ b/src/config/geminiProviderPresets.ts @@ -580,6 +580,28 @@ export const geminiProviderPresets: GeminiProviderPreset[] = [ icon: "aicodewith", iconColor: "#3A3B40", }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + settingsConfig: { + env: { + GOOGLE_GEMINI_BASE_URL: "https://ai.soruxgpt.com", + GEMINI_MODEL: "gemini-3.1-pro-preview", + }, + }, + baseURL: "https://ai.soruxgpt.com", + model: "gemini-3.1-pro-preview", + description: "SoruxGPT", + category: "aggregator", + endpointCandidates: [ + "https://ai.soruxgpt.com", + "https://api-cf.soruxgpt.com", + "https://api-host.soruxgpt.com", + "https://api-node6.soruxgpt.com", + "https://api-node3.soruxgpt.com", + ], + }, ]; export function getGeminiPresetByName( diff --git a/src/config/hermesProviderPresets.ts b/src/config/hermesProviderPresets.ts index caed5d93d..85fe3d128 100644 --- a/src/config/hermesProviderPresets.ts +++ b/src/config/hermesProviderPresets.ts @@ -2494,4 +2494,36 @@ export const hermesProviderPresets: HermesProviderPreset[] = [ model: { default: "gpt-5.6-sol", provider: "aicodewith" }, }, }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + settingsConfig: { + name: "soruxgpt", + base_url: "https://ai.soruxgpt.com", + api_key: "", + api_mode: "anthropic_messages", + models: [ + { + id: "claude-opus-5-5", + name: "Claude Opus 5.5", + context_length: 1000000, + }, + { + id: "claude-sonnet-5-5", + name: "Claude Sonnet 5.5", + context_length: 1000000, + }, + { + id: "claude-haiku-4-5-20251001", + name: "Claude Haiku 4.5", + context_length: 200000, + }, + ], + }, + category: "aggregator", + suggestedDefaults: { + model: { default: "claude-opus-5-5", provider: "soruxgpt" }, + }, + }, ]; diff --git a/src/config/openclawProviderPresets.ts b/src/config/openclawProviderPresets.ts index 0b9a9a585..2249ec516 100644 --- a/src/config/openclawProviderPresets.ts +++ b/src/config/openclawProviderPresets.ts @@ -4773,4 +4773,56 @@ export const openclawProviderPresets: OpenClawProviderPreset[] = [ }, }, }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + settingsConfig: { + baseUrl: "https://ai.soruxgpt.com", + apiKey: "", + api: "anthropic-messages", + models: [ + { + id: "claude-opus-5-5", + name: "Claude Opus 5.5", + reasoning: true, + input: ["text", "image"], + contextWindow: 1000000, + maxTokens: 128000, + }, + { + id: "claude-sonnet-5-5", + name: "Claude Sonnet 5.5", + reasoning: true, + input: ["text", "image"], + contextWindow: 1000000, + maxTokens: 128000, + }, + { + id: "claude-haiku-4-5-20251001", + name: "Claude Haiku 4.5", + contextWindow: 200000, + }, + ], + }, + category: "aggregator", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "", + editorValue: "", + }, + }, + suggestedDefaults: { + model: { + primary: "soruxgpt/claude-opus-5-5", + fallbacks: ["soruxgpt/claude-sonnet-5-5"], + }, + modelCatalog: { + "soruxgpt/claude-opus-5-5": { alias: "Opus" }, + "soruxgpt/claude-sonnet-5-5": { alias: "Sonnet" }, + "soruxgpt/claude-haiku-4-5-20251001": { alias: "Haiku" }, + }, + }, + }, ]; diff --git a/src/config/opencodeProviderPresets.ts b/src/config/opencodeProviderPresets.ts index 73c55c475..4aa438c26 100644 --- a/src/config/opencodeProviderPresets.ts +++ b/src/config/opencodeProviderPresets.ts @@ -3545,4 +3545,44 @@ export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ }, }, }, + { + name: "SoruxGPT", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + settingsConfig: { + npm: "@ai-sdk/anthropic", + name: "SoruxGPT", + options: { + baseURL: "https://ai.soruxgpt.com/v1", + apiKey: "", + setCacheKey: true, + }, + models: { + "claude-opus-5-5": { + name: "Claude Opus 5.5", + reasoning: true, + limit: { context: 1000000, output: 128000 }, + modalities: { input: ["text", "image"], output: ["text"] }, + }, + "claude-sonnet-5-5": { + name: "Claude Sonnet 5.5", + reasoning: true, + limit: { context: 1000000, output: 128000 }, + modalities: { input: ["text", "image"], output: ["text"] }, + }, + "claude-haiku-4-5-20251001": { + name: "Claude Haiku 4.5", + reasoning: true, + }, + }, + }, + category: "aggregator", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "", + editorValue: "", + }, + }, + }, ]; diff --git a/src/config/piProviderPresets.ts b/src/config/piProviderPresets.ts index 60d00fbd0..d3d6bc040 100644 --- a/src/config/piProviderPresets.ts +++ b/src/config/piProviderPresets.ts @@ -2525,6 +2525,26 @@ const piProviderPresetDefinitions: PiProviderPreset[] = [ category: "aggregator", icon: "moark", }, + { + name: "SoruxGPT", + providerKey: "cc-switch-sorux-gpt", + websiteUrl: "https://ai.soruxgpt.com", + apiKeyUrl: "https://ai.soruxgpt.com/console/token", + settingsConfig: { + name: "SoruxGPT", + baseUrl: "https://ai.soruxgpt.com", + api: "anthropic-messages", + apiKey: "", + models: [ + piModel("anthropic/claude-opus-5.5", { id: "claude-opus-5-5" }), + piModel("anthropic/claude-sonnet-5.5", { id: "claude-sonnet-5-5" }), + piModel("anthropic/claude-haiku-4.5", { + id: "claude-haiku-4-5-20251001", + }), + ], + }, + category: "aggregator", + }, ]; function materializeVerifiedThinkingProfiles( diff --git a/tests/components/ProviderPresetSelector.test.tsx b/tests/components/ProviderPresetSelector.test.tsx index 3034c29be..c8c9ec1d0 100644 --- a/tests/components/ProviderPresetSelector.test.tsx +++ b/tests/components/ProviderPresetSelector.test.tsx @@ -226,11 +226,11 @@ describe("preset families", () => { expect(hits("moonshot")).toEqual([["family:kimi", []]]); }); - it("merges Claude's visible presets into 74 rows", () => { + it("merges Claude's visible presets into 75 rows", () => { const claudeEntries = providerPresets .filter((item) => !item.hidden) .map((item, index) => ({ id: `claude-${index}`, preset: item })); - expect(groupPresetRows(claudeEntries)).toHaveLength(74); + expect(groupPresetRows(claudeEntries)).toHaveLength(75); }); it("orders plans and regions as the design does where a family says so", () => {