64 lines
2.7 KiB
Go
64 lines
2.7 KiB
Go
package callmemory
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"data-terminal-cloud/internal/elderagent"
|
||
|
|
"data-terminal-cloud/internal/memoryidentity"
|
||
|
|
"github.com/google/uuid"
|
||
|
|
)
|
||
|
|
|
||
|
|
type nativeMemoryTestProvider struct{ configs []map[string]any }
|
||
|
|
|
||
|
|
func (p *nativeMemoryTestProvider) Ensure(context.Context, string, map[string]any, map[string]any) (elderagent.Bot, error) {
|
||
|
|
panic("not used")
|
||
|
|
}
|
||
|
|
func (p *nativeMemoryTestProvider) Update(_ context.Context, _ string, c, a map[string]any) error {
|
||
|
|
p.configs = append(p.configs, c)
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDirectNativeMemoryUsesVikingWithoutPlatformFactsAndDisablesAfterWithdrawal(t *testing.T) {
|
||
|
|
f, d := directFixture(t)
|
||
|
|
f.add(t)
|
||
|
|
f.exec(t, `UPDATE subject_voice_agent SET config='{"S2SConfig":{"ProviderParams":{"dialog":{"system_role":"基础人设"}}},"MemoryConfig":{"Enable":false}}'::jsonb WHERE subject_id=$1::uuid`, f.subject)
|
||
|
|
provider := &nativeMemoryTestProvider{}
|
||
|
|
agent := &elderagent.Service{Pool: f.p, Provider: provider, VikingCollectionName: "aiphone", VikingEventType: "event_v1", CallbackURL: "https://example.com/callback", CallbackSecret: []byte(strings.Repeat("k", 32))}
|
||
|
|
f.s.direct.Prepare = agent.Prepare
|
||
|
|
ctx := context.Background()
|
||
|
|
sid := uuid.NewString()
|
||
|
|
if _, err := f.s.DirectRequest(ctx, d, "start", DirectInput{SessionID: sid}); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if len(provider.configs) != 1 {
|
||
|
|
t.Fatal("provider not prepared")
|
||
|
|
}
|
||
|
|
c := provider.configs[0]
|
||
|
|
m := c["MemoryConfig"].(map[string]any)
|
||
|
|
filter := m["ProviderParams"].(map[string]any)["filter"].(map[string]any)
|
||
|
|
if m["Enable"] != true || filter["user_id"].([]string)[0] != memoryidentity.UserID(f.tenant, f.subject) {
|
||
|
|
t.Fatal("Viking identity does not match uploads", m)
|
||
|
|
}
|
||
|
|
role := c["S2SConfig"].(map[string]any)["ProviderParams"].(map[string]any)["dialog"].(map[string]any)["system_role"].(string)
|
||
|
|
if strings.Contains(role, "喜欢喝淡茶") || strings.Contains(role, "<资料>") {
|
||
|
|
t.Fatal("platform facts entered prompt")
|
||
|
|
}
|
||
|
|
var mode string
|
||
|
|
if err := f.p.QueryRow(ctx, `SELECT memory_mode FROM call_session WHERE id=$1::uuid`, sid).Scan(&mode); err != nil || mode != "NATIVE_VIKING" {
|
||
|
|
t.Fatal("incorrect frozen memory mode", mode, err)
|
||
|
|
}
|
||
|
|
if _, err := f.s.DirectRequest(ctx, d, "end", DirectInput{SessionID: sid, Reason: "hangup", SDKStopped: true}); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
f.exec(t, `UPDATE consent_record SET withdrawn_at=now() WHERE subject_id=$1::uuid AND consent_type='personalized_memory' AND withdrawn_at IS NULL`, f.subject)
|
||
|
|
if _, err := f.s.DirectRequest(ctx, d, "start", DirectInput{SessionID: uuid.NewString()}); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
m = provider.configs[1]["MemoryConfig"].(map[string]any)
|
||
|
|
if m["Enable"] != false || len(m) != 1 {
|
||
|
|
t.Fatal("withdrawn memory still has retrieval filters", m)
|
||
|
|
}
|
||
|
|
}
|