简介:
你好,朋友ð。
在本教程中,我将向您展示如何创建一个CLI应用程序,该应用程序允许您从命令行与CHATGPT进行交互。该应用程序名为“ chatshell”,将允许用户索取针对特定任务的shell命令或直接与chatgpt聊天。我们将使用GO编程语言和眼镜蛇CLI库来创建我们的CLI应用程序和Go-Openai库与OpenAI的GPT-3 API进行交互。
如果以任何方式有见地的话,请提高大拇指。
先决条件:
- 已安装编程语言(版本1.20.2或更高版本)
- COBRA CLI库已安装
- 安装了go-openai库
- 安装了Viper库(用于配置和环境vars)
- An OpenAI API key
最终目标:
- 能够运行表单的外壳命令:
chatshell ask "how to delete a local branch ?"
chatshell ask -c "when was gpt first built ?"
步骤:
a。设置项目结构
为项目创建一个新目录,并导航到
$ mkdir chatshell
$ cd chatshell
初始化新的GO模块
$ go mod init github.com/{your_username}/chatshell
# note: replace {your_username} with actual github username
安装眼镜蛇CLI库和go-openai库
$ go install github.com/spf13/cobra-cli@latest
$ go get -u github.com/sashabaranov/go-openai
$ go get github.com/spf13/viper
b。创建CLI应用
Cobra-CLI有助于自动为您的CLI应用程序生成锅炉,这加快了开发。
使用眼镜蛇CLI生成CLI应用的基本结构:
$ cobra-cli init
这将生成CLI应用程序的基本结构,包括main.go文件,一个CMD目录和许可证文件。
如果您熟悉眼镜蛇,可以查看代码。
c。实现“ ask”命令
再次我们将呼吁我们的朋友(Cobra-cli)
cobra-cli add ask
这将生成一个文件ask.go,其中包含“ ask”命令的实现。我们必须对我们的需求进行挑战,以下是对填充的代码进行评论的良好评论。
导入必要的软件包
/*
Copyright © 2023 Ugochukwu Onyebuchi <pyvinci@gmail.com>
*/
package cmd
import (
"context"
"fmt"
"os"
"runtime"
"github.com/spf13/cobra"
"github.com/spf13/viper"
openai "github.com/sashabaranov/go-openai"
)
接下来的Intial AskCMD
使用:关于如何使用ask命令的简短描述,在我们的情况下,我们希望在引号中遵循文字
简短:询问命令的简短描述
长:更长的描述
ARGS:我们指定我们只需要一个参数,这是引号中的文本
运行:我们指定要调用的函数,此功能将处理业务逻辑。
// askCmd represents the ask command
var askCmd = &cobra.Command{
Use: "ask [text]",
Short: "ask ChatGPT",
Long: `ask is used to ask for shell commands for a particular task`,
Args: cobra.ExactArgs(1),
Run: runAsk,
}
// authToken holds your openai auth key
var authToken string
// initial operations
func init() {
// add the ask command to root
rootCmd.AddCommand(askCmd)
// add flag to enable chat mode
askCmd.PersistentFlags().BoolP("chat", "c", false, "Chat with ChatGPT")
// Read the auth token from a configuration file
viper.SetConfigName("config")
viper.AddConfigPath("$HOME/.chatshell")
viper.AddConfigPath(`%USERPROFILE%/.chatshell`)
viper.SetEnvPrefix("OPENAI")
viper.AutomaticEnv()
// Handle missing config file or auth token
if err := viper.ReadInConfig(); err == nil {
authToken = viper.GetString("OPENAI_AUTH_TOKEN")
} else {
fmt.Printf("Error reading configuration file: %v\n", err)
}
if authToken == "" {
fmt.Println("Error: OPENAI_AUTH_TOKEN environment variable not set")
os.Exit(1)
}
}
我使用的提示很大:但是,对于使用os.Getenv("SHELL")
的runtime.GOOS
和shell类型,我可以使用os.Getenv("SHELL")
获得Ostype,这将有助于chatgpt给出相关操作系统的合理外壳命令,我们不希望Mac的Shell命令尽管我们正在使用Windows ..并且它还以“对不起,我似乎找不到命令”,如果它可以找到您的提示符命令。为了获得一个很好的提示,这是一个迭代过程。
// Call OpenAI and prints response
func runAsk(cmd *cobra.Command, args []string) {
client := openai.NewClient(authToken)
osType := runtime.GOOS
shell := os.Getenv("SHELL")
content := ""
chatMode, _ := cmd.Flags().GetBool("chat")
// We use the state of the flag to determine the context
if !chatMode {
content = fmt.Sprintf(`You are a very helpful shell assistant that gives users only shell commands to achieve a task, just give out only the shell command(s), and nothing else, no preamble, greetings or explanation please, just the shell command. When you can't find a command for a query/prompt/greeting respond strictly with "Sorry I can't seem to find a command for that". Start now: "%v in %v os using %v shell"`, args[0], osType, shell)
} else {
content = args[0]
}
// Get ChatGPT Response
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: content,
},
},
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
}
fmt.Println(resp.Choices[0].Message.Content)
}
d。更新配置文件
为了正常工作
请记住,我们将Viper设置为寻找应包含我们OpenAi_Auth_Token的配置文件
在主目录中创建一个名为.chatshell的新目录(在Windows上,使用%userProfile%而不是$ home):
$ mkdir ~/.chatshell
在.chatshell目录中创建一个名为config.json的新文件,然后添加OpenAi API键作为OpenAi_Auth_token变量的值:
{"OPENAI_AUTH_TOKEN":"your_api_key_here"}
e。构建CLI应用
导航到项目的根目录并构建应用程序:
$ go build
这将创建一个可执行的二进制文件,称为“ chatshell”。
f。使用Chatshell CLI应用
运行Chatshell二进制文件并提供任务描述作为参数:
$ ./chatshell ask "how to delete a local branch ?"
output: git branch -d <branch_name>
然后,该应用将与Chatgpt进行交互,并返回给定任务的Shell命令。
您也可以使用-c标志直接与chatgpt聊天:
$ ./chatshell ask -c "When was gpt first built?"
output: GPT (Generative Pre-trained Transformer) was first introduced by OpenAI in June 2018
结论:
在本教程中,我们看到了如何创建一个从命令行与ChatGpt交互的Conda Cli应用程序。 Chatshell应用程序可用于获取用于特定任务的Shell命令或直接与ChatGPT聊天。请随时探索提供的代码和Go-Openai库,以扩展应用程序的功能或适应您的需求。
roppository:https://github.com/ColeDrain/chatshell