add agentpool
This commit is contained in:
148
example/webui/agentpool.go
Normal file
148
example/webui/agentpool.go
Normal file
@@ -0,0 +1,148 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
. "github.com/mudler/local-agent-framework/agent"
|
||||
)
|
||||
|
||||
type AgentConfig struct {
|
||||
}
|
||||
|
||||
type AgentPool struct {
|
||||
file string
|
||||
pool AgentPoolData
|
||||
agents map[string]*Agent
|
||||
}
|
||||
|
||||
type AgentPoolData map[string]AgentConfig
|
||||
|
||||
func NewAgentPool(file string) (*AgentPool, error) {
|
||||
// if file exists, try to load an existing pool.
|
||||
// if file does not exist, create a new pool.
|
||||
|
||||
if _, err := os.Stat(file); err != nil {
|
||||
// file does not exist, create a new pool
|
||||
return &AgentPool{
|
||||
file: file,
|
||||
agents: make(map[string]*Agent),
|
||||
pool: make(map[string]AgentConfig),
|
||||
}, nil
|
||||
}
|
||||
|
||||
poolData, err := loadPoolFromFile(file)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &AgentPool{
|
||||
file: file,
|
||||
agents: make(map[string]*Agent),
|
||||
pool: *poolData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CreateAgent adds a new agent to the pool
|
||||
// and starts it.
|
||||
// It also saves the state to the file.
|
||||
func (a *AgentPool) CreateAgent(name string, agentConfig *AgentConfig) error {
|
||||
if _, ok := a.pool[name]; ok {
|
||||
return fmt.Errorf("agent %s already exists", name)
|
||||
}
|
||||
a.pool[name] = *agentConfig
|
||||
if err := a.Save(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return a.startAgentWithConfig(name, agentConfig)
|
||||
}
|
||||
|
||||
func (a *AgentPool) startAgentWithConfig(name string, config *AgentConfig) error {
|
||||
|
||||
agent, err := New(
|
||||
WithModel("hermes-2-pro-mistral"),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
a.agents[name] = agent
|
||||
|
||||
go func() {
|
||||
if err := agent.Run(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Starts all the agents in the pool
|
||||
func (a *AgentPool) StartAll() error {
|
||||
for name, config := range a.pool {
|
||||
if a.agents[name] != nil { // Agent already started
|
||||
continue
|
||||
}
|
||||
if err := a.startAgentWithConfig(name, &config); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *AgentPool) StopAll() {
|
||||
for _, agent := range a.agents {
|
||||
agent.Stop()
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AgentPool) Stop(name string) {
|
||||
if agent, ok := a.agents[name]; ok {
|
||||
agent.Stop()
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AgentPool) Start(name string) error {
|
||||
if agent, ok := a.agents[name]; ok {
|
||||
return agent.Run()
|
||||
}
|
||||
if config, ok := a.pool[name]; ok {
|
||||
return a.startAgentWithConfig(name, &config)
|
||||
}
|
||||
|
||||
return fmt.Errorf("agent %s not found", name)
|
||||
}
|
||||
|
||||
func (a *AgentPool) Remove(name string) error {
|
||||
a.Stop(name)
|
||||
delete(a.agents, name)
|
||||
delete(a.pool, name)
|
||||
if err := a.Save(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (a *AgentPool) Save() error {
|
||||
data, err := json.Marshal(a.pool)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(a.file, data, 0644)
|
||||
}
|
||||
|
||||
func (a *AgentPool) GetAgent(name string) *Agent {
|
||||
return a.agents[name]
|
||||
}
|
||||
|
||||
func loadPoolFromFile(path string) (*AgentPoolData, error) {
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
poolData := &AgentPoolData{}
|
||||
err = json.Unmarshal(data, poolData)
|
||||
return poolData, err
|
||||
}
|
||||
Reference in New Issue
Block a user