151 lines
4.3 KiB
TypeScript
151 lines
4.3 KiB
TypeScript
import { app } from '../app.ts';
|
|
import { z } from 'zod';
|
|
import { chalk } from '@/module/chalk.ts';
|
|
import path from 'node:path';
|
|
import os from 'node:os';
|
|
import fs from 'node:fs';
|
|
import { select } from '@inquirer/prompts';
|
|
import { useKey } from '@kevisual/context';
|
|
|
|
const MODELS = ['minimax', 'glm', 'volcengine', 'bailian'] as const;
|
|
|
|
const changeMinimax = (token?: string) => {
|
|
const auth_token = token || useKey("MINIMAX_API_KEY")
|
|
const MINIMAX_MODEL = useKey("MINIMAX_MODEL") || "MiniMax-M2.5"
|
|
return {
|
|
"env": {
|
|
"ANTHROPIC_AUTH_TOKEN": auth_token,
|
|
"ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
|
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": MINIMAX_MODEL,
|
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": MINIMAX_MODEL,
|
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": MINIMAX_MODEL,
|
|
"ANTHROPIC_MODEL": MINIMAX_MODEL,
|
|
"API_TIMEOUT_MS": "3000000",
|
|
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1
|
|
}
|
|
}
|
|
}
|
|
|
|
const changeGLM = (token?: string) => {
|
|
const auth_token = token || useKey('ZHIPU_API_KEY')
|
|
return {
|
|
"env": {
|
|
"ANTHROPIC_AUTH_TOKEN": auth_token,
|
|
"ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic",
|
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-4.7",
|
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-4.7",
|
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-4.7",
|
|
"ANTHROPIC_MODEL": "glm-4.7"
|
|
}
|
|
}
|
|
}
|
|
|
|
const changeVolcengine = (token?: string) => {
|
|
const auth_token = token || useKey('VOLCENGINE_API_KEY')
|
|
return {
|
|
"env": {
|
|
"ANTHROPIC_AUTH_TOKEN": auth_token,
|
|
"ANTHROPIC_BASE_URL": "https://ark.cn-beijing.volces.com/api/coding",
|
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "ark-code-latest",
|
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": "ark-code-latest",
|
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": "ark-code-latest",
|
|
"ANTHROPIC_MODEL": "ark-code-latest",
|
|
"API_TIMEOUT_MS": "3000000"
|
|
}
|
|
}
|
|
}
|
|
|
|
const changeBailian = (token?: string) => {
|
|
const auth_token = token || useKey('BAILIAN_API_KEY')
|
|
return {
|
|
"env": {
|
|
"ANTHROPIC_AUTH_TOKEN": auth_token,
|
|
"ANTHROPIC_BASE_URL": "https://coding.dashscope.aliyuncs.com/apps/anthropic",
|
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3-coder-plus",
|
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3-coder-plus",
|
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3-coder-plus",
|
|
"ANTHROPIC_MODEL": "qwen3-coder-plus"
|
|
},
|
|
"includeCoAuthoredBy": false
|
|
}
|
|
}
|
|
|
|
const changeNoCheck = () => {
|
|
const homeDir = os.homedir();
|
|
const claudeConfigPath = path.join(homeDir, '.claude.json');
|
|
|
|
let claudeConfig = {};
|
|
if (fs.existsSync(claudeConfigPath)) {
|
|
const content = fs.readFileSync(claudeConfigPath, 'utf-8');
|
|
try {
|
|
claudeConfig = JSON.parse(content);
|
|
} catch {
|
|
claudeConfig = {};
|
|
}
|
|
}
|
|
|
|
claudeConfig = {
|
|
...claudeConfig,
|
|
hasCompletedOnboarding: true
|
|
};
|
|
|
|
fs.writeFileSync(claudeConfigPath, JSON.stringify(claudeConfig, null, 2));
|
|
}
|
|
|
|
const modelConfig: Record<string, (token?: string) => object> = {
|
|
minimax: changeMinimax,
|
|
glm: changeGLM,
|
|
volcengine: changeVolcengine,
|
|
bailian: changeBailian,
|
|
};
|
|
|
|
const readOrCreateConfig = (configPath: string): Record<string, unknown> => {
|
|
if (fs.existsSync(configPath)) {
|
|
const content = fs.readFileSync(configPath, 'utf-8');
|
|
try {
|
|
return JSON.parse(content);
|
|
} catch {
|
|
return {};
|
|
}
|
|
}
|
|
return {};
|
|
};
|
|
|
|
const saveConfig = (configPath: string, config: Record<string, unknown>) => {
|
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
};
|
|
|
|
app.route({
|
|
path: 'cc',
|
|
key: 'main',
|
|
description: '切换claude code模型',
|
|
metadata: {
|
|
middleware: ['auth'],
|
|
args: {
|
|
models: z.string().optional().describe(`选择模型: ${MODELS.join(' | ')}`),
|
|
}
|
|
}
|
|
}).define(async (ctx) => {
|
|
const configPath = path.join(os.homedir(), '.claude/settings.json');
|
|
const config = readOrCreateConfig(configPath);
|
|
|
|
let selectedModel: string;
|
|
if (ctx.args.models && MODELS.includes(ctx.args.models as any)) {
|
|
selectedModel = ctx.args.models;
|
|
} else {
|
|
selectedModel = await select({
|
|
message: '请选择模型:',
|
|
choices: MODELS,
|
|
});
|
|
}
|
|
|
|
const updateConfig = modelConfig[selectedModel]();
|
|
Object.assign(config, updateConfig);
|
|
|
|
saveConfig(configPath, config);
|
|
changeNoCheck();
|
|
|
|
console.log(`已切换到模型: ${chalk.green(selectedModel)}`);
|
|
console.log(`配置已保存到: ${configPath}`);
|
|
}).addTo(app)
|