Browse Source

fix:new api sop_task/generate_ai_answer

jimmyyem 3 months ago
parent
commit
681e71d2c7

+ 13 - 0
desc/wechat/sop_task.api

@@ -142,6 +142,15 @@ type (
 		Page   uint64    `json:"page" validate:"required,number,gt=0"`
 		PageSize  uint64    `json:"pageSize" validate:"required,number,lt=2000"`
 	}
+
+	GenerateAiAnswerReq {
+		content string `json:"content"`
+	}
+
+	GenerateAiAnswerResp {
+		BaseDataInfo
+		Data string `json:"data"`
+	}
 )
 
 @server(
@@ -215,4 +224,8 @@ service Wechat {
     // 测试Sop节点
     @handler testNode
     post /sop_task/test_node (TestNodeReq) returns (TestNodeResp)
+
+	// 根据内容生成AI回答
+	@handler generateAiAnswer
+	post /sop_task/generate_ai_answer (GenerateAiAnswerReq) returns (GenerateAiAnswerResp)
 }

+ 36 - 0
hook/fastgpt/aioptimize.go

@@ -0,0 +1,36 @@
+package fastgpt
+
+import (
+	"context"
+	"github.com/sashabaranov/go-openai"
+)
+
+func ChatWithCustomConfig(baseURL, apiKey, prompt string) (string, error) {
+	// 创建OpenAI客户端配置
+	config := openai.DefaultConfig(apiKey)
+	config.BaseURL = baseURL
+
+	// 创建OpenAI客户端
+	openaiClient := openai.NewClientWithConfig(config)
+
+	// 构建请求
+	request := openai.ChatCompletionRequest{
+		Model: openai.GPT4o,
+		Messages: []openai.ChatCompletionMessage{
+			{
+				Role:    "user",
+				Content: prompt,
+			},
+		},
+		Stream: false,
+	}
+
+	// 调用Chat接口
+	response, err := openaiClient.CreateChatCompletion(context.Background(), request)
+	if err != nil {
+		return "", err
+	}
+
+	// 返回响应内容
+	return response.Choices[0].Message.Content, nil
+}

+ 1 - 0
internal/config/config.go

@@ -17,6 +17,7 @@ type Config struct {
 	CasbinConf         casbin.CasbinConf
 	DatabaseConf       config.DatabaseConf
 	Miniprogram        types.Miniprogram
+	Fastgpt            types.Fastgpt
 	Aliyun             types.Aliyun
 	CoreRpc            zrpc.RpcClientConf
 }

+ 5 - 0
internal/handler/routes.go

@@ -516,6 +516,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 					Path:    "/sop_task/test_node",
 					Handler: sop_task.TestNodeHandler(serverCtx),
 				},
+				{
+					Method:  http.MethodPost,
+					Path:    "/sop_task/generate_ai_answer",
+					Handler: sop_task.GenerateAiAnswerHandler(serverCtx),
+				},
 			}...,
 		),
 		rest.WithJwt(serverCtx.Config.Auth.AccessSecret),

+ 44 - 0
internal/handler/sop_task/generate_ai_answer_handler.go

@@ -0,0 +1,44 @@
+package sop_task
+
+import (
+	"net/http"
+
+	"github.com/zeromicro/go-zero/rest/httpx"
+
+	"wechat-api/internal/logic/sop_task"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+)
+
+// swagger:route post /sop_task/generate_ai_answer sop_task GenerateAiAnswer
+//
+// 根据内容生成AI回答
+//
+// 根据内容生成AI回答
+//
+// Parameters:
+//  + name: body
+//    require: true
+//    in: body
+//    type: GenerateAiAnswerReq
+//
+// Responses:
+//  200: GenerateAiAnswerResp
+
+func GenerateAiAnswerHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.GenerateAiAnswerReq
+		if err := httpx.Parse(r, &req, true); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := sop_task.NewGenerateAiAnswerLogic(r.Context(), svcCtx)
+		resp, err := l.GenerateAiAnswer(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 43 - 0
internal/logic/sop_task/generate_ai_answer_logic.go

@@ -0,0 +1,43 @@
+package sop_task
+
+import (
+	"context"
+	"fmt"
+
+	"wechat-api/hook/fastgpt"
+	"wechat-api/internal/svc"
+	"wechat-api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GenerateAiAnswerLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewGenerateAiAnswerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GenerateAiAnswerLogic {
+	return &GenerateAiAnswerLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx}
+}
+
+func (l *GenerateAiAnswerLogic) GenerateAiAnswer(req *types.GenerateAiAnswerReq) (*types.GenerateAiAnswerResp, error) {
+	resp := types.GenerateAiAnswerResp{}
+	prompt := fmt.Sprintf(`
+请根据用户输入的消息,优化用户输入的内容。
+用户输入内容:%s
+`, req.Content)
+
+	baseUrl := l.svcCtx.Config.Fastgpt.BASE_URL
+	apiKey := l.svcCtx.Config.Fastgpt.API_KEY
+	answer, err := fastgpt.ChatWithCustomConfig(baseUrl, apiKey, prompt)
+	if err != nil {
+		return nil, err
+	}
+	resp.Data = answer
+
+	return &resp, nil
+}

+ 3 - 1
internal/logic/sop_task/test_node_logic.go

@@ -94,7 +94,9 @@ func (l *TestNodeLogic) TestNode(req *types.TestNodeReq) (resp *types.TestNodeRe
 	index := ""
 	if needJudge {
 		// 调用openai接口,使用自定义base和key
-		index, err = ChatWithCustomConfig("https://newapi.gkscrm.com/v1", "sk-ZQRNypQOC8ID5WbpCdF263C58dF44271842e86D408Bb3848", prompt)
+		baseUrl := l.svcCtx.Config.Fastgpt.BASE_URL
+		apiKey := l.svcCtx.Config.Fastgpt.API_KEY
+		index, err = ChatWithCustomConfig(baseUrl, apiKey, prompt)
 		if err != nil {
 			return nil, err
 		}

+ 5 - 0
internal/types/miniprograme.go

@@ -12,3 +12,8 @@ type Aliyun struct {
 	OSS_ENDPOINT      string
 	OSS_ROLEARN       string
 }
+
+type Fastgpt struct {
+	BASE_URL string
+	API_KEY  string
+}

+ 11 - 0
internal/types/types.go

@@ -1231,6 +1231,17 @@ type SopApiListReq struct {
 	PageSize uint64 `json:"pageSize" validate:"required,number,lt=2000"`
 }
 
+// swagger:model GenerateAiAnswerReq
+type GenerateAiAnswerReq struct {
+	Content string `json:"content"`
+}
+
+// swagger:model GenerateAiAnswerResp
+type GenerateAiAnswerResp struct {
+	BaseDataInfo
+	Data string `json:"data"`
+}
+
 // The response data of sop stage information | SopStage信息
 // swagger:model SopStageInfo
 type SopStageInfo struct {