feat(session,llm): restore session runtime on resume; align Responses API details
This commit is contained in:
@@ -403,3 +403,132 @@ func TestManagerUsesModelContextForAgentCompaction(t *testing.T) {
|
||||
t.Fatalf("answerCalls = %d, want 1", provider.answerCalls)
|
||||
}
|
||||
}
|
||||
|
||||
func TestManagerResumeRestoresRuntime(t *testing.T) {
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "text/event-stream")
|
||||
_, _ = w.Write([]byte(`data: {"type":"response.output_text.delta","item_id":"msg_1","output_index":0,"content_index":0,"delta":"ok"}` + "\n\n"))
|
||||
_, _ = w.Write([]byte(`data: {"type":"response.completed","response":{"id":"resp_1","status":"completed"}}` + "\n\n"))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
cfg := &config.Config{
|
||||
Providers: map[string]config.ProviderConfig{
|
||||
"chat": {
|
||||
Name: "chat",
|
||||
APIType: config.APITypeChat,
|
||||
BaseURL: "https://chat.example.com",
|
||||
APIKey: "sk-test",
|
||||
Model: "model-a",
|
||||
Models: []string{"model-a"},
|
||||
Thinking: "none",
|
||||
ThinkingParam: "thinking",
|
||||
ThinkingConfigured: true,
|
||||
},
|
||||
"resp": {
|
||||
Name: "resp",
|
||||
APIType: config.APITypeResponses,
|
||||
BaseURL: server.URL,
|
||||
APIKey: "sk-test",
|
||||
Model: "m1",
|
||||
Models: []string{"m1", "m2"},
|
||||
Thinking: "none",
|
||||
ThinkingParam: "reasoning",
|
||||
ThinkingConfigured: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
assistant := agent.New(agent.Options{
|
||||
Provider: &recordingProvider{},
|
||||
Model: "model-a",
|
||||
Thinking: "none",
|
||||
ThinkingParam: "thinking",
|
||||
ThinkingEnabled: true,
|
||||
})
|
||||
store, err := NewStore(filepath.Join(t.TempDir(), "sessions"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
manager, err := NewManager(cfg, assistant, server.Client(), store)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Build a session on the responses provider with a custom model and thinking.
|
||||
manager.newSession()
|
||||
if _, err := manager.SetProvider("resp"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := manager.SetModel("m2"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := manager.SetThinking("xhigh"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := manager.Save(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
id := manager.CurrentSessionID()
|
||||
|
||||
// Drift away from the saved runtime.
|
||||
if _, err := manager.SetProvider("chat"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := manager.SetModel("model-a"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := manager.SetThinking("none"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := manager.Resume(id); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got := manager.CurrentProvider(); got != "resp" {
|
||||
t.Fatalf("provider = %q, want resp", got)
|
||||
}
|
||||
if got := manager.CurrentModel(); got != "m2" {
|
||||
t.Fatalf("model = %q, want m2", got)
|
||||
}
|
||||
if got := manager.CurrentThinking(); got != "xhigh" {
|
||||
t.Fatalf("thinking = %q, want xhigh", got)
|
||||
}
|
||||
if got := manager.CurrentAPIType(); got != config.APITypeResponses {
|
||||
t.Fatalf("api type = %q, want responses", got)
|
||||
}
|
||||
runtime := assistant.RuntimeInfo()
|
||||
if runtime.ProviderName != "resp" || runtime.Model != "m2" || runtime.Thinking != "xhigh" {
|
||||
t.Fatalf("agent runtime = %#v", runtime)
|
||||
}
|
||||
}
|
||||
|
||||
func TestManagerResumeFallsBackWhenRuntimeMissing(t *testing.T) {
|
||||
manager, assistant, _ := testManager(t)
|
||||
|
||||
sess := &Session{
|
||||
ID: GenerateID(),
|
||||
Provider: "ghost",
|
||||
Model: "ghost-model",
|
||||
Thinking: "xhigh",
|
||||
Messages: []llm.Message{{Role: llm.RoleUser, Content: "hi"}},
|
||||
}
|
||||
if err := manager.store.Save(sess); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := manager.Resume(sess.ID); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got := manager.CurrentProvider(); got != "one" {
|
||||
t.Fatalf("provider = %q, want default one", got)
|
||||
}
|
||||
if got := manager.CurrentModel(); got != "model-a" {
|
||||
t.Fatalf("model = %q, want default model-a", got)
|
||||
}
|
||||
if got := manager.CurrentThinking(); got != "xhigh" {
|
||||
t.Fatalf("thinking = %q, want restored xhigh", got)
|
||||
}
|
||||
runtime := assistant.RuntimeInfo()
|
||||
if runtime.ProviderName != "one" || runtime.Model != "model-a" {
|
||||
t.Fatalf("agent runtime = %#v", runtime)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user