🆕 控制页面新增设置AI模型 #21
@ -16,6 +16,13 @@ type changeStatusParam struct {
|
|||||||
UserId string `json:"userId"`
|
UserId string `json:"userId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// changeUseAiModelParam
|
||||||
|
// @description: 修改使用的AI模型用的参数集
|
||||||
|
type changeUseAiModelParam struct {
|
||||||
|
WxId string `json:"wxid" binding:"required"` // 群Id或微信Id
|
||||||
|
Model string `json:"model" binding:"required"` // 模型代码
|
||||||
|
}
|
||||||
|
|
||||||
// ChangeEnableAiStatus
|
// ChangeEnableAiStatus
|
||||||
// @description: 修改是否开启AI
|
// @description: 修改是否开启AI
|
||||||
// @param ctx
|
// @param ctx
|
||||||
@ -39,6 +46,27 @@ func ChangeEnableAiStatus(ctx *gin.Context) {
|
|||||||
ctx.String(http.StatusOK, "操作成功")
|
ctx.String(http.StatusOK, "操作成功")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChangeUseAiModel
|
||||||
|
// @description: 修改使用的AI模型
|
||||||
|
// @param ctx
|
||||||
|
func ChangeUseAiModel(ctx *gin.Context) {
|
||||||
|
var p changeUseAiModelParam
|
||||||
|
if err := ctx.ShouldBind(&p); err != nil {
|
||||||
|
ctx.String(http.StatusBadRequest, "参数错误")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err := client.MySQL.Model(&entity.Friend{}).
|
||||||
|
Where("wxid = ?", p.WxId).
|
||||||
|
Update("`ai_model`", p.Model).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("修改【%s】的AI模型失败:%s", p.WxId, err)
|
||||||
|
ctx.String(http.StatusInternalServerError, "操作失败: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.String(http.StatusOK, "操作成功")
|
||||||
|
}
|
||||||
|
|
||||||
// ChangeEnableGroupRankStatus
|
// ChangeEnableGroupRankStatus
|
||||||
// @description: 修改是否开启水群排行榜
|
// @description: 修改是否开启水群排行榜
|
||||||
// @param ctx
|
// @param ctx
|
||||||
|
@ -23,6 +23,7 @@ func Index(ctx *gin.Context) {
|
|||||||
result["friends"] = friends
|
result["friends"] = friends
|
||||||
result["groups"] = groups
|
result["groups"] = groups
|
||||||
result["vnc"] = config.Conf.Wechat.VncUrl
|
result["vnc"] = config.Conf.Wechat.VncUrl
|
||||||
|
result["aiModels"] = config.Conf.Ai.Models
|
||||||
// 渲染页面
|
// 渲染页面
|
||||||
ctx.HTML(http.StatusOK, "index.html", result)
|
ctx.HTML(http.StatusOK, "index.html", result)
|
||||||
}
|
}
|
||||||
|
15
config.yaml
15
config.yaml
@ -3,7 +3,7 @@ wechat:
|
|||||||
# 微信HOOK接口地址
|
# 微信HOOK接口地址
|
||||||
host: 10.0.0.73:19088
|
host: 10.0.0.73:19088
|
||||||
# 微信容器映射出来的vnc页面地址,没有就不填
|
# 微信容器映射出来的vnc页面地址,没有就不填
|
||||||
vncUrl: http://192.168.1.175:19087/vnc_lite.html
|
# vncUrl: http://192.168.1.175:19087/vnc_lite.html
|
||||||
# 是否在启动的时候自动设置hook服务的回调
|
# 是否在启动的时候自动设置hook服务的回调
|
||||||
autoSetCallback: false
|
autoSetCallback: false
|
||||||
# 回调IP,如果是Docker运行,本参数必填(填auto表示自动,不适用于 docker 环境),如果Docker修改了映射,格式为 ip:port
|
# 回调IP,如果是Docker运行,本参数必填(填auto表示自动,不适用于 docker 环境),如果Docker修改了映射,格式为 ip:port
|
||||||
@ -45,6 +45,19 @@ ai:
|
|||||||
baseUrl: https://sxxx
|
baseUrl: https://sxxx
|
||||||
# 人设
|
# 人设
|
||||||
personality: 你的名字叫张三,你是一个百科机器人,你的爱好是看电影,你的性格是开朗的,你的专长是讲故事,你的梦想是当一名童话故事作家。你对政治没有一点儿兴趣,也不会讨论任何与政治相关的话题,你甚至可以拒绝回答这一类话题。
|
personality: 你的名字叫张三,你是一个百科机器人,你的爱好是看电影,你的性格是开朗的,你的专长是讲故事,你的梦想是当一名童话故事作家。你对政治没有一点儿兴趣,也不会讨论任何与政治相关的话题,你甚至可以拒绝回答这一类话题。
|
||||||
|
models:
|
||||||
|
- name: ChatGPT-4
|
||||||
|
model: gpt-4-0613
|
||||||
|
- name: 讯飞星火v3
|
||||||
|
model: SparkDesk3
|
||||||
|
- name: 讯飞星火随机
|
||||||
|
model: SparkDesk
|
||||||
|
- name: 月之暗面-8k
|
||||||
|
model: moonshot-v1-8k
|
||||||
|
- name: 月之暗面-32k
|
||||||
|
model: moonshot-v1-32k
|
||||||
|
- name: 月之暗面-128k
|
||||||
|
model: moonshot-v1-128k
|
||||||
|
|
||||||
# 资源配置
|
# 资源配置
|
||||||
# map[k]v结构,k 会变成全小写,所以这儿不能用大写字母
|
# map[k]v结构,k 会变成全小写,所以这儿不能用大写字母
|
||||||
|
18
config/ai.go
18
config/ai.go
@ -3,9 +3,17 @@ package config
|
|||||||
// ai
|
// ai
|
||||||
// @description: AI配置
|
// @description: AI配置
|
||||||
type ai struct {
|
type ai struct {
|
||||||
Enable bool `json:"enable" yaml:"enable"` // 是否启用AI
|
Enable bool `json:"enable" yaml:"enable"` // 是否启用AI
|
||||||
Model string `json:"model" yaml:"model"` // 模型
|
Model string `json:"model" yaml:"model"` // 模型
|
||||||
ApiKey string `json:"apiKey" yaml:"apiKey"` // API Key
|
ApiKey string `json:"apiKey" yaml:"apiKey"` // API Key
|
||||||
BaseUrl string `json:"baseUrl" yaml:"baseUrl"` // API地址
|
BaseUrl string `json:"baseUrl" yaml:"baseUrl"` // API地址
|
||||||
Personality string `json:"personality" yaml:"personality"` // 人设
|
Personality string `json:"personality" yaml:"personality"` // 人设
|
||||||
|
Models []aiModel `json:"models" yaml:"models"` // 模型列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// aiModel
|
||||||
|
// @description: AI模型
|
||||||
|
type aiModel struct {
|
||||||
|
Name string `json:"name" yaml:"name"` // 模型名称
|
||||||
|
Model string `json:"model" yaml:"model"` // 模型代码
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ func Init(g *gin.Engine) {
|
|||||||
// 接口
|
// 接口
|
||||||
api := g.Group("/api")
|
api := g.Group("/api")
|
||||||
api.PUT("/ai/status", app.ChangeEnableAiStatus) // 修改是否开启AI状态
|
api.PUT("/ai/status", app.ChangeEnableAiStatus) // 修改是否开启AI状态
|
||||||
|
api.POST("/ai/model", app.ChangeUseAiModel) // 修改使用的AI模型
|
||||||
api.PUT("/welcome/status", app.ChangeEnableWelcomeStatus) // 修改是否开启迎新状态
|
api.PUT("/welcome/status", app.ChangeEnableWelcomeStatus) // 修改是否开启迎新状态
|
||||||
api.PUT("/command/status", app.ChangeEnableCommandStatus) // 修改是否开启指令状态
|
api.PUT("/command/status", app.ChangeEnableCommandStatus) // 修改是否开启指令状态
|
||||||
api.PUT("/grouprank/status", app.ChangeEnableGroupRankStatus) // 修改是否开启水群排行榜状态
|
api.PUT("/grouprank/status", app.ChangeEnableGroupRankStatus) // 修改是否开启水群排行榜状态
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>水群助手</title>
|
<title>水群助手</title>
|
||||||
|
|
||||||
<!-- <link href="https://cdn.jsdelivr.net/npm/daisyui@4.4.14/dist/full.min.css" rel="stylesheet" type="text/css" />-->
|
|
||||||
<link href="assets/css/daisyui-4.4.14-full.min.css" rel="stylesheet" type="text/css" />
|
<link href="assets/css/daisyui-4.4.14-full.min.css" rel="stylesheet" type="text/css" />
|
||||||
<link href="assets/css/index.css" rel="stylesheet" type="text/css" />
|
<link href="assets/css/index.css" rel="stylesheet" type="text/css" />
|
||||||
|
|
||||||
@ -71,6 +70,16 @@
|
|||||||
<div class="swap-on">✔️已启用</div>
|
<div class="swap-on">✔️已启用</div>
|
||||||
<div class="swap-off">❌已禁用</div>
|
<div class="swap-off">❌已禁用</div>
|
||||||
</label>
|
</label>
|
||||||
|
{{ if .EnableAi }}
|
||||||
|
<br />
|
||||||
|
<select class="select select-success select-xs w-1/2 max-w-xs" onchange="aiModelChange(event, {{.Wxid}})">
|
||||||
|
<option value="" {{ if eq .AiModel ""}}selected{{ end }}>默认(gpt-3.5-turbo-0613)</option>
|
||||||
|
{{$useModel := .AiModel}}
|
||||||
|
{{ range $.aiModels }}
|
||||||
|
<option value="{{.Model}}" {{ if eq $useModel .Model}}selected{{ end }}>{{.Name}}({{.Model}})</option>
|
||||||
|
{{ end }}
|
||||||
|
</select>
|
||||||
|
{{ end }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<label class="swap swap-flip {{ checkSwap .EnableCommand }}">
|
<label class="swap swap-flip {{ checkSwap .EnableCommand }}">
|
||||||
@ -135,6 +144,16 @@
|
|||||||
<div class="swap-on">✔️已启用</div>
|
<div class="swap-on">✔️已启用</div>
|
||||||
<div class="swap-off">❌已禁用</div>
|
<div class="swap-off">❌已禁用</div>
|
||||||
</label>
|
</label>
|
||||||
|
{{ if .EnableAi }}
|
||||||
|
<br />
|
||||||
|
<select class="select select-success select-xs w-1/2 max-w-xs" onchange="aiModelChange(event, {{.Wxid}})">
|
||||||
|
<option value="" {{ if eq .AiModel ""}}selected{{ end }}>默认(gpt-3.5-turbo-0613)</option>
|
||||||
|
{{$useModel := .AiModel}}
|
||||||
|
{{ range $.aiModels }}
|
||||||
|
<option value="{{.Model}}" {{ if eq $useModel .Model}}selected{{ end }}>{{.Name}}({{.Model}})</option>
|
||||||
|
{{ end }}
|
||||||
|
</select>
|
||||||
|
{{ end }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<!-- EnableChatRank -->
|
<!-- EnableChatRank -->
|
||||||
|
@ -135,3 +135,24 @@ function getGroupUsers(groupId, groupName) {
|
|||||||
groupNameTag.innerHTML = groupName
|
groupNameTag.innerHTML = groupName
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AI模型变动
|
||||||
|
function aiModelChange(event, wxid) {
|
||||||
|
// 取出变动后的值
|
||||||
|
const modelStr = event.target.value;
|
||||||
|
console.log("AI模型变动: ", wxid, modelStr)
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: '/api/ai/model',
|
||||||
|
data: {
|
||||||
|
wxid: wxid,
|
||||||
|
model: modelStr
|
||||||
|
}
|
||||||
|
}).then(function (response) {
|
||||||
|
console.log(`返回结果: ${JSON.stringify(response)}`);
|
||||||
|
alert(`${response.data}`)
|
||||||
|
}).catch(function (error) {
|
||||||
|
console.log(`错误信息: ${error}`);
|
||||||
|
alert("修改失败")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user