@@ -34,12 +34,12 @@ var (
3434 Brief : "OpenAI聊天" ,
3535 Help : "- 设置AI聊天触发概率10\n " +
3636 "- 设置AI聊天温度80\n " +
37- "- 设置AI聊天(识图)接口类型[OpenAI|OLLaMA|GenAI]\n " +
37+ "- 设置AI聊天(识图|Agent )接口类型[OpenAI|OLLaMA|GenAI]\n " +
3838 "- 设置AI聊天(不)使用Agent模式\n " +
3939 "- 设置AI聊天(不)支持系统提示词\n " +
40- "- 设置AI聊天(识图)接口地址https://api.siliconflow.cn/v1/chat/completions\n " +
41- "- 设置AI聊天(识图)密钥xxx\n " +
42- "- 设置AI聊天(识图)模型名Qwen/Qwen3-8B\n " +
40+ "- 设置AI聊天(识图|Agent )接口地址https://api.siliconflow.cn/v1/chat/completions\n " +
41+ "- 设置AI聊天(识图|Agent )密钥xxx\n " +
42+ "- 设置AI聊天(识图|Agent )模型名Qwen/Qwen3-8B\n " +
4343 "- 查看AI聊天系统提示词\n " +
4444 "- 重置AI聊天系统提示词\n " +
4545 "- 设置AI聊天系统提示词xxx\n " +
@@ -71,18 +71,24 @@ var (
7171
7272func init () {
7373 en .OnMessage (ensureconfig , func (ctx * zero.Ctx ) bool {
74- return ctx .ExtractPlainText () != "" &&
75- (bool (! cfg .NoReplyAT ) || (bool (cfg .NoReplyAT ) && ! ctx .Event .IsToMe ))
76- }).SetBlock (false ).Handle (func (ctx * zero.Ctx ) {
7774 gid := ctx .Event .GroupID
7875 if gid == 0 {
7976 gid = - ctx .Event .UserID
8077 }
8178 stor , err := newstorage (ctx , gid )
8279 if err != nil {
8380 logrus .Warnln ("ERROR: " , err )
84- return
81+ return false
82+ }
83+ ctx .State ["__aichat_stor__" ] = stor
84+ return ctx .ExtractPlainText () != "" &&
85+ (bool (! stor .noreplyat ()) || (bool (stor .noreplyat ()) && ! ctx .Event .IsToMe ))
86+ }).SetBlock (false ).Handle (func (ctx * zero.Ctx ) {
87+ gid := ctx .Event .GroupID
88+ if gid == 0 {
89+ gid = - ctx .Event .UserID
8590 }
91+ stor := ctx .State ["__aichat_stor__" ].(storage )
8692 rate := stor .rate ()
8793 if ! ctx .Event .IsToMe && rand .Intn (100 ) >= int (rate ) {
8894 return
@@ -97,14 +103,13 @@ func init() {
97103 temperature := stor .temp ()
98104 topp , maxn := cfg .mparams ()
99105
100- x := deepinfra .NewAPI (cfg .API , string (cfg .Key ))
101- mod , err := cfg .Type .protocol (cfg .ModelName , temperature , topp , maxn )
102- if err != nil {
103- logrus .Warnln ("ERROR: " , err )
104- return
105- }
106-
107106 if ! stor .noagent () {
107+ x := deepinfra .NewAPI (cfg .AgentAPI , string (cfg .AgentKey ))
108+ mod , err := cfg .Type .protocol (cfg .AgentModelName , temperature , topp , maxn )
109+ if err != nil {
110+ logrus .Warnln ("ERROR: " , err )
111+ return
112+ }
108113 role := goba .PermRoleUser
109114 if zero .AdminPermission (ctx ) {
110115 role = goba .PermRoleAdmin
@@ -123,15 +128,10 @@ func init() {
123128 }
124129 ctx .NoTimeout ()
125130 hasresp := false
126- defer func () {
127- if hasresp {
128- ag .AddTerminus (gid )
129- }
130- }()
131131 for i := 0 ; i < 8 ; i ++ { // 最大运行 8 轮因为问答上下文只有 16
132132 reqs := chat .CallAgent (ag , zero .SuperUserPermission (ctx ), x , mod , gid , role )
133133 if len (reqs ) == 0 {
134- return
134+ break
135135 }
136136 hasresp = true
137137 for _ , req := range reqs {
@@ -146,9 +146,19 @@ func init() {
146146 })
147147 }
148148 }
149- return
149+ if hasresp {
150+ ag .AddTerminus (gid )
151+ return
152+ }
153+ // no response, fall back to normal chat
150154 }
151155
156+ x := deepinfra .NewAPI (cfg .API , string (cfg .Key ))
157+ mod , err := cfg .Type .protocol (cfg .ModelName , temperature , topp , maxn )
158+ if err != nil {
159+ logrus .Warnln ("ERROR: " , err )
160+ return
161+ }
152162 data , err := x .Request (chat .GetChatContext (mod , gid , cfg .SystemP , bool (cfg .NoSystemP )))
153163 if err != nil {
154164 logrus .Warnln ("[aichat] post err:" , err )
@@ -188,68 +198,34 @@ func init() {
188198 }
189199 }
190200 })
191- en .OnPrefix ("设置AI聊天触发概率" , zero .AdminPermission ).SetBlock (true ).Handle (newstoragebitmap (bitmaprate , 0 , 100 ))
192- en .OnPrefix ("设置AI聊天温度" , zero .AdminPermission ).SetBlock (true ).Handle (newstoragebitmap (bitmaptemp , 0 , 100 ))
193- en .OnPrefix ("设置AI聊天接口类型" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).Handle (func (ctx * zero.Ctx ) {
194- args := strings .TrimSpace (ctx .State ["args" ].(string ))
195- if args == "" {
196- ctx .SendChain (message .Text ("ERROR: empty args" ))
197- return
198- }
199- c , ok := ctx .State ["manager" ].(* ctrl.Control [* zero.Ctx ])
200- if ! ok {
201- ctx .SendChain (message .Text ("ERROR: no such plugin" ))
202- return
203- }
204- typ , err := newModelType (args )
205- if err != nil {
206- ctx .SendChain (message .Text ("ERROR: " , err ))
207- return
208- }
209- cfg .Type = typ
210- err = c .SetExtra (& cfg )
211- if err != nil {
212- ctx .SendChain (message .Text ("ERROR: set extra err: " , err ))
213- return
214- }
215- ctx .SendChain (message .Text ("成功" ))
216- })
217- en .OnPrefix ("设置AI聊天识图接口类型" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).Handle (func (ctx * zero.Ctx ) {
218- args := strings .TrimSpace (ctx .State ["args" ].(string ))
219- if args == "" {
220- ctx .SendChain (message .Text ("ERROR: empty args" ))
221- return
222- }
223- c , ok := ctx .State ["manager" ].(* ctrl.Control [* zero.Ctx ])
224- if ! ok {
225- ctx .SendChain (message .Text ("ERROR: no such plugin" ))
226- return
227- }
228- typ , err := newModelType (args )
229- if err != nil {
230- ctx .SendChain (message .Text ("ERROR: " , err ))
231- return
232- }
233- cfg .ImageType = typ
234- err = c .SetExtra (& cfg )
235- if err != nil {
236- ctx .SendChain (message .Text ("ERROR: set extra err: " , err ))
237- return
238- }
239- ctx .SendChain (message .Text ("成功" ))
240- })
201+ en .OnPrefix ("设置AI聊天触发概率" , zero .AdminPermission ).SetBlock (true ).
202+ Handle (ctxext .NewStorageSaveBitmapHandler (bitmaprate , 0 , 100 ))
203+ en .OnPrefix ("设置AI聊天温度" , zero .AdminPermission ).SetBlock (true ).
204+ Handle (ctxext .NewStorageSaveBitmapHandler (bitmaptemp , 0 , 100 ))
205+ en .OnPrefix ("设置AI聊天接口类型" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
206+ Handle (newextrasetmodeltype (& cfg .Type ))
207+ en .OnPrefix ("设置AI聊天识图接口类型" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
208+ Handle (newextrasetmodeltype (& cfg .ImageType ))
209+ en .OnPrefix ("设置AI聊天Agent接口类型" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
210+ Handle (newextrasetmodeltype (& cfg .AgentType ))
241211 en .OnPrefix ("设置AI聊天接口地址" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
242212 Handle (newextrasetstr (& cfg .API ))
243213 en .OnPrefix ("设置AI聊天识图接口地址" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
244214 Handle (newextrasetstr (& cfg .ImageAPI ))
215+ en .OnPrefix ("设置AI聊天Agent接口地址" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
216+ Handle (newextrasetstr (& cfg .AgentAPI ))
245217 en .OnPrefix ("设置AI聊天密钥" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
246218 Handle (newextrasetstr (& cfg .Key ))
247219 en .OnPrefix ("设置AI聊天识图密钥" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
248220 Handle (newextrasetstr (& cfg .ImageKey ))
221+ en .OnPrefix ("设置AI聊天Agent密钥" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
222+ Handle (newextrasetstr (& cfg .ImageKey ))
249223 en .OnPrefix ("设置AI聊天模型名" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
250224 Handle (newextrasetstr (& cfg .ModelName ))
251225 en .OnPrefix ("设置AI聊天识图模型名" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
252226 Handle (newextrasetstr (& cfg .ImageModelName ))
227+ en .OnPrefix ("设置AI聊天Agent模型名" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
228+ Handle (newextrasetstr (& cfg .ImageModelName ))
253229 en .OnPrefix ("设置AI聊天系统提示词" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
254230 Handle (newextrasetstr (& cfg .SystemP ))
255231 en .OnFullMatch ("查看AI聊天系统提示词" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).Handle (func (ctx * zero.Ctx ) {
@@ -272,17 +248,17 @@ func init() {
272248 en .OnPrefix ("设置AI聊天分隔符" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
273249 Handle (newextrasetstr (& cfg .Separator ))
274250 en .OnRegex ("^设置AI聊天(不)?响应AT$" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
275- Handle (newextrasetbool ( & cfg . NoReplyAT ))
251+ Handle (ctxext . NewStorageSaveBoolHandler ( bitmapnrat ))
276252 en .OnRegex ("^设置AI聊天(不)?支持系统提示词$" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
277253 Handle (newextrasetbool (& cfg .NoSystemP ))
278254 en .OnRegex ("^设置AI聊天(不)?使用Agent模式$" , ensureconfig , zero .SuperUserPermission ).SetBlock (true ).
279- Handle (newstoragebool (bitmapnagt ))
255+ Handle (ctxext . NewStorageSaveBoolHandler (bitmapnagt ))
280256 en .OnPrefix ("设置AI聊天最大长度" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
281257 Handle (newextrasetuint (& cfg .MaxN ))
282258 en .OnPrefix ("设置AI聊天TopP" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
283259 Handle (newextrasetfloat32 (& cfg .TopP ))
284260 en .OnRegex ("^设置AI聊天(不)?以AI语音输出$" , ensureconfig , zero .AdminPermission ).SetBlock (true ).
285- Handle (newstoragebool (bitmapnrec ))
261+ Handle (ctxext . NewStorageSaveBoolHandler (bitmapnrec ))
286262 en .OnFullMatch ("查看AI聊天配置" , ensureconfig , zero .OnlyPrivate , zero .SuperUserPermission ).SetBlock (true ).
287263 Handle (func (ctx * zero.Ctx ) {
288264 gid := ctx .Event .GroupID
@@ -298,6 +274,7 @@ func init() {
298274 "• 温度:" , stor .temp (), "\n " ,
299275 "• 以AI语音输出:" , ModelBool (! stor .norecord ()), "\n " ,
300276 "• 使用Agent:" , ModelBool (! stor .noagent ()), "\n " ,
277+ "• 响应@:" , ModelBool (! stor .noreplyat ()), "\n " ,
301278 ),
302279 message .Text ("【当前AI聊天全局配置】\n " , & cfg ),
303280 )
0 commit comments