增加AI辅助功能 (#1808)

* feature: 增加两个辅助AI,小奇和小淼

* feature:调整AI自动反写部分
This commit is contained in:
PiexlMax(奇淼
2024-07-02 22:53:59 +08:00
committed by GitHub
parent 128e810f77
commit 59cfe96fe3
11 changed files with 288 additions and 52 deletions

View File

@@ -2,6 +2,8 @@ package system
import (
"fmt"
"github.com/goccy/go-json"
"io"
"net/url"
"strings"
@@ -9,6 +11,7 @@ import (
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
"github.com/flipped-aurora/gin-vue-admin/server/utils"
"github.com/flipped-aurora/gin-vue-admin/server/utils/request"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
@@ -304,6 +307,48 @@ func (autoApi *AutoCodeApi) InstallPlugin(c *gin.Context) {
}}, c)
}
func (autoApi *AutoCodeApi) LLMAuto(c *gin.Context) {
prompt := c.Query("prompt")
mode := c.Query("mode")
params := make(map[string]string)
params["prompt"] = prompt
params["mode"] = mode
path := strings.ReplaceAll(global.GVA_CONFIG.AutoCode.AiPath, "{FUNC}", "api/chat/ai")
res, err := request.HttpRequest(
path,
"POST",
nil,
params,
nil,
)
if err != nil {
global.GVA_LOG.Error("大模型生成失败!", zap.Error(err))
response.FailWithMessage("大模型生成失败"+err.Error(), c)
return
}
var resStruct response.Response
b, err := io.ReadAll(res.Body)
defer res.Body.Close()
if err != nil {
global.GVA_LOG.Error("大模型生成失败!", zap.Error(err))
response.FailWithMessage("大模型生成失败"+err.Error(), c)
return
}
err = json.Unmarshal(b, &resStruct)
if err != nil {
global.GVA_LOG.Error("大模型生成失败!", zap.Error(err))
response.FailWithMessage("大模型生成失败"+err.Error(), c)
return
}
if resStruct.Code == 7 {
global.GVA_LOG.Error("大模型生成失败!"+resStruct.Msg, zap.Error(err))
response.FailWithMessage("大模型生成失败"+resStruct.Msg, c)
return
}
response.OkWithData(resStruct.Data, c)
}
// PubPlug
// @Tags AutoCode
// @Summary 打包插件

View File

@@ -74,6 +74,8 @@ system:
iplimit-time: 3600
# 路由全局前缀
router-prefix: ""
# AI服务路径
ai-path: ""
# captcha configuration
captcha:
@@ -253,4 +255,4 @@ cors:
allow-headers: content-type
allow-methods: GET, POST
expose-headers: Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type
allow-credentials: true # 布尔值
allow-credentials: true # 布尔值

View File

@@ -15,4 +15,5 @@ type Autocode struct {
WApi string `mapstructure:"web-api" json:"web-api" yaml:"web-api"`
WForm string `mapstructure:"web-form" json:"web-form" yaml:"web-form"`
TransferRestart bool `mapstructure:"transfer-restart" json:"transfer-restart" yaml:"transfer-restart"`
AiPath string `mapstructure:"ai-path" json:"ai-path" yaml:"ai-path"`
}

View File

@@ -12,8 +12,8 @@ import (
func initServer(address string, router *gin.Engine) server {
s := endless.NewServer(address, router)
s.ReadHeaderTimeout = 20 * time.Second
s.WriteTimeout = 20 * time.Second
s.ReadHeaderTimeout = 10 * time.Minute
s.WriteTimeout = 10 * time.Minute
s.MaxHeaderBytes = 1 << 20
return s
}

View File

@@ -14,8 +14,8 @@ func initServer(address string, router *gin.Engine) server {
return &http.Server{
Addr: address,
Handler: router,
ReadTimeout: 20 * time.Second,
WriteTimeout: 20 * time.Second,
ReadTimeout: 10 * time.Minute,
WriteTimeout: 10 * time.Minute,
MaxHeaderBytes: 1 << 20,
}
}

View File

@@ -84,7 +84,7 @@ func Routers() *gin.Engine {
systemRouter.InitMenuRouter(PrivateGroup) // 注册menu路由
systemRouter.InitSystemRouter(PrivateGroup) // system相关路由
systemRouter.InitCasbinRouter(PrivateGroup) // 权限相关路由
systemRouter.InitAutoCodeRouter(PrivateGroup) // 创建自动化代码
systemRouter.InitAutoCodeRouter(PrivateGroup, PublicGroup) // 创建自动化代码
systemRouter.InitAuthorityRouter(PrivateGroup) // 注册角色路由
systemRouter.InitSysDictionaryRouter(PrivateGroup) // 字典管理
systemRouter.InitAutoCodeHistoryRouter(PrivateGroup) // 自动化代码历史

View File

@@ -7,8 +7,9 @@ import (
type AutoCodeRouter struct{}
func (s *AutoCodeRouter) InitAutoCodeRouter(Router *gin.RouterGroup) {
func (s *AutoCodeRouter) InitAutoCodeRouter(Router *gin.RouterGroup, RouterPublic *gin.RouterGroup) {
autoCodeRouter := Router.Group("autoCode")
publicAutoCodeRouter := RouterPublic.Group("autoCode")
autoCodeApi := v1.ApiGroupApp.SystemApiGroup.AutoCodeApi
{
autoCodeRouter.GET("getDB", autoCodeApi.GetDB) // 获取数据库
@@ -23,4 +24,7 @@ func (s *AutoCodeRouter) InitAutoCodeRouter(Router *gin.RouterGroup) {
autoCodeRouter.POST("installPlugin", autoCodeApi.InstallPlugin) // 自动安装插件
autoCodeRouter.POST("pubPlug", autoCodeApi.PubPlug) // 打包插件
}
{
publicAutoCodeRouter.POST("llmAuto", autoCodeApi.LLMAuto)
}
}

View File

@@ -0,0 +1,62 @@
package request
import (
"bytes"
"encoding/json"
"net/http"
"net/url"
)
func HttpRequest(
urlStr string,
method string,
headers map[string]string,
params map[string]string,
data any) (*http.Response, error) {
// 创建URL
u, err := url.Parse(urlStr)
if err != nil {
return nil, err
}
// 添加查询参数
query := u.Query()
for k, v := range params {
query.Set(k, v)
}
u.RawQuery = query.Encode()
// 将数据编码为JSON
buf := new(bytes.Buffer)
if data != nil {
b, err := json.Marshal(data)
if err != nil {
return nil, err
}
buf = bytes.NewBuffer(b)
}
// 创建请求
req, err := http.NewRequest(method, u.String(), buf)
if err != nil {
return nil, err
}
for k, v := range headers {
req.Header.Set(k, v)
}
if data != nil {
req.Header.Set("Content-Type", "application/json")
}
// 发送请求
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
// 返回响应,让调用者处理
return resp, nil
}