answer_api_chat_logic.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package chatrecords
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/alibabacloud-go/tea/tea"
  8. "io"
  9. "net/http"
  10. "time"
  11. "wechat-api/ent/wxcard"
  12. "wechat-api/ent/wxcarduser"
  13. "wechat-api/hook/fastgpt"
  14. "wechat-api/internal/utils/dberrorhandler"
  15. "wechat-api/internal/utils/jwt"
  16. "wechat-api/internal/svc"
  17. "wechat-api/internal/types"
  18. "github.com/zeromicro/go-zero/core/logx"
  19. )
  20. type AnswerApiChatLogic struct {
  21. logx.Logger
  22. ctx context.Context
  23. svcCtx *svc.ServiceContext
  24. }
  25. func NewAnswerApiChatLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AnswerApiChatLogic {
  26. return &AnswerApiChatLogic{
  27. Logger: logx.WithContext(ctx),
  28. ctx: ctx,
  29. svcCtx: svcCtx}
  30. }
  31. func (l *AnswerApiChatLogic) AnswerApiChat(req *types.ChatAskReq) (*types.ChatAskResp, error) {
  32. resp := types.ChatAskResp{}
  33. userId := l.ctx.Value("userId").(uint64)
  34. card, err := l.svcCtx.DB.WxCard.Query().Where(wxcard.ID(*req.CardId)).Only(l.ctx)
  35. if err != nil {
  36. return nil, dberrorhandler.DefaultEntError(l.Logger, err, req)
  37. }
  38. userInfo, _ := l.svcCtx.DB.WxCardUser.Query().Where(wxcarduser.ID(userId)).First(l.ctx)
  39. var chatReq fastgpt.ChatReq
  40. chatReq.Stream = false
  41. message := make([]fastgpt.Message, 0, 1)
  42. message = append(message, fastgpt.Message{
  43. Content: *req.Question,
  44. Role: "user",
  45. })
  46. chatReq.Messages = message
  47. chatReq.ChatId = jwt.HashidsEncode(*req.SessionId)
  48. chatReq.Variables = fastgpt.Variables{
  49. Uid: jwt.HashidsEncode(int(userId)),
  50. Name: userInfo.Nickname,
  51. }
  52. // 設置請求體 (這裡是一個簡單的範例,你可以根據需要調整)
  53. jsonData, _ := json.Marshal(chatReq)
  54. fmt.Printf("request data:%v\n", string(jsonData))
  55. // 建立HTTP請求
  56. url := card.APIBase + fastgpt.GetChatUrl()
  57. fmt.Printf("url=%v \n", url)
  58. request, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
  59. if err != nil {
  60. fmt.Printf("Error creating request:%v", err)
  61. return nil, err
  62. }
  63. // 設置請求頭
  64. request.Header.Set("Content-Type", "application/json")
  65. request.Header.Set("Authorization", "Bearer "+card.APIKey)
  66. // 發送請求
  67. client := &http.Client{
  68. Timeout: time.Second * 60,
  69. }
  70. response, err := client.Do(request)
  71. defer response.Body.Close()
  72. // 对返回的内容进行处理
  73. answerByte, _ := io.ReadAll(response.Body)
  74. fmt.Printf("answer=%s\n", answerByte)
  75. chatData := fastgpt.ChatNoStreamResp{}
  76. err = json.Unmarshal(answerByte, &chatData)
  77. if err != nil {
  78. fmt.Printf("json unmarshall error:%v\n", err)
  79. return nil, err
  80. }
  81. fmt.Printf("response=%v\n", chatData.Choices)
  82. resp.Data = tea.String(chatData.Choices[0].Message.Content)
  83. return &resp, nil
  84. }