Merge pull request #656 from mneves75/feat/minimax-api-auth-v2
Config: add MiniMax direct API authentication option
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
- Onboarding/Gateway: persist non-interactive gateway token auth in config; add WS wizard + gateway tool-calling regression coverage.
|
- Onboarding/Gateway: persist non-interactive gateway token auth in config; add WS wizard + gateway tool-calling regression coverage.
|
||||||
- CLI: `clawdbot sessions` now includes `elev:*` + `usage:*` flags in the table output.
|
- CLI: `clawdbot sessions` now includes `elev:*` + `usage:*` flags in the table output.
|
||||||
- Branding: normalize user-facing “ClawdBot”/“CLAWDBOT” → “Clawdbot” (CLI, status, docs).
|
- Branding: normalize user-facing “ClawdBot”/“CLAWDBOT” → “Clawdbot” (CLI, status, docs).
|
||||||
|
- Models/Auth: allow MiniMax API configs without `models.providers.minimax.apiKey` (auth profiles / `MINIMAX_API_KEY`). (#656) — thanks @mneves75.
|
||||||
|
|
||||||
## 2026.1.9
|
## 2026.1.9
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ import { healthCommand } from "./health.js";
|
|||||||
import { formatHealthCheckFailure } from "./health-format.js";
|
import { formatHealthCheckFailure } from "./health-format.js";
|
||||||
import {
|
import {
|
||||||
applyAuthProfileConfig,
|
applyAuthProfileConfig,
|
||||||
|
applyMinimaxApiConfig,
|
||||||
applyMinimaxConfig,
|
applyMinimaxConfig,
|
||||||
applyMinimaxHostedConfig,
|
applyMinimaxHostedConfig,
|
||||||
applyOpencodeZenConfig,
|
applyOpencodeZenConfig,
|
||||||
@@ -369,6 +370,7 @@ async function promptAuthConfig(
|
|||||||
| "gemini-api-key"
|
| "gemini-api-key"
|
||||||
| "apiKey"
|
| "apiKey"
|
||||||
| "minimax-cloud"
|
| "minimax-cloud"
|
||||||
|
| "minimax-api"
|
||||||
| "minimax"
|
| "minimax"
|
||||||
| "opencode-zen"
|
| "opencode-zen"
|
||||||
| "skip";
|
| "skip";
|
||||||
@@ -788,6 +790,21 @@ async function promptAuthConfig(
|
|||||||
next = applyMinimaxHostedConfig(next);
|
next = applyMinimaxHostedConfig(next);
|
||||||
} else if (authChoice === "minimax") {
|
} else if (authChoice === "minimax") {
|
||||||
next = applyMinimaxConfig(next);
|
next = applyMinimaxConfig(next);
|
||||||
|
} else if (authChoice === "minimax-api") {
|
||||||
|
const key = guardCancel(
|
||||||
|
await text({
|
||||||
|
message: "Enter MiniMax API key",
|
||||||
|
validate: (value) => (value?.trim() ? undefined : "Required"),
|
||||||
|
}),
|
||||||
|
runtime,
|
||||||
|
);
|
||||||
|
await setMinimaxApiKey(String(key).trim());
|
||||||
|
next = applyAuthProfileConfig(next, {
|
||||||
|
profileId: "minimax:default",
|
||||||
|
provider: "minimax",
|
||||||
|
mode: "api_key",
|
||||||
|
});
|
||||||
|
next = applyMinimaxApiConfig(next);
|
||||||
} else if (authChoice === "opencode-zen") {
|
} else if (authChoice === "opencode-zen") {
|
||||||
note(
|
note(
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -336,7 +336,7 @@ export function applyMinimaxApiProviderConfig(
|
|||||||
const providers = { ...cfg.models?.providers };
|
const providers = { ...cfg.models?.providers };
|
||||||
providers.minimax = {
|
providers.minimax = {
|
||||||
baseUrl: MINIMAX_API_BASE_URL,
|
baseUrl: MINIMAX_API_BASE_URL,
|
||||||
apiKey: "", // Resolved via MINIMAX_API_KEY env var or auth profile
|
// apiKey omitted: resolved via MINIMAX_API_KEY env var or auth profile by default.
|
||||||
api: "anthropic-messages",
|
api: "anthropic-messages",
|
||||||
models: [buildMinimaxApiModelDefinition(modelId)],
|
models: [buildMinimaxApiModelDefinition(modelId)],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -240,6 +240,57 @@ describe("config identity defaults", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("accepts blank model provider apiKey values", async () => {
|
||||||
|
await withTempHome(async (home) => {
|
||||||
|
const configDir = path.join(home, ".clawdbot");
|
||||||
|
await fs.mkdir(configDir, { recursive: true });
|
||||||
|
await fs.writeFile(
|
||||||
|
path.join(configDir, "clawdbot.json"),
|
||||||
|
JSON.stringify(
|
||||||
|
{
|
||||||
|
models: {
|
||||||
|
mode: "merge",
|
||||||
|
providers: {
|
||||||
|
minimax: {
|
||||||
|
baseUrl: "https://api.minimax.io/anthropic",
|
||||||
|
apiKey: "",
|
||||||
|
api: "anthropic-messages",
|
||||||
|
models: [
|
||||||
|
{
|
||||||
|
id: "MiniMax-M2.1",
|
||||||
|
name: "MiniMax M2.1",
|
||||||
|
reasoning: false,
|
||||||
|
input: ["text"],
|
||||||
|
cost: {
|
||||||
|
input: 0,
|
||||||
|
output: 0,
|
||||||
|
cacheRead: 0,
|
||||||
|
cacheWrite: 0,
|
||||||
|
},
|
||||||
|
contextWindow: 200000,
|
||||||
|
maxTokens: 8192,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
"utf-8",
|
||||||
|
);
|
||||||
|
|
||||||
|
vi.resetModules();
|
||||||
|
const { loadConfig } = await import("./config.js");
|
||||||
|
const cfg = loadConfig();
|
||||||
|
|
||||||
|
expect(cfg.models?.providers?.minimax?.baseUrl).toBe(
|
||||||
|
"https://api.minimax.io/anthropic",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it("respects empty responsePrefix to disable identity defaults", async () => {
|
it("respects empty responsePrefix to disable identity defaults", async () => {
|
||||||
await withTempHome(async (home) => {
|
await withTempHome(async (home) => {
|
||||||
const configDir = path.join(home, ".clawdbot");
|
const configDir = path.join(home, ".clawdbot");
|
||||||
|
|||||||
@@ -1201,7 +1201,7 @@ export type ModelDefinitionConfig = {
|
|||||||
|
|
||||||
export type ModelProviderConfig = {
|
export type ModelProviderConfig = {
|
||||||
baseUrl: string;
|
baseUrl: string;
|
||||||
apiKey: string;
|
apiKey?: string;
|
||||||
api?: ModelApi;
|
api?: ModelApi;
|
||||||
headers?: Record<string, string>;
|
headers?: Record<string, string>;
|
||||||
authHeader?: boolean;
|
authHeader?: boolean;
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ const ModelDefinitionSchema = z.object({
|
|||||||
|
|
||||||
const ModelProviderSchema = z.object({
|
const ModelProviderSchema = z.object({
|
||||||
baseUrl: z.string().min(1),
|
baseUrl: z.string().min(1),
|
||||||
apiKey: z.string().min(1),
|
apiKey: z.string().optional(),
|
||||||
api: ModelApiSchema.optional(),
|
api: ModelApiSchema.optional(),
|
||||||
headers: z.record(z.string(), z.string()).optional(),
|
headers: z.record(z.string(), z.string()).optional(),
|
||||||
authHeader: z.boolean().optional(),
|
authHeader: z.boolean().optional(),
|
||||||
|
|||||||
Reference in New Issue
Block a user