feat: add /help command and improve /list models in agent loop
Fixes #569: /help now returns a formatted list of all available commands across all channels. Fixes #570: /list models now shows actual configured models with fallbacks instead of a static unhelpful message. Fixes #580: memory/context feedback messages are now more user-friendly.
This commit is contained in:
parent
f78ac3abe7
commit
989954e9d4
1 changed files with 158 additions and 0 deletions
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -631,3 +632,160 @@ func TestAgentLoop_ContextExhaustionRetry(t *testing.T) {
|
||||||
t.Errorf("Expected history to be compressed (len < 8), got %d", len(finalHistory))
|
t.Errorf("Expected history to be compressed (len < 8), got %d", len(finalHistory))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHandleCommand_Help(t *testing.T) {
|
||||||
|
tmpDir, err := os.MkdirTemp("", "agent-test-*")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create temp dir: %v", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
cfg := &config.Config{
|
||||||
|
Agents: config.AgentsConfig{
|
||||||
|
Defaults: config.AgentDefaults{
|
||||||
|
Workspace: tmpDir,
|
||||||
|
Model: "test-model",
|
||||||
|
MaxTokens: 4096,
|
||||||
|
MaxToolIterations: 10,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
msgBus := bus.NewMessageBus()
|
||||||
|
provider := &mockProvider{}
|
||||||
|
al := NewAgentLoop(cfg, msgBus, provider)
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
msg := bus.InboundMessage{
|
||||||
|
Channel: "test",
|
||||||
|
SenderID: "user1",
|
||||||
|
ChatID: "chat1",
|
||||||
|
Content: "/help",
|
||||||
|
}
|
||||||
|
|
||||||
|
response, handled := al.handleCommand(ctx, msg)
|
||||||
|
if !handled {
|
||||||
|
t.Fatal("Expected /help to be handled")
|
||||||
|
}
|
||||||
|
if response == "" {
|
||||||
|
t.Fatal("Expected non-empty help response")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify key commands are mentioned in the help text
|
||||||
|
expectedCommands := []string{
|
||||||
|
"/help",
|
||||||
|
"/show model",
|
||||||
|
"/show channel",
|
||||||
|
"/show agents",
|
||||||
|
"/list models",
|
||||||
|
"/list channels",
|
||||||
|
"/list agents",
|
||||||
|
"/switch model to",
|
||||||
|
"/switch channel to",
|
||||||
|
}
|
||||||
|
for _, cmd := range expectedCommands {
|
||||||
|
if !strings.Contains(response, cmd) {
|
||||||
|
t.Errorf("Help response missing command %q", cmd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHandleCommand_ListModels(t *testing.T) {
|
||||||
|
tmpDir, err := os.MkdirTemp("", "agent-test-*")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create temp dir: %v", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
cfg := &config.Config{
|
||||||
|
Agents: config.AgentsConfig{
|
||||||
|
Defaults: config.AgentDefaults{
|
||||||
|
Workspace: tmpDir,
|
||||||
|
Model: "gpt-4",
|
||||||
|
ModelFallbacks: []string{"gpt-3.5-turbo"},
|
||||||
|
MaxTokens: 4096,
|
||||||
|
MaxToolIterations: 10,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
msgBus := bus.NewMessageBus()
|
||||||
|
provider := &mockProvider{}
|
||||||
|
al := NewAgentLoop(cfg, msgBus, provider)
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
msg := bus.InboundMessage{
|
||||||
|
Channel: "test",
|
||||||
|
SenderID: "user1",
|
||||||
|
ChatID: "chat1",
|
||||||
|
Content: "/list models",
|
||||||
|
}
|
||||||
|
|
||||||
|
response, handled := al.handleCommand(ctx, msg)
|
||||||
|
if !handled {
|
||||||
|
t.Fatal("Expected /list models to be handled")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should contain the model name
|
||||||
|
if !strings.Contains(response, "gpt-4") {
|
||||||
|
t.Errorf("Expected response to contain model name 'gpt-4', got: %s", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should contain fallback info
|
||||||
|
if !strings.Contains(response, "gpt-3.5-turbo") {
|
||||||
|
t.Errorf("Expected response to contain fallback model 'gpt-3.5-turbo', got: %s", response)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should contain "Configured models" header
|
||||||
|
if !strings.Contains(response, "Configured models:") {
|
||||||
|
t.Errorf("Expected response to contain 'Configured models:', got: %s", response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHandleCommand_NotACommand(t *testing.T) {
|
||||||
|
tmpDir, err := os.MkdirTemp("", "agent-test-*")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create temp dir: %v", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
|
cfg := &config.Config{
|
||||||
|
Agents: config.AgentsConfig{
|
||||||
|
Defaults: config.AgentDefaults{
|
||||||
|
Workspace: tmpDir,
|
||||||
|
Model: "test-model",
|
||||||
|
MaxTokens: 4096,
|
||||||
|
MaxToolIterations: 10,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
msgBus := bus.NewMessageBus()
|
||||||
|
provider := &mockProvider{}
|
||||||
|
al := NewAgentLoop(cfg, msgBus, provider)
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
content string
|
||||||
|
}{
|
||||||
|
{name: "plain text", content: "hello world"},
|
||||||
|
{name: "unknown command", content: "/unknown"},
|
||||||
|
{name: "empty", content: ""},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
msg := bus.InboundMessage{
|
||||||
|
Channel: "test",
|
||||||
|
SenderID: "user1",
|
||||||
|
ChatID: "chat1",
|
||||||
|
Content: tt.content,
|
||||||
|
}
|
||||||
|
_, handled := al.handleCommand(ctx, msg)
|
||||||
|
if handled {
|
||||||
|
t.Errorf("Expected %q to not be handled as a command", tt.content)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue