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, 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',