diff --git a/README.md b/README.md index 9ba147d..bc20d81 100644 --- a/README.md +++ b/README.md @@ -379,17 +379,66 @@ |346|你真棒棒| |347|大展宏兔| |348|福萝卜| +|9728|☀ 晴天| +|9749|☕ 咖啡| +|9786|☺ 可爱| +|10024|✨ 闪光| +|10060|❌ 错误| +|10068|❔ 问号| +|127801|🌹 玫瑰| +|127817|🍉 西瓜| +|127822|🍎 苹果| +|127827|🍓 草莓| +|127836|🍜 拉面| +|127838|🍞 面包| +|127847|🍧 刨冰| +|127866|🍺 啤酒| +|127867|🍻 干杯| +|127881|🎉 庆祝| +|128027|🐛 虫| +|128046|🐮 牛| +|128051|🐳 鲸鱼| +|128053|🐵 猴| +|128074|👊 拳头| +|128076|👌 好的| +|128077|👍 厉害| +|128079|👏 鼓掌| +|128089|👙 内衣| +|128102|👦 男孩| +|128104|👨 爸爸| +|128147|💓 爱心| +|128157|💝 礼物| +|128164|💤 睡觉| +|128166|💦 水| +|128168|💨 吹气| +|128170|💪 肌肉| +|128235|📫 邮箱| +|128293|🔥 火| +|128513|😁 呲牙| +|128514|😂 激动| +|128516|😄 高兴| +|128522|😊 嘿嘿| +|128524|😌 羞涩| +|128527|😏 哼哼| +|128530|😒 不屑| +|128531|😓 汗| +|128532|😔 失落| +|128536|😘 飞吻| +|128538|😚 亲亲| +|128540|😜 淘气| +|128541|😝 吐舌| +|128557|😭 大哭| +|128560|😰 紧张| +|128563|😳 瞪眼| ### 输出 > 严格遵循文档,禁止输出除下述格式外的任何解释性文本! #### 1. 调用 API -格式如下,不要用任何代码块包裹,一次只能发送零个(不发送)或一个: +格式如下,不要用任何代码块包裹,一次能且只能发送一个: {"action":"api_name","params":{"a":123,"b":"456"}} -如果选择不发送,输出一个全角空格 (非JSON),代表结束本次任务。 - 调用完成后,你可能会收到 API 的响应结果,格式如下: {"status":"failed","data":null,"message":1404,"wording":"fail reason"} @@ -400,10 +449,10 @@ #### 2. 分析调用结果 -- 如果任务成功完成,输出全角空格 代表结束本次任务; +- 如果任务成功完成,调用`end_action`结束本次任务; - 如果还需要进一步操作,首先发消息将要执行的任务解释给用户, - 如果任务不是敏感或危险操作,直接执行; - - 否则,输出全角空格 暂停本次任务,等待用户确认。 + - 否则,调用`end_action`暂停本次任务,等待用户确认。 注意事项: - 如果你只是在回应用户而不做高级调用,发送一条消息成功后立即结束本次任务。 diff --git a/actions.yaml b/actions.yaml index b9443d2..298f05a 100644 --- a/actions.yaml +++ b/actions.yaml @@ -1,4 +1,8 @@ actions: + end_action: + desc: 结束或暂停任务 + params: "-" + data: "-" send_private_msg: desc: 发送私聊消息 params: user_id 对方QQ号;message 要发送的内容 (json.RawMessage) @@ -15,6 +19,10 @@ actions: desc: 发送好友赞 params: user_id 对方QQ号;times 赞的次数,每个好友每天最多10次 (number) data: "-" + set_msg_emoji_like: + desc: 发送表情回应 + params: message_id 消息ID;emoji_id 表情 ID + data: "-" set_group_kick: desc: 群组踢人 params: group_id 群号;user_id 要踢的QQ号;reject_add_request 拒绝此人的加群请求 (boolean) @@ -89,10 +97,12 @@ actions: data: "[]User" config: owner: + - end_action - send_private_msg - send_group_msg - delete_msg - send_like + - set_msg_emoji_like - set_group_kick - set_group_ban - set_group_whole_ban @@ -112,9 +122,11 @@ config: - get_group_member_info - get_group_member_list admin: # need to check if gid is the same as admin's gid + - end_action - send_group_msg - delete_msg - send_like + - set_msg_emoji_like - set_group_kick - set_group_ban - set_group_whole_ban @@ -128,8 +140,10 @@ config: - get_group_member_info - get_group_member_list user: # need to check if gid is the same as user's gid + - end_action - send_group_msg - send_like + - set_msg_emoji_like - get_msg - get_forward_msg - get_stranger_info diff --git a/agent.go b/agent.go index d355afb..4917e8e 100644 --- a/agent.go +++ b/agent.go @@ -14,6 +14,10 @@ import ( "github.com/wdvxdr1123/ZeroBot/message" ) +const ( + EOA = "end_action" // EOA is a dummy action that is used to terminate request +) + var ( // ErrPermissionDenied LLM 调用了不该调用的 action ErrPermissionDenied = errors.New("permission denied") @@ -55,7 +59,7 @@ func (ag *Agent) AddEvent(grp int64, ev *Event) { ag.log.Add(grp, ev, false) } -// AddRequest 一般无需主动调用, 由 GetAction 自动添加 +// AddRequest 添加 API 请求, 一般无需主动调用, 由 GetAction 自动添加 func (ag *Agent) AddRequest(grp int64, req *zero.APIRequest) { ag.log.Add(grp, req, true) } @@ -65,7 +69,7 @@ func (ag *Agent) AddResponse(grp int64, resp *APIResponse) { ag.log.Add(grp, resp, false) } -// AddTerminus 添加会话终止符 +// AddTerminus 添加会话终止符, 一般无需主动调用, 由 GetAction 自动添加 func (ag *Agent) AddTerminus(grp int64) { ag.log.Add(grp, Terminus{}, true) } @@ -158,6 +162,9 @@ func (ag *Agent) GetAction(api deepinfra.API, p model.Protocol, grp int64, role continue } switch { + case r.Action == EOA: + ag.AddTerminus(grp) + return case !ag.perm.allow(role, r.Action): err = errors.Wrap(ErrPermissionDenied, r.Action) return diff --git a/perm_test.go b/perm_test.go index c39f9e5..09465fd 100644 --- a/perm_test.go +++ b/perm_test.go @@ -2,12 +2,14 @@ package goba import "testing" -const fulltab = `|功能|action|params|data| +const fulltab = ` |功能|action|params|data| |---|---|---|---| +|结束或暂停任务|end_action|-|-| |发送私聊消息|send_private_msg|user_id 对方QQ号;message 要发送的内容 (json.RawMessage)|message_id 消息ID (number)| |发送群消息|send_group_msg|group_id 群号;message 要发送的内容 (json.RawMessage)|message_id 消息ID (number)| |撤回消息|delete_msg|message_id 消息ID|-| |发送好友赞|send_like|user_id 对方QQ号;times 赞的次数,每个好友每天最多10次 (number)|-| +|发送表情回应|set_msg_emoji_like|message_id 消息ID;emoji_id 表情 ID|-| |群组踢人|set_group_kick|group_id 群号;user_id 要踢的QQ号;reject_add_request 拒绝此人的加群请求 (boolean)|-| |群组单人禁言|set_group_ban|group_id 群号;user_id 要禁言的QQ号;duration 禁言时长(秒),0表示取消禁言|-| |群组全员禁言|set_group_whole_ban|group_id 群号;enable 是否禁言 (boolean)|-| diff --git a/types.go b/types.go index dd90d77..8ff901f 100644 --- a/types.go +++ b/types.go @@ -58,9 +58,9 @@ func (resp *APIResponse) String() string { return strings.TrimSpace(sb.String()) } -// Terminus 终止符, 一个全角空格 +// Terminus 终止符, 映射到 EOA type Terminus struct{} func (Terminus) String() string { - return " " + return `{"action":"` + EOA + `"}` }