package chatpipeline import ( "context" "strings" "testing" "github.com/Tencent/WeKnora/internal/types" "github.com/stretchr/testify/require" ) func TestPrepareMessagesWithModelContextUsesChunkCentricContext(t *testing.T) { rendered := `first contentsecond content` manage := &types.ChatManage{ PipelineRequest: types.PipelineRequest{ Query: "question", SummaryConfig: types.SummaryConfig{ Prompt: "system", }, }, PipelineState: types.PipelineState{ RenderedContexts: rendered, UserContent: "References:\n" + rendered + "\nQuestion: question", MergeResult: []*types.SearchResult{ {ID: "chunk-1", KnowledgeID: "doc-1", KnowledgeBaseID: "kb-1", KnowledgeTitle: "Doc", ChunkIndex: 1, Content: "first content"}, {ID: "chunk-2", KnowledgeID: "doc-1", KnowledgeBaseID: "kb-1", KnowledgeTitle: "Doc", ChunkIndex: 2, Content: "second content"}, }, }, } messages, refs := prepareMessagesWithModelContext(context.Background(), manage) require.Len(t, messages, 2) require.Contains(t, messages[0].Content, "Source handling protocol") require.Contains(t, messages[1].Content, ``) require.Contains(t, messages[1].Content, ``) require.Contains(t, messages[1].Content, ``) require.False(t, strings.Contains(messages[1].Content, "chunk-1")) require.Equal(t, ``, refs.DecodeOutputText(``), ) } func TestPrepareMessagesWithModelContextReplacesSystemPromptContextAndHistoryCitations(t *testing.T) { rendered := `first content` manage := &types.ChatManage{ PipelineRequest: types.PipelineRequest{ Query: "question", SummaryConfig: types.SummaryConfig{ Prompt: `System references: {{contexts}}`, }, }, PipelineState: types.PipelineState{ RenderedContexts: rendered, UserContent: "Question: question", History: []*types.History{{ Query: "previous", Answer: `Previous `, }}, MergeResult: []*types.SearchResult{{ ID: "current-chunk", KnowledgeID: "current-doc", KnowledgeBaseID: "current-kb", KnowledgeTitle: "Current", Content: "first content", }}, }, } messages, refs := prepareMessagesWithModelContext(context.Background(), manage) messages = refs.EncodeMessages(messages) require.NotContains(t, messages[0].Content, rendered) require.Contains(t, messages[0].Content, ``) require.NotContains(t, messages[2].Content, "old-chunk") } func TestPrepareMessagesWithModelContextKeepsWebSeparateFromChunks(t *testing.T) { manage := &types.ChatManage{ PipelineRequest: types.PipelineRequest{Query: "question", SummaryConfig: types.SummaryConfig{Prompt: "system"}}, PipelineState: types.PipelineState{ UserContent: "question", MergeResult: []*types.SearchResult{{ ID: "https://example.com/page", KnowledgeTitle: "Example", Content: "web content", ChunkType: string(types.ChunkTypeWebSearch), KnowledgeSource: "web_search", }}, }, } messages, refs := prepareMessagesWithModelContext(context.Background(), manage) require.Contains(t, messages[1].Content, ``) require.Contains(t, messages[1].Content, ``) require.NotContains(t, messages[1].Content, ``, refs.DecodeOutputText(``), ) } func TestPrepareMessagesWithModelContextCompactsHistoryWithoutCurrentRetrieval(t *testing.T) { manage := &types.ChatManage{ PipelineRequest: types.PipelineRequest{Query: "follow-up", SummaryConfig: types.SummaryConfig{Prompt: "system"}}, PipelineState: types.PipelineState{ UserContent: "follow-up", History: []*types.History{{ Query: "previous", Answer: `Previous `, }}, }, } messages, refs := prepareMessagesWithModelContext(context.Background(), manage) messages = refs.EncodeMessages(messages) require.Contains(t, messages[0].Content, "Source handling protocol") require.Contains(t, messages[2].Content, ``) require.NotContains(t, messages[2].Content, "https://example.com/old") } func TestPrepareMessagesWithModelContextSuppressesCitationsWhenDisabled(t *testing.T) { disabled := false manage := &types.ChatManage{ PipelineRequest: types.PipelineRequest{ Query: "question", CitationEnabled: &disabled, SummaryConfig: types.SummaryConfig{Prompt: "custom system prompt"}, }, PipelineState: types.PipelineState{ UserContent: "question", MergeResult: []*types.SearchResult{{ ID: "chunk-1", KnowledgeID: "doc-1", KnowledgeBaseID: "kb-1", KnowledgeTitle: "Doc", Content: "evidence", }}, }, } messages, refs := prepareMessagesWithModelContext(context.Background(), manage) require.Contains(t, messages[0].Content, "Source citations are disabled") require.Contains(t, messages[1].Content, ``)) }