v0.0.5: context compaction, minimal config, retry/search/code symbols/diff/status/test commands
This commit is contained in:
@@ -116,6 +116,7 @@ func TestManagerSaveAndResume(t *testing.T) {
|
||||
manager.newSession()
|
||||
var out strings.Builder
|
||||
assistant.RunTurn(context.Background(), "hello world", &out, nil)
|
||||
assistant.SetLastUsage(&llm.Usage{PromptTokens: 10, CompletionTokens: 5, TotalTokens: 15})
|
||||
|
||||
// Save
|
||||
if err := manager.Save(); err != nil {
|
||||
@@ -153,6 +154,9 @@ func TestManagerSaveAndResume(t *testing.T) {
|
||||
if !hasUser {
|
||||
t.Fatal("resumed session should contain original user message")
|
||||
}
|
||||
if usage := assistant.LastUsage(); usage == nil || usage.TotalTokens != 15 {
|
||||
t.Fatalf("resumed usage = %#v", usage)
|
||||
}
|
||||
}
|
||||
|
||||
func TestManagerRename(t *testing.T) {
|
||||
@@ -264,3 +268,66 @@ func TestManagerResumeLatest(t *testing.T) {
|
||||
t.Fatalf("expected %s, got %s", id1, manager.CurrentSessionID())
|
||||
}
|
||||
}
|
||||
|
||||
type compactingProvider struct {
|
||||
summaryCalls int
|
||||
answerCalls int
|
||||
}
|
||||
|
||||
func (p *compactingProvider) ChatStream(ctx context.Context, req llm.ChatRequest, emit func(llm.StreamEvent) error) error {
|
||||
if len(req.Messages) == 2 && req.Messages[0].Role == llm.RoleSystem {
|
||||
p.summaryCalls++
|
||||
return emit(llm.StreamEvent{Content: "summary"})
|
||||
}
|
||||
p.answerCalls++
|
||||
return emit(llm.StreamEvent{Content: "answer"})
|
||||
}
|
||||
|
||||
func TestManagerUsesModelContextForAgentCompaction(t *testing.T) {
|
||||
provider := &compactingProvider{}
|
||||
cfg := &config.Config{Providers: map[string]config.ProviderConfig{
|
||||
"one": {
|
||||
Name: "one",
|
||||
BaseURL: "https://one.example.com",
|
||||
APIKey: "sk-test",
|
||||
Model: "model-a",
|
||||
Models: []string{"model-a"},
|
||||
ModelConfigs: map[string]config.ModelConfig{"model-a": {ID: "model-a", Thinking: "none", ContextTokens: 1}},
|
||||
ContextTokens: 1,
|
||||
},
|
||||
}}
|
||||
assistant := agent.New(agent.Options{Provider: provider, ProviderName: "one", Model: "model-a"})
|
||||
store, err := NewStore(filepath.Join(t.TempDir(), "sessions"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
manager, err := NewManager(cfg, assistant, nil, store)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := manager.SetModel("model-a"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assistant.SetMessages([]llm.Message{
|
||||
{Role: llm.RoleSystem, Content: "system"},
|
||||
{Role: llm.RoleUser, Content: "old question 1"},
|
||||
{Role: llm.RoleAssistant, Content: "old answer 1"},
|
||||
{Role: llm.RoleUser, Content: "old question 2"},
|
||||
{Role: llm.RoleAssistant, Content: "old answer 2"},
|
||||
{Role: llm.RoleUser, Content: "recent question 1"},
|
||||
{Role: llm.RoleAssistant, Content: "recent answer 1"},
|
||||
{Role: llm.RoleUser, Content: "recent question 2"},
|
||||
{Role: llm.RoleAssistant, Content: "recent answer 2"},
|
||||
})
|
||||
|
||||
var out strings.Builder
|
||||
if err := assistant.RunTurn(context.Background(), "new question", &out, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if provider.summaryCalls != 1 {
|
||||
t.Fatalf("summaryCalls = %d, want 1", provider.summaryCalls)
|
||||
}
|
||||
if provider.answerCalls != 1 {
|
||||
t.Fatalf("answerCalls = %d, want 1", provider.answerCalls)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user