Skip to content

Commit b1d4bdf

Browse files
authored
Merge branch 'FloatTech:master' into feature-rsshub-20250914
2 parents fb32a5c + 43cc90b commit b1d4bdf

File tree

15 files changed

+629
-364
lines changed

15 files changed

+629
-364
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1644,12 +1644,12 @@ print("run[CQ:image,file="+j["img"]+"]")
16441644

16451645
- [x] 设置AI聊天触发概率10
16461646
- [x] 设置AI聊天温度80
1647-
- [x] 设置AI聊天接口类型[OpenAI|OLLaMA|GenAI]
1647+
- [x] 设置AI聊天(识图)接口类型[OpenAI|OLLaMA|GenAI]
16481648
- [x] 设置AI聊天(不)使用Agent模式
16491649
- [x] 设置AI聊天(不)支持系统提示词
1650-
- [x] 设置AI聊天接口地址https://api.siliconflow.cn/v1/chat/completions
1651-
- [x] 设置AI聊天密钥xxx
1652-
- [x] 设置AI聊天模型名Qwen/Qwen3-8B
1650+
- [x] 设置AI聊天(识图)接口地址https://api.siliconflow.cn/v1/chat/completions
1651+
- [x] 设置AI聊天(识图)密钥xxx
1652+
- [x] 设置AI聊天(识图)模型名Qwen/Qwen3-8B
16531653
- [x] 查看AI聊天系统提示词
16541654
- [x] 重置AI聊天系统提示词
16551655
- [x] 设置AI聊天系统提示词xxx

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ require (
1212
github.com/FloatTech/sqlite v1.7.1
1313
github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562
1414
github.com/FloatTech/zbpctrl v1.7.0
15-
github.com/FloatTech/zbputils v1.7.2-0.20250922144137-bf2b9bb6a8d9
15+
github.com/FloatTech/zbputils v1.7.2-0.20250925155009-638ed762e15e
1616
github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7
1717
github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5
1818
github.com/Tnze/go-mc v1.20.2
@@ -22,9 +22,9 @@ require (
2222
github.com/disintegration/imaging v1.6.2
2323
github.com/fumiama/ahsai v0.1.0
2424
github.com/fumiama/cron v1.3.0
25-
github.com/fumiama/deepinfra v0.0.0-20250920170049-e3d1b92cc3a1
25+
github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa
2626
github.com/fumiama/go-base16384 v1.7.0
27-
github.com/fumiama/go-onebot-agent v0.0.0-20250922152742-c40bb3512d63
27+
github.com/fumiama/go-onebot-agent v0.0.0-20250925150209-46ace7c2b17a
2828
github.com/fumiama/go-registry v0.2.7
2929
github.com/fumiama/gotracemoe v0.0.3
3030
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565
@@ -66,7 +66,7 @@ require (
6666
github.com/faiface/beep v1.1.0 // indirect
6767
github.com/fumiama/go-simple-protobuf v0.2.0 // indirect
6868
github.com/fumiama/gofastTEA v0.0.10 // indirect
69-
github.com/fumiama/imgsz v0.0.2 // indirect
69+
github.com/fumiama/imgsz v0.0.4 // indirect
7070
github.com/gabriel-vasile/mimetype v1.0.4 // indirect
7171
github.com/go-ole/go-ole v1.2.6 // indirect
7272
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect

go.sum

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562 h1:snfw7FNFym1eNnLrQ
1717
github.com/FloatTech/ttl v0.0.0-20240716161252-965925764562/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
1818
github.com/FloatTech/zbpctrl v1.7.0 h1:Hxo6EIhJo+pHjcQP9QgIJgluaT1pHH99zkk3njqTNMo=
1919
github.com/FloatTech/zbpctrl v1.7.0/go.mod h1:xmM4dSwHA02Gei3ogCRiG+RTrw/7Z69PfrN5NYf8BPE=
20-
github.com/FloatTech/zbputils v1.7.2-0.20250922144137-bf2b9bb6a8d9 h1:iR36inettls14aMOADNQ7PHNlGvgyDRRYp2dBgZCp8A=
21-
github.com/FloatTech/zbputils v1.7.2-0.20250922144137-bf2b9bb6a8d9/go.mod h1:L1Rvdf6JUXGRIdKaXVtBWa0iW481zccCjYdYeDSaMXs=
20+
github.com/FloatTech/zbputils v1.7.2-0.20250925155009-638ed762e15e h1:M+pIxQFztHqrtUVmfctSs/D5ytn0ag6twP6iJg3gdEk=
21+
github.com/FloatTech/zbputils v1.7.2-0.20250925155009-638ed762e15e/go.mod h1:AUDxqs7liBF2H7TpSs+OXZj1Akyh0moUN/J/j8iNFxc=
2222
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
2323
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
2424
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
@@ -63,12 +63,12 @@ github.com/fumiama/ahsai v0.1.0 h1:LXD61Kaj6kJHa3AEGsLIfKNzcgaVxg7JB72OR4yNNZ4=
6363
github.com/fumiama/ahsai v0.1.0/go.mod h1:fFeNnqgo44i8FIaguK659aQryuZeFy+4klYLQu/rfdk=
6464
github.com/fumiama/cron v1.3.0 h1:ZWlwuexF+HQHl3cYytEE5HNwD99q+3vNZF1GrEiXCFo=
6565
github.com/fumiama/cron v1.3.0/go.mod h1:bz5Izvgi/xEUI8tlBN8BI2jr9Moo8N4or0KV8xXuPDY=
66-
github.com/fumiama/deepinfra v0.0.0-20250920170049-e3d1b92cc3a1 h1:6PglFpNVm3DalGyRldacW2/v4jGWwn3v3q1tr2PhbVQ=
67-
github.com/fumiama/deepinfra v0.0.0-20250920170049-e3d1b92cc3a1/go.mod h1:wW05PQSn8mo1mZIoa6LBUE+3xIBjkoONvnfPTV5ZOhY=
66+
github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa h1:UMMNejpPp8dn92GPaVSZ2XKNSgp7+CVneOkZfExUilk=
67+
github.com/fumiama/deepinfra v0.0.0-20250924162107-cf156d49a0fa/go.mod h1:uqsWK/GM9OvKV0pXZOQB63rWugBbiXInY8E1JoRKhkg=
6868
github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMWSsXCA=
6969
github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM=
70-
github.com/fumiama/go-onebot-agent v0.0.0-20250922152742-c40bb3512d63 h1:ZdPMPIgZMH4HV4A/JIBb8G7UpLM4iUHWQ8qGjKnKiVI=
71-
github.com/fumiama/go-onebot-agent v0.0.0-20250922152742-c40bb3512d63/go.mod h1:wVMgFWkR3GpipL05FkokvrV/jWFIgoEWN1jzUGa0bWg=
70+
github.com/fumiama/go-onebot-agent v0.0.0-20250925150209-46ace7c2b17a h1:PapkA1fkFCzBbcmFaxRQvRAHbRig3NIgstzG7OFcXjQ=
71+
github.com/fumiama/go-onebot-agent v0.0.0-20250925150209-46ace7c2b17a/go.mod h1:FIhZxVeFAs201W06EgXxx/6b/l/ETSmu2sQOj10kjdk=
7272
github.com/fumiama/go-registry v0.2.7 h1:tLEqgEpsiybQMqBv0dLHm5leia/z1DhajMupwnOHeNs=
7373
github.com/fumiama/go-registry v0.2.7/go.mod h1:m+wp5fF8dYgVoFkBPZl+vlK90loymaJE0JCtocVQLEs=
7474
github.com/fumiama/go-simple-protobuf v0.2.0 h1:ACyN1MAlu7pDR3EszWgzUeNP+IRsSHwH6V9JCJA5R5o=
@@ -77,8 +77,8 @@ github.com/fumiama/gofastTEA v0.0.10 h1:JJJ+brWD4kie+mmK2TkspDXKzqq0IjXm89aGYfoG
7777
github.com/fumiama/gofastTEA v0.0.10/go.mod h1:RIdbYZyB4MbH6ZBlPymRaXn3cD6SedlCu5W/HHfMPBk=
7878
github.com/fumiama/gotracemoe v0.0.3 h1:iI5EbE9A3UUbfukG6+/soYPjp1S31eCNYf4tw7s6/Jc=
7979
github.com/fumiama/gotracemoe v0.0.3/go.mod h1:tyqahdUzHf0bQIAVY/GYmDWvYYe5ik1ZbhnGYh+zl40=
80-
github.com/fumiama/imgsz v0.0.2 h1:fAkC0FnIscdKOXwAxlyw3EUba5NzxZdSxGaq3Uyfxak=
81-
github.com/fumiama/imgsz v0.0.2/go.mod h1:dR71mI3I2O5u6+PCpd47M9TZptzP+39tRBcbdIkoqM4=
80+
github.com/fumiama/imgsz v0.0.4 h1:Lsasu2hdSSFS+vnD+nvR1UkiRMK7hcpyYCC0FzgSMFI=
81+
github.com/fumiama/imgsz v0.0.4/go.mod h1:bISOQVTlw9sRytPwe8ir7tAaEmyz9hSNj9n8mXMBG0E=
8282
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565 h1:sQuR2+N5HurnvsZhiKdEg+Ig354TaqgCQRxd/0KgIOQ=
8383
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565/go.mod h1:UUEvyLTJ7yoOA/viKG4wEis4ERydM7+Ny6gZUWgkS80=
8484
github.com/fumiama/libc v0.0.0-20240530081950-6f6d8586b5c5 h1:jDxsIupsT84A6WHcs6kWbst+KqrRQ8/o0VyoFMnbBOA=

plugin/aichat/cfg.go

Lines changed: 127 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package aichat
22

33
import (
4+
"errors"
45
"fmt"
56
"strconv"
67
"strings"
@@ -18,19 +19,92 @@ var (
1819
cfg = newconfig()
1920
)
2021

22+
var (
23+
apitypes = map[string]uint8{
24+
"OpenAI": 0,
25+
"OLLaMA": 1,
26+
"GenAI": 2,
27+
}
28+
apilist = [3]string{"OpenAI", "OLLaMA", "GenAI"}
29+
)
30+
31+
// ModelType 支持打印 string 并生产 protocal
32+
type ModelType int
33+
34+
func newModelType(typ string) (ModelType, error) {
35+
t, ok := apitypes[typ]
36+
if !ok {
37+
return 0, errors.New("未知类型 " + typ)
38+
}
39+
return ModelType(t), nil
40+
}
41+
42+
func (mt ModelType) String() string {
43+
return apilist[mt]
44+
}
45+
46+
func (mt ModelType) protocol(modn string, temp float32, topp float32, maxn uint) (mod model.Protocol, err error) {
47+
switch cfg.Type {
48+
case 0:
49+
mod = model.NewOpenAI(
50+
modn, cfg.Separator,
51+
temp, topp, maxn,
52+
)
53+
case 1:
54+
mod = model.NewOLLaMA(
55+
modn, cfg.Separator,
56+
temp, topp, maxn,
57+
)
58+
case 2:
59+
mod = model.NewGenAI(
60+
modn,
61+
temp, topp, maxn,
62+
)
63+
default:
64+
err = errors.New("unsupported model type " + strconv.Itoa(int(cfg.Type)))
65+
}
66+
return
67+
}
68+
69+
// ModelBool 支持打印成 "是/否"
70+
type ModelBool bool
71+
72+
func (mb ModelBool) String() string {
73+
if mb {
74+
return "是"
75+
}
76+
return "否"
77+
}
78+
79+
// ModelKey 支持隐藏密钥
80+
type ModelKey string
81+
82+
func (mk ModelKey) String() string {
83+
if len(mk) == 0 {
84+
return "未设置"
85+
}
86+
if len(mk) <= 4 {
87+
return "****"
88+
}
89+
key := string(mk)
90+
return key[:2] + strings.Repeat("*", len(key)-4) + key[len(key)-2:]
91+
}
92+
2193
type config struct {
22-
ModelName string
23-
Type int
24-
MaxN uint
25-
TopP float32
26-
SystemP string
27-
API string
28-
Key string
29-
Separator string
30-
NoReplyAT bool
31-
NoSystemP bool
32-
NoRecord bool
33-
NoAgent bool
94+
ModelName string
95+
ImageModelName string
96+
Type ModelType
97+
ImageType ModelType
98+
MaxN uint
99+
TopP float32
100+
SystemP string
101+
API string
102+
ImageAPI string
103+
Key ModelKey
104+
ImageKey ModelKey
105+
Separator string
106+
NoReplyAT ModelBool
107+
NoSystemP ModelBool
34108
}
35109

36110
func newconfig() config {
@@ -41,10 +115,47 @@ func newconfig() config {
41115
}
42116
}
43117

118+
func (c *config) String() string {
119+
topp, maxn := c.mparams()
120+
sb := strings.Builder{}
121+
sb.WriteString(fmt.Sprintf("• 模型名:%s\n", c.ModelName))
122+
sb.WriteString(fmt.Sprintf("• 图像模型名:%s\n", c.ImageModelName))
123+
sb.WriteString(fmt.Sprintf("• 接口类型:%v\n", c.Type))
124+
sb.WriteString(fmt.Sprintf("• 图像接口类型:%v\n", c.ImageType))
125+
sb.WriteString(fmt.Sprintf("• 最大长度:%d\n", maxn))
126+
sb.WriteString(fmt.Sprintf("• TopP:%.1f\n", topp))
127+
sb.WriteString(fmt.Sprintf("• 系统提示词:%s\n", c.SystemP))
128+
sb.WriteString(fmt.Sprintf("• 接口地址:%s\n", c.API))
129+
sb.WriteString(fmt.Sprintf("• 图像接口地址:%s\n", c.ImageAPI))
130+
sb.WriteString(fmt.Sprintf("• 密钥:%v\n", c.Key))
131+
sb.WriteString(fmt.Sprintf("• 图像密钥:%v\n", c.ImageKey))
132+
sb.WriteString(fmt.Sprintf("• 分隔符:%s\n", c.Separator))
133+
sb.WriteString(fmt.Sprintf("• 响应@:%v\n", !c.NoReplyAT))
134+
sb.WriteString(fmt.Sprintf("• 支持系统提示词:%v\n", !c.NoSystemP))
135+
return sb.String()
136+
}
137+
44138
func (c *config) isvalid() bool {
45139
return c.ModelName != "" && c.API != "" && c.Key != ""
46140
}
47141

142+
// 获取全局模型参数:TopP和最大长度
143+
func (c *config) mparams() (topp float32, maxn uint) {
144+
// 处理TopP参数
145+
topp = c.TopP
146+
if topp == 0 {
147+
topp = 0.9
148+
}
149+
150+
// 处理最大长度参数
151+
maxn = c.MaxN
152+
if maxn == 0 {
153+
maxn = 4096
154+
}
155+
156+
return topp, maxn
157+
}
158+
48159
func ensureconfig(ctx *zero.Ctx) bool {
49160
c, ok := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
50161
if !ok {
@@ -62,7 +173,7 @@ func ensureconfig(ctx *zero.Ctx) bool {
62173
return true
63174
}
64175

65-
func newextrasetstr(ptr *string) func(ctx *zero.Ctx) {
176+
func newextrasetstr[T ~string](ptr *T) func(ctx *zero.Ctx) {
66177
return func(ctx *zero.Ctx) {
67178
args := strings.TrimSpace(ctx.State["args"].(string))
68179
if args == "" {
@@ -74,7 +185,7 @@ func newextrasetstr(ptr *string) func(ctx *zero.Ctx) {
74185
ctx.SendChain(message.Text("ERROR: no such plugin"))
75186
return
76187
}
77-
*ptr = args
188+
*ptr = T(args)
78189
err := c.SetExtra(&cfg)
79190
if err != nil {
80191
ctx.SendChain(message.Text("ERROR: set extra err: ", err))
@@ -84,7 +195,7 @@ func newextrasetstr(ptr *string) func(ctx *zero.Ctx) {
84195
}
85196
}
86197

87-
func newextrasetbool(ptr *bool) func(ctx *zero.Ctx) {
198+
func newextrasetbool[T ~bool](ptr *T) func(ctx *zero.Ctx) {
88199
return func(ctx *zero.Ctx) {
89200
args := ctx.State["regex_matched"].([]string)
90201
isno := args[1] == "不"
@@ -93,7 +204,7 @@ func newextrasetbool(ptr *bool) func(ctx *zero.Ctx) {
93204
ctx.SendChain(message.Text("ERROR: no such plugin"))
94205
return
95206
}
96-
*ptr = isno
207+
*ptr = T(isno)
97208
err := c.SetExtra(&cfg)
98209
if err != nil {
99210
ctx.SendChain(message.Text("ERROR: set extra err: ", err))
@@ -156,44 +267,3 @@ func newextrasetfloat32(ptr *float32) func(ctx *zero.Ctx) {
156267
ctx.SendChain(message.Text("成功"))
157268
}
158269
}
159-
160-
func printConfig(rate int64, temperature int64, cfg config) string {
161-
maxn := cfg.MaxN
162-
if maxn == 0 {
163-
maxn = 4096
164-
}
165-
topp := cfg.TopP
166-
if topp == 0 {
167-
topp = 0.9
168-
}
169-
var builder strings.Builder
170-
builder.WriteString("当前AI聊天配置:\n")
171-
builder.WriteString(fmt.Sprintf("• 模型名:%s\n", cfg.ModelName))
172-
builder.WriteString(fmt.Sprintf("• 接口类型:%d(%s)\n", cfg.Type, apilist[cfg.Type]))
173-
builder.WriteString(fmt.Sprintf("• 触发概率:%d%%\n", rate))
174-
builder.WriteString(fmt.Sprintf("• 温度:%.2f\n", float32(temperature)/100))
175-
builder.WriteString(fmt.Sprintf("• 最大长度:%d\n", maxn))
176-
builder.WriteString(fmt.Sprintf("• TopP:%.1f\n", topp))
177-
builder.WriteString(fmt.Sprintf("• 系统提示词:%s\n", cfg.SystemP))
178-
builder.WriteString(fmt.Sprintf("• 接口地址:%s\n", cfg.API))
179-
builder.WriteString(fmt.Sprintf("• 密钥:%s\n", maskKey(cfg.Key)))
180-
builder.WriteString(fmt.Sprintf("• 分隔符:%s\n", cfg.Separator))
181-
builder.WriteString(fmt.Sprintf("• 响应@:%s\n", yesNo(!cfg.NoReplyAT)))
182-
builder.WriteString(fmt.Sprintf("• 支持系统提示词:%s\n", yesNo(!cfg.NoSystemP)))
183-
builder.WriteString(fmt.Sprintf("• 以AI语音输出:%s\n", yesNo(!cfg.NoRecord)))
184-
return builder.String()
185-
}
186-
187-
func maskKey(key string) string {
188-
if len(key) <= 4 {
189-
return "****"
190-
}
191-
return key[:2] + strings.Repeat("*", len(key)-4) + key[len(key)-2:]
192-
}
193-
194-
func yesNo(b bool) string {
195-
if b {
196-
return "是"
197-
}
198-
return "否"
199-
}

0 commit comments

Comments
 (0)