Why: Some endpoints reject consecutive system messages or a run of the same role. The product already emits several system messages in one request. Evidence: go test is covered by PrepareMessages tests for merge, strict folding, and tool pairs. Empty MessageShape leaves the transcript unchanged. Impact: Callers opt in with StreamOptions.MessageShape. Tool calls and tool results are not merged. Refs: docs/records/2026-10-04-sillytavern-review.md
39 lines
1.0 KiB
Go
39 lines
1.0 KiB
Go
package llm
|
|
|
|
import "testing"
|
|
|
|
func TestPrepareMergesAdjacentSystems(t *testing.T) {
|
|
out := PrepareMessages([]Message{
|
|
{Role: RoleSystem, Content: "a"},
|
|
{Role: RoleSystem, Content: "b"},
|
|
{Role: RoleUser, Content: "hi"},
|
|
}, "merge")
|
|
if len(out) != 2 || out[0].Content != "a\n\nb" {
|
|
t.Fatalf("merged = %#v", out)
|
|
}
|
|
}
|
|
|
|
func TestPrepareStrictFoldsLaterSystem(t *testing.T) {
|
|
out := PrepareMessages([]Message{
|
|
{Role: RoleSystem, Content: "base"},
|
|
{Role: RoleUser, Content: "hi"},
|
|
{Role: RoleSystem, Content: "note"},
|
|
}, "strict")
|
|
if len(out) != 2 {
|
|
t.Fatalf("len = %d %#v", len(out), out)
|
|
}
|
|
if out[1].Role != RoleUser || out[1].Content != "hi\n\n[system]\nnote" {
|
|
t.Fatalf("folded = %#v", out[1])
|
|
}
|
|
}
|
|
|
|
func TestPrepareKeepsToolPairs(t *testing.T) {
|
|
out := PrepareMessages([]Message{
|
|
{Role: RoleAssistant, Content: "call", ToolCalls: []ToolCall{{ID: "1", Name: "t"}}},
|
|
{Role: RoleTool, ToolCallID: "1", Content: "ok"},
|
|
}, "merge")
|
|
if len(out) != 2 || out[1].Role != RoleTool {
|
|
t.Fatalf("tools = %#v", out)
|
|
}
|
|
}
|