diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index fd327657b678..558292eaf64e 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -376,7 +376,7 @@ const sambaNovaSchema = apiModelIdProviderModelSchema.extend({ sambaNovaApiKey: z.string().optional(), }) -export const zaiApiLineSchema = z.enum(["international_coding", "international", "china_coding", "china"]) +export const zaiApiLineSchema = z.enum(["international", "china"]) export type ZaiApiLine = z.infer diff --git a/packages/types/src/providers/zai.ts b/packages/types/src/providers/zai.ts index b3838c1406a0..a32a21cad898 100644 --- a/packages/types/src/providers/zai.ts +++ b/packages/types/src/providers/zai.ts @@ -106,12 +106,10 @@ export const mainlandZAiModels = { export const ZAI_DEFAULT_TEMPERATURE = 0 export const zaiApiLineConfigs = { - international_coding: { - name: "International Coding Plan", + international: { + name: "International", baseUrl: "https://api.z.ai/api/coding/paas/v4", isChina: false, }, - international: { name: "International Standard", baseUrl: "https://api.z.ai/api/paas/v4", isChina: false }, - china_coding: { name: "China Coding Plan", baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4", isChina: true }, - china: { name: "China Standard", baseUrl: "https://open.bigmodel.cn/api/paas/v4", isChina: true }, + china: { name: "China", baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4", isChina: true }, } satisfies Record diff --git a/scripts/find-missing-translations.js b/scripts/find-missing-translations.js index 9277d935ba06..fd00025c6ca5 100755 --- a/scripts/find-missing-translations.js +++ b/scripts/find-missing-translations.js @@ -92,14 +92,44 @@ function findKeys(obj, parentKey = "") { // Get value at a dotted path in an object function getValueAtPath(obj, path) { - const parts = path.split(".") + // Handle the case where keys might contain dots (like "glm-4.5") + // We need to be smarter about splitting the path let current = obj + let remainingPath = path + + while (remainingPath && current && typeof current === "object") { + let found = false + + // Try to find the longest matching key first + for (const key of Object.keys(current)) { + if (remainingPath === key) { + // Exact match - we're done + return current[key] + } else if (remainingPath.startsWith(key + ".")) { + // Key matches the start of remaining path + current = current[key] + remainingPath = remainingPath.slice(key.length + 1) + found = true + break + } + } - for (const part of parts) { - if (current === undefined || current === null) { - return undefined + if (!found) { + // No matching key found, try the old method as fallback + const dotIndex = remainingPath.indexOf(".") + if (dotIndex === -1) { + // No more dots, this should be the final key + return current[remainingPath] + } else { + const nextKey = remainingPath.slice(0, dotIndex) + if (current[nextKey] !== undefined) { + current = current[nextKey] + remainingPath = remainingPath.slice(dotIndex + 1) + } else { + return undefined + } + } } - current = current[part] } return current diff --git a/src/api/providers/__tests__/zai.spec.ts b/src/api/providers/__tests__/zai.spec.ts index 7928a4298da3..20bf365f37ad 100644 --- a/src/api/providers/__tests__/zai.spec.ts +++ b/src/api/providers/__tests__/zai.spec.ts @@ -43,7 +43,7 @@ describe("ZAiHandler", () => { new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international" }) expect(OpenAI).toHaveBeenCalledWith( expect.objectContaining({ - baseURL: "https://api.z.ai/api/paas/v4", + baseURL: "https://api.z.ai/api/coding/paas/v4", }), ) }) @@ -81,7 +81,7 @@ describe("ZAiHandler", () => { it("should use the correct China Z AI base URL", () => { new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "china" }) expect(OpenAI).toHaveBeenCalledWith( - expect.objectContaining({ baseURL: "https://open.bigmodel.cn/api/paas/v4" }), + expect.objectContaining({ baseURL: "https://open.bigmodel.cn/api/coding/paas/v4" }), ) }) diff --git a/src/api/providers/zai.ts b/src/api/providers/zai.ts index ce5aab9dd9f8..a4f110ea3f10 100644 --- a/src/api/providers/zai.ts +++ b/src/api/providers/zai.ts @@ -15,14 +15,14 @@ import { BaseOpenAiCompatibleProvider } from "./base-openai-compatible-provider" export class ZAiHandler extends BaseOpenAiCompatibleProvider { constructor(options: ApiHandlerOptions) { - const isChina = zaiApiLineConfigs[options.zaiApiLine ?? "international_coding"].isChina + const isChina = zaiApiLineConfigs[options.zaiApiLine ?? "international"].isChina const models = isChina ? mainlandZAiModels : internationalZAiModels const defaultModelId = isChina ? mainlandZAiDefaultModelId : internationalZAiDefaultModelId super({ ...options, providerName: "Z AI", - baseURL: zaiApiLineConfigs[options.zaiApiLine ?? "international_coding"].baseUrl, + baseURL: zaiApiLineConfigs[options.zaiApiLine ?? "international"].baseUrl, apiKey: options.zaiApiKey ?? "not-provided", defaultProviderModelId: defaultModelId, providerModels: models, diff --git a/webview-ui/src/components/settings/ModelInfoView.tsx b/webview-ui/src/components/settings/ModelInfoView.tsx index 138a55feba97..9e0f3217418d 100644 --- a/webview-ui/src/components/settings/ModelInfoView.tsx +++ b/webview-ui/src/components/settings/ModelInfoView.tsx @@ -102,12 +102,20 @@ export const ModelInfoView = ({ const infoItems = shouldShowTierPricingTable ? baseInfoItems : [...baseInfoItems, ...priceInfoItems] + // Localize provider-specific model descriptions when available + const zaiDescKey = `settings:providers.zaiModels.${selectedModelId}.description` + const zaiLocalizedDesc = apiProvider === "zai" ? t(zaiDescKey) : undefined + const descriptionToUse = + apiProvider === "zai" && zaiLocalizedDesc && zaiLocalizedDesc !== zaiDescKey + ? zaiLocalizedDesc + : modelInfo?.description + return ( <> - {modelInfo?.description && ( + {descriptionToUse && ( diff --git a/webview-ui/src/components/settings/providers/ZAi.tsx b/webview-ui/src/components/settings/providers/ZAi.tsx index c7f44510c134..cc6fec58f97b 100644 --- a/webview-ui/src/components/settings/providers/ZAi.tsx +++ b/webview-ui/src/components/settings/providers/ZAi.tsx @@ -33,14 +33,15 @@ export const ZAi = ({ apiConfiguration, setApiConfigurationField }: ZAiProps) =>
{zaiApiLineSchema.options.map((zaiApiLine) => { const config = zaiApiLineConfigs[zaiApiLine] + const label = t(`settings:providers.zaiEntrypointOptions.${zaiApiLine}`) return ( - {config.name} ({config.baseUrl}) + {label} ({config.baseUrl}) ) })} @@ -64,7 +65,7 @@ export const ZAi = ({ apiConfiguration, setApiConfigurationField }: ZAiProps) => {!apiConfiguration?.zaiApiKey && (