在外壳中
#openai #go #cli #chatgpt

简介:
你好,朋友ð。

在本教程中,我将向您展示如何创建一个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目录和许可证文件。

如果您熟悉眼镜蛇,可以查看代码。

Project Structure

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