(
+ field: K,
+ transform: (event: E) => ProviderSettings[K] = inputEventTransform,
+ ) =>
+ (event: E | Event) => {
+ setApiConfigurationField(field, transform(event as E))
+ },
+ [setApiConfigurationField],
+ )
+
+ return (
+ <>
+
+
+
+
+
+
+ {t("settings:providers.apiKeyStorageNotice")}
+
+ {!apiConfiguration?.zenmuxApiKey && (
+
+ {t("settings:providers.getZenmuxApiKey")}
+
+ )}
+ {!simplifySettings && (
+ <>
+
+ {
+ setZenmuxBaseUrlSelected(checked)
+
+ if (!checked) {
+ setApiConfigurationField("zenmuxBaseUrl", "")
+ }
+ }}>
+ {t("settings:providers.useCustomBaseUrl")}
+
+ {zenmuxBaseUrlSelected && (
+
+ )}
+
+
+ ,
+ }}
+ />
+
+ >
+ )}
+
+ >
+ )
+}
diff --git a/webview-ui/src/components/settings/providers/index.ts b/webview-ui/src/components/settings/providers/index.ts
index 6af98e438fd..accb34dec33 100644
--- a/webview-ui/src/components/settings/providers/index.ts
+++ b/webview-ui/src/components/settings/providers/index.ts
@@ -18,6 +18,7 @@ export { Ollama } from "./Ollama"
export { OpenAI } from "./OpenAI"
export { OpenAICompatible } from "./OpenAICompatible"
export { OpenRouter } from "./OpenRouter"
+export { ZenMux } from "./ZenMux" // kilocode_change
export { QwenCode } from "./QwenCode"
export { Roo } from "./Roo"
export { Requesty } from "./Requesty"
diff --git a/webview-ui/src/components/ui/hooks/useRouterModels.ts b/webview-ui/src/components/ui/hooks/useRouterModels.ts
index bef96d7c5c0..d4d545cbcb9 100644
--- a/webview-ui/src/components/ui/hooks/useRouterModels.ts
+++ b/webview-ui/src/components/ui/hooks/useRouterModels.ts
@@ -66,6 +66,8 @@ type RouterModelsQueryKey = {
nanoGptApiKey?: string
nanoGptModelList?: "all" | "personalized" | "subscription"
syntheticApiKey?: string
+ zenmuxBaseUrl?: string
+ zenmuxApiKey?: string
// Requesty, Unbound, etc should perhaps also be here, but they already have their own hacks for reloading
}
// kilocode_change end
diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts
index 99668eb74fc..750a94d24e0 100644
--- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts
+++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts
@@ -98,6 +98,8 @@ export const useSelectedModel = (apiConfiguration?: ProviderSettings) => {
geminiApiKey: apiConfiguration?.geminiApiKey,
googleGeminiBaseUrl: apiConfiguration?.googleGeminiBaseUrl,
syntheticApiKey: apiConfiguration?.syntheticApiKey,
+ zenmuxBaseUrl: apiConfiguration?.zenmuxBaseUrl,
+ zenmuxApiKey: apiConfiguration?.zenmuxApiKey,
},
// kilocode_change end
{
@@ -525,6 +527,11 @@ function getSelectedModel({
}
return { id, info }
}
+ case "zenmux": {
+ const id = getValidatedModelId(apiConfiguration.zenmuxModelId, routerModels.zenmux, defaultModelId)
+ const info = routerModels.zenmux?.[id]
+ return { id, info }
+ }
// kilocode_change end
// case "anthropic":
// case "human-relay":
diff --git a/webview-ui/src/utils/__tests__/validate.test.ts b/webview-ui/src/utils/__tests__/validate.test.ts
index d3ec33b91c8..30681868713 100644
--- a/webview-ui/src/utils/__tests__/validate.test.ts
+++ b/webview-ui/src/utils/__tests__/validate.test.ts
@@ -73,6 +73,7 @@ describe("Model Validation Functions", () => {
// kilocode_change end
roo: {},
chutes: {},
+ zenmux: {},
}
const allowAllOrganization: OrganizationAllowList = {