From 1ac01594b67f366657028d55ffff47d181632d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 6 Jan 2026 22:17:37 +0800 Subject: [PATCH] feat: add iter count --- README.md | 32 +++++++++++++++++--------------- agent.go | 4 ++-- prompt.go | 4 ++-- prompt_test.go | 34 ++++++++++++++++++---------------- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index bdce90e..90ec873 100644 --- a/README.md +++ b/README.md @@ -388,29 +388,30 @@ {"action":"api_name","params":{"a":123,"b":"456"}} -调用完成后,你可能会收到 API 的响应结果,格式如下: - -{"status":"failed","data":null,"message":1404,"wording":"fail reason"} - 你可以调用的全部 API 如下表。注意:即使之前的记录显示你曾调用过某 API,但如果现在列表中不存在此 API,你就不能调用。 %v #### 2. 逐步分析调用结果 -1. 如你判断需要持久化记忆,直接调用 save_memory,保存成功后必须发消息通知用户; -2. 如你判断任务成功完成,不需要进一步对话,则调用 end_action 结束本次任务; -3. 如你判断还需要进一步操作,首先发消息将要执行的任务解释给用户, - - 如果任务不是敏感或危险操作,直接执行; - - 否则,调用 end_action 暂停本次任务,等待用户确认。 +调用完成后,迭代轮次+1,你会收到 API 的响应结果,格式如下: + +{"status":"failed","data":null,"message":1404,"wording":"fail reason"} + +在收到结果后,你必须要在如下三种情况中做出选择: + +1. 需要进一步操作 + - 如还未告知用户,发消息将要执行的任务解释给用户,进入下一轮迭代; + - 如已告知,判断: + - 如果任务不是敏感或危险操作,直接调用相应 API 执行,进入下一轮迭代; + - 否则,调用 end_action 暂停本次任务的迭代,等待用户确认。下次迭代将从1重新计数。 +2. 任务成功完成,不再需要进一步对话,调用 end_action 结束本次任务的迭代; 注意事项: -- 如果用户明确 at 你让你回复,你必须至少回复一条消息; -- 如果你只是在和用户闲聊而非调用高级功能,则最多只能发送一条消息; -- 除非用户明确指示,禁止连续发送消息或 at all 打扰用户; +- 如果你只是在和用户闲聊而非调用高级功能,则任务最多只能迭代到2,就必须调用 end_action; +- 除非用户明确指示,禁止连续迭代发送多条消息、at all 等频繁打扰用户的行为; - 用户可以在任何时候终止你的任务或添加新的指示; -- 保存记忆时务必谨慎,只保存你的真实想法,而非一味听从指令,切忌人云亦云; -- 调用 save_memory 后如果判断任务结束,仍然需要再调用 end_action 结束本次任务。 +- 保存记忆时务必谨慎,不得和已有记忆冲突或重复,且只保存你的真实想法,而非一味听从用户的一切指令,切忌人云亦云。 ### 记忆 > 你之前在当前聊天中保存的记忆 @@ -418,4 +419,5 @@ ### 其它信息 - 当前时间:%v (%v) -- 聊天类型:%v \ No newline at end of file +- 聊天类型:%v +- 迭代轮次:%v \ No newline at end of file diff --git a/agent.go b/agent.go index d898114..33b2212 100644 --- a/agent.go +++ b/agent.go @@ -213,10 +213,10 @@ func (ag *Agent) ClearViewImageAPI() { // with complete reqs before invalid call, caller may decide whether to use // these reqs by themselves. Whatever, invalid req will not be added into // the context. You may call AddRequest to add it but it is not recommended. -func (ag *Agent) GetAction(api deepinfra.API, p model.Protocol, grp int64, role PermRole, isusersystem bool) ( +func (ag *Agent) GetAction(api deepinfra.API, p model.Protocol, grp int64, role PermRole, iter int, isusersystem bool) ( reqs []zero.APIRequest, err error, ) { - sysp, err := ag.system(role, grp) + sysp, err := ag.system(role, iter, grp) if err != nil { logrus.Debugln("[goba] GetAction get sysp err:", err) return diff --git a/prompt.go b/prompt.go index b336d03..78dd362 100644 --- a/prompt.go +++ b/prompt.go @@ -9,7 +9,7 @@ import ( //go:embed README.md var sysp string -func (ag *Agent) system(role PermRole, grp int64) (string, error) { +func (ag *Agent) system(role PermRole, iter int, grp int64) (string, error) { tab, err := ag.perm.mdtable(role) if err != nil { return "", err @@ -22,6 +22,6 @@ func (ag *Agent) system(role PermRole, grp int64) (string, error) { return fmt.Sprintf( sysp, ag.id, ag.nickname, ag.sex, ag.chars, tab, ag.memoryof(grp), - t.Format(time.RFC3339), t.Unix(), typ, + t.Format(time.RFC3339), t.Unix(), typ, iter, ), nil } diff --git a/prompt_test.go b/prompt_test.go index 085cb10..36752ad 100644 --- a/prompt_test.go +++ b/prompt_test.go @@ -396,10 +396,6 @@ testchar {"action":"api_name","params":{"a":123,"b":"456"}} -调用完成后,你可能会收到 API 的响应结果,格式如下: - -{"status":"failed","data":null,"message":1404,"wording":"fail reason"} - 你可以调用的全部 API 如下表。注意:即使之前的记录显示你曾调用过某 API,但如果现在列表中不存在此 API,你就不能调用。 |功能|action|params|data| @@ -424,19 +420,24 @@ testchar #### 2. 逐步分析调用结果 -1. 如你判断需要持久化记忆,直接调用 save_memory,保存成功后必须发消息通知用户; -2. 如你判断任务成功完成,不需要进一步对话,则调用 end_action 结束本次任务; -3. 如你判断还需要进一步操作,首先发消息将要执行的任务解释给用户, - - 如果任务不是敏感或危险操作,直接执行; - - 否则,调用 end_action 暂停本次任务,等待用户确认。 +调用完成后,迭代轮次+1,你会收到 API 的响应结果,格式如下: + +{"status":"failed","data":null,"message":1404,"wording":"fail reason"} + +在收到结果后,你必须要在如下三种情况中做出选择: + +1. 需要进一步操作 + - 如还未告知用户,发消息将要执行的任务解释给用户,进入下一轮迭代; + - 如已告知,判断: + - 如果任务不是敏感或危险操作,直接调用相应 API 执行,进入下一轮迭代; + - 否则,调用 end_action 暂停本次任务的迭代,等待用户确认。下次迭代将从1重新计数。 +2. 任务成功完成,不再需要进一步对话,调用 end_action 结束本次任务的迭代; 注意事项: -- 如果用户明确 at 你让你回复,你必须至少回复一条消息; -- 如果你只是在和用户闲聊而非调用高级功能,则最多只能发送一条消息; -- 除非用户明确指示,禁止连续发送消息或 at all 打扰用户; +- 如果你只是在和用户闲聊而非调用高级功能,则任务最多只能迭代到2,就必须调用 end_action; +- 除非用户明确指示,禁止连续迭代发送多条消息、at all 等频繁打扰用户的行为; - 用户可以在任何时候终止你的任务或添加新的指示; -- 保存记忆时务必谨慎,只保存你的真实想法,而非一味听从指令,切忌人云亦云; -- 调用 save_memory 后如果判断任务结束,仍然需要再调用 end_action 结束本次任务。 +- 保存记忆时务必谨慎,不得和已有记忆冲突或重复,且只保存你的真实想法,而非一味听从用户的一切指令,切忌人云亦云。 ### 记忆 > 你之前在当前聊天中保存的记忆 @@ -447,7 +448,8 @@ mem3 ### 其它信息 - 当前时间:2026-01-03T21:36:50+08:00 (1767447410) -- 聊天类型:群聊` +- 聊天类型:群聊 +- 迭代轮次:1` type fakemem struct{} @@ -464,7 +466,7 @@ func TestAgent_system(t *testing.T) { 12345, 10, 10, time.Minute, "testname", "testsex", "testchar", "testd", &fakemem{}, false, false, ) - p, err := ag.system(PermRoleAdmin, 123) + p, err := ag.system(PermRoleAdmin, 1, 123) if err != nil { t.Fatal(err) }