mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-07-25 13:21:04 +02:00
Add files via upload
This commit is contained in:
@@ -190,29 +190,26 @@ func einoMessagesForRunRestart(args *einoADKRunLoopArgs, baseMsgs, accumulated [
|
|||||||
return append([]adk.Message(nil), baseMsgs...), einoRestartContextInitial
|
return append([]adk.Message(nil), baseMsgs...), einoRestartContextInitial
|
||||||
}
|
}
|
||||||
|
|
||||||
// adkMessagesHasUserContent 从尾部向前查找,是否已有与 want 相同的 user 消息(避免重复 append)。
|
// adkMessagesHasUserContent reports whether the conversation tail is already a user turn
|
||||||
|
// with the given content. Only the last message counts: matching text in an earlier round
|
||||||
|
// (e.g. user repeats the same prompt after an assistant reply) must not suppress appending
|
||||||
|
// the new user turn — Claude 4.6+ rejects requests whose final message is assistant.
|
||||||
func adkMessagesHasUserContent(msgs []adk.Message, want string) bool {
|
func adkMessagesHasUserContent(msgs []adk.Message, want string) bool {
|
||||||
want = strings.TrimSpace(want)
|
want = strings.TrimSpace(want)
|
||||||
if want == "" {
|
if want == "" {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for i := len(msgs) - 1; i >= 0; i-- {
|
if len(msgs) == 0 {
|
||||||
m := msgs[i]
|
return false
|
||||||
if m == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if m.Role == schema.User {
|
|
||||||
return strings.TrimSpace(m.Content) == want
|
|
||||||
}
|
|
||||||
if m.Role == schema.Assistant || m.Role == schema.Tool {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
return false
|
last := msgs[len(msgs)-1]
|
||||||
|
if last == nil || last.Role != schema.User {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(last.Content) == want
|
||||||
}
|
}
|
||||||
|
|
||||||
// appendUserMessageIfNeeded 在 history 轨迹之后追加本轮 user 消息(仅当轨迹中尚未包含该句)。
|
// appendUserMessageIfNeeded 在 history 轨迹之后追加本轮 user 消息(仅当尾部已是相同 user 句)。
|
||||||
func appendUserMessageIfNeeded(msgs []adk.Message, userMessage string) []adk.Message {
|
func appendUserMessageIfNeeded(msgs []adk.Message, userMessage string) []adk.Message {
|
||||||
if strings.TrimSpace(userMessage) == "" || adkMessagesHasUserContent(msgs, userMessage) {
|
if strings.TrimSpace(userMessage) == "" || adkMessagesHasUserContent(msgs, userMessage) {
|
||||||
return msgs
|
return msgs
|
||||||
|
|||||||
@@ -143,3 +143,18 @@ func TestAppendUserMessageIfNeeded(t *testing.T) {
|
|||||||
t.Fatalf("should not duplicate user message: len=%d", len(dup))
|
t.Fatalf("should not duplicate user message: len=%d", len(dup))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAppendUserMessageIfNeeded_repeatPromptAfterAssistant(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
msgs := []adk.Message{
|
||||||
|
schema.UserMessage("扫描 example.com"),
|
||||||
|
schema.AssistantMessage("开始扫描...", nil),
|
||||||
|
}
|
||||||
|
out := appendUserMessageIfNeeded(msgs, "扫描 example.com")
|
||||||
|
if len(out) != 3 {
|
||||||
|
t.Fatalf("should append new user turn after assistant reply: len=%d", len(out))
|
||||||
|
}
|
||||||
|
if out[2].Role != schema.User || out[2].Content != "扫描 example.com" {
|
||||||
|
t.Fatalf("tail should be repeated user prompt, got role=%s content=%q", out[2].Role, out[2].Content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user