From e0b542d24315e8ca7b4d9a984111bafcdfee84ea Mon Sep 17 00:00:00 2001 From: Mahesh Kommareddi Date: Wed, 17 Jul 2024 03:43:55 -0400 Subject: [PATCH] Conversation!!!! With Agents as participants --- frontend/src/App.js | 14 +- .../src/components/ConversationDisplay.js | 27 +++ src/main/java/com/ioa/IoASystem.java | 68 +++++--- src/main/java/com/ioa/agent/AgentInfo.java | 30 +++- .../com/ioa/conversation/ConversationFSM.java | 163 ++++++++++++------ .../ioa/conversation/ConversationManager.java | 74 ++++++++ .../java/com/ioa/conversation/Message.java | 23 ++- .../com/ioa/model/BedrockLanguageModel.java | 4 +- src/main/java/com/ioa/task/TaskManager.java | 82 +++------ src/main/java/com/ioa/team/TeamFormation.java | 2 +- target/classes/com/ioa/IoASystem.class | Bin 11149 -> 12335 bytes target/classes/com/ioa/agent/AgentInfo.class | Bin 5279 -> 6368 bytes .../ioa/conversation/ConversationFSM$1.class | Bin 890 -> 0 bytes ...versationFSM$ConversationStateUpdate.class | Bin 688 -> 1115 bytes .../ioa/conversation/ConversationFSM.class | Bin 3492 -> 7693 bytes .../conversation/ConversationManager.class | Bin 0 -> 4009 bytes .../com/ioa/conversation/Message.class | Bin 2209 -> 771 bytes .../com/ioa/model/BedrockLanguageModel.class | Bin 5823 -> 5823 bytes target/classes/com/ioa/task/TaskManager.class | Bin 6458 -> 4546 bytes .../classes/com/ioa/team/TeamFormation.class | Bin 8555 -> 8555 bytes target/classes/static/asset-manifest.json | 6 +- target/classes/static/index.html | 2 +- .../classes/static/static/js/main.a73628f2.js | 3 + .../static/js/main.a73628f2.js.LICENSE.txt | 39 +++++ .../static/static/js/main.a73628f2.js.map | 1 + .../compile/default-compile/createdFiles.lst | 2 +- 26 files changed, 388 insertions(+), 152 deletions(-) create mode 100644 frontend/src/components/ConversationDisplay.js create mode 100644 src/main/java/com/ioa/conversation/ConversationManager.java delete mode 100644 target/classes/com/ioa/conversation/ConversationFSM$1.class create mode 100644 target/classes/com/ioa/conversation/ConversationManager.class create mode 100644 target/classes/static/static/js/main.a73628f2.js create mode 100644 target/classes/static/static/js/main.a73628f2.js.LICENSE.txt create mode 100644 target/classes/static/static/js/main.a73628f2.js.map diff --git a/frontend/src/App.js b/frontend/src/App.js index 333dd70..bcc6fc8 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -2,13 +2,15 @@ import React, { useEffect, useState } from 'react'; import { connectWebSocket, subscribeToTopic } from './services/websocket'; import AgentNetworkGraph from './components/AgentNetworkGraph'; -import ConversationStateDiagram from './components/ConversationStateDiagram'; +import ConversationDisplay from './components/ConversationDisplay'; import TaskProgressIndicator from './components/TaskProgressIndicator'; import TreeOfThoughtVisual from './components/TreeOfThoughtVisual'; function App() { const [agentNetwork, setAgentNetwork] = useState(null); const [conversationState, setConversationState] = useState({ currentState: '', possibleTransitions: [] }); + const [conversationMessages, setConversationMessages] = useState([]); + const [conversationParticipants, setConversationParticipants] = useState([]); const [taskProgress, setTaskProgress] = useState({ taskId: '', status: '', progressPercentage: 0 }); const [treeOfThought, setTreeOfThought] = useState(null); @@ -16,6 +18,8 @@ function App() { connectWebSocket(() => { subscribeToTopic('agent_network', setAgentNetwork); subscribeToTopic('conversation_state', setConversationState); + subscribeToTopic('conversation_message', (message) => setConversationMessages(prev => [...prev, message])); + subscribeToTopic('conversation_participants', setConversationParticipants); subscribeToTopic('task_progress', setTaskProgress); subscribeToTopic('tree_of_thought', setTreeOfThought); }); @@ -29,10 +33,10 @@ function App() { {agentNetwork && }
-

Conversation State

- Conversation +
diff --git a/frontend/src/components/ConversationDisplay.js b/frontend/src/components/ConversationDisplay.js new file mode 100644 index 0000000..85fcf15 --- /dev/null +++ b/frontend/src/components/ConversationDisplay.js @@ -0,0 +1,27 @@ +// src/components/ConversationDisplay.js +import React from 'react'; + +const ConversationDisplay = ({ messages, participants }) => { + return ( +
+

Conversation

+
+

Participants:

+
    + {participants.map((participant, index) => ( +
  • {participant.name}
  • + ))} +
+
+
+ {messages.map((message, index) => ( +
+ {message.sender}: {message.content} +
+ ))} +
+
+ ); +}; + +export default ConversationDisplay; \ No newline at end of file diff --git a/src/main/java/com/ioa/IoASystem.java b/src/main/java/com/ioa/IoASystem.java index 74ec3b3..b3214df 100644 --- a/src/main/java/com/ioa/IoASystem.java +++ b/src/main/java/com/ioa/IoASystem.java @@ -2,6 +2,7 @@ package com.ioa; import com.ioa.agent.AgentInfo; import com.ioa.agent.AgentRegistry; +import com.ioa.conversation.ConversationManager; import com.ioa.task.Task; import com.ioa.task.TaskManager; import com.ioa.team.TeamFormation; @@ -29,6 +30,11 @@ public class IoASystem { return new WebSocketService(messagingTemplate); } + @Bean + public ConversationManager conversationManager(BedrockLanguageModel model, WebSocketService webSocketService) { + return new ConversationManager(model, webSocketService); + } + @Bean public BedrockLanguageModel bedrockLanguageModel() { return new BedrockLanguageModel("anthropic.claude-3-sonnet-20240229-v1:0"); @@ -40,17 +46,17 @@ public class IoASystem { } @Bean - public AgentRegistry agentRegistry(ToolRegistry toolRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { + public AgentRegistry agentRegistry(ToolRegistry toolRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService, ConversationManager conversationManager) { AgentRegistry registry = new AgentRegistry(toolRegistry); - // Other agent creation code + // Agent creation is now moved to processTasksAndAgents method return registry; } @Bean - public TaskManager taskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought) { - return new TaskManager(agentRegistry, model, toolRegistry, treeOfThought); + public TaskManager taskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought, ConversationManager conversationManager) { + return new TaskManager(agentRegistry, model, toolRegistry, treeOfThought, conversationManager); } @Bean @@ -58,12 +64,6 @@ public class IoASystem { return new TeamFormation(agentRegistry, treeOfThought, webSocketService, model); } - public static void main(String[] args) { - ConfigurableApplicationContext context = SpringApplication.run(IoASystem.class, args); - IoASystem system = context.getBean(IoASystem.class); - system.processTasksAndAgents(context); - } - @Bean public ToolRegistry toolRegistry() { ToolRegistry toolRegistry = new ToolRegistry(); @@ -87,6 +87,12 @@ public class IoASystem { return toolRegistry; } + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication.run(IoASystem.class, args); + IoASystem system = context.getBean(IoASystem.class); + system.processTasksAndAgents(context); + } + public void processTasksAndAgents(ConfigurableApplicationContext context) { AgentRegistry agentRegistry = context.getBean(AgentRegistry.class); TeamFormation teamFormation = context.getBean(TeamFormation.class); @@ -94,36 +100,37 @@ public class IoASystem { TreeOfThought treeOfThought = context.getBean(TreeOfThought.class); WebSocketService webSocketService = context.getBean(WebSocketService.class); ToolRegistry toolRegistry = context.getBean(ToolRegistry.class); + ConversationManager conversationManager = context.getBean(ConversationManager.class); // Register all agents agentRegistry.registerAgent("agent1", new AgentInfo("agent1", "General Assistant", Arrays.asList("general", "search"), Arrays.asList("webSearch", "getWeather", "setReminder"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); agentRegistry.registerAgent("agent2", new AgentInfo("agent2", "Travel Expert", Arrays.asList("travel", "booking"), Arrays.asList("bookTravel", "calculateDistance", "findRestaurants"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); agentRegistry.registerAgent("agent3", new AgentInfo("agent3", "Event Planner Extraordinaire", Arrays.asList("event planning", "team management", "booking"), Arrays.asList("findRestaurants", "bookTravel", "scheduleAppointment", "getWeather"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); agentRegistry.registerAgent("agent4", new AgentInfo("agent4", "Fitness Guru", Arrays.asList("health", "nutrition", "motivation"), Arrays.asList("findFitnessClasses", "getRecipe", "setReminder", "getWeather"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); agentRegistry.registerAgent("agent5", new AgentInfo("agent5", "Research Specialist", Arrays.asList("research", "writing", "analysis"), Arrays.asList("webSearch", "getNewsUpdates", "translate", "compareProductPrices"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); agentRegistry.registerAgent("agent6", new AgentInfo("agent6", "Digital Marketing Expert", Arrays.asList("marketing", "social media", "content creation"), Arrays.asList("webSearch", "getNewsUpdates", "scheduleAppointment", "getMovieRecommendations"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); agentRegistry.registerAgent("agent7", new AgentInfo("agent7", "Family Travel Coordinator", Arrays.asList("travel", "family planning", "budgeting"), Arrays.asList("bookTravel", "calculateDistance", "getWeather", "findRestaurants", "getFinancialAdvice"), - treeOfThought, webSocketService, toolRegistry)); + treeOfThought, webSocketService, toolRegistry, conversationManager)); // Create all tasks List tasks = Arrays.asList( @@ -174,17 +181,38 @@ public class IoASystem { System.out.println("Formed team: " + team); if (!team.isEmpty()) { + // Create a conversation for the team + String conversationId = conversationManager.createConversation(); + + // Add team members to the conversation + for (AgentInfo agent : team) { + conversationManager.addParticipant(conversationId, agent); + } + // Assign the task to all team members for (AgentInfo agent : team) { Task agentTask = new Task(task.getId() + "_" + agent.getId(), task.getDescription(), task.getRequiredCapabilities(), task.getRequiredTools()); agentTask.setAssignedAgent(agent); taskManager.addTask(agentTask); - taskManager.executeTask(agentTask.getId()); - System.out.println("Task result for " + agent.getId() + ": " + agentTask.getResult()); + taskManager.executeTask(agentTask.getId(), conversationId); } + + // Start the conversation + conversationManager.startConversation(conversationId, "Let's work on the task: " + task.getDescription()); + + // Wait for the conversation to finish (you might want to implement a more sophisticated mechanism) + try { + Thread.sleep(30000); // Wait for 30 seconds + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // Get the result + String result = conversationManager.getConversationResult(conversationId); + System.out.println("Task result: " + result); } else { System.out.println("No suitable agents found for this task. Consider updating the agent pool or revising the task requirements."); } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/ioa/agent/AgentInfo.java b/src/main/java/com/ioa/agent/AgentInfo.java index b4e2321..86f1b50 100644 --- a/src/main/java/com/ioa/agent/AgentInfo.java +++ b/src/main/java/com/ioa/agent/AgentInfo.java @@ -1,10 +1,15 @@ package com.ioa.agent; +import com.ioa.conversation.Message; import com.ioa.util.TreeOfThought; import com.ioa.service.WebSocketService; import com.ioa.tool.ToolRegistry; +import com.ioa.conversation.ConversationFSM; +import com.ioa.conversation.ConversationManager; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class AgentInfo { private String id; @@ -14,9 +19,11 @@ public class AgentInfo { private TreeOfThought treeOfThought; private WebSocketService webSocketService; private ToolRegistry toolRegistry; + private final ConversationManager conversationManager; -public AgentInfo(String id, String name, List capabilities, List tools, - TreeOfThought treeOfThought, WebSocketService webSocketService, ToolRegistry toolRegistry) { + public AgentInfo(String id, String name, List capabilities, List tools, + TreeOfThought treeOfThought, WebSocketService webSocketService, + ToolRegistry toolRegistry, ConversationManager conversationManager) { this.id = id; this.name = name; this.capabilities = capabilities; @@ -24,6 +31,19 @@ public AgentInfo(String id, String name, List capabilities, List this.treeOfThought = treeOfThought; this.webSocketService = webSocketService; this.toolRegistry = toolRegistry; + this.conversationManager = conversationManager; + } + + public void sendMessage(String conversationId, String content) { + conversationManager.postMessage(conversationId, this.id, content); + } + + public void receiveMessage(Message message) { + // Process the received message + Map reasoningResult = treeOfThought.reason("Respond to message: " + message.getContent(), 2, 2); + String response = (String) reasoningResult.get("response"); // Assuming the response is stored under the key "response" + // Send the response back to the conversation + sendMessage(message.getConversationId(), response); } public List getCapabilities() { @@ -98,4 +118,8 @@ public AgentInfo(String id, String name, List capabilities, List return result; } + + public void voteToFinish(String conversationId) { + conversationManager.postMessage(conversationId, this.id, "/vote"); + } } \ No newline at end of file diff --git a/src/main/java/com/ioa/conversation/ConversationFSM.java b/src/main/java/com/ioa/conversation/ConversationFSM.java index 2bf96ac..b67853e 100644 --- a/src/main/java/com/ioa/conversation/ConversationFSM.java +++ b/src/main/java/com/ioa/conversation/ConversationFSM.java @@ -1,79 +1,140 @@ package com.ioa.conversation; +import java.util.stream.Collectors; +import com.ioa.agent.AgentInfo; import com.ioa.model.BedrockLanguageModel; import com.ioa.service.WebSocketService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.*; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; + @Component public class ConversationFSM { private ConversationState currentState; - private BedrockLanguageModel model; + private final BedrockLanguageModel model; + private final WebSocketService webSocketService; + private final Queue messageQueue; + private final List participants; + private final Map votes; + private final AtomicBoolean finished; + private String result; + private final ScheduledExecutorService executorService; - @Autowired - private WebSocketService webSocketService; - - public ConversationFSM(BedrockLanguageModel model) { + public ConversationFSM(BedrockLanguageModel model, WebSocketService webSocketService) { + this.executorService = Executors.newScheduledThreadPool(1); this.currentState = ConversationState.DISCUSSION; this.model = model; + this.webSocketService = webSocketService; + this.messageQueue = new ConcurrentLinkedQueue<>(); + this.participants = new ArrayList<>(); + this.votes = new HashMap<>(); + this.finished = new AtomicBoolean(false); + this.result = ""; } - public void handleMessage(Message message) { - String stateTransitionTask = "Decide the next conversation state based on this message: " + message.getContent() + - "\nCurrent state: " + currentState; - - String reasoning = model.generate(stateTransitionTask, null); - - String decisionPrompt = "Based on this reasoning:\n" + reasoning + - "\nProvide the next conversation state (DISCUSSION, TASK_ASSIGNMENT, EXECUTION, or CONCLUSION)."; - String response = model.generate(decisionPrompt, null); - - ConversationState newState = ConversationState.valueOf(response.trim()); - transitionTo(newState); - - // Handle the message based on the new state - switch (newState) { - case DISCUSSION: - handleDiscussionMessage(message); - break; - case TASK_ASSIGNMENT: - handleTaskAssignmentMessage(message); - break; - case EXECUTION: - handleExecutionMessage(message); - break; - case CONCLUSION: - handleConclusionMessage(message); - break; + public void addParticipant(AgentInfo agent) { + participants.add(agent); + votes.put(agent.getId(), false); + webSocketService.sendUpdate("conversation_participants", participants); + } + + public void removeParticipant(AgentInfo agent) { + participants.remove(agent); + votes.remove(agent.getId()); + webSocketService.sendUpdate("conversation_participants", participants); + } + + public void postMessage(Message message) { + messageQueue.offer(message); + processMessages(); + } + + private void processMessages() { + while (!messageQueue.isEmpty() && !finished.get()) { + Message message = messageQueue.poll(); + handleMessage(message); } } + private void handleMessage(Message message) { + if (message.getContent().startsWith("/vote")) { + handleVote(message.getSender()); + } else { + String stateTransitionTask = "Decide the next conversation state based on this message: " + message.getContent() + + "\nCurrent state: " + currentState + + "\nParticipants: " + participants; + + String reasoning = model.generate(stateTransitionTask, null); + + String decisionPrompt = "Based on this reasoning:\n" + reasoning + + "\nProvide the next conversation state (DISCUSSION, TASK_ASSIGNMENT, EXECUTION, or CONCLUSION)."; + String response = model.generate(decisionPrompt, null); + + ConversationState newState = ConversationState.valueOf(response.trim()); + transitionTo(newState); + + // Broadcast the message to all participants + for (AgentInfo agent : participants) { + if (!agent.getId().equals(message.getSender())) { + agent.receiveMessage(message); + } + } + + webSocketService.sendUpdate("conversation_message", message); + + } + } + + private void handleVote(String agentId) { + votes.put(agentId, true); + checkVotes(); + } + + private void checkVotes() { + int totalVotes = (int) votes.values().stream().filter(v -> v).count(); + if (totalVotes > participants.size() / 2) { + finish("Majority vote reached"); + } + } + + public void finish(String reason) { + if (finished.compareAndSet(false, true)) { + result = "Conversation finished. Reason: " + reason + "\nFinal state: " + currentState; + webSocketService.sendUpdate("conversation_finished", result); + } + } + + public boolean isFinished() { + return finished.get(); + } + + public String getResult() { + return result; + } + private void transitionTo(ConversationState newState) { this.currentState = newState; - webSocketService.sendUpdate("conversation_state", new ConversationStateUpdate(currentState)); + webSocketService.sendUpdate("conversation_state", new ConversationStateUpdate(currentState, getPossibleTransitions())); } - private void handleDiscussionMessage(Message message) { - // Implement discussion logic - } - - private void handleTaskAssignmentMessage(Message message) { - // Implement task assignment logic - } - - private void handleExecutionMessage(Message message) { - // Implement execution logic - } - - private void handleConclusionMessage(Message message) { - // Implement conclusion logic + private List getPossibleTransitions() { + // This is a simplified version. You might want to implement more complex logic. + return Arrays.asList(ConversationState.values()).stream() + .map(Enum::name) + .collect(Collectors.toList()); } private class ConversationStateUpdate { - public ConversationState state; + public String currentState; + public List possibleTransitions; - ConversationStateUpdate(ConversationState state) { - this.state = state; + ConversationStateUpdate(ConversationState state, List transitions) { + this.currentState = state.name(); + this.possibleTransitions = transitions; } } } \ No newline at end of file diff --git a/src/main/java/com/ioa/conversation/ConversationManager.java b/src/main/java/com/ioa/conversation/ConversationManager.java new file mode 100644 index 0000000..421e38f --- /dev/null +++ b/src/main/java/com/ioa/conversation/ConversationManager.java @@ -0,0 +1,74 @@ +package com.ioa.conversation; + +import com.ioa.agent.AgentInfo; +import com.ioa.model.BedrockLanguageModel; +import com.ioa.service.WebSocketService; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.*; + +@Component +public class ConversationManager { + private final Map conversations; + private final BedrockLanguageModel model; + private final WebSocketService webSocketService; + private final ScheduledExecutorService executorService; + + public ConversationManager(BedrockLanguageModel model, WebSocketService webSocketService) { + this.conversations = new ConcurrentHashMap<>(); + this.model = model; + this.webSocketService = webSocketService; + this.executorService = Executors.newScheduledThreadPool(1); + } + + public String createConversation() { + String conversationId = UUID.randomUUID().toString(); + ConversationFSM conversation = new ConversationFSM(model, webSocketService); + conversations.put(conversationId, conversation); + return conversationId; + } + + public void addParticipant(String conversationId, AgentInfo agent) { + ConversationFSM conversation = conversations.get(conversationId); + if (conversation != null) { + conversation.addParticipant(agent); + } + } + + public void removeParticipant(String conversationId, AgentInfo agent) { + ConversationFSM conversation = conversations.get(conversationId); + if (conversation != null) { + conversation.removeParticipant(agent); + } + } + + public void postMessage(String conversationId, String senderId, String content) { + ConversationFSM conversation = conversations.get(conversationId); + if (conversation != null) { + conversation.postMessage(new Message(conversationId, senderId, content)); + } + } + + public void startConversation(String conversationId, String initialMessage) { + ConversationFSM conversation = conversations.get(conversationId); + if (conversation != null) { + conversation.postMessage(new Message(conversationId, "SYSTEM", initialMessage)); + + // Start a timer to end the conversation after 10 minutes + executorService.schedule(() -> { + if (!conversation.isFinished()) { + conversation.finish("Time limit reached"); + } + }, 10, TimeUnit.MINUTES); + } + } + + public String getConversationResult(String conversationId) { + ConversationFSM conversation = conversations.get(conversationId); + if (conversation != null) { + return conversation.getResult(); + } + return "Conversation not found"; + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/conversation/Message.java b/src/main/java/com/ioa/conversation/Message.java index b5d825b..1e02b49 100644 --- a/src/main/java/com/ioa/conversation/Message.java +++ b/src/main/java/com/ioa/conversation/Message.java @@ -1,14 +1,25 @@ package com.ioa.conversation; -import lombok.Data; - -@Data public class Message { - private String sender; - private String content; + private final String conversationId; + private final String sender; + private final String content; - public Message(String sender, String content) { + public Message(String conversationId, String sender, String content) { + this.conversationId = conversationId; this.sender = sender; this.content = content; } + + public String getConversationId() { + return conversationId; + } + + public String getSender() { + return sender; + } + + public String getContent() { + return content; + } } \ No newline at end of file diff --git a/src/main/java/com/ioa/model/BedrockLanguageModel.java b/src/main/java/com/ioa/model/BedrockLanguageModel.java index 3126ddb..f85bab5 100644 --- a/src/main/java/com/ioa/model/BedrockLanguageModel.java +++ b/src/main/java/com/ioa/model/BedrockLanguageModel.java @@ -38,8 +38,8 @@ public class BedrockLanguageModel { ArrayNode messages = requestBody.putArray("messages"); ObjectNode message = messages.addObject(); message.put("role", "user"); - requestBody.put("max_tokens", 2000); - requestBody.put("temperature", 0.7); + requestBody.put("max_tokens", 20000); + requestBody.put("temperature", 0.4); requestBody.put("top_p", 0.9); ArrayNode content = message.putArray("content"); diff --git a/src/main/java/com/ioa/task/TaskManager.java b/src/main/java/com/ioa/task/TaskManager.java index e068495..f4b7d07 100644 --- a/src/main/java/com/ioa/task/TaskManager.java +++ b/src/main/java/com/ioa/task/TaskManager.java @@ -6,13 +6,11 @@ import com.ioa.model.BedrockLanguageModel; import com.ioa.service.WebSocketService; import com.ioa.tool.ToolRegistry; import com.ioa.util.TreeOfThought; -import org.springframework.beans.factory.annotation.Autowired; +import com.ioa.conversation.ConversationManager; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; -import java.util.List; -import java.util.ArrayList; @Component public class TaskManager { @@ -21,90 +19,56 @@ public class TaskManager { private BedrockLanguageModel model; private ToolRegistry toolRegistry; private TreeOfThought treeOfThought; + private ConversationManager conversationManager; - @Autowired - private WebSocketService webSocketService; - - public TaskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought) { + public TaskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought, ConversationManager conversationManager) { this.agentRegistry = agentRegistry; this.model = model; this.toolRegistry = toolRegistry; this.treeOfThought = treeOfThought; + this.conversationManager = conversationManager; } public void addTask(Task task) { tasks.put(task.getId(), task); - System.out.println("DEBUG: Task added: " + task.getId()); - webSocketService.sendUpdate("task_added", Map.of("taskId", task.getId(), "description", task.getDescription())); } - public void executeTask(String taskId) { + public void executeTask(String taskId, String conversationId) { Task task = tasks.get(taskId); AgentInfo agent = task.getAssignedAgent(); - updateTaskProgress(taskId, "STARTED", 0); + conversationManager.postMessage(conversationId, agent.getId(), "Starting task: " + task.getDescription()); String executionPlanningTask = "Plan the execution of this task: " + task.getDescription() + "\nAssigned agent capabilities: " + agent.getCapabilities() + "\nAvailable tools: " + agent.getTools(); - Map reasoningTree = treeOfThought.reason(executionPlanningTask, 3, 2); - String reasoning = formatReasoning(reasoningTree); + Map reasoningResult = treeOfThought.reason(executionPlanningTask, 3, 2); + String reasoning = (String) reasoningResult.get("reasoning"); // Assuming the reasoning is stored under the key "reasoning" - System.out.println("DEBUG: Task execution reasoning:\n" + reasoning); - webSocketService.sendUpdate("task_reasoning", Map.of("taskId", taskId, "reasoning", reasoning)); + conversationManager.postMessage(conversationId, agent.getId(), "Task execution plan:\n" + reasoning); - updateTaskProgress(taskId, "IN_PROGRESS", 25); + String executionPrompt = "Based on this execution plan:\n" + reasoning + + "\nExecute the task using the available tools and provide the result."; + Map executionResult = treeOfThought.reason(executionPrompt, 1, 1); + String response = (String) executionResult.get("response"); // Assuming the response is stored under the key "response" - List selectedTools = extractToolSelection(reasoning); - System.out.println("DEBUG: Selected tools: " + selectedTools); - webSocketService.sendUpdate("tools_selected", Map.of("taskId", taskId, "tools", selectedTools)); - - updateTaskProgress(taskId, "IN_PROGRESS", 50); - - String result = executeTools(selectedTools, task.getDescription(), agent); + String result = executeToolsFromResponse(response, agent); task.setResult(result); - updateTaskProgress(taskId, "COMPLETED", 100); - System.out.println("DEBUG: Task completed: " + taskId + ", Result: " + result); - webSocketService.sendUpdate("task_completed", Map.of("taskId", taskId, "result", result)); + conversationManager.postMessage(conversationId, agent.getId(), "Task result: " + result); } - private void updateTaskProgress(String taskId, String status, int progressPercentage) { - Map progressUpdate = new HashMap<>(); - progressUpdate.put("taskId", taskId); - progressUpdate.put("status", status); - progressUpdate.put("progressPercentage", progressPercentage); - webSocketService.sendUpdate("task_progress", progressUpdate); - } - - private String formatReasoning(Map reasoningTree) { - // Implement a method to format the reasoning tree into a string - // This is a placeholder implementation - return reasoningTree.toString(); - } - - private List extractToolSelection(String reasoning) { - // Implement a method to extract tool selection from reasoning - // This is a placeholder implementation that selects all available tools - return new ArrayList<>(toolRegistry.getAllTools().keySet()); - } - - private String executeTools(List tools, String taskDescription, AgentInfo agent) { + private String executeToolsFromResponse(String response, AgentInfo agent) { StringBuilder result = new StringBuilder(); - for (String tool : tools) { - System.out.println("DEBUG: Executing tool: " + tool); - webSocketService.sendUpdate("tool_execution", Map.of("taskId", taskDescription, "tool", tool)); - - Object toolInstance = toolRegistry.getTool(tool); - // Execute the tool (this is a simplified representation) - String toolResult = tool + " result: " + toolInstance.toString(); - result.append(toolResult).append("\n"); - - System.out.println("DEBUG: Tool result: " + toolResult); - webSocketService.sendUpdate("tool_result", Map.of("taskId", taskDescription, "tool", tool, "result", toolResult)); + for (String tool : agent.getTools()) { + if (response.contains(tool)) { + Object toolInstance = toolRegistry.getTool(tool); + // Execute the tool (this is a simplified representation) + result.append(tool).append(" result: ").append(toolInstance.toString()).append("\n"); + } } - return result.toString().trim(); + return result.toString(); } } \ No newline at end of file diff --git a/src/main/java/com/ioa/team/TeamFormation.java b/src/main/java/com/ioa/team/TeamFormation.java index 3485348..ad64ab2 100644 --- a/src/main/java/com/ioa/team/TeamFormation.java +++ b/src/main/java/com/ioa/team/TeamFormation.java @@ -35,7 +35,7 @@ public class TeamFormation { "\nRequired tools: " + requiredTools + "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents); - Map reasoningTree = treeOfThought.reason(teamFormationTask, 3, 2); + Map reasoningTree = treeOfThought.reason(teamFormationTask, 1, 2); String reasoning = formatReasoning(reasoningTree); // Send update about the reasoning process diff --git a/target/classes/com/ioa/IoASystem.class b/target/classes/com/ioa/IoASystem.class index 200ee20f9a3d753cbd39431e7782aaabba64b473..b3d58e11afad35eecd2701ae7ff6cfa1acc3ba95 100644 GIT binary patch literal 12335 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 A)&Kwi literal 11149 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 W&sWs*H9mm%xbN`0e2Cwp=Klf4=EA`M diff --git a/target/classes/com/ioa/agent/AgentInfo.class b/target/classes/com/ioa/agent/AgentInfo.class index 245b350f554c261424f2a45f5d338a95d730aa71..d55c746313fd7428b4add1c0967b1fa283423389 100644 GIT binary patch literal 6368 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 literal 5279 zcmbVP>3>OQ! z2$pDw>R1Y0U`58BNm;g$GA7Nuo9dI}V1B|DXt1&Zv7rjwuv@V5lW7UiqN7!6hw{dZ zDHpEN5yRC2dd8SF#;u&?TBbu|JoTb$pI?2YHX2= zLP+RXgS9kV8gtN`q>+VF0;|f}ay>N?_%R)0+&grv!+M5q#+Wt-?0m*>$1Hb>GsiXZ zE?wWcu{LzIE1k7VORy208j?D?&|Q_!;Zu%l&M=L3k-=H+sakgGcIL%pc1&Z2#tC#p zk;07{-lF5JxJlq@mBVU50c}>QWHd#QBoGiJ#mdqUuFa08E(>44*JV8xGD2|pcW1@vne(6I}<1rjB` zTrTJI$T9QTL$g`KB}p~}4fFY3Ygp%K6nk;2hCv;-;T_dEQANSPoG@}la#vt|5Yu<9 zPMTvZTPA8h4rsVt$2)OQU}eetTDr4}nP10dy4D3Z@QofEtc^?rBRURYRG@XjF3cG2 zK?T4X7P!I3C7mhiiE+=*iXZRSb0U}RibF~eq# z{l}6vchs>tXt8PzF@)rX<3#akM-bMvTktXYU6i^ipxf~DcO zj%nlsS}JsuTL?rf*DM&WT@YyB7_?x}Ur#SZ9=3*A9q$39Vikmv2(vw9IQ!|TYNf zOT6!TI)V=fh^R!mSI38NA3b$#Pln;Fvc{*3*uT|OE+vR#< zMOy~E`mF0@_XrKxSvu4@WaZ8M#hG!lFk+17xDp$(Ge&OIC|L5_UktfZ7LUJpd0WM$ z%Ef{{w^!?(nl0%*|7L7NdL5oL z5pR%fA;SN%XE4O&7Q$0_(Xrzb$;S@#3r1gOcV>wlRCUd?%0qmY>0}DltkU~@Hkoy-KF{2G>p(md=MnQ7YN^K3BK zTey6MKy^b>@2+-*dC@X<-c>C>I&2pU8FP;%OQWT)bdla9&ktT1`fb~Fcr?!LGuqPJ~UNg&L_gLBO8^nh0guGG9+35&=&I`@1-TjC5_9m2ELL~eSnV(F^wDl%L1iuv6 z;+?b!S-(!g$Y&E?j-3P#{*q+0?}TCHWTkp?O8M8cVbK=lT=zza{@Yp`N~sUPToSl$ z5sb7i;T;}orx$C10?yEICG~rOvP4KK?(`(N3aEB6O0f5M(NQy#0mYy2LD&X!MrGr?x$3wpV`l@ZRFPREdK zPZwu{H(9^#0t~KF9AT@gBYrd>U+2Q;Lkt+X+%Ru1vV;fod9yH(GaScsG`zw)VU17q zOx5sDfz_`s%46R13u}1lHt?;ZapYT(vj+LW^Esz}B;_0N4UX%H2JRX{8)wVWqHI{fhvYT5p5r=N(1lg_CZ!H~``}ynHov%|@<*td z^hkQyEg!JNmNV&1NX?`lO=>1R39Fg(MZT0DzvPZh z$!DGp4YhJ(&z+$wn09uRhkH8P{BM+sag`s5nMDtVFAc49T&;!h46F*kP z-WI!AF2=TYok#CHcJgCI7l*d<*t38k#;|D~`}QTf=P|tBN9b9=SOwu-KEjb6AE9R+ zcl3sQ*?33+-Bpn{eEE$0Np5)&*~8~B(c2UcT>#%pz2SKH0{HfR7#rn`$M194+pCe4 zUGuoRHxh4(N9OU~*!ww*J@(qmahmwSd3?AxT-r3efR9yn{J6j4{qeB3V>~Q_7*eFT zja-z;UWOaVS}UL@%EkY2NX-;S6peEq2nBK3t;2-!OoGU^iaH9{dM; zMHGW75qB`ym(YwKlj{*mx8otsG?{=>O>p)E*91{t!cjcQH2330JjJy}?spbXtD1Ne zIXr-8SQD=zi8=lnE?0u5IZsVbURJ_6`mqKLuisy{RN*_7 zqvZHL8X*f(>$-qX3Pmli;=NKipgi&_Pb*nZU!=`K+2WOvT$$&JN8=b+=cBh7{iP*I_a5FHhN5@ zTUPBD7HED0HIhuDOl>1Ba=igR!B6>rD~a+ay7R0WpHt&6)c7kk{zi?@tMLUj{!Wd5 QAoYMKHUCZm{tNN{1Nu2)X8-^I diff --git a/target/classes/com/ioa/conversation/ConversationFSM$1.class b/target/classes/com/ioa/conversation/ConversationFSM$1.class deleted file mode 100644 index 7cc4f34213f638326ffe252d6e47dc85e54db388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcma)5U2oGc6g^(ErVSY_qikh-4HiaAVbPG_1%y;(EmUjMhqPnT9*~<_Yep8MBrX4k z7oGtLA%yk=_)&=KXi|rSP^HMn=la^`*!Skw?;mFXny?KlA*Vw#v5Y*!wl7cZKyurc z(M-e%PXig*&IRJ7JQWQ284sr-VQAFqN8QDCJujkwq7K8vC76qdwY{FT%dl&CAA;1M z^!R&=q%1N>I5%kh!{E|Ur$~3ZY@&oRgR$4~oT2A+`YuClQN!wWR!v+*g+Z6`IEZ-2 zkgL@@I@TCAPWX)5A&-u2S9()_(hfv8ZpE>Tm3Gy{b){VzG`;<|O%i|Q_FC>ht=%wj zQ>_(Shb?C~AX_SW+r*vBt*sRlbro{nxs zekhY5I_`;dBF8!&F{pz4zhmeCvg?W@eJvAmZg!$b#7@YQL?q=+>WNM2MOLn=u23_I z+`|^3MeHMTGy~e-!OngfU!i|d-^w>!(fXgD?PqkI=<=Ly5Y5l&EuwlxKSM(i6|CbL zs-&?^_yAAvl<*n-4|{|;+$X(!rm8YPg#l#&Ybdm96uND3i*5a`igm&2J^+NokTjam)`XV-!!n`Mz$}>=n)n2Myp2Dq zi9dV*AIf-Vw??Fmus`mr9O)WZ>TfvZ1d_<-k zRNH?UI#x?Hs28w~jXX*oZoy}0%sum*EBDdCW_&BVV0Q&-FPjoX~j-F(UCZiu2JRbNg~;= z+u90_CJ#Kz`Pr5j)5A{o55N(tQ>a$^KlzCC?((uj0Ou}c%5q4$>ob2CpKbK^+= z?F8K+5A-1KAd9=?DcYGM>({=4)%L$4e~Go)%S&v2AvBA7E|%>0K>v^M@QKd-jQfP| zQrtx!;2~M(JtEAp`*=*8Sv(=%OBfxpL&#G?)+nu1A}9UQ!YUMeMnDF8c%Ik*HL^uY KUq^r!$ovL|<}mR9 delta 243 zcmW+wyAAI;5FrX3g+{|B#1}|xq7exyjUUj+{SgY0D0CXX;8#S9 zo0FWGIgdH#ZJ(p+^}Rm;3{W|#w(G!#6N5@1j)Xu@cdV+e%A)Set~ITVjXsLHeu{m@ z4Z_`Wy_n25^HsPDH(ULY9Z}RRYj&_9=_(jBG7N|!$!dyfNVJHmaf4_yuZUf!B+|?& x(-|RxF&qSNS@VpWLIznX?ip8!9J#|o?tche%ri?A;CqJnC=nIEu;HT&`2$E29vJ`t diff --git a/target/classes/com/ioa/conversation/ConversationFSM.class b/target/classes/com/ioa/conversation/ConversationFSM.class index 9f915b66a5679d1b876e626f3c2e2188cc4d1d4a..186c4a5b6602449fcec1fa6de6f41c45f01119b6 100644 GIT binary patch literal 7693 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 literal 3492 zcma)8YgZFj6y2BCgg7FiRS_Ri5g{VcR;>~rg$PPbKuticZS63*!bmcc&P+ht+S-@x zPv}2zt$wSkqRXz;AJ8AwcHfy0MhW7AnS1Bv-1FFHpL@?g|GxSgzzBYgqY2F#T6DCc zO`!9>v1p`9hCP>>n!PVgU!d)rWn2CQf#&{!nRdj`t|6{t6Lf(-((XWwmGx*Z+ZqM=jAR%NYs!)@dFoPcgtU02$E zU|Olzreiza6KE|vMOmVry8U1wH7bj)V=iPFb=8=YIVF{jV<&cL=+?0tJpy|g+RjPO z;||6*Cw+$P)2zVu{(^bV&i+vjQ>qy|hYe0tr0@|Wcs>-Q*gtb4iKg>hA zfyyqX@Q{vP92VGFHWnm3Fb)5v<@ukiXn;9P?!2I_e@vAr6IF5_>$s}qc7$?c52RUD zAVx%TIwm77F)FiEjku(0@tTh7xIz9e$=N)MPWpN2E?TA}!RqPs!ll&BH)PT=6a>1W z*xe<~eW_uF6j>o?^!L};pz^T>>*-378seD7Ep-Uq7P!6+aM7()m9G1{uE8Lg0nm5w zsfN#Ve2%*Ui4{-R3zP?nC+%YBn!u3;TYB;=?ql zgCOg;b1AQ)j-z|7QI<=NyO5fdEQi!R!}J~ZValj)NR3o|XUTG9F&#Lt;_~{{&p27Q z8J?a3Te6ldC#&UI=@tw+!mMQ-(kW3Kcn#FHV#Y`GL< zn2vEY7g*r6z~XtQ>Y8%gQlW2ugE&LVra-b`K0IH#((xZwB&l1bC6*!G-!v&bmZJic zfOU>Kj_>g#tK_6V?-acl9tdPF(bu9(`13Mh%LhJbwtB84g7_1&h9`>&$EJ|wC2H^u zCqz6GUYem87h?EIU}^L<@j5QUaS}wBegL9^qRJ->FOFF)!`aL|OKtvmjI9O+svW=Z%N_ z75FV$DmB3nqbtEV>GftEXQ5h2uT6Yp<+Y6k=Awc4orwHO1xA)?Dl$f?l(&4z6zUT; z@5W5Y@I1*J?u@b`pix-v8h#Quye8U4L1=g)uOm$4)HCpN#to>w>sdq8rMpEf4Yzi;E@S8=P7JptyW5s=@)^#k@xsvWfhnBlAowWH5`6mk9OrW; zNkgMgu}h8PPtmEyiKmFEF{@%~4r021Eu8P5&)w+Z-yt?}DePw-kibQL&Eqi2=tG5? zs~Eroy7&l#c#I+Zj1xipSHj5Z@jrou`}ArncPyYpbb2_JIcugy6E#4in6F4KNl=3J}6pfgzhze0xA!-OT zsm@~~6&E&8!KP#*6{8!dVAHaZit)FqXoVXf;MFV0=XaHl0{<*qi$%^=^?gl4OTqgg azUSI*B7T-5I%AaTzz>x9k<|GG-TwpgyNX8u diff --git a/target/classes/com/ioa/conversation/ConversationManager.class b/target/classes/com/ioa/conversation/ConversationManager.class new file mode 100644 index 0000000000000000000000000000000000000000..b45cbcb33a47ac2acae01b198e0031e1a22c39c8 GIT binary patch literal 4009 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 literal 6458 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 App
\ No newline at end of file +React App
\ No newline at end of file diff --git a/target/classes/static/static/js/main.a73628f2.js b/target/classes/static/static/js/main.a73628f2.js new file mode 100644 index 0000000..c0f10e3 --- /dev/null +++ b/target/classes/static/static/js/main.a73628f2.js @@ -0,0 +1,3 @@ +/*! For license information please see main.a73628f2.js.LICENSE.txt */ +(()=>{var e={446:e=>{var t=function(){if("object"===typeof self&&self)return self;if("object"===typeof window&&window)return window;throw new Error("Unable to resolve global `this`")};e.exports=function(){if(this)return this;if("object"===typeof globalThis&&globalThis)return globalThis;try{Object.defineProperty(Object.prototype,"__global__",{get:function(){return this},configurable:!0})}catch(e){return t()}try{return __global__||t()}finally{delete Object.prototype.__global__}}()},6329:e=>{"function"===typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},5663:(e,t,n)=>{var r=n(5663);for(k in r)n.g[k]=r[k]},7237:(e,t)=>{"use strict";var n=Object.prototype.hasOwnProperty;function r(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch(t){return null}}function o(e){try{return encodeURIComponent(e)}catch(t){return null}}t.stringify=function(e,t){t=t||"";var r,i,a=[];for(i in"string"!==typeof t&&(t="?"),e)if(n.call(e,i)){if((r=e[i])||null!==r&&undefined!==r&&!isNaN(r)||(r=""),i=o(i),r=o(r),null===i||null===r)continue;a.push(i+"="+r)}return a.length?t+a.join("&"):""},t.parse=function(e){for(var t,n=/([^=?#&]+)=?([^&]*)/g,o={};t=n.exec(e);){var i=r(t[1]),a=r(t[2]);null===i||null===a||i in o||(o[i]=a)}return o}},2730:(e,t,n)=>{"use strict";var r=n(5043),o=n(8853);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n