diff --git a/chat/init.go b/chat/init.go index 96d1191..e7825b0 100644 --- a/chat/init.go +++ b/chat/init.go @@ -1,3 +1,4 @@ +// Package chat 提供聊天记录管理和 AI 模型交互功能 package chat import ( @@ -11,21 +12,27 @@ import ( zero "github.com/wdvxdr1123/ZeroBot" ) +// SystemPrompt 将 README.md 内容嵌入为默认系统提示词 +// //go:embed README.md var SystemPrompt string +// lst 全局聊天记录,每群/每用户独立保存最近 8 条 var lst = chat.NewLog(8, "\n\n", "自己随机开启新话题", "【", "】", ">>") func init() { + // 注册 ZeroBot 消息钩子,记录所有非空文本 zero.OnMessage(func(ctx *zero.Ctx) bool { txt := ctx.ExtractPlainText() ctx.State["__zbputil_chat_txt__"] = txt return txt != "" }).FirstPriority().SetBlock(false).Handle(func(ctx *zero.Ctx) { + // 计算群组 ID(私聊时使用负的 UserID) gid := ctx.Event.GroupID if gid == 0 { gid = -ctx.Event.UserID } + // 将用户消息追加到对应群组的聊天记录 lst.Add( gid, ctx.Event.Sender.Name(), ctx.State["__zbputil_chat_txt__"].(string), @@ -34,18 +41,26 @@ func init() { }) } +// Reply 将 AI 回复追加到指定群组的聊天记录 func Reply(grp int64, txt string) { lst.Add(grp, "", txt, true, false) } +// Ask 根据聊天记录构造可执行的 deepinfra 模型请求 func Ask(p model.Protocol, grp int64, sysp string, isusersys bool) deepinfra.Model { return lst.Modelize(p, grp, sysp, isusersys) } +// AskCustom 通用日志转换函数,允许自定义每条记录的映射逻辑 func AskCustom[T any](grp int64, f func(int, string) T) []T { return chat.Modelize(&lst, grp, f) } +// Sanitize 清洗 AI 返回文本: +// 1. 去掉换行后内容 +// 2. 去掉发言前缀(如【name】或[name]) +// 3. 去掉重复 10 次以上的子串 +// 4. 去除首尾空白 func Sanitize(msg string) string { msg, _, _ = strings.Cut(msg, "\n") msg = strings.TrimSpace(msg) @@ -69,3 +84,8 @@ func Sanitize(msg string) string { } return strings.TrimSpace(msg) } + +// Reset 清空全局聊天记录,重新开始 +func Reset() { + lst.Reset() +} diff --git a/driver/funcall.go b/driver/funcall.go index 2043f05..0b9454e 100644 --- a/driver/funcall.go +++ b/driver/funcall.go @@ -162,7 +162,7 @@ func (f *FCClient) handleRequest(req *zero.APIRequest) (r *zero.APIResponse, err r = &zero.APIResponse{ // 发送api调用响应 Status: s, Data: data.Get("data"), - Msg: m, + Message: m, Wording: w, RetCode: c, Echo: req.Echo, diff --git a/go.mod b/go.mod index ad282e1..06e1103 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7 github.com/RomiChan/websocket v1.4.3-0.20220227141055-9b2c6168c9c5 github.com/fumiama/cron v1.3.0 - github.com/fumiama/deepinfra v0.0.0-20250330125128-71ec2f7c085e + github.com/fumiama/deepinfra v0.0.0-20250812083039-f1b27f21d8c9 github.com/fumiama/go-base16384 v1.7.0 github.com/gin-gonic/gin v1.8.2 github.com/go-playground/assert/v2 v2.2.0 @@ -24,7 +24,7 @@ require ( github.com/swaggo/gin-swagger v1.5.3 github.com/swaggo/swag v1.8.10 github.com/tidwall/gjson v1.18.0 - github.com/wdvxdr1123/ZeroBot v1.8.0 + github.com/wdvxdr1123/ZeroBot v1.8.2-0.20250804063440-ccc03e33ac20 ) require ( diff --git a/go.sum b/go.sum index 19c49d6..6f4f9ea 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,8 @@ github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 h1:BBade+Jl github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4/go.mod h1:H7chHJglrhPPzetLdzBleF8d22WYOv7UM/lEKYiwlKM= github.com/fumiama/cron v1.3.0 h1:ZWlwuexF+HQHl3cYytEE5HNwD99q+3vNZF1GrEiXCFo= github.com/fumiama/cron v1.3.0/go.mod h1:bz5Izvgi/xEUI8tlBN8BI2jr9Moo8N4or0KV8xXuPDY= -github.com/fumiama/deepinfra v0.0.0-20250330125128-71ec2f7c085e h1:L/Z5N6UfpuqNIiPUrjSzmrnWj3mjd3auwl/2ctpGXNY= -github.com/fumiama/deepinfra v0.0.0-20250330125128-71ec2f7c085e/go.mod h1:wW05PQSn8mo1mZIoa6LBUE+3xIBjkoONvnfPTV5ZOhY= +github.com/fumiama/deepinfra v0.0.0-20250812083039-f1b27f21d8c9 h1:X2h8RnCgC04LmwBoizYbFawXh/h6CouXmhYtaVuUn7k= +github.com/fumiama/deepinfra v0.0.0-20250812083039-f1b27f21d8c9/go.mod h1:wW05PQSn8mo1mZIoa6LBUE+3xIBjkoONvnfPTV5ZOhY= github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMWSsXCA= github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= github.com/fumiama/go-registry v0.2.7 h1:tLEqgEpsiybQMqBv0dLHm5leia/z1DhajMupwnOHeNs= @@ -180,8 +180,8 @@ github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6 github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/wdvxdr1123/ZeroBot v1.8.0 h1:v7m+0kGtL6XQlUH9O/LzmOntDJs2clzVj93YsAWWMbk= -github.com/wdvxdr1123/ZeroBot v1.8.0/go.mod h1:C86nQ0gIdAri4K2vg8IIQIslt08zzrKMcqYt8zhkx1M= +github.com/wdvxdr1123/ZeroBot v1.8.2-0.20250804063440-ccc03e33ac20 h1:Yzd+cbiJQYtf6cZDP5ZB/LqjNWiV752+5P6Eua+wnic= +github.com/wdvxdr1123/ZeroBot v1.8.2-0.20250804063440-ccc03e33ac20/go.mod h1:C86nQ0gIdAri4K2vg8IIQIslt08zzrKMcqYt8zhkx1M= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=