Files
ai-agent-scaffold-go/internal/domain/agent/service/armory/context.go
2026-05-30 23:16:49 +08:00

88 lines
1.9 KiB
Go

package armory
import (
"sync"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
)
type DynamicContext struct {
mu sync.RWMutex
ModelAPI ports.ModelAPI
ChatModel ports.ChatModel
agentGroup map[string]ports.Agent
currentStepIndex int
currentWorkflow *model.AgentWorkflowConfig
values map[string]any
}
func NewDynamicContext() *DynamicContext {
return &DynamicContext{
agentGroup: make(map[string]ports.Agent),
values: make(map[string]any),
}
}
func (c *DynamicContext) AddAgent(agent ports.Agent) {
c.mu.Lock()
defer c.mu.Unlock()
c.agentGroup[agent.Name()] = agent
}
func (c *DynamicContext) Agent(name string) (ports.Agent, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
agent, ok := c.agentGroup[name]
return agent, ok
}
func (c *DynamicContext) QueryAgentList(names []string) []ports.Agent {
c.mu.RLock()
defer c.mu.RUnlock()
agents := make([]ports.Agent, 0, len(names))
for _, name := range names {
if agent, ok := c.agentGroup[name]; ok {
agents = append(agents, agent)
}
}
return agents
}
func (c *DynamicContext) AddCurrentStepIndex() {
c.mu.Lock()
defer c.mu.Unlock()
c.currentStepIndex++
}
func (c *DynamicContext) CurrentStepIndex() int {
c.mu.RLock()
defer c.mu.RUnlock()
return c.currentStepIndex
}
func (c *DynamicContext) SetCurrentWorkflow(workflow *model.AgentWorkflowConfig) {
c.mu.Lock()
defer c.mu.Unlock()
c.currentWorkflow = workflow
}
func (c *DynamicContext) CurrentWorkflow() *model.AgentWorkflowConfig {
c.mu.RLock()
defer c.mu.RUnlock()
return c.currentWorkflow
}
func (c *DynamicContext) SetValue(key string, value any) {
c.mu.Lock()
defer c.mu.Unlock()
c.values[key] = value
}
func (c *DynamicContext) Value(key string) (any, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
value, ok := c.values[key]
return value, ok
}