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:
73
agent.go
73
agent.go
@@ -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)
|
||||||
|
|||||||
12
prompt.go
12
prompt.go
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user