Class: RailsAi::Agents::AgentManager
- Inherits:
-
Object
- Object
- RailsAi::Agents::AgentManager
- Defined in:
- lib/rails_ai/agents/agent_manager.rb
Instance Attribute Summary collapse
-
#agents ⇒ Object
readonly
Returns the value of attribute agents.
-
#message_bus ⇒ Object
readonly
Returns the value of attribute message_bus.
-
#task_queue ⇒ Object
readonly
Returns the value of attribute task_queue.
Instance Method Summary collapse
- #assign_task_to_agent(task, agent_name) ⇒ Object
- #auto_assign_task(task) ⇒ Object
- #broadcast_message(from_agent, message, exclude: []) ⇒ Object
-
#create_agent_team(team_name, agents, collaboration_strategy: :round_robin) ⇒ Object
Agent collaboration.
- #find_best_agent_for_task(task) ⇒ Object
- #get_agent(agent_name) ⇒ Object
- #health_check ⇒ Object
-
#initialize ⇒ AgentManager
constructor
A new instance of AgentManager.
- #list_agents ⇒ Object
- #orchestrate_collaboration(task, agent_names) ⇒ Object
- #pause! ⇒ Object
-
#register_agent(agent) ⇒ Object
Agent lifecycle management.
- #resume! ⇒ Object
-
#send_message(from_agent, to_agent, message) ⇒ Object
Communication.
-
#start! ⇒ Object
System control.
- #stop! ⇒ Object
-
#submit_task(task) ⇒ Object
Task management.
-
#system_status ⇒ Object
Monitoring and health.
- #unregister_agent(agent_name) ⇒ Object
Constructor Details
#initialize ⇒ AgentManager
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
#agents ⇒ Object (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_bus ⇒ Object (readonly)
Returns the value of attribute message_bus.
6 7 8 |
# File 'lib/rails_ai/agents/agent_manager.rb', line 6 def @message_bus end |
#task_queue ⇒ Object (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 (from_agent, , exclude: []) @message_bus.broadcast(from_agent, , 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_check ⇒ Object
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_agents ⇒ Object
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 (from_agent, to_agent, ) @message_bus.(from_agent, to_agent, ) 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_status ⇒ Object
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 |