fix: preserve agent system prompt for greetings

This commit is contained in:
wolfkill
2026-05-28 20:04:20 +08:00
committed by lyingbug
parent 10383c6ddd
commit b22303cec8
5 changed files with 54 additions and 3 deletions
@@ -470,14 +470,18 @@ func mergeImageDescAndOCR(desc, ocr string) (string, bool) {
// applyIntentPromptOverride resolves the system-prompt override for the current
// non-retrieval intent. Agent-level overrides take precedence; otherwise the
// tenant/global IntentSystemPrompts map is consulted. Whitespace-only agent
// overrides are treated as unset and fall through to the global default. Returns
// true when a non-empty override was applied.
// tenant/global IntentSystemPrompts map is consulted. When a custom agent
// system prompt is already applied, global intent prompts must not replace it.
// Whitespace-only agent overrides are treated as unset. Returns true when a
// non-empty override was applied.
func applyIntentPromptOverride(chatManage *types.ChatManage, globalPrompts map[string]string) bool {
intentKey := string(chatManage.Intent)
if raw, ok := chatManage.IntentPromptOverrides[intentKey]; ok && strings.TrimSpace(raw) != "" {
chatManage.SystemPromptOverride = raw
}
if chatManage.AgentSystemPromptApplied {
return chatManage.SystemPromptOverride != ""
}
if chatManage.SystemPromptOverride == "" {
if prompt, ok := globalPrompts[intentKey]; ok {
chatManage.SystemPromptOverride = prompt
@@ -59,6 +59,23 @@ func TestApplyIntentPromptOverride_BlankAgentFallsBackToGlobal(t *testing.T) {
}
}
func TestApplyIntentPromptOverride_CustomAgentSystemPromptSkipsGlobalFallback(t *testing.T) {
cm := &types.ChatManage{
PipelineRequest: types.PipelineRequest{
AgentSystemPromptApplied: true,
},
PipelineState: types.PipelineState{Intent: types.IntentGreeting},
}
global := map[string]string{"greeting": "global prompt"}
if applyIntentPromptOverride(cm, global) {
t.Fatal("expected applied=false")
}
if cm.SystemPromptOverride != "" {
t.Errorf("override should remain empty, got %q", cm.SystemPromptOverride)
}
}
func TestApplyIntentPromptOverride_NoOverrideAndNoGlobal(t *testing.T) {
cm := &types.ChatManage{
PipelineState: types.PipelineState{Intent: types.IntentChitchat},
@@ -117,6 +117,7 @@ func (s *sessionService) applyAgentOverridesToChatManage(
// Override summary config fields
if customAgent.Config.SystemPrompt != "" {
cm.SummaryConfig.Prompt = customAgent.Config.SystemPrompt
cm.AgentSystemPromptApplied = true
logger.Infof(ctx, "Using custom agent's system_prompt")
}
if customAgent.Config.ContextTemplate != "" {
@@ -0,0 +1,25 @@
package service
import (
"context"
"testing"
"github.com/Tencent/WeKnora/internal/types"
)
func TestApplyAgentOverridesToChatManageMarksCustomSystemPrompt(t *testing.T) {
s := &sessionService{}
cm := &types.ChatManage{}
agent := &types.CustomAgent{
Config: types.CustomAgentConfig{SystemPrompt: "You are Xiaochi."},
}
s.applyAgentOverridesToChatManage(context.Background(), agent, cm)
if cm.SummaryConfig.Prompt != "You are Xiaochi." {
t.Errorf("prompt: got %q", cm.SummaryConfig.Prompt)
}
if !cm.AgentSystemPromptApplied {
t.Fatal("expected custom agent system prompt to be marked as applied")
}
}
+4
View File
@@ -62,6 +62,9 @@ type PipelineRequest struct {
// IntentPromptOverrides holds agent-level intent prompt overrides for the
// query-understanding stage. Empty values fall back to tenant/global defaults.
IntentPromptOverrides map[string]string `json:"-"`
// AgentSystemPromptApplied is true when SummaryConfig.Prompt was supplied
// by a custom agent. Global intent prompts must not replace that prompt.
AgentSystemPromptApplied bool `json:"-"`
// Misc request-scoped config
TenantID uint64 `json:"-"`
@@ -226,6 +229,7 @@ func (c *ChatManage) Clone() *ChatManage {
WebFetchTopN: c.WebFetchTopN,
Language: c.Language,
IntentPromptOverrides: maps.Clone(c.IntentPromptOverrides),
AgentSystemPromptApplied: c.AgentSystemPromptApplied,
},
PipelineState: PipelineState{
RewriteQuery: c.RewriteQuery,