feat(channels): 陌生人私聊正常聊天(跳概率门)+ 强制流控 6条/分与回合槽位 + 安静时段不再硬静默 + 受限车道边界行前置
- 陌生人私聊:不再走「值不值得回」的概率门,唯一闸门 = 每发送者 6 条/分滑窗 + 同会话 1 个在跑回合 - 被限流只登记不回,且留带 source 的可见告警(不静默) - 安静时段在回复侧只作信号(规则层不再静默),群聊取消夜间静默 - 锁定流控常量:FlowDirectDefault 加字面量钉桩测试(放大它 = 静默关流控,且会让额度循环跑百万轮)
This commit is contained in:
1 parent
c6f5c3fea0
commit
7ae4298871
10 files changed
+654
-118
No files matched your search
@@ -249,27 +249,29 @@ func TestGroupTurnSeedsItsOwnSessionTranscript(t *testing.T) {
|
||||
|
||||
b.process(context.Background(), groupMessage("9", adapter.Actor{Role: adapter.RoleMember}))
|
||||
|
||||
// 形状:该群最近 3 条转录(最旧优先)+ 第三方边界/来源系统行 + 当次用户消息。
|
||||
// 形状(frame 先行):第三方边界/来源系统行**在最前**,该群最近 3 条转录居中
|
||||
// (最旧优先),当次用户消息在最后。
|
||||
if len(chat.msgs) != 5 {
|
||||
t.Fatalf("loop messages = %d, want 5 (transcript 3 + boundary + user): %+v", len(chat.msgs), chat.msgs)
|
||||
t.Fatalf("loop messages = %d, want 5 (boundary + transcript 3 + user): %+v", len(chat.msgs), chat.msgs)
|
||||
}
|
||||
// 边界行必须最先:历史里的陌生人发言绝不能在她还不知道「这是群、这些人是外人」
|
||||
// 之前进入上下文(提示词注入面,主人 2026-10-05 裁定)。
|
||||
if got := chat.msgs[0]; got.Role != model.RoleSystem || !strings.Contains(turnMessageText(got), thirdPartyBoundaryPrompt) ||
|
||||
!strings.Contains(turnMessageText(got), "群「Gang」") {
|
||||
t.Fatalf("messages[0] = %+v, want the origin + third-party boundary system row first", got)
|
||||
}
|
||||
// 说话人归属逐条正确:两个不同说话人各归各,且走结构化字段(不是织进正文的标签)。
|
||||
if got := chat.msgs[0]; got.Role != model.RoleUser || turnMessageText(got) != "晚上要不要开黑" || got.SenderName != "张三" {
|
||||
t.Fatalf("messages[0] = %+v, want 张三's earlier line attributed to 张三", got)
|
||||
if got := chat.msgs[1]; got.Role != model.RoleUser || turnMessageText(got) != "晚上要不要开黑" || got.SenderName != "张三" {
|
||||
t.Fatalf("messages[1] = %+v, want 张三's earlier line attributed to 张三", got)
|
||||
}
|
||||
if got := chat.msgs[1]; got.Role != model.RoleUser || turnMessageText(got) != "我还在加班" || got.SenderName != "李四" {
|
||||
t.Fatalf("messages[1] = %+v, want 李四's silenced line attributed to 李四", got)
|
||||
if got := chat.msgs[2]; got.Role != model.RoleUser || turnMessageText(got) != "我还在加班" || got.SenderName != "李四" {
|
||||
t.Fatalf("messages[2] = %+v, want 李四's silenced line attributed to 李四", got)
|
||||
}
|
||||
if got := chat.msgs[2]; got.Role != model.RoleAssistant || turnMessageText(got) != "那你先忙" || got.SenderName != "cyrene" {
|
||||
t.Fatalf("messages[2] = %+v, want her earlier reply attributed to cyrene", got)
|
||||
}
|
||||
// 第三方身份边界与来源行照旧(内容一个字没变,仍在每轮注入)。
|
||||
if got := chat.msgs[3]; got.Role != model.RoleSystem || !strings.Contains(turnMessageText(got), thirdPartyBoundaryPrompt) ||
|
||||
!strings.Contains(turnMessageText(got), "群「Gang」") {
|
||||
t.Fatalf("messages[3] = %+v, want the origin + third-party boundary system row", got)
|
||||
if got := chat.msgs[3]; got.Role != model.RoleAssistant || turnMessageText(got) != "那你先忙" || got.SenderName != "cyrene" {
|
||||
t.Fatalf("messages[3] = %+v, want her earlier reply attributed to cyrene", got)
|
||||
}
|
||||
if got := chat.msgs[4]; got.Role != model.RoleUser || turnMessageText(got) != "hello all" || got.SenderName != "张三" {
|
||||
t.Fatalf("messages[4] = %+v, want this turn's user message", got)
|
||||
t.Fatalf("messages[4] = %+v, want this turn's user message last", got)
|
||||
}
|
||||
// 当次消息只出现一次:转录是在本回合消息落库**之前**读的。活夹具把已经落库的行也返回,
|
||||
// 因此播种时刻一旦挪到落库之后,这里立刻数出两次。
|
||||
@@ -430,10 +432,18 @@ func TestOwnerGroupTurnSeedsOnlyItsOwnIsolatedTranscript(t *testing.T) {
|
||||
t.Fatalf("loop session id = %q, want the isolated sess-g", chat.sessionID)
|
||||
}
|
||||
if len(chat.msgs) != 3 {
|
||||
t.Fatalf("loop messages = %d, want 3 (isolated transcript + origin/boundary + user): %+v", len(chat.msgs), chat.msgs)
|
||||
t.Fatalf("loop messages = %d, want 3 (boundary + isolated transcript + user): %+v", len(chat.msgs), chat.msgs)
|
||||
}
|
||||
if got := chat.msgs[0]; turnMessageText(got) != "群里的上一句" || got.SenderName != "张三" {
|
||||
t.Fatalf("messages[0] = %+v, want the group's own earlier line", got)
|
||||
// frame 先行:主人本人在群里同样是受限(群聊)车道 —— 边界/来源行仍在最前,
|
||||
// 转录居中,当次消息在最后。
|
||||
if got := chat.msgs[0]; got.Role != model.RoleSystem || !strings.Contains(turnMessageText(got), thirdPartyBoundaryPrompt) {
|
||||
t.Fatalf("messages[0] = %+v, want the boundary/origin system row first", got)
|
||||
}
|
||||
if got := chat.msgs[1]; turnMessageText(got) != "群里的上一句" || got.SenderName != "张三" {
|
||||
t.Fatalf("messages[1] = %+v, want the group's own earlier line", got)
|
||||
}
|
||||
if got := chat.msgs[2]; got.Role != model.RoleUser {
|
||||
t.Fatalf("messages[2] = %+v, want this turn's user message last", got)
|
||||
}
|
||||
for i, m := range chat.msgs {
|
||||
if strings.Contains(turnMessageText(m), "主人的私事") {
|
||||
|
||||
Reference in new issue
Block a user