mirror of
https://github.com/mudler/LocalAI.git
synced 2026-04-01 13:42:20 -04:00
* 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>
176 lines
4.1 KiB
Go
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())
|
|
})
|
|
})
|