1
0
mirror of https://github.com/fumiama/go-onebot-agent.git synced 2026-06-20 02:30:24 +08:00

feat: mutable cfg & decode base64 img

This commit is contained in:
源文雨
2026-01-17 17:29:58 +08:00
parent f7d2527203
commit f289768c83
3 changed files with 58 additions and 34 deletions

View File

@@ -3,6 +3,7 @@ package goba
import ( import (
"bytes" "bytes"
"encoding/base64"
"encoding/json" "encoding/json"
"fmt" "fmt"
"image" "image"
@@ -39,16 +40,14 @@ var (
// Agent is a OneBot event context, it is recommended to create one agent // Agent is a OneBot event context, it is recommended to create one agent
// per group or per user. // per group or per user.
type Agent struct { type Agent struct {
log chat.Log[fmt.Stringer] log chat.Log[fmt.Stringer]
id int64 cfg *Config
nickname, sex string perm *Perm
chars string imgpcache *ttl.Cache[uint64, string]
perm *Perm mem MemoryStorage
imgpcache *ttl.Cache[uint64, string] manualaddreq bool
mem MemoryStorage manualaddmem bool
manualaddreq bool hasimageapi bool
manualaddmem bool
hasimageapi bool
} }
// NewAgent 创建一个 Agent 实例。 // NewAgent 创建一个 Agent 实例。
@@ -58,15 +57,16 @@ type Agent struct {
// - manualaddreq 表示是否由用户手动添加请求。 // - manualaddreq 表示是否由用户手动添加请求。
// - manualaddmem 表示是否由用户手动添加记忆。 // - manualaddmem 表示是否由用户手动添加记忆。
func NewAgent( func NewAgent(
id int64, batchcap, itemscap int, imgpcachettl time.Duration, cfg *Config, batchcap, itemscap int, imgpcachettl time.Duration,
nickname, sex, characteristics, defaultprompt string, mem MemoryStorage, defaultprompt string, mem MemoryStorage,
manualaddreq, manualaddmem bool, manualaddreq, manualaddmem bool,
) (ag Agent) { ) (ag Agent) {
ag = Agent{ ag = Agent{
id: id, nickname: nickname, sex: sex, chars: characteristics, log: chat.NewLog[fmt.Stringer](batchcap, itemscap, "\n", defaultprompt),
imgpcache: ttl.NewCache[uint64, string](imgpcachettl), cfg: cfg,
log: chat.NewLog[fmt.Stringer](batchcap, itemscap, "\n", defaultprompt), imgpcache: ttl.NewCache[uint64, string](imgpcachettl),
mem: mem, manualaddreq: manualaddreq, manualaddmem: manualaddmem, mem: mem,
manualaddreq: manualaddreq, manualaddmem: manualaddmem,
} }
_ = ag.LoadPermTable() _ = ag.LoadPermTable()
return return
@@ -117,20 +117,37 @@ func (ag *Agent) SetViewImageAPI(api deepinfra.API, p model.Protocol) {
continue continue
} }
u := msg.Data["url"] u := msg.Data["url"]
if !strings.HasPrefix(u, "http") { if u == "" {
continue u = msg.Data["file"]
} }
resp, err := http.Get(u) var (
if err != nil { data []byte
logrus.Debugln("[goba] SetViewImageAPI get http err:", err) err error
continue )
} switch {
data, err := io.ReadAll(resp.Body) case strings.HasPrefix(u, "http"):
_ = resp.Body.Close() resp, err := http.Get(u)
if err != nil { if err != nil {
logrus.Debugln("[goba] SetViewImageAPI read body err:", err) logrus.Debugln("[goba] SetViewImageAPI get http err:", err)
continue
}
data, err = io.ReadAll(resp.Body)
_ = resp.Body.Close()
if err != nil {
logrus.Debugln("[goba] SetViewImageAPI read body err:", err)
continue
}
case strings.HasPrefix(u, "base64://"):
data, err = base64.StdEncoding.DecodeString(u[9:])
if err != nil {
logrus.Debugln("[goba] SetViewImageAPI decode base64 err:", err)
continue
}
default:
// we can support local files but skip due to security concerns.
continue continue
} }
img, _, err := image.Decode(bytes.NewReader(data)) img, _, err := image.Decode(bytes.NewReader(data))
if err != nil { if err != nil {
logrus.Debugln("[goba] SetViewImageAPI decode img err:", err) logrus.Debugln("[goba] SetViewImageAPI decode img err:", err)

View File

@@ -9,6 +9,14 @@ import (
//go:embed README.md //go:embed README.md
var sysp string var sysp string
// Config stores mutable characteristics of the agent.
type Config struct {
ID int64 // ID QQ
Nickname string // Nickname 昵称
Sex string // Sex 性别
Chars string // Chars 个性
}
func (ag *Agent) system(role PermRole, iter int, grp int64) (string, error) { func (ag *Agent) system(role PermRole, iter int, grp int64) (string, error) {
tab, err := ag.perm.mdtable(role) tab, err := ag.perm.mdtable(role)
if err != nil { if err != nil {
@@ -20,8 +28,8 @@ func (ag *Agent) system(role PermRole, iter int, grp int64) (string, error) {
typ = "私聊" typ = "私聊"
} }
return fmt.Sprintf( return fmt.Sprintf(
sysp, ag.id, ag.nickname, ag.sex, sysp, ag.cfg.ID, ag.cfg.Nickname, ag.cfg.Sex,
ag.chars, tab, ag.memoryof(grp), ag.cfg.Chars, tab, ag.memoryof(grp),
t.Format(time.RFC3339), t.Unix(), typ, iter, t.Format(time.RFC3339), t.Unix(), typ, iter,
), nil ), nil
} }

View File

@@ -462,10 +462,9 @@ func (fakemem) Load(grp int64) []string {
} }
func TestAgent_system(t *testing.T) { func TestAgent_system(t *testing.T) {
ag := NewAgent( ag := NewAgent(&Config{
12345, 10, 10, time.Minute, "testname", "testsex", "testchar", 12345, "testname", "testsex", "testchar",
"testd", &fakemem{}, false, false, }, 10, 10, time.Minute, "testd", &fakemem{}, false, false)
)
p, err := ag.system(PermRoleAdmin, 1, 123) p, err := ag.system(PermRoleAdmin, 1, 123)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)