Skip to content

Commit

Permalink
chitchat v1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
ayo-ajayi committed Aug 1, 2023
0 parents commit 05f511e
Show file tree
Hide file tree
Showing 16 changed files with 1,220 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .chitchat.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
openapi_key: #required

redis:
addr: #optional
default_db: #optional
history_key: #optional
models_key: #optional
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
note.txt
*.exe
Empty file added LICENSE
Empty file.
79 changes: 79 additions & 0 deletions cmd/chat/chat.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package chat

import (
"bufio"
"fmt"
"github.com/ayo-ajayi/chitchat/gpt"
"github.com/ayo-ajayi/chitchat/history"
"github.com/spf13/cobra"
"os"
"os/exec"
"os/signal"
"syscall"
)

var gptModel int16
var nosave bool
var ChatCmd = &cobra.Command{
Use: "chat",
Short: "interactive conversation with ai",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Welcome to My Chitchat CLI App! Enter Ctrl+C to exit.")
fmt.Println("Type 'exit' to quit.")
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM)
var model string
if gptModel < 0 {
model = string(gpt.DefaultModel())
fmt.Println("using default model: ", model)
fmt.Println()
} else {
model = gpt.ListOfModels[gptModel]
fmt.Println("using model: ", model)
fmt.Println()
}
scanner := bufio.NewScanner(os.Stdin)
go func() {
for {
fmt.Print(">> ")
if !scanner.Scan() {
break
}
input := scanner.Text()
switch input {
case "exit":
fmt.Println("Exiting...")
os.Exit(0)
case "":

case "cls":
clearScreen()
default:
var res string
res = gpt.Chat(input, &model)
if !nosave {
if err := history.SaveChat(input, res); err != nil {
fmt.Println(err)
}
}
fmt.Println(res)
fmt.Println()
}
}
}()
<-interrupt
fmt.Println("\nExiting...")
os.Exit(0)
},
}

func clearScreen() {
cmd := exec.Command("clear")
cmd.Stdout = os.Stdout
cmd.Run()
}
func init() {
ChatCmd.Flags().Int16VarP(&gptModel, "model", "m", -1, "gpt model to use")
ChatCmd.Flags().BoolVarP(&nosave, "nosave", "n", false, "do not save chat")
}
41 changes: 41 additions & 0 deletions cmd/chat/ls.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package chat

import (
"fmt"
"github.com/ayo-ajayi/chitchat/gpt"
rdb "github.com/ayo-ajayi/chitchat/redis"
"github.com/spf13/cobra"
)

var refresh bool
var lsCmd = &cobra.Command{
Use: "ls",
Short: "list of available gpt models",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println()
var ls []string
var err error
if refresh {
ls, err = gpt.LS()
if err != nil {
panic(err)
}
c := rdb.DefaultClient()
c.SetList("chitchat:model", ls)
defer c.C.Close()
} else {
ls = gpt.ListOfModels
}
for i, l := range ls {
fmt.Printf("[%v]: %v\n", i, l)
}
fmt.Println("select the model of choice with the `-m` flag and the index of the model from the list")
fmt.Printf("default model is %v\n", ls[len(ls)-1])
},
}

func init() {
lsCmd.Flags().BoolVarP(&refresh, "refresh", "r", false, "refresh the models list in the cache")
ChatCmd.AddCommand(lsCmd)
}
38 changes: 38 additions & 0 deletions cmd/history/history.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package history

import (
"fmt"

"github.com/ayo-ajayi/chitchat/history"
"github.com/spf13/cobra"
)
var defaultHistoryLimit int64 = 10
var limit int64 = defaultHistoryLimit

var HistoryCmd = &cobra.Command{
Use: "history",
Short: "Chat History",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
if limit <=0 {
limit=defaultHistoryLimit
}
chat, err := history.GetChat(limit)
if err != nil {
fmt.Println(err)
}
for _, c:=range chat{
date, err:=history.GetDate(c.ID)
if err != nil {
date=""
}
fmt.Print(date, " ")
for key, value := range c.Values {
fmt.Println("Prompt:", key, "Answer:", value)
}
}
},
}
func init() {
HistoryCmd.Flags().Int64VarP(&limit, "limit", "l", 10, "chat history limit")
}
53 changes: 53 additions & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package cmd

import (
"fmt"
"github.com/ayo-ajayi/chitchat/cmd/chat"
"github.com/ayo-ajayi/chitchat/cmd/history"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"os"
)

var cfgFile string
var (
version = "1.0.0"
)
var rootCmd = &cobra.Command{
Use: "chitchat",
Short: "ChatGPT CLI",
Long: ``,
Version: version,
}

func Execute() {
err := rootCmd.Execute()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func init() {
cobra.OnInitialize(initConfig)
rootCmd.AddCommand(chat.ChatCmd)
rootCmd.AddCommand(history.HistoryCmd)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.chitchat.yaml)")
}
func initConfig() {
if cfgFile != "" {
viper.SetConfigFile(cfgFile)
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err == nil {
fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed())
}
} else {
home, err := os.UserHomeDir()
cobra.CheckErr(err)
viper.AddConfigPath(home)
viper.SetConfigType("yaml")
viper.SetConfigName(".chitchat")
viper.AutomaticEnv()
viper.ReadInConfig()
}

}
27 changes: 27 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module github.com/ayo-ajayi/chitchat

go 1.18

require (
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-redis/redis v6.15.9+incompatible
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/redis/go-redis/v9 v9.0.5 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/cobra v1.7.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.16.0 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading

0 comments on commit 05f511e

Please sign in to comment.