From af55cf7b1d367c3ecbbbc1a7248952eaefa41b25 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 27 May 2026 16:11:53 +0100 Subject: [PATCH] fix: map canonical kimi env auth --- src/llm/env-api-keys.test.ts | 29 +++++++++++++++++++++++++++++ src/llm/env-api-keys.ts | 9 ++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/llm/env-api-keys.test.ts b/src/llm/env-api-keys.test.ts index 0b5c258f8b0..879ab92968b 100644 --- a/src/llm/env-api-keys.test.ts +++ b/src/llm/env-api-keys.test.ts @@ -7,6 +7,9 @@ const envKeys = [ "GOOGLE_APPLICATION_CREDENTIALS", "GOOGLE_CLOUD_LOCATION", "GOOGLE_CLOUD_PROJECT", + "KIMI_API_KEY", + "KIMICODE_API_KEY", + "MOONSHOT_API_KEY", ] as const; const previousEnv = new Map(); @@ -61,6 +64,32 @@ describe("getEnvApiKey", () => { expect(getEnvApiKey("google-vertex")).toBe(""); }); + it("detects canonical Moonshot and Kimi provider credentials", async () => { + setEnv("MOONSHOT_API_KEY", "moonshot-key"); + setEnv("KIMI_API_KEY", "kimi-key"); + setEnv("KIMICODE_API_KEY", "kimicode-key"); + + vi.resetModules(); + const { findEnvKeys, getEnvApiKey } = await import("./env-api-keys.js"); + + expect(findEnvKeys("moonshot")).toEqual(["MOONSHOT_API_KEY", "KIMI_API_KEY"]); + expect(getEnvApiKey("moonshot")).toBe("moonshot-key"); + expect(findEnvKeys("kimi")).toEqual(["KIMI_API_KEY", "KIMICODE_API_KEY"]); + expect(getEnvApiKey("kimi")).toBe("kimi-key"); + expect(findEnvKeys("kimi-coding")).toEqual(["KIMI_API_KEY", "KIMICODE_API_KEY"]); + expect(getEnvApiKey("kimi-coding")).toBe("kimi-key"); + }); + + it("falls back to alternate canonical Kimi env vars", async () => { + setEnv("KIMICODE_API_KEY", "kimicode-key"); + + vi.resetModules(); + const { findEnvKeys, getEnvApiKey } = await import("./env-api-keys.js"); + + expect(findEnvKeys("kimi")).toEqual(["KIMICODE_API_KEY"]); + expect(getEnvApiKey("kimi")).toBe("kimicode-key"); + }); + it("does not cache missing Google Vertex ADC credentials", async () => { const dir = await mkdtemp(join(tmpdir(), "openclaw-vertex-adc-")); tempDirs.push(dir); diff --git a/src/llm/env-api-keys.ts b/src/llm/env-api-keys.ts index c7c9dfc29c1..13361cd18d0 100644 --- a/src/llm/env-api-keys.ts +++ b/src/llm/env-api-keys.ts @@ -145,6 +145,14 @@ function getApiKeyEnvVars(provider: string): readonly string[] | undefined { return ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"]; } + if (provider === "moonshot") { + return ["MOONSHOT_API_KEY", "KIMI_API_KEY"]; + } + + if (provider === "kimi" || provider === "kimi-coding") { + return ["KIMI_API_KEY", "KIMICODE_API_KEY"]; + } + const envMap: Record = { openai: "OPENAI_API_KEY", "azure-openai-responses": "AZURE_OPENAI_API_KEY", @@ -167,7 +175,6 @@ function getApiKeyEnvVars(provider: string): readonly string[] | undefined { together: "TOGETHER_API_KEY", opencode: "OPENCODE_API_KEY", "opencode-go": "OPENCODE_API_KEY", - "kimi-coding": "KIMI_API_KEY", "cloudflare-workers-ai": "CLOUDFLARE_API_KEY", "cloudflare-ai-gateway": "CLOUDFLARE_API_KEY", xiaomi: "XIAOMI_API_KEY",