diff --git a/packages/shared/config/constant.ts b/packages/shared/config/constant.ts index af0191f4fa..0304d84675 100644 --- a/packages/shared/config/constant.ts +++ b/packages/shared/config/constant.ts @@ -233,7 +233,8 @@ export enum codeTools { geminiCli = 'gemini-cli', openaiCodex = 'openai-codex', iFlowCli = 'iflow-cli', - githubCopilotCli = 'github-copilot-cli' + githubCopilotCli = 'github-copilot-cli', + kimiCli = 'kimi-cli' } export enum terminalApps { diff --git a/src/main/services/CodeToolsService.ts b/src/main/services/CodeToolsService.ts index 755e1cc00f..9c0e60ed59 100644 --- a/src/main/services/CodeToolsService.ts +++ b/src/main/services/CodeToolsService.ts @@ -87,6 +87,8 @@ class CodeToolsService { return '@iflow-ai/iflow-cli' case codeTools.githubCopilotCli: return '@github/copilot' + case codeTools.kimiCli: + return 'kimi-cli' // Python package default: throw new Error(`Unsupported CLI tool: ${cliTool}`) } @@ -106,6 +108,8 @@ class CodeToolsService { return 'iflow' case codeTools.githubCopilotCli: return 'copilot' + case codeTools.kimiCli: + return 'kimi' default: throw new Error(`Unsupported CLI tool: ${cliTool}`) } @@ -647,6 +651,12 @@ class CodeToolsService { let baseCommand = isWin ? `"${executablePath}"` : `"${bunPath}" "${executablePath}"` + // Special handling for kimi-cli: use uvx instead of bun + if (cliTool === codeTools.kimiCli) { + const uvPath = path.join(os.homedir(), HOME_CHERRY_DIR, 'bin', await getBinaryName('uv')) + baseCommand = `${uvPath} tool run ${packageName}` + } + // Add configuration parameters for OpenAI Codex if (cliTool === codeTools.openaiCodex && env.OPENAI_MODEL_PROVIDER && env.OPENAI_MODEL_PROVIDER != 'openai') { const provider = env.OPENAI_MODEL_PROVIDER @@ -666,7 +676,11 @@ class CodeToolsService { const bunInstallPath = path.join(os.homedir(), HOME_CHERRY_DIR) - if (isInstalled) { + // Special handling for kimi-cli: uvx handles installation automatically + if (cliTool === codeTools.kimiCli) { + // uvx will automatically download and run kimi-cli, no need to install + // Just use the base command directly + } else if (isInstalled) { // If already installed, run executable directly (with optional update message) if (updateMessage) { baseCommand = `echo "Checking ${cliTool} version..."${updateMessage} && ${baseCommand}` diff --git a/src/renderer/src/pages/code/index.ts b/src/renderer/src/pages/code/index.ts index 5b30b8f8c5..333745dc55 100644 --- a/src/renderer/src/pages/code/index.ts +++ b/src/renderer/src/pages/code/index.ts @@ -22,7 +22,8 @@ export const CLI_TOOLS = [ { value: codeTools.geminiCli, label: 'Gemini CLI' }, { value: codeTools.openaiCodex, label: 'OpenAI Codex' }, { value: codeTools.iFlowCli, label: 'iFlow CLI' }, - { value: codeTools.githubCopilotCli, label: 'GitHub Copilot CLI' } + { value: codeTools.githubCopilotCli, label: 'GitHub Copilot CLI' }, + { value: codeTools.kimiCli, label: 'Kimi CLI' } ] export const GEMINI_SUPPORTED_PROVIDERS = ['aihubmix', 'dmxapi', 'new-api', 'cherryin'] @@ -59,7 +60,8 @@ export const CLI_TOOL_PROVIDER_MAP: Record Pr [codeTools.openaiCodex]: (providers) => providers.filter((p) => p.id === 'openai' || OPENAI_CODEX_SUPPORTED_PROVIDERS.includes(p.id)), [codeTools.iFlowCli]: (providers) => providers.filter((p) => p.type.includes('openai')), - [codeTools.githubCopilotCli]: () => [] + [codeTools.githubCopilotCli]: () => [], + [codeTools.kimiCli]: (providers) => providers.filter((p) => p.type.includes('openai')) } export const getCodeToolsApiBaseUrl = (model: Model, type: EndpointType) => { @@ -190,6 +192,12 @@ export const generateToolEnvironment = ({ case codeTools.githubCopilotCli: env.GITHUB_TOKEN = apiKey || '' break + + case codeTools.kimiCli: + env.KIMI_API_KEY = apiKey + env.KIMI_BASE_URL = formattedBaseUrl + env.KIMI_MODEL_NAME = model.id + break } return env