前端开发神器之 VsCode AI 辅助插件 DevChat

news2024/11/15 4:48:14

目录

  • 前言
  • DevChat介绍
  • DevChat 独特优势
    • 注册账号
    • 安装插件
    • 设置密钥访问
    • 指令
    • AI 解疑
  • 最后

#AI编程助手哪家好?DevChat“真”好用 #

前言

我们都有过写代码时反复看了半天也不知道bug在哪,大大浪费了时间。一些基础的代码可能看一会儿能够解决,但是复杂的代码就要花上一二个小时去检查,甚至更久。如果有个AI工具,可以帮助我们搞定基础代码,复杂的逻辑给我们提供给逻辑,那岂不是更好啦。本文给大家介绍一款VS Code AI辅助工具-DevChat,开发效率直接翻倍!

DevChat介绍

在这里插入图片描述
DevChat 是一个集成了多种主流大模型的 AI 编程工具,专注于提升程序员的编程效率。它整合了ChatGPT等热门 AI 应用,支持自然语言编程、代码编写、代码生成、代码补全等功能。Devchat 最大的优势是一站式服务,集成热门大模型,并且可以根据需求随心切换,省去了选择和整合不同AI模型的麻烦,无需过多配置就可以快速上手,从而全面提升开发效率。

产品务实高效,近期还在2023QCon全球软件大会亮相,斩获众多圈内开发者的好评 |

DevChat 独特优势

DevChat 兼容多种主流大模型,多种模板快速响应,不用纠结AI编程助手哪家好,大模型包括GPT-4 8k/32k、GPT-3.5 4k/16k、Claude2、文心一言、星火、ChatGLM、Code Llama等;可根据需求选择代码片段进行AI咨询。所以DevChat AI辅助工具对开发者提高工作效率真的很有帮助,具体优势如下:

1、多种大模型任意选。复杂任务非 GPT-4 莫属,简单任务交给低成本模型,组合使用效能最佳。

2、精准的“上下文”管理。对上下文的精确控制是有效使用人工智能的关键。DevChat 将控制权交给用户,以实现真正的生产力,并提供用户友好的方法来简化上下文选择。

3、上手简单。您不必学习特定编程语言的新框架来扩展人工智能以满足您的需求。 提示应该对用户可见且易于编辑,而不是隐藏在复杂的框架中。您不需要复杂的框架来让人工智能为您服务。所需要的只是一个在您的文件系统上运行的标准编辑器。

4、实用。利用人工智能编码能力的瓶颈在于如何在提示中嵌入正确的上下文,仅当人工智能真正增加价值时才使用它

5、简单可扩展的提示词目录。开放提示词扩展,Prompts as Code,满足团队和个人自定义需求。

6、灵活的 Prompt 模板管理,ask-code功能解答代码库的各类问题。

7、产品设计务实,迭代反馈快。

8、代码和文档自由生成,而非简单补全。

9、对接微软 Azure 服务,可信赖的企业级数据安全

官方地址:https://meri.co/tvy

注册账号

DevChat账号注册地址:链接直达,注册之后发送到邮箱的key,注意保存下来,在安装插件之后需要用到。

安装插件

打开VS Code开发工具,在应用市场搜索DevChat,然后点击install
在这里插入图片描述
安装完之后就可以在侧边栏有个类似小兔子图标,点击之后就可以看到插件的视图。

设置密钥访问

插件需要密钥访问,密钥是在注册时发送到邮箱里的。

在 Visual Studio Code 中按 ⇧⌘P / Ctrl+Shift+PF1 打开命令面板。接下来,输入devchat access key并输入上面的访问密钥。注意不要忘记安装Python 3.8+和Git来使用 DevChat。

在这里插入图片描述
然后输入邮箱里的key就可以啦
在这里插入图片描述
之后就可以正常使用啦!

指令

DevChat提供了下面的指令,方便了我们在开发时的操作以及对代码的分析。

  • 自定义本地命令
    单击此项并输入您想要的命令以运行。返回将被添加到上下文中。
  • git diff --cached
    自上次提交以来已暂存的更改
  • git diff HEAD
    自上次提交以来的所有更改
  • git log for release note
    自指定提交以来的格式化提交历史记录
  • symbol definitions
    在所选代码中查找类、函数等的相关定义
  • symbol references
    查找引用所选符号(类、函数、变量等)的代码站点

比如我要用symbol references分析下面的代码:

let transAudioData = {
  transcode(audioData) {
    let output = transAudioData.to16kHz(audioData)
    output = transAudioData.to16BitPCM(output)
    output = Array.from(new Uint8Array(output.buffer))
    self.postMessage(output)
    // return output
  },

选择symbol references之后,可以看到控制台中的OUTPUT输出一段JSON。
在这里插入图片描述
将图中的字符串转JSON之后如下:

{
    "languageId": "javascript",
    "path": "../study-demo/kedaxunfei/src/until/transcode.worker.js",
    "startLine": 6,
    "content": "  transcode(audioData) {\r\n    let output = transAudioData.to16kHz(audioData)\r\n    output = transAudioData.to16BitPCM(output)\r\n    output = Array.from(new Uint8Array(output.buffer))\r\n    self.postMessage(output)"
}

AI 解疑

DevChat提供了图中8种AI模型,根据需求选择其中一种进行对话操作。

选择GPT-3.5模型,然后向DevChat输入需求:手写Promise,让其帮助我们进行解答。DevChat回答如下:
在这里插入图片描述
下面是回答的全部代码,可见回答的十分详细。

enum PromiseStatus {
  Pending = 'pending',
  Fulfilled = 'fulfilled',
  Rejected = 'rejected'
}

class MyPromise<T> {
  private status: PromiseStatus;
  private value: T;
  private reason: any;
  private onFulfilledCallbacks: ((value: T) => void)[];
  private onRejectedCallbacks: ((reason: any) => void)[];

  constructor(executor: (resolve: (value?: T) => void, reject: (reason?: any) => void) => void) {
    this.status = PromiseStatus.Pending;
    this.value = undefined;
    this.reason = undefined;
    this.onFulfilledCallbacks = [];
    this.onRejectedCallbacks = [];

    const resolve = (value?: T) => {
      if (this.status === PromiseStatus.Pending) {
        this.status = PromiseStatus.Fulfilled;
        this.value = value;
        this.onFulfilledCallbacks.forEach(callback => callback(this.value));
      }
    };

    const reject = (reason?: any) => {
      if (this.status === PromiseStatus.Pending) {
        this.status = PromiseStatus.Rejected;
        this.reason = reason;
        this.onRejectedCallbacks.forEach(callback => callback(this.reason));
      }
    };

    try {
      executor(resolve, reject);
    } catch (err) {
      reject(err);
    }
  }

  then<U>(onFulfilled?: (value: T) => U | PromiseLike<U>, onRejected?: (reason: any) => U | PromiseLike<U>): MyPromise<U> {
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value;
    onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason };

    const promise = new MyPromise<U>((resolve, reject) => {
      const handleFulfilled = (value: T) => {
        try {
          const result = onFulfilled!(value);
          if (result instanceof MyPromise) {
            result.then(resolve, reject);
          } else {
            resolve(result);
          }
        } catch (err) {
          reject(err);
        }
      };

      const handleRejected = (reason: any) => {
        try {
          const result = onRejected!(reason);
          if (result instanceof MyPromise) {
            result.then(resolve, reject);
          } else {
            resolve(result);
          }
        } catch (err) {
          reject(err);
        }
      };

      if (this.status === PromiseStatus.Pending) {
        this.onFulfilledCallbacks.push(handleFulfilled);
        this.onRejectedCallbacks.push(handleRejected);
      } else if (this.status === PromiseStatus.Fulfilled) {
        setTimeout(() => {
          handleFulfilled(this.value);
        }, 0);
      } else if (this.status === PromiseStatus.Rejected) {
        setTimeout(() => {
          handleRejected(this.reason);
        }, 0);
      }
    });

    return promise;
  }

  catch<U>(onRejected: (reason: any) => U | PromiseLike<U>): MyPromise<U> {
    return this.then(undefined, onRejected);
  }

  static resolve<U>(value?: U | PromiseLike<U>): MyPromise<U> {
    return new MyPromise<U>(resolve => resolve(value));
  }

  static reject<U>(reason?: any): MyPromise<U> {
    return new MyPromise<U>((_, reject) => reject(reason));
  }

  static all<U>(promises: (U | PromiseLike<U>)[]): MyPromise<U[]> {
    return new MyPromise<U[]>((resolve, reject) => {
      const results: U[] = [];
      let count = 0;

      const handleResolve = (value: U, idx: number) => {
        results[idx] = value;
        count++;
        if (count === promises.length) {
          resolve(results);
        }
      };

      promises.forEach((promise, idx) => {
        if (promise instanceof MyPromise) {
          promise.then(value => handleResolve(value, idx), reject);
        } else {
          handleResolve(promise, idx);
        }
      });
    });
  }

  static race<U>(promises: (U | PromiseLike<U>)[]): MyPromise<U> {
    return new MyPromise<U>((resolve, reject) => {
      promises.forEach(promise => {
        if (promise instanceof MyPromise) {
          promise.then(resolve, reject);
        } else {
          resolve(promise);
        }
      });
    });
  }
}

当然,如果我们在编辑器中有部分代码有疑惑,可以右键选择Add to AddChat,然后在左侧对话框输入我们的问题。比如,编辑器中我对下面的代码有疑惑,然后询问DevChat帮我解答疑惑。

  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
      'components': path.resolve(__dirname, 'src/components'),
    },
    extensions: ['.js', '.json', '.ts', '.vue'], // 使用路径别名时想要省略的后缀名,可以自己 增减
  },

在这里插入图片描述

可以看到当点击Add to AddChat后,左侧输入框就多个图标内容,主要记录的是你的操作。

下面是DevChat的回答:

这段代码是设置在一个使用Vite的项目中的路径别名(alias)和默认文件后缀(extensions)的配置。

  • alias: 这个属性允许你创建一些路径别名,在你引用这个路径时,可以使用别名代替真实路径。例如,在此代码中,‘@’ 代表了 ‘src’
    目录,‘components’ 代表了 ‘src/components’ 目录。所以如果你在项目中想引用 ‘src/components’
    目录下的 ‘Example.vue’ 文件,你可以这么做:import Example from
    ‘components/Example.vue’ 或 import Example from ‘@/Example.vue’。

  • extensions: 这个属性可以设置一些默认的文件后缀。例如在此代码中,设置了 ‘.js’, ‘.json’, ‘.ts’,
    ‘.vue’ 这几种文件后缀名,这样在引用文件时就可以省略这些后缀了。例如 import Example from
    ‘@/Example’,系统会自动尝试加载 ‘src/Example’ + 这些后缀名的文件。

这两个选项的配置都是用于简化路径引用和提高代码的可读性。

DevChat进行解答,这种形式不需要我们通过搜索引擎去搜索问题答案,真的是太高效了!

最后

体验之后,真的感受到人工智能的强大。提高开发效率是每一位程序猿的综合素养。在互联网降本增效的时代,希望我们每位程序猿都能顺应潮流,更高效地工作,减少无用功,将自身价值发挥到有意义的地方!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯省赛真题46】Scratch魔术表演 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch魔术表演 一、题目要求 编程实现 二、案例分析 1、角色分析

图片如何去除水印?试试这三种去水印方法!

从事自媒体行业的小伙伴们&#xff0c;你们是否经常为文章配图而烦恼呢&#xff1f;下载的图片大部分带有各种各样的水印或者多余元素&#xff0c;让人感到困扰。今天&#xff0c;我要分享三个去水印的妙招&#xff0c;这是新媒体人必备的图片处理技能&#xff0c;快来一起学起…

STM32F103C8T6第6天:adc、iic、spi、温湿度dht11在lcd1602显示

1. ADC介绍 ADC是什么&#xff1f; Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xff0c;比如&#xff1a;8、10、1…

ThinkPHP6.1 多应用模式的一些事儿

TP安装就不说了&#xff0c;直接从安装完成开始了。 安装多应用模式扩展 think-multi-app composer require topthink/think-multi-app删除 app 目录下的 controller 文件夹&#xff08;TP 是根据是否有这个文件夹来判断单应用模式还是多应用模式的&#xff09;。 创建应用 …

C++设计模式之工厂模式(中)——工厂模式

工厂模式 工厂模式介绍示例示例使用运行结果工厂模式与简单工厂模式区别 工厂模式 工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加&#xff0c;可以通过新增子类工厂来生产&#xff0c;没有破坏程序设计原则中的开放封闭原则。 介绍 工厂模式先抽象…

在国外怎么申请香港优才计划项目?和在内地申请有何区别?

在国外怎么申请香港优才计划项目&#xff1f;和在内地申请有何区别&#xff1f; 随着香港优才计划的热度持续上升&#xff0c;也吸引了不少优秀人才想要申请。如果你现在人在新加坡、加拿大、马来西亚、澳大利亚或者其他国家&#xff0c;想申请香港优才计划拿香港身份&#xff…

浅析智慧社区建设趋势及AI大数据监管平台方案设计

一、背景与需求 伴随着社会与经济的发展&#xff0c;人们对生活质量的要求越来越高&#xff0c;与此同时&#xff0c;新兴技术的进步也促进了智慧社区市场的逐步成熟。智慧社区是社区管理的一种新理念&#xff0c;是新形势下城市与社会管理的一种创新模式。 在上海、杭州、深…

pycharm 创建的django目录和命令行创建的django再使用pycharm打开的目录对比截图 及相关

pytcharm创建django的项目 命令行创建的django 命令行创建项目时 不带路径时 (.venv) D:\gbCode>django-admin startproject gbCode 命令行创建项目时 带路径时 -- 所以如果有目录就指定路径好 (.venv) D:\gbCode>django-admin startproject gbCode d:\gbCode\

【精选】​​深度学习:构建卷积神经网络的表情识别系统(源码&教程)

1.研究背景与意义 随着社交媒体和在线通信的普及&#xff0c;人们越来越多地使用表情符号来表达情感和情绪。表情识别系统的发展成为一个重要的研究领域&#xff0c;旨在通过计算机自动识别和理解人类的表情&#xff0c;从而提高人机交互的效果和用户体验。 传统的表情识别方…

“它经济”新风口:海外网红营销之路,打造宠物用品全球热潮

近年来&#xff0c;宠物用品行业在全球范围内迎来了蓬勃发展&#xff0c;消费者对宠物的关注和关爱程度不断提升。随着社交媒体的崛起&#xff0c;海外网红营销正成为宠物用品品牌走向国际市场的有效途径&#xff0c;通过与海外网红的合作&#xff0c;不仅可以提升品牌知名度&a…

vivado产生报告阅读分析18-设计收敛报告

设计收敛报告 Report QoR Assessment report_qor_assessment 命令会生成报告以提供下列信息 &#xff1a; • 评估得分 &#xff0c; 用于指示设计满足性能目标的概率 • 有关建议的后续步骤的流程指南 • 使用率和性能指标汇总信息 • 对于 QoR 至关重要的方法论检查汇…

激光雷达与惯导标定 | Lidar_IMU_Init : 编译

激光雷达与惯导标定&#xff1a;Lidar_IMU_Init 编译 功能包安装安装ceres-solver-2.0.0 &#xff08;注意安装2.2.0不行&#xff0c;必须要安装2.0.0&#xff09; LI-Init是一种鲁棒、实时的激光雷达惯性系统初始化方法。该方法可校准激光雷达与IMU之间的时间偏移量和外部参数…

Python中的解析器argparse

import argparse## 构造解析器 argparse.ArgumentParser() parse argparse.ArgumentParser(description"caculateing the area of rectangle")## 添加参数 .add_argument() parse.add_argument("--length",typeint,default20,helpThe length of rectangle…

催单开发信怎么写?外贸人如何写催单邮件?

年末催单开发信编写技巧&#xff1f;最有效的催单话术有哪些&#xff1f; 催单开发信成为了企业间日常沟通的重要一环。这些信件不仅有助于促进业务发展&#xff0c;还可加强供应链的协调&#xff0c;确保货物及时送达。蜂邮EDM将介绍如何写一封出色的催单开发信&#xff0c;以…

jetson xavier NX深度学习环境配置

文章目录 jetson xavier NX深度学习环境配置1. SD卡系统烧录1.1 材料1.2 软件配置1.3 格式化SD卡1.4 系统镜像烧录 2. 环境配置2.1 cuda环境配置2.2 安装依赖库2.3 安装python及依赖环境2.4 安装pytorch环境 jetson xavier NX深度学习环境配置 1. SD卡系统烧录 1.1 材料 SD …

全网最全最有用的网络安全(超详细)学习路线!整理了一个月!

正文&#xff1a; 禁止废话&#xff0c;先看学习路线图&#xff1b; 在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发…

线程面试题

让3个线程串行执行 1、线程循序执行Join&#xff0c;比如T2.join 表达当前线程需要等待t2执行完&#xff0c;才会执行。2、使用countDownlach &#xff0c;定义2个countDow...&#xff0c;并且值都设置为1&#xff0c; 线程1执行完&#xff0c;调用一次countDow减1&#xff…

Springmvc实现增删改差

一、包结构 二、各层代码 (1)数据User public class User {private Integer id;private String userName;private String note;public User() {super();}public User(Integer i, String userName, String note) {super();this.id i;this.userName userName;this.note note;…

Spring Beans;Spring Bean的生命周期;spring Bean的作用域,spring处理线程并发问题

文章目录 Spring Beans请解释Spring Bean的生命周期解释Spring支持的几种bean的作用域Spring容器中的bean可以分为5个范围&#xff1a; Spring如何处理线程并发问题&#xff1f; 在现在的项目开发中经常使用到spring bean&#xff0c;那么来谈谈spring bean的生命周期&#xff…