chatApi.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package model
  2. import (
  3. "aiChat/internal/consts"
  4. "bufio"
  5. "context"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/net/gclient"
  8. "github.com/gogf/gf/v2/util/gconv"
  9. "io"
  10. "net/http"
  11. "strings"
  12. )
  13. type GPTReq struct {
  14. *BaseQuestion
  15. Identity string `json:"identity"`
  16. }
  17. // SimpleRes 语义服务,响应常用问题
  18. type SimpleRes struct {
  19. Status int `json:"status"`
  20. Result struct {
  21. Prompt string `json:"prompt"`
  22. Answer string `json:"answer"`
  23. } `json:"result"`
  24. }
  25. // GPTRes 业务及扩展聊天响应
  26. type GPTRes struct {
  27. Status int `json:"status"`
  28. Response string `json:"response"`
  29. History [][]string `json:"history"`
  30. Time string `json:"time"`
  31. }
  32. var (
  33. ChatGpt = &cChatGpt{}
  34. )
  35. type cChatGpt struct {
  36. }
  37. func (c *cChatGpt) SimpleDo(ctx context.Context, qReq *QuestionReq) (res *SimpleRes, err error) {
  38. gReq := GPTReq{
  39. BaseQuestion: qReq.BaseQuestion,
  40. Identity: g.Config().MustGet(ctx, "chat.api.identity", "剑鱼chat").String(),
  41. }
  42. var gRes *gclient.Response
  43. gRes, err = g.Client().Header(consts.RequestJsonHeader).Post(ctx, g.Config().MustGet(ctx, "chat.api.addr_simple", "").String(), gReq)
  44. if err != nil {
  45. return nil, err
  46. }
  47. res = &SimpleRes{}
  48. defer gRes.Close()
  49. err = gconv.Struct(gRes.ReadAll(), res)
  50. //g.Dump("SimpleDo", gReq, res)
  51. if err != nil {
  52. return nil, err
  53. }
  54. return
  55. }
  56. func (c *cChatGpt) GPTDo(ctx context.Context, qReq *QuestionReq) (res io.ReadCloser, err error) {
  57. gReq := GPTReq{
  58. BaseQuestion: qReq.BaseQuestion,
  59. Identity: g.Config().MustGet(ctx, "chat.api.identity", "剑鱼chat").String(),
  60. }
  61. if gReq.History == nil {
  62. gReq.History = [][]string{}
  63. }
  64. req, err := http.NewRequest("POST", g.Config().MustGet(ctx, "chat.api.addr_answer", "").String(), strings.NewReader(gconv.String(gReq)))
  65. if err != nil {
  66. return nil, err
  67. }
  68. client := &http.Client{}
  69. req.Header.Set("Accept", "text/event-stream")
  70. resp, err := client.Do(req)
  71. if err != nil {
  72. return nil, err
  73. }
  74. return resp.Body, nil
  75. }
  76. type BufRes struct {
  77. Delta string `json:"delta"`
  78. Response string `json:"response"`
  79. Finished bool `json:"finished"`
  80. }
  81. func readEvent(res *bufio.Reader) (string, error) {
  82. event := ""
  83. buf := make([]byte, 1024)
  84. for {
  85. n, err := res.Read(buf)
  86. if err != nil {
  87. return "", err
  88. }
  89. // 解析Event-Stream消息
  90. for _, b := range buf[:n] {
  91. if b == '\n' {
  92. return event, nil
  93. }
  94. event += string(b)
  95. }
  96. }
  97. }