cauto 1 năm trước cách đây
mục cha
commit
ba11f06e5a
6 tập tin đã thay đổi với 78 bổ sung22 xóa
  1. 14 8
      api/v1/Chat.go
  2. 2 0
      go.mod
  3. 17 0
      go.sum
  4. 10 1
      gpt/gpt.go
  5. 2 0
      gpt/model.go
  6. 33 13
      internal/controller/chat.go

+ 14 - 8
api/v1/Chat.go

@@ -3,20 +3,26 @@ package v1
 import "github.com/gogf/gf/v2/frame/g"
 
 type ChatReq struct {
-	g.Meta  `path:"/chat" tags:"聊天请求" method:"post" summary:"AI聊天"`
-	Role    string `json:"role" v:"required"`
-	Content string `json:"content" v:"required"`
+	g.Meta         `path:"/chat" tags:"聊天请求" method:"post" summary:"AI聊天"`
+	Role           string `json:"role" v:"required"`
+	Content        string `json:"content" v:"required"`
+	ConversationID string `json:"conversation_id" doc:"这个一个会话ID唯一值"`
+	MessageId      string `json:"message_id,omitempty" doc:"这个一个消息ID用于保持上下文"`
 }
 
 type ChatRes struct {
-	g.Meta `mime:"application/json" example:"json"`
-	Text   string `json:"text" `
+	g.Meta         `mime:"application/json" example:"json"`
+	Text           string `json:"text" `
+	ConversationID string `json:"conversation_id"`
+	MessageId      string `json:"message_id,omitempty"`
 }
 
 type ChatStreamReq struct {
-	g.Meta  `path:"/chatStream" tags:"聊天请求流传输" method:"post" summary:"AI聊天流传输"`
-	Role    string `json:"role" v:"required"`
-	Content string `json:"content" v:"required"`
+	g.Meta         `path:"/chatStream" tags:"聊天请求流传输" method:"post" summary:"AI聊天流传输"`
+	Role           string `json:"role" v:"required"`
+	Content        string `json:"content" v:"required"`
+	ConversationID string `json:"conversation_id" doc:"这个一个会话ID唯一值"`
+	MessageId      string `json:"message_id,omitempty" doc:"这个一个消息ID用于保持上下文"`
 }
 
 type ChatStreamRes struct {

+ 2 - 0
go.mod

@@ -5,5 +5,7 @@ go 1.15
 require (
 	github.com/gogf/gf-jwt/v2 v2.0.1
 	github.com/gogf/gf/v2 v2.3.1
+	github.com/gogf/guuid v1.1.0
+	github.com/google/uuid v1.3.0 // indirect
 	golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2
 )

+ 17 - 0
go.sum

@@ -2,6 +2,9 @@ github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi
 github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
 github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E=
 github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -21,13 +24,17 @@ github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=
+github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/gogf/gf-jwt/v2 v2.0.1 h1:Sr6QLBbbTih7+IDfR4rK8REoWodi60hFaaO1gs7uzm8=
 github.com/gogf/gf-jwt/v2 v2.0.1/go.mod h1:AGEJOkG64G8ZYOi50ObYgJ+D7L3W4GcTW65m6VVGbmI=
 github.com/gogf/gf/v2 v2.0.0-rc3/go.mod h1:apktt6TleWtCIwpz63vBqUnw8MX8gWKoZyxgDpXFtgM=
+github.com/gogf/gf/v2 v2.1.1/go.mod h1:thvkyb43RWUu/m05sRm4CbH9r7t7/FrW2M56L9Ystwk=
 github.com/gogf/gf/v2 v2.3.1 h1:uptCJK47N6KSRwTBnFAqBWYnYa/OXBkZ0OlhO9CK7bQ=
 github.com/gogf/gf/v2 v2.3.1/go.mod h1:tsbmtwcAl2chcYoq/fP9W2FZf06aw4i89X34nbSHo9Y=
+github.com/gogf/guuid v1.1.0 h1:Q25c+qwAIjhc8htiUB4c6HpoB51gQcse1xCri3bQAJQ=
+github.com/gogf/guuid v1.1.0/go.mod h1:tLZwRYZ0P0+T+OLyw4OLt1BX177qr/pVITJKsO0F/N8=
 github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
 github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -46,12 +53,16 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0=
 github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
 github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
@@ -68,9 +79,13 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -113,6 +128,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -123,6 +139,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

+ 10 - 1
gpt/gpt.go

@@ -215,6 +215,7 @@ func (c *client) ChatCompletion(ctx context.Context, request *ChatCompletionRequ
 	if err := getResponseObject(rsp, output); err != nil {
 		return nil, err
 	}
+
 	return output, nil
 }
 
@@ -444,7 +445,15 @@ func checkForSuccess(rsp *http.Response) error {
 
 func getResponseObject(rsp *http.Response, v interface{}) error {
 	defer rsp.Body.Close()
-	if err := json.NewDecoder(rsp.Body).Decode(v); err != nil {
+
+	body, err := io.ReadAll(rsp.Body)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return err
+	}
+	fmt.Println("Response:")
+	fmt.Println(string(body))
+	if err := json.NewDecoder(bytes.NewReader(body)).Decode(v); err != nil {
 		return fmt.Errorf("invalid json response: %w", err)
 	}
 	return nil

+ 2 - 0
gpt/model.go

@@ -105,6 +105,8 @@ type CompletionRequest struct {
 	LogitBias map[string]float32 `json:"logit_bias,omitempty"`
 	// User sets an end-user identifier. Can be used to associate completions generated by a specific user.
 	User string `json:"user,omitempty"`
+	// ConversationID Independent dialogue 进行独立对话
+	ConversationID string `json:"conversation_id,omitempty"`
 }
 
 // EditsRequest is a request for the edits API

+ 33 - 13
internal/controller/chat.go

@@ -3,19 +3,24 @@ package controller
 import (
 	"context"
 	"encoding/json"
+	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/os/glog"
+	"github.com/gogf/gf/v2/util/guid"
 	v1 "go-gpt/api/v1"
 	"go-gpt/gpt"
 )
 
 type Message struct {
-	Text string `json:"text"`
+	Text           string `json:"text"`
+	ConversationID string `json:"conversation_id"`
+	MessageId      string `json:"message_id,omitempty"`
 }
 
 var (
 	Chat     = sChat{}
-	key      = "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"
+	key      = "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"
 	proxyUrl = "127.0.0.1:6153"
 )
 
@@ -24,19 +29,26 @@ type sChat struct {
 
 // Chat 这里不使用流数据
 func (c *sChat) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatRes, err error) {
+	var chatRequst gpt.ChatCompletionRequest
+	var chatMessage []gpt.ChatCompletionRequestMessage
 
-	client := gpt.NewClient(key, proxyUrl)
-	completion, err := client.ChatCompletion(ctx, &gpt.ChatCompletionRequest{
-		Model: gpt.GPT3Dot5Turbo,
-		Messages: []gpt.ChatCompletionRequestMessage{
-			{
-				Role:    req.Role,
-				Content: req.Content,
-			},
-		},
-		MaxTokens:   2048,
-		Temperature: 0.8,
+	//re := g.RequestFromCtx(ctx)
+	//ConversationID := ""
+	chatRequst.Model = gpt.GPT3Dot5Turbo
+	chatRequst.MaxTokens = 1024
+	chatRequst.Temperature = 0
+
+	if req.ConversationID == "" || req.MessageId == "" {
+		//ConversationID = CreateSessionId(re)
+		//chatRequst.ConversationID = ConversationID
+	}
+	chatMessage = append(chatMessage, gpt.ChatCompletionRequestMessage{
+		Role:    req.Role,
+		Content: req.Content,
 	})
+	chatRequst.Messages = chatMessage
+	client := gpt.NewClient(key, proxyUrl)
+	completion, err := client.ChatCompletion(ctx, &chatRequst)
 	if err != nil {
 		return nil, err
 	}
@@ -94,3 +106,11 @@ func (c *sChat) ChatStream(ctx context.Context, req *v1.ChatStreamReq) (res *v1.
 
 	return
 }
+
+func CreateSessionId(r *ghttp.Request) string {
+	var (
+		address = r.RemoteAddr
+		header  = fmt.Sprintf("%v", r.Header)
+	)
+	return guid.S([]byte(address), []byte(header))
+}