Class: RailsAi::Agents::AgentManager

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_ai/agents/agent_manager.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAgentManager

Returns a new instance of AgentManager.



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/rails_ai/agents/agent_manager.rb', line 8

def initialize
  @agents = {}
  @message_bus = MessageBus.new
  @task_queue = TaskQueue.new
  @running = false
  @thread_pool = Concurrent::ThreadPoolExecutor.new(
    min_threads: 2,
    max_threads: 10,
    max_queue: 100
  )
end

Instance Attribute Details

#agentsObject (readonly)

Returns the value of attribute agents.



6
7
8
# File 'lib/rails_ai/agents/agent_manager.rb', line 6

def agents
  @agents
end

#message_busObject (readonly)

Returns the value of attribute message_bus.



6
7
8
# File 'lib/rails_ai/agents/agent_manager.rb', line 6

def message_bus
  @message_bus
end

#task_queueObject (readonly)

Returns the value of attribute task_queue.



6
7
8
# File 'lib/rails_ai/agents/agent_manager.rb', line 6

def task_queue
  @task_queue
end

Instance Method Details

#assign_task_to_agent(task, agent_name) ⇒ Object



53
54
55
56
57
58
# File 'lib/rails_ai/agents/agent_manager.rb', line 53

def assign_task_to_agent(task, agent_name)
  agent = get_agent(agent_name)
  return false unless agent

  agent.assign_task(task)
end

#auto_assign_task(task) ⇒ Object



74
75
76
77
78
79
# File 'lib/rails_ai/agents/agent_manager.rb', line 74

def auto_assign_task(task)
  best_agent = find_best_agent_for_task(task)
  return false unless best_agent

  assign_task_to_agent(task, best_agent.name)
end

#broadcast_message(from_agent, message, exclude: []) ⇒ Object



86
87
88
# File 'lib/rails_ai/agents/agent_manager.rb', line 86

def broadcast_message(from_agent, message, exclude: [])
  @message_bus.broadcast(from_agent, message, exclude: exclude)
end

#create_agent_team(team_name, agents, collaboration_strategy: :round_robin) ⇒ Object

Agent collaboration



155
156
157
158
159
160
161
162
163
164
165
# File 'lib/rails_ai/agents/agent_manager.rb', line 155

def create_agent_team(team_name, agents, collaboration_strategy: :round_robin)
  team = AgentTeam.new(
    name: team_name,
    agents: agents,
    strategy: collaboration_strategy,
    manager: self
  )
  
  team.agents.each { |agent| register_agent(agent) }
  team
end

#find_best_agent_for_task(task) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/rails_ai/agents/agent_manager.rb', line 60

def find_best_agent_for_task(task)
  available_agents = @agents.values.select { |agent| agent.state == :active }
  
  return nil if available_agents.empty?

  # Score agents based on capabilities and current workload
  scored_agents = available_agents.map do |agent|
    score = calculate_agent_score(agent, task)
    { agent: agent, score: score }
  end

  scored_agents.max_by { |item| item[:score] }&.dig(:agent)
end

#get_agent(agent_name) ⇒ Object



38
39
40
# File 'lib/rails_ai/agents/agent_manager.rb', line 38

def get_agent(agent_name)
  @agents[agent_name]
end

#health_checkObject



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/rails_ai/agents/agent_manager.rb', line 141

def health_check
  agent_health = @agents.values.map do |agent|
    { name: agent.name, health: agent.health_check }
  end

  {
    system_healthy: @running && @thread_pool.running?,
    agent_health: agent_health,
    memory_usage: calculate_memory_usage,
    task_queue_healthy: @task_queue.size < 1000
  }
end

#list_agentsObject



42
43
44
# File 'lib/rails_ai/agents/agent_manager.rb', line 42

def list_agents
  @agents.values.map(&:status)
end

#orchestrate_collaboration(task, agent_names) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/rails_ai/agents/agent_manager.rb', line 167

def orchestrate_collaboration(task, agent_names)
  agents = agent_names.map { |name| get_agent(name) }.compact
  return false if agents.empty?

  collaboration = Collaboration.new(
    task: task,
    agents: agents,
    manager: self
  )

  collaboration.start!
  collaboration
end

#pause!Object



113
114
115
116
117
# File 'lib/rails_ai/agents/agent_manager.rb', line 113

def pause!
  @running = false
  @agents.each_value(&:pause!)
  defined?(Rails) && Rails.logger && Rails.logger.info("Agent Manager paused")
end

#register_agent(agent) ⇒ Object

Agent lifecycle management



21
22
23
24
25
26
# File 'lib/rails_ai/agents/agent_manager.rb', line 21

def register_agent(agent)
  @agents[agent.name] = agent
  @message_bus.subscribe(agent.name, agent)
  defined?(Rails) && Rails.logger && Rails.logger.info("Registered agent: #{agent.name}")
  agent
end

#resume!Object



119
120
121
122
123
124
125
# File 'lib/rails_ai/agents/agent_manager.rb', line 119

def resume!
  @running = true
  @agents.each_value(&:resume!)
  start_task_processor
  start_agent_monitor
  defined?(Rails) && Rails.logger && Rails.logger.info("Agent Manager resumed")
end

#send_message(from_agent, to_agent, message) ⇒ Object

Communication



82
83
84
# File 'lib/rails_ai/agents/agent_manager.rb', line 82

def send_message(from_agent, to_agent, message)
  @message_bus.send_message(from_agent, to_agent, message)
end

#start!Object

System control



91
92
93
94
95
96
97
98
99
# File 'lib/rails_ai/agents/agent_manager.rb', line 91

def start!
  return false if @running

  @running = true
  start_task_processor
  start_agent_monitor
  defined?(Rails) && Rails.logger && Rails.logger.info("Agent Manager started")
  true
end

#stop!Object



101
102
103
104
105
106
107
108
109
110
111
# File 'lib/rails_ai/agents/agent_manager.rb', line 101

def stop!
  return false unless @running

  @running = false
  @thread_pool.shutdown
  @thread_pool.wait_for_termination(30)
  
  @agents.each_value(&:stop!)
  defined?(Rails) && Rails.logger && Rails.logger.info("Agent Manager stopped")
  true
end

#submit_task(task) ⇒ Object

Task management



47
48
49
50
51
# File 'lib/rails_ai/agents/agent_manager.rb', line 47

def submit_task(task)
  @task_queue.enqueue(task)
  defined?(Rails) && Rails.logger && Rails.logger.info("Submitted task: #{task[:description]}")
  task
end

#system_statusObject

Monitoring and health



128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/rails_ai/agents/agent_manager.rb', line 128

def system_status
  {
    running: @running,
    total_agents: @agents.length,
    active_agents: @agents.values.count { |a| a.state == :active },
    paused_agents: @agents.values.count { |a| a.state == :paused },
    stopped_agents: @agents.values.count { |a| a.state == :stopped },
    pending_tasks: @task_queue.size,
    total_tasks_processed: @task_queue.total_processed,
    thread_pool_status: @thread_pool.running?
  }
end

#unregister_agent(agent_name) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/rails_ai/agents/agent_manager.rb', line 28

def unregister_agent(agent_name)
  agent = @agents.delete(agent_name)
  return false unless agent

  @message_bus.unsubscribe(agent_name)
  agent.stop!
  defined?(Rails) && Rails.logger && Rails.logger.info("Unregistered agent: #{agent_name}")
  true
end