first commit
This commit is contained in:
commit
58fc945222
6 changed files with 188 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
chat-go
|
12
go.mod
Normal file
12
go.mod
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
module chat-go
|
||||||
|
|
||||||
|
go 1.23.3
|
||||||
|
|
||||||
|
require github.com/openai/openai-go v0.1.0-alpha.38
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/tidwall/gjson v1.14.4 // indirect
|
||||||
|
github.com/tidwall/match v1.1.1 // indirect
|
||||||
|
github.com/tidwall/pretty v1.2.1 // indirect
|
||||||
|
github.com/tidwall/sjson v1.2.5 // indirect
|
||||||
|
)
|
12
go.sum
Normal file
12
go.sum
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
github.com/openai/openai-go v0.1.0-alpha.38 h1:j/rL0aEIHWnWaPgA8/AXYKCI79ZoW44NTIpn7qfMEXQ=
|
||||||
|
github.com/openai/openai-go v0.1.0-alpha.38/go.mod h1:3SdE6BffOX9HPEQv8IL/fi3LYZ5TUpRYaqGQZbyk11A=
|
||||||
|
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
|
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
|
||||||
|
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
|
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||||
|
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
|
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
|
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
|
||||||
|
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
|
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
|
||||||
|
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
|
3
go.work
Normal file
3
go.work
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
go 1.23.3
|
||||||
|
|
||||||
|
use ./
|
12
go.work.sum
Normal file
12
go.work.sum
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
|
||||||
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||||
|
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||||
|
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
|
||||||
|
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
||||||
|
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
148
main.go
Normal file
148
main.go
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/openai/openai-go"
|
||||||
|
"github.com/openai/openai-go/option"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
sys = `You are an expert golang programmer.`
|
||||||
|
|
||||||
|
model = "Qwen/Qwen2.5-Coder-7B-Instruct"
|
||||||
|
|
||||||
|
reader = bufio.NewReader(os.Stdin)
|
||||||
|
|
||||||
|
history = []History{}
|
||||||
|
|
||||||
|
client = openai.NewClient(
|
||||||
|
option.WithAPIKey("EMPTY"), // defaults to os.LookupEnv("OPENAI_API_KEY")
|
||||||
|
option.WithBaseURL("http://192.168.55.14:8001/v1/"),
|
||||||
|
)
|
||||||
|
ctx = context.Background()
|
||||||
|
)
|
||||||
|
|
||||||
|
type History struct {
|
||||||
|
Assistant string
|
||||||
|
User string
|
||||||
|
}
|
||||||
|
|
||||||
|
func readKey(input chan rune) {
|
||||||
|
char, _, err := reader.ReadRune()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error reading key: ", err)
|
||||||
|
}
|
||||||
|
input <- char
|
||||||
|
}
|
||||||
|
|
||||||
|
func push(h History) int {
|
||||||
|
history = append(history, h)
|
||||||
|
return len(history)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resume(s string) string {
|
||||||
|
|
||||||
|
resumer := "you are a golang expert; very able to resume the conversation; Limited to responding to the question without adding anything else."
|
||||||
|
question := "resume this conversation in max 100 tokens: " + s
|
||||||
|
|
||||||
|
completion, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
|
||||||
|
Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
|
||||||
|
openai.SystemMessage(resumer),
|
||||||
|
openai.UserMessage(question),
|
||||||
|
}),
|
||||||
|
Model: openai.F(model),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error: %v\n", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return completion.Choices[0].Message.Content
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
input := make(chan rune, 1)
|
||||||
|
|
||||||
|
for {
|
||||||
|
|
||||||
|
current_history := History{
|
||||||
|
Assistant: "",
|
||||||
|
User: "",
|
||||||
|
}
|
||||||
|
|
||||||
|
print("> ")
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
go readKey(input)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case i := <-input:
|
||||||
|
current_history.User += string(i)
|
||||||
|
switch i {
|
||||||
|
case '\n':
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println()
|
||||||
|
|
||||||
|
// stream := client.Chat.Completions.NewStreaming(ctx, openai.ChatCompletionNewParams{
|
||||||
|
// Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
|
||||||
|
// openai.SystemMessage(sys), openai.UserMessage(user),
|
||||||
|
// }),
|
||||||
|
// Model: openai.F(model),
|
||||||
|
// })
|
||||||
|
|
||||||
|
var messages_hist []openai.ChatCompletionMessageParamUnion
|
||||||
|
for _, h := range history {
|
||||||
|
messages_hist = append(messages_hist, openai.UserMessage(h.User), openai.AssistantMessage(h.Assistant))
|
||||||
|
}
|
||||||
|
|
||||||
|
// fmt.Printf("%+v\n", messages_hist)
|
||||||
|
|
||||||
|
msg := []openai.ChatCompletionMessageParamUnion{
|
||||||
|
openai.SystemMessage(sys),
|
||||||
|
}
|
||||||
|
msg = append(msg, messages_hist...)
|
||||||
|
msg = append(msg, openai.UserMessage(current_history.User))
|
||||||
|
|
||||||
|
stream := client.Chat.Completions.NewStreaming(ctx, openai.ChatCompletionNewParams{
|
||||||
|
Messages: openai.F(msg),
|
||||||
|
Model: openai.F(model),
|
||||||
|
})
|
||||||
|
|
||||||
|
// fmt.Printf("%+v\n", msg)
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
|
// history = append(history, openai.UserMessage(user))
|
||||||
|
|
||||||
|
for stream.Next() {
|
||||||
|
evt := stream.Current()
|
||||||
|
if len(evt.Choices) > 0 {
|
||||||
|
print(evt.Choices[0].Delta.Content)
|
||||||
|
current_history.Assistant += evt.Choices[0].Delta.Content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println()
|
||||||
|
|
||||||
|
if err := stream.Err(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
current_history.Assistant = resume(current_history.Assistant)
|
||||||
|
|
||||||
|
// println()
|
||||||
|
// fmt.Printf("%+v\n", current_history)
|
||||||
|
|
||||||
|
history = append(history, current_history)
|
||||||
|
|
||||||
|
println()
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue