114 lines
3.9 KiB
Go
114 lines
3.9 KiB
Go
package qa
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/core"
|
|
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/reasoningmode"
|
|
"gitea.zheromiku.top/Weknora/dobotai-platform/internal/session"
|
|
)
|
|
|
|
type fakeReasoningFinalizer struct {
|
|
repo *memoryRepository
|
|
calls int
|
|
input reasoningmode.TurnCompletion
|
|
completion reasoningmode.Completion
|
|
}
|
|
|
|
func (f *fakeReasoningFinalizer) Complete(_ context.Context, input reasoningmode.TurnCompletion) (reasoningmode.Completion, error) {
|
|
f.calls++
|
|
f.input = input
|
|
f.repo.mu.Lock()
|
|
finished := len(f.repo.finishTurns)
|
|
f.repo.mu.Unlock()
|
|
if finished == 0 {
|
|
panic("reasoning completion ran before successful Turn persistence")
|
|
}
|
|
return f.completion, nil
|
|
}
|
|
|
|
func TestAgentOverrideUsesSameWeKnoraSessionAsDefaultAgent(t *testing.T) {
|
|
repo := newMemoryRepository()
|
|
client := &fakeWeKnora{}
|
|
service, err := New(repo, fixedResolver{}, client, session.GroupShared)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
base := core.QARequest{
|
|
TenantKey: "tenant", Channel: "dingtalk", ConversationType: core.ConversationDirect,
|
|
ExternalUserID: "staff-1", SenderName: "张三", Query: "第一问",
|
|
}
|
|
base.ExternalMessageID = "message-quick"
|
|
quick, err := service.Ask(context.Background(), base)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
base.ExternalMessageID = "message-reasoning"
|
|
base.Query = "继续深入分析"
|
|
base.AgentIDOverride = "agent-reasoning"
|
|
reasoning, err := service.Ask(context.Background(), base)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if quick.WeKnoraSessionID == "" || reasoning.WeKnoraSessionID != quick.WeKnoraSessionID {
|
|
t.Fatalf("quick session=%q reasoning session=%q", quick.WeKnoraSessionID, reasoning.WeKnoraSessionID)
|
|
}
|
|
client.mu.Lock()
|
|
defer client.mu.Unlock()
|
|
if client.sessions != 1 || len(client.requests) != 2 {
|
|
t.Fatalf("sessions=%d requests=%d", client.sessions, len(client.requests))
|
|
}
|
|
if client.requests[0].AgentID != "agent-1" || client.requests[1].AgentID != "agent-reasoning" {
|
|
t.Fatalf("agent requests=%q,%q", client.requests[0].AgentID, client.requests[1].AgentID)
|
|
}
|
|
repo.mu.Lock()
|
|
defer repo.mu.Unlock()
|
|
if len(repo.finishTurns) != 2 || repo.finishTurns[0].AgentID != "agent-1" || repo.finishTurns[1].AgentID != "agent-reasoning" {
|
|
t.Fatalf("finished turns=%+v", repo.finishTurns)
|
|
}
|
|
if repo.finishTurns[0].SessionKey != repo.finishTurns[1].SessionKey {
|
|
t.Fatalf("session keys diverged: %q vs %q", repo.finishTurns[0].SessionKey, repo.finishTurns[1].SessionKey)
|
|
}
|
|
}
|
|
|
|
func TestReasoningCompletionDecoratesPersistedAndReturnedAnswer(t *testing.T) {
|
|
repo := newMemoryRepository()
|
|
client := &fakeWeKnora{}
|
|
finalizer := &fakeReasoningFinalizer{
|
|
repo: repo,
|
|
completion: reasoningmode.Completion{
|
|
RoundNumber: 8,
|
|
ShowHint: true,
|
|
},
|
|
}
|
|
service, err := New(repo, fixedResolver{}, client, session.GroupShared, WithReasoningModeFinalizer(finalizer))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
request := core.QARequest{
|
|
TenantKey: "tenant", Channel: "dingtalk", ConversationType: core.ConversationDirect,
|
|
ExternalUserID: "staff-1", ExternalMessageID: "message-mode-completion",
|
|
Query: "分析", AgentIDOverride: "agent-reasoning",
|
|
ReasoningExecution: string(reasoningmode.ExecutionReasoning),
|
|
}
|
|
result, err := service.Ask(context.Background(), request)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if finalizer.calls != 1 || finalizer.input.TurnID == "" || finalizer.input.Answer != "answer" {
|
|
t.Fatalf("finalizer calls=%d input=%+v", finalizer.calls, finalizer.input)
|
|
}
|
|
want := "【智能推理模式】\n\nanswer\n\n💡 推理模式还剩2轮,到期将自动关闭,如需继续可发送 /think on 重置轮次"
|
|
if result.Answer != want {
|
|
t.Fatalf("result answer=%q want=%q", result.Answer, want)
|
|
}
|
|
repo.mu.Lock()
|
|
defer repo.mu.Unlock()
|
|
stored := repo.turns["tenant:dingtalk:message-mode-completion"]
|
|
if stored.Answer != result.Answer {
|
|
t.Fatalf("stored answer=%q result=%q", stored.Answer, result.Answer)
|
|
}
|
|
}
|