Files
LocalAI/core/cli/agent_test.go
Ettore Di Giacinto 8862e3ce60 feat: add node reconciler, allow to schedule to group of nodes, min/max autoscaler (#9186)
* always enable parallel requests

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* feat: add node reconciler, allow to schedule to group of nodes, min/max autoscaler

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* chore: move tests to ginkgo

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* chore(smart router): order by available vram

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

---------

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-03-31 08:28:56 +02:00

176 lines
4.1 KiB
Go

package cli
import (
"encoding/json"
"os"
"path/filepath"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/mudler/LocalAGI/core/state"
)
var _ = Describe("AgentRunCMD", func() {
Describe("loadAgentConfig", func() {
It("loads agent config from file", func() {
tmpDir := GinkgoT().TempDir()
configFile := filepath.Join(tmpDir, "agent.json")
cfg := state.AgentConfig{
Name: "test-agent",
Model: "llama3",
SystemPrompt: "You are a helpful assistant",
}
data, err := json.MarshalIndent(cfg, "", " ")
Expect(err).ToNot(HaveOccurred())
Expect(os.WriteFile(configFile, data, 0644)).To(Succeed())
cmd := &AgentRunCMD{
Config: configFile,
StateDir: tmpDir,
}
loaded, err := cmd.loadAgentConfig()
Expect(err).ToNot(HaveOccurred())
Expect(loaded.Name).To(Equal("test-agent"))
Expect(loaded.Model).To(Equal("llama3"))
})
It("loads agent config from pool", func() {
tmpDir := GinkgoT().TempDir()
pool := map[string]state.AgentConfig{
"my-agent": {
Model: "gpt-4",
Description: "A test agent",
SystemPrompt: "Hello",
},
"other-agent": {
Model: "llama3",
},
}
data, err := json.MarshalIndent(pool, "", " ")
Expect(err).ToNot(HaveOccurred())
Expect(os.WriteFile(filepath.Join(tmpDir, "pool.json"), data, 0644)).To(Succeed())
cmd := &AgentRunCMD{
Name: "my-agent",
StateDir: tmpDir,
}
loaded, err := cmd.loadAgentConfig()
Expect(err).ToNot(HaveOccurred())
Expect(loaded.Name).To(Equal("my-agent"))
Expect(loaded.Model).To(Equal("gpt-4"))
})
It("returns error for missing agent in pool", func() {
tmpDir := GinkgoT().TempDir()
pool := map[string]state.AgentConfig{
"existing-agent": {Model: "llama3"},
}
data, err := json.MarshalIndent(pool, "", " ")
Expect(err).ToNot(HaveOccurred())
Expect(os.WriteFile(filepath.Join(tmpDir, "pool.json"), data, 0644)).To(Succeed())
cmd := &AgentRunCMD{
Name: "nonexistent",
StateDir: tmpDir,
}
_, err = cmd.loadAgentConfig()
Expect(err).To(HaveOccurred())
})
It("returns error when no pool.json exists", func() {
cmd := &AgentRunCMD{
StateDir: GinkgoT().TempDir(),
}
_, err := cmd.loadAgentConfig()
Expect(err).To(HaveOccurred())
})
It("returns error for config with no name", func() {
tmpDir := GinkgoT().TempDir()
configFile := filepath.Join(tmpDir, "agent.json")
cfg := state.AgentConfig{
Model: "llama3",
}
data, _ := json.MarshalIndent(cfg, "", " ")
Expect(os.WriteFile(configFile, data, 0644)).To(Succeed())
cmd := &AgentRunCMD{
Config: configFile,
StateDir: tmpDir,
}
_, err := cmd.loadAgentConfig()
Expect(err).To(HaveOccurred())
})
})
Describe("applyOverrides", func() {
It("applies overrides to empty fields", func() {
cfg := &state.AgentConfig{
Name: "test",
}
cmd := &AgentRunCMD{
APIURL: "http://localhost:9090",
APIKey: "secret",
DefaultModel: "my-model",
}
cmd.applyOverrides(cfg)
Expect(cfg.APIURL).To(Equal("http://localhost:9090"))
Expect(cfg.APIKey).To(Equal("secret"))
Expect(cfg.Model).To(Equal("my-model"))
})
It("does not overwrite existing model", func() {
cfg := &state.AgentConfig{
Name: "test",
Model: "existing-model",
}
cmd := &AgentRunCMD{
DefaultModel: "override-model",
}
cmd.applyOverrides(cfg)
Expect(cfg.Model).To(Equal("existing-model"))
})
})
})
var _ = Describe("AgentListCMD", func() {
It("runs without error when no pool file exists", func() {
cmd := &AgentListCMD{
StateDir: GinkgoT().TempDir(),
}
Expect(cmd.Run(nil)).To(Succeed())
})
It("runs without error with agents in pool", func() {
tmpDir := GinkgoT().TempDir()
pool := map[string]state.AgentConfig{
"agent-a": {Model: "llama3", Description: "First agent"},
"agent-b": {Model: "gpt-4"},
}
data, _ := json.MarshalIndent(pool, "", " ")
Expect(os.WriteFile(filepath.Join(tmpDir, "pool.json"), data, 0644)).To(Succeed())
cmd := &AgentListCMD{
StateDir: tmpDir,
}
Expect(cmd.Run(nil)).To(Succeed())
})
})