diff --git a/internal/multiagent/eino_summarize_test.go b/internal/multiagent/eino_summarize_test.go index 0f4672da..0a1f6290 100644 --- a/internal/multiagent/eino_summarize_test.go +++ b/internal/multiagent/eino_summarize_test.go @@ -409,9 +409,9 @@ func TestSanitizeSystemContentForTranscript_BestPractice(t *testing.T) { "需要写入请使用 upsert_project_fact。", project.FactIndexSectionEndMarker, "", - "# Skills System", - "**How to Use Skills**", - "Remember: Skills make you more capable", + transcriptSkillsSystemMarker, + "**如何使用 Skill(技能)(渐进式展示):**", + "记住:Skill 让你更加强大和稳定", }, "\n") out := sanitizeSystemContentForTranscript(system) @@ -421,7 +421,7 @@ func TestSanitizeSystemContentForTranscript_BestPractice(t *testing.T) { if strings.Contains(out, "- nmap") || strings.Contains(out, "高强度扫描要求") { t.Fatalf("static persona should be stripped: %q", out) } - if strings.Contains(out, "# Skills System") || strings.Contains(out, "How to Use Skills") { + if strings.Contains(out, transcriptSkillsSystemMarker) || strings.Contains(out, "如何使用 Skill") { t.Fatalf("skills boilerplate should be stripped: %q", out) } if !strings.Contains(out, transcriptStaticSystemOmitNote) { @@ -435,7 +435,7 @@ func TestSanitizeSystemContentForTranscript_BestPractice(t *testing.T) { func TestFormatSummarizationTranscript_OmitsBloatedSystem(t *testing.T) { t.Parallel() msgs := []adk.Message{ - schema.SystemMessage("以下是当前会话绑定的工具名称索引\n- nmap\n\n你是CyberStrikeAI\n" + project.FactIndexSectionStartMarker + "\n## 项目黑板索引(project: p1, id: x)\n(暂无事实)\n" + project.FactIndexSectionEndMarker + "\n# Skills System\nboiler"), + schema.SystemMessage("以下是当前会话绑定的工具名称索引\n- nmap\n\n你是CyberStrikeAI\n" + project.FactIndexSectionStartMarker + "\n## 项目黑板索引(project: p1, id: x)\n(暂无事实)\n" + project.FactIndexSectionEndMarker + "\n" + transcriptSkillsSystemMarker + "\nboiler"), schema.UserMessage("hello"), schema.AssistantMessage("reply", nil), } diff --git a/internal/multiagent/eino_summarize_transcript.go b/internal/multiagent/eino_summarize_transcript.go index 15b8edb6..a59f4679 100644 --- a/internal/multiagent/eino_summarize_transcript.go +++ b/internal/multiagent/eino_summarize_transcript.go @@ -20,7 +20,9 @@ const ( transcriptStaticSystemOmitNote = "[static system prompt omitted — unchanged in live context after compaction]" transcriptToolIndexStartMarker = "以下是当前会话绑定的工具名称索引" transcriptPersonaStartMarker = "你是CyberStrikeAI" - transcriptSkillsSystemMarker = "# Skills System" + // ADK LanguageChinese injects skill middleware prompt with this header (see eino adk/middlewares/skill/prompt.go). + transcriptSkillsSystemMarker = "# Skill 系统" + transcriptSkillsSystemMarkerEnglish = "# Skills System" ) type transcriptToolCall struct { @@ -86,13 +88,23 @@ func stripToolNamesIndexFromSystem(s string) string { } func stripSkillsSystemBoilerplate(s string) string { - idx := strings.Index(s, transcriptSkillsSystemMarker) + idx := indexFirstSubstring(s, transcriptSkillsSystemMarker, transcriptSkillsSystemMarkerEnglish) if idx < 0 { return strings.TrimSpace(s) } return strings.TrimSpace(s[:idx]) } +func indexFirstSubstring(s string, markers ...string) int { + first := -1 + for _, m := range markers { + if i := strings.Index(s, m); i >= 0 && (first < 0 || i < first) { + first = i + } + } + return first +} + func extractProjectBlackboardSection(s string) string { start := strings.Index(s, project.FactIndexSectionStartMarker) if start < 0 {