fix(web-search): allow MiniMax OAuth search credentials

Co-authored-by: 周鹤0668001310 <zhou.he3@xydigit.com>
This commit is contained in:
Peter Steinberger
2026-05-02 05:42:43 +01:00
parent 40c8ce844c
commit f2370b769c
12 changed files with 68 additions and 35 deletions

View File

@@ -246,7 +246,7 @@ describe("minimax provider hooks", () => {
expect(webSearchProviders[0]).toMatchObject({
id: "minimax",
label: "MiniMax Search",
envVars: ["MINIMAX_CODE_PLAN_KEY", "MINIMAX_CODING_API_KEY"],
envVars: ["MINIMAX_CODE_PLAN_KEY", "MINIMAX_CODING_API_KEY", "MINIMAX_OAUTH_TOKEN"],
});
});

View File

@@ -12,6 +12,7 @@ const MINIMAX_API_KEY = process.env.MINIMAX_API_KEY?.trim() ?? "";
const MINIMAX_SEARCH_KEY =
process.env.MINIMAX_CODE_PLAN_KEY?.trim() ||
process.env.MINIMAX_CODING_API_KEY?.trim() ||
process.env.MINIMAX_OAUTH_TOKEN?.trim() ||
MINIMAX_API_KEY ||
"";
const MINIMAX_TTS_TOKEN_PLAN_KEY =

View File

@@ -97,8 +97,8 @@
},
"uiHints": {
"webSearch.apiKey": {
"label": "MiniMax Coding Plan key",
"help": "MiniMax Coding Plan key (fallback: MINIMAX_CODE_PLAN_KEY, MINIMAX_CODING_API_KEY, or MINIMAX_API_KEY if it already points at a coding-plan token).",
"label": "MiniMax Token Plan key",
"help": "MiniMax Token Plan key or OAuth token (fallback: MINIMAX_CODE_PLAN_KEY, MINIMAX_CODING_API_KEY, MINIMAX_OAUTH_TOKEN, or MINIMAX_API_KEY if it already points at a token-plan credential).",
"sensitive": true,
"placeholder": "sk-cp-..."
},

View File

@@ -26,7 +26,11 @@ import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
const MINIMAX_SEARCH_ENDPOINT_GLOBAL = "https://api.minimax.io/v1/coding_plan/search";
const MINIMAX_SEARCH_ENDPOINT_CN = "https://api.minimaxi.com/v1/coding_plan/search";
const MINIMAX_CODING_PLAN_ENV_VARS = ["MINIMAX_CODE_PLAN_KEY", "MINIMAX_CODING_API_KEY"] as const;
const MINIMAX_TOKEN_PLAN_ENV_VARS = [
"MINIMAX_CODE_PLAN_KEY",
"MINIMAX_CODING_API_KEY",
"MINIMAX_OAUTH_TOKEN",
] as const;
type MiniMaxSearchResult = {
title?: string;
@@ -51,7 +55,7 @@ type MiniMaxSearchResponse = {
function resolveMiniMaxApiKey(searchConfig?: SearchConfigRecord): string | undefined {
return (
readConfiguredSecretString(searchConfig?.apiKey, "tools.web.search.apiKey") ??
readProviderEnvValue([...MINIMAX_CODING_PLAN_ENV_VARS, "MINIMAX_API_KEY"])
readProviderEnvValue([...MINIMAX_TOKEN_PLAN_ENV_VARS, "MINIMAX_API_KEY"])
);
}
@@ -182,7 +186,7 @@ async function runMiniMaxSearch(params: {
function missingMiniMaxKeyPayload() {
return {
error: "missing_minimax_api_key",
message: `web_search (minimax) needs a MiniMax Coding Plan key. Run \`${formatCliCommand("openclaw configure --section web")}\` to store it, or set MINIMAX_CODE_PLAN_KEY, MINIMAX_CODING_API_KEY, or MINIMAX_API_KEY in the Gateway environment.`,
message: `web_search (minimax) needs a MiniMax Token Plan key or OAuth token. Run \`${formatCliCommand("openclaw configure --section web")}\` to store it, or set MINIMAX_CODE_PLAN_KEY, MINIMAX_CODING_API_KEY, MINIMAX_OAUTH_TOKEN, or MINIMAX_API_KEY in the Gateway environment.`,
docs: "https://docs.openclaw.ai/tools/web",
};
}

View File

@@ -13,12 +13,14 @@ describe("minimax web search provider", () => {
const originalApiHost = process.env.MINIMAX_API_HOST;
const originalCodePlanKey = process.env.MINIMAX_CODE_PLAN_KEY;
const originalCodingApiKey = process.env.MINIMAX_CODING_API_KEY;
const originalOauthToken = process.env.MINIMAX_OAUTH_TOKEN;
const originalApiKey = process.env.MINIMAX_API_KEY;
beforeEach(() => {
delete process.env.MINIMAX_API_HOST;
delete process.env.MINIMAX_CODE_PLAN_KEY;
delete process.env.MINIMAX_CODING_API_KEY;
delete process.env.MINIMAX_OAUTH_TOKEN;
delete process.env.MINIMAX_API_KEY;
});
@@ -26,6 +28,7 @@ describe("minimax web search provider", () => {
process.env.MINIMAX_API_HOST = originalApiHost;
process.env.MINIMAX_CODE_PLAN_KEY = originalCodePlanKey;
process.env.MINIMAX_CODING_API_KEY = originalCodingApiKey;
process.env.MINIMAX_OAUTH_TOKEN = originalOauthToken;
process.env.MINIMAX_API_KEY = originalApiKey;
});
@@ -130,7 +133,7 @@ describe("minimax web search provider", () => {
expect(resolveMiniMaxApiKey({ apiKey: "configured-key" })).toBe("configured-key");
});
it("accepts MINIMAX_CODING_API_KEY as a coding-plan alias", () => {
it("accepts MINIMAX_CODING_API_KEY as a token-plan alias", () => {
process.env.MINIMAX_CODING_API_KEY = "coding-key";
expect(resolveMiniMaxApiKey()).toBe("coding-key");
});
@@ -139,6 +142,12 @@ describe("minimax web search provider", () => {
process.env.MINIMAX_API_KEY = "plain-key";
expect(resolveMiniMaxApiKey()).toBe("plain-key");
});
it("accepts MINIMAX_OAUTH_TOKEN before the legacy API-key fallback", () => {
process.env.MINIMAX_OAUTH_TOKEN = "oauth-token";
process.env.MINIMAX_API_KEY = "plain-key";
expect(resolveMiniMaxApiKey()).toBe("oauth-token");
});
});
describe("endpoint constants", () => {

View File

@@ -4,7 +4,11 @@ import {
} from "openclaw/plugin-sdk/provider-web-search-config-contract";
const MINIMAX_CREDENTIAL_PATH = "plugins.entries.minimax.config.webSearch.apiKey";
const MINIMAX_CODING_PLAN_ENV_VARS = ["MINIMAX_CODE_PLAN_KEY", "MINIMAX_CODING_API_KEY"] as const;
const MINIMAX_TOKEN_PLAN_ENV_VARS = [
"MINIMAX_CODE_PLAN_KEY",
"MINIMAX_CODING_API_KEY",
"MINIMAX_OAUTH_TOKEN",
] as const;
type MiniMaxWebSearchRuntime = typeof import("./minimax-web-search-provider.runtime.js");
@@ -32,9 +36,9 @@ export function createMiniMaxWebSearchProvider(): WebSearchProviderPlugin {
return {
id: "minimax",
label: "MiniMax Search",
hint: "Structured results via MiniMax Coding Plan search API",
credentialLabel: "MiniMax Coding Plan key",
envVars: [...MINIMAX_CODING_PLAN_ENV_VARS],
hint: "Structured results via MiniMax Token Plan search API",
credentialLabel: "MiniMax Token Plan key or OAuth token",
envVars: [...MINIMAX_TOKEN_PLAN_ENV_VARS],
placeholder: "sk-cp-...",
signupUrl: "https://platform.minimax.io/user-center/basic-information/interface-key",
docsUrl: "https://docs.openclaw.ai/tools/minimax-search",

View File

@@ -3,7 +3,11 @@ import {
type WebSearchProviderPlugin,
} from "openclaw/plugin-sdk/provider-web-search-config-contract";
const MINIMAX_CODING_PLAN_ENV_VARS = ["MINIMAX_CODE_PLAN_KEY", "MINIMAX_CODING_API_KEY"] as const;
const MINIMAX_TOKEN_PLAN_ENV_VARS = [
"MINIMAX_CODE_PLAN_KEY",
"MINIMAX_CODING_API_KEY",
"MINIMAX_OAUTH_TOKEN",
] as const;
export function createMiniMaxWebSearchProvider(): WebSearchProviderPlugin {
const credentialPath = "plugins.entries.minimax.config.webSearch.apiKey";
@@ -11,9 +15,9 @@ export function createMiniMaxWebSearchProvider(): WebSearchProviderPlugin {
return {
id: "minimax",
label: "MiniMax Search",
hint: "Structured results via MiniMax Coding Plan search API",
credentialLabel: "MiniMax Coding Plan key",
envVars: [...MINIMAX_CODING_PLAN_ENV_VARS],
hint: "Structured results via MiniMax Token Plan search API",
credentialLabel: "MiniMax Token Plan key or OAuth token",
envVars: [...MINIMAX_TOKEN_PLAN_ENV_VARS],
placeholder: "sk-cp-...",
signupUrl: "https://platform.minimax.io/user-center/basic-information/interface-key",
docsUrl: "https://docs.openclaw.ai/tools/minimax-search",