Umi 源码解析:如何实现一个coplilot智能助手

Umi 项目里,copilot 模块是一个命令行辅助工具,借助 OpenAI 的 ChatGPT 为用户提供更便捷的方式来使用 Umi 框架。下面详细介绍 umi/copilot/src/cli.ts 文件中 copilot 的具体作用。它的用法如下所示:

bash 复制代码
    Usage: umi-copilot [message]
        Options:
          --token     OpenAI API key
          --proxy-url Proxy URL for OpenAI API
          --cwd       Working directory
          --timeout   Timeout for OpenAI API, Default: 20000
          --help      Show help

        Examples:
          $ umi-copilot "I want to"

一、核心功能概述

copilot 的核心功能是让用户可以使用自然语言描述需求,它会调用 ChatGPT 分析需求并推荐合适的 Umi 命令,最后询问用户是否执行该命令。

二、具体作用详解

1. 解析命令行参数

ini 复制代码
const args = yParser(process.argv.slice(2), {
  alias: {
    help: ['h'],
  },
});
  • 借助 yParser 解析用户在命令行输入的参数。
  • 支持 --help 或 -h 参数,用于显示帮助信息。

2. 检查 OpenAI API 密钥

arduino 复制代码
const token = process.env.OPENAI_API_KEY || args.token;
if (!token) {
  throw new Error('Please set OPENAI_API_KEY or --token');
}
  • 检查是否设置了 OpenAI API 密钥,可通过环境变量 OPENAI_API_KEY 或者命令行参数 --token 来设置。
  • 若未设置,会抛出错误提示用户进行设置。

3. 与 ChatGPT 交互

php 复制代码
const commandRes = await sendMessage({
  messages: [
    {
      role: 'system',
      content: prompts.commands,
    },
    {
      role: 'user',
      content: message,
    },
  ],
  ...commonParams,
});
  • 把用户输入的自然语言需求发送给 ChatGPT,获取推荐的 Umi 命令。
  • 先发送 system 消息,包含命令提示信息,再发送 user 消息,包含用户的具体需求。

4. 验证推荐命令

javascript 复制代码
if (!prompts[willUseCommand]) {
  logger.warn(willUseCommand);
  throw new Error('No matching command');
}
  • 检查 ChatGPT 推荐的命令是否在预设的命令列表中。
  • 若不在,会发出警告并抛出错误。

5. 获取最终命令

php 复制代码
const questionRes = await sendMessage({
  messages: [
    {
      role: 'system',
      content: `${prompts[willUseCommand]}.无法根据要求返回命令时,给出提示`,
    },
    {
      role: 'user',
      content: message,
    },
  ],
  ...commonParams,
});
const command = questionRes.data.choices[0].message.content;
  • 再次与 ChatGPT 交互,获取最终要执行的命令。
  • 发送包含命令提示和用户需求的消息,获取 ChatGPT 的响应。

6. 验证最终命令

ini 复制代码
if (!/^[\w\s=-'"{}:.]+$/.test(command)) {
  logger.warn(command);
  return;
}
  • 对最终命令进行正则验证,确保其只包含合法字符。
  • 若不合法,会发出警告并终止操作。

7. 询问用户是否执行命令

ini 复制代码
const shouldRunCommand = await confirm({
  message: `Run the command?`,
});
if (shouldRunCommand === true) {
  // 执行命令
}
  • 使用 clackPrompts 的 confirm 方法询问用户是否执行推荐的命令。
  • 若用户同意,会执行后续的命令执行操作。

8. 查找 Umi 命令路径

javascript 复制代码
async function findUmiCommand(opts: { cwd: string }) {
  // 查找命令路径的逻辑
}
  • 尝试查找 max 或 umi 命令的路径,优先查找本地安装的命令,若未找到则查找全局安装的命令。

9. 执行命令

javascript 复制代码
const { $ } = await import('zx');
await $`${command.replace('umi', commandPath).split(' ')}`;
  • 使用 zx 库执行最终的命令。
  • 把命令中的 umi 替换为实际的命令路径,并将命令拆分为数组传递给 zx。

三、总结

copilot 的作用是简化 Umi 框架的命令行使用流程,让用户可以用自然语言描述需求,借助 ChatGPT 的智能分析能力获取合适的命令,并提供确认机制,确保用户安全地执行命令。

相关推荐
张较瘦_18 小时前
[论文阅读] AI + 软件工程 | LLM救场Serverless开发!SlsReuse框架让函数复用率飙升至91%,还快了44%
论文阅读·人工智能·软件工程
极限实验室18 小时前
INFINI Labs 产品更新 - Coco AI v0.9 与 Easysearch v2.0 全新功能上线,全面支持 GitLab 合并请求(MR)自动
数据库·人工智能·产品
还是转转20 小时前
AI Code Review 工具
人工智能·代码复审
艾莉丝努力练剑20 小时前
【Git:多人协作】Git多人协作实战:从同分支到多分支工作流
服务器·c++·人工智能·git·gitee·centos·项目管理
拓端研究室1 天前
专题:2025AI产业全景洞察报告:企业应用、技术突破与市场机遇|附920+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能·pdf
lumi.1 天前
Vue + Element Plus 实现AI文档解析与问答功能(含详细注释+核心逻辑解析)
前端·javascript·vue.js·人工智能
m0_650108241 天前
InstructBLIP:面向通用视觉语言模型的指令微调技术解析
论文阅读·人工智能·q-former·指令微调的视觉语言大模型·零样本跨任务泛化·通用视觉语言模型
金融小师妹1 天前
基于NLP语义解析的联储政策信号:强化学习框架下的12月降息概率回升动态建模
大数据·人工智能·深度学习·1024程序员节
AKAMAI1 天前
提升 EdgeWorker 可观测性:使用 DataStream 设置日志功能
人工智能·云计算
银空飞羽1 天前
让Trae CN SOLO自主发挥,看看能做出一个什么样的项目
前端·人工智能·trae