From 1b81dc7dc38d7284777159815f3ab26f6631f5f7 Mon Sep 17 00:00:00 2001 From: Marc Liu Date: Mon, 27 Jul 2026 13:25:00 -0400 Subject: [PATCH 1/2] fix: relabel GLM provider display to Z.ai MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GLM is the model family (GLM-5, GLM-5.2...), not the provider/company (Zhipu AI, internationally branded Z.ai). The provider was labelled "GLM" next to models named "GLM-5" — confusing and redundant. This is a display-only rename; the internal provider id 'glm', model ids, aliases, family, registry routing, settings.json keys, env vars (GLM_API_KEY / ZHIPU_API_KEY), stored credentials, and brand color are all unchanged, so existing sessions/configs keep working with no migration. User-facing provider labels updated to "Z.ai": - GlmProvider.displayName (was 'GLM (智谱AI)') - credential-probe providerName (surfaces in health-check errors) - buildSdkConfig missing-key error - credential-discovery BUILT_IN_PROVIDER_ENV_MAP displayName - useModelSwitcher PROVIDER_LABELS (picker group header) - AddProviderModal preset displayName (description stays 'Zhipu AI models', matching the Kimi -> 'Moonshot AI models' precedent) - provider-brand KNOWN_PROVIDER_LABELS (trailing-tag stripper) Model names (GLM-5, GLM-5.1, GLM-5.2, GLM-5-Turbo, GLM-5V-Turbo, GLM-4.7) are intentionally unchanged — GLM is the model name. --- packages/daemon/src/lib/credential-discovery.ts | 2 +- packages/daemon/src/lib/providers/glm-provider.ts | 7 ++++--- packages/daemon/tests/online/glm/glm-provider.test.ts | 4 ++-- .../tests/unit/1-core/providers/glm-provider.test.ts | 8 ++++---- packages/shared/src/types.ts | 2 +- packages/web/src/components/settings/AddProviderModal.tsx | 2 +- packages/web/src/hooks/__tests__/useModelSwitcher.test.ts | 2 +- packages/web/src/hooks/useModelSwitcher.ts | 2 +- packages/web/src/lib/provider-brand.ts | 2 +- 9 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/daemon/src/lib/credential-discovery.ts b/packages/daemon/src/lib/credential-discovery.ts index fa3f51feb7..773e9dafd6 100644 --- a/packages/daemon/src/lib/credential-discovery.ts +++ b/packages/daemon/src/lib/credential-discovery.ts @@ -154,7 +154,7 @@ const BUILT_IN_PROVIDER_ENV_MAP: BuiltInProviderEnvMapping[] = [ }, { providerId: 'glm', - displayName: 'GLM', + displayName: 'Z.ai', envVar: 'GLM_API_KEY', altEnvVar: 'ZHIPU_API_KEY', authType: 'api_key', diff --git a/packages/daemon/src/lib/providers/glm-provider.ts b/packages/daemon/src/lib/providers/glm-provider.ts index c0e23b0343..0a82352523 100644 --- a/packages/daemon/src/lib/providers/glm-provider.ts +++ b/packages/daemon/src/lib/providers/glm-provider.ts @@ -24,7 +24,8 @@ import { probeAnthropicCompatCredentials } from './shared/credential-probe.js'; */ export class GlmProvider implements Provider { readonly id = 'glm'; - readonly displayName = 'GLM (智谱AI)'; + // GLM is the model family; the provider/company is Zhipu AI, branded Z.ai. + readonly displayName = 'Z.ai'; readonly capabilities: ProviderCapabilities = { streaming: true, @@ -212,7 +213,7 @@ export class GlmProvider implements Provider { baseUrl, apiKey, model: 'glm-5-turbo', - providerName: 'GLM', + providerName: 'Z.ai', fetchImpl: this.fetchImpl, }) .then(() => undefined) @@ -269,7 +270,7 @@ export class GlmProvider implements Provider { // Get API key: session override > global env const apiKey = sessionConfig?.apiKey || this.getApiKey(); if (!apiKey) { - throw new Error('GLM API key not configured'); + throw new Error('Z.ai API key not configured'); } // Get base URL: session override > default diff --git a/packages/daemon/tests/online/glm/glm-provider.test.ts b/packages/daemon/tests/online/glm/glm-provider.test.ts index 2abfad0fbd..d06b7933c1 100644 --- a/packages/daemon/tests/online/glm/glm-provider.test.ts +++ b/packages/daemon/tests/online/glm/glm-provider.test.ts @@ -1,5 +1,5 @@ /** - * Integration tests for GLM (智谱AI) provider support + * Integration tests for the Z.ai (智谱AI) provider (model family: GLM) * * Covers: * 1. ProviderService — GLM availability, provider listing, model defaults, provider switching @@ -81,7 +81,7 @@ describe('GLM Provider Integration', () => { // Find GLM const glm = providers.find((p) => p.id === 'glm'); expect(glm).toBeDefined(); - expect(glm!.name).toBe('GLM (智谱AI)'); + expect(glm!.name).toBe('Z.ai'); // Note: baseUrl is now undefined in the new provider system (legacy field) expect(glm!.baseUrl).toBeUndefined(); }); diff --git a/packages/daemon/tests/unit/1-core/providers/glm-provider.test.ts b/packages/daemon/tests/unit/1-core/providers/glm-provider.test.ts index 0fe346114e..75777f433b 100644 --- a/packages/daemon/tests/unit/1-core/providers/glm-provider.test.ts +++ b/packages/daemon/tests/unit/1-core/providers/glm-provider.test.ts @@ -28,7 +28,7 @@ describe('GlmProvider', () => { }); it('should have correct display name', () => { - expect(provider.displayName).toBe('GLM (智谱AI)'); + expect(provider.displayName).toBe('Z.ai'); }); it('should have correct capabilities', () => { @@ -142,7 +142,7 @@ describe('GlmProvider', () => { ) as unknown as typeof fetch; provider = new GlmProvider(process.env, fetchImpl); - expect(provider.getModels()).rejects.toThrow('GLM API key rejected (HTTP 401)'); + expect(provider.getModels()).rejects.toThrow('Z.ai API key rejected (HTTP 401)'); }); it('throws when probe fails at the network layer', async () => { @@ -152,7 +152,7 @@ describe('GlmProvider', () => { }) as unknown as typeof fetch; provider = new GlmProvider(process.env, fetchImpl); - expect(provider.getModels()).rejects.toThrow('GLM probe failed: ENOTFOUND'); + expect(provider.getModels()).rejects.toThrow('Z.ai probe failed: ENOTFOUND'); }); it('caches successful probe for 30s so repeated calls do not re-probe', async () => { @@ -372,7 +372,7 @@ describe('GlmProvider', () => { delete process.env.GLM_API_KEY; delete process.env.ZHIPU_API_KEY; - expect(() => provider.buildSdkConfig('glm-5')).toThrow('GLM API key not configured'); + expect(() => provider.buildSdkConfig('glm-5')).toThrow('Z.ai API key not configured'); }); }); diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index d868d819c0..7c6c459784 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -179,7 +179,7 @@ export type { RuntimeState } from './types/neo'; /** * Supported AI providers * - 'anthropic': Default Claude API provider - * - 'glm': GLM (智谱AI) via Anthropic-compatible API + * - 'glm': Z.ai (智谱AI) via Anthropic-compatible API * - 'minimax': MiniMax via Anthropic-compatible API * - 'kimi': Kimi (Moonshot AI) via Anthropic-compatible API * - 'openrouter': OpenRouter Anthropic-compatible API gateway diff --git a/packages/web/src/components/settings/AddProviderModal.tsx b/packages/web/src/components/settings/AddProviderModal.tsx index 06c8484f04..45079da502 100644 --- a/packages/web/src/components/settings/AddProviderModal.tsx +++ b/packages/web/src/components/settings/AddProviderModal.tsx @@ -58,7 +58,7 @@ const QUICK_ADD_PROVIDERS: BuiltInProviderPreset[] = [ }, { providerId: 'glm', - displayName: 'GLM', + displayName: 'Z.ai', authType: 'api_key', description: 'Zhipu AI models', }, diff --git a/packages/web/src/hooks/__tests__/useModelSwitcher.test.ts b/packages/web/src/hooks/__tests__/useModelSwitcher.test.ts index 447f49b8bb..182413f65e 100644 --- a/packages/web/src/hooks/__tests__/useModelSwitcher.test.ts +++ b/packages/web/src/hooks/__tests__/useModelSwitcher.test.ts @@ -164,7 +164,7 @@ describe('useModelSwitcher', () => { describe('getProviderLabel', () => { it('should return correct label for known providers', () => { expect(getProviderLabel('anthropic')).toBe('Anthropic'); - expect(getProviderLabel('glm')).toBe('GLM'); + expect(getProviderLabel('glm')).toBe('Z.ai'); expect(getProviderLabel('kimi')).toBe('Kimi'); expect(getProviderLabel('minimax')).toBe('MiniMax'); expect(getProviderLabel('openrouter')).toBe('OpenRouter'); diff --git a/packages/web/src/hooks/useModelSwitcher.ts b/packages/web/src/hooks/useModelSwitcher.ts index 20fadb469e..5a41ee129a 100644 --- a/packages/web/src/hooks/useModelSwitcher.ts +++ b/packages/web/src/hooks/useModelSwitcher.ts @@ -244,7 +244,7 @@ export function groupModelsByProvider(models: ModelInfo[]): Map = { anthropic: 'Anthropic', - glm: 'GLM', + glm: 'Z.ai', kimi: 'Kimi', minimax: 'MiniMax', openrouter: 'OpenRouter', diff --git a/packages/web/src/lib/provider-brand.ts b/packages/web/src/lib/provider-brand.ts index 6724fb8d82..b9492f0365 100644 --- a/packages/web/src/lib/provider-brand.ts +++ b/packages/web/src/lib/provider-brand.ts @@ -85,7 +85,7 @@ const AGGREGATOR_PROVIDERS = new Set(['openrouter']); // "(free)", "(preview)", or "(1M context)" that disambiguate models. const KNOWN_PROVIDER_LABELS = [ 'Anthropic', - 'GLM', + 'Z.ai', 'Kimi', 'MiniMax', 'OpenRouter', From 2557e7a4c3088b5566265ee7dd7478ff48e39a21 Mon Sep 17 00:00:00 2001 From: Marc Liu Date: Mon, 27 Jul 2026 13:32:53 -0400 Subject: [PATCH 2/2] fix: relabel GLM provider in query-runner auth error to Z.ai MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review feedback on #2273 (P2): the no-auth-configured error in query-runner.ts listed "Anthropic or GLM" — GLM as a peer of Anthropic is the provider/company, which should read Z.ai. Missed in the first pass because query-runner.ts was outside the task's Key files list. --- packages/daemon/src/lib/agent/query-runner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/daemon/src/lib/agent/query-runner.ts b/packages/daemon/src/lib/agent/query-runner.ts index e432f57b31..d28c9fcad9 100644 --- a/packages/daemon/src/lib/agent/query-runner.ts +++ b/packages/daemon/src/lib/agent/query-runner.ts @@ -521,7 +521,7 @@ export class QueryRunner { if (!hasAuth) { const authError = new Error( - 'No authentication configured. Please set up API key for Anthropic or GLM.' + 'No authentication configured. Please set up API key for Anthropic or Z.ai.' ); await errorManager.handleError( session.id,