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, ``))
}