diff --git a/src/main/java/com/ioa/IoASystem.java b/src/main/java/com/ioa/IoASystem.java index 1468a21..74ec3b3 100644 --- a/src/main/java/com/ioa/IoASystem.java +++ b/src/main/java/com/ioa/IoASystem.java @@ -5,20 +5,19 @@ import com.ioa.agent.AgentRegistry; import com.ioa.task.Task; import com.ioa.task.TaskManager; import com.ioa.team.TeamFormation; -import com.ioa.tool.CommonTools; import com.ioa.tool.ToolRegistry; +import com.ioa.tool.Tool; +import com.ioa.tool.common.*; import com.ioa.model.BedrockLanguageModel; import com.ioa.service.WebSocketService; -import com.ioa.tool.Tool; import com.ioa.util.TreeOfThought; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.messaging.simp.SimpMessagingTemplate; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -26,26 +25,13 @@ import java.util.List; public class IoASystem { @Bean - public ToolRegistry toolRegistry() { - ToolRegistry toolRegistry = new ToolRegistry(); - CommonTools commonTools = new CommonTools(); - - for (Method method : CommonTools.class.getMethods()) { - if (method.isAnnotationPresent(Tool.class)) { - toolRegistry.registerTool(method.getName(), method); - } - } - return toolRegistry; - } - - @Bean - public AgentRegistry agentRegistry(ToolRegistry toolRegistry) { - return new AgentRegistry(toolRegistry); + public WebSocketService webSocketService(SimpMessagingTemplate messagingTemplate) { + return new WebSocketService(messagingTemplate); } @Bean public BedrockLanguageModel bedrockLanguageModel() { - return new BedrockLanguageModel("anthropic.claude-3-5-sonnet-20240620-v1:0"); + return new BedrockLanguageModel("anthropic.claude-3-sonnet-20240229-v1:0"); } @Bean @@ -54,18 +40,22 @@ public class IoASystem { } @Bean - public TeamFormation teamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { - return new TeamFormation(agentRegistry, treeOfThought, webSocketService); + public AgentRegistry agentRegistry(ToolRegistry toolRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { + AgentRegistry registry = new AgentRegistry(toolRegistry); + + // Other agent creation code + + return registry; } @Bean - public TaskManager taskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry) { - return new TaskManager(agentRegistry, model, toolRegistry); + public TaskManager taskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought) { + return new TaskManager(agentRegistry, model, toolRegistry, treeOfThought); } @Bean - public WebSocketService webSocketService(SimpMessagingTemplate messagingTemplate) { - return new WebSocketService(messagingTemplate); + public TeamFormation teamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService, BedrockLanguageModel model) { + return new TeamFormation(agentRegistry, treeOfThought, webSocketService, model); } public static void main(String[] args) { @@ -74,33 +64,66 @@ public class IoASystem { system.processTasksAndAgents(context); } + @Bean + public ToolRegistry toolRegistry() { + ToolRegistry toolRegistry = new ToolRegistry(); + + // Register all tools + toolRegistry.registerTool("webSearch", new WebSearchTool()); + toolRegistry.registerTool("getWeather", new WeatherTool()); + toolRegistry.registerTool("setReminder", new ReminderTool()); + toolRegistry.registerTool("bookTravel", new TravelBookingTool()); + toolRegistry.registerTool("calculateDistance", new DistanceCalculatorTool()); + toolRegistry.registerTool("findRestaurants", new RestaurantFinderTool()); + toolRegistry.registerTool("scheduleAppointment", new AppointmentSchedulerTool()); + toolRegistry.registerTool("findFitnessClasses", new FitnessClassFinderTool()); + toolRegistry.registerTool("getRecipe", new RecipeTool()); + toolRegistry.registerTool("getNewsUpdates", new NewsUpdateTool()); + toolRegistry.registerTool("translate", new TranslationTool()); + toolRegistry.registerTool("compareProductPrices", new PriceComparisonTool()); + toolRegistry.registerTool("getMovieRecommendations", new MovieRecommendationTool()); + toolRegistry.registerTool("getFinancialAdvice", new FinancialAdviceTool()); + + return toolRegistry; + } + public void processTasksAndAgents(ConfigurableApplicationContext context) { AgentRegistry agentRegistry = context.getBean(AgentRegistry.class); TeamFormation teamFormation = context.getBean(TeamFormation.class); TaskManager taskManager = context.getBean(TaskManager.class); + TreeOfThought treeOfThought = context.getBean(TreeOfThought.class); + WebSocketService webSocketService = context.getBean(WebSocketService.class); + ToolRegistry toolRegistry = context.getBean(ToolRegistry.class); // Register all agents agentRegistry.registerAgent("agent1", new AgentInfo("agent1", "General Assistant", Arrays.asList("general", "search"), - Arrays.asList("webSearch", "getWeather", "setReminder"))); + Arrays.asList("webSearch", "getWeather", "setReminder"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent2", new AgentInfo("agent2", "Travel Expert", Arrays.asList("travel", "booking"), - Arrays.asList("bookTravel", "calculateDistance", "findRestaurants"))); + Arrays.asList("bookTravel", "calculateDistance", "findRestaurants"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent3", new AgentInfo("agent3", "Event Planner Extraordinaire", Arrays.asList("event planning", "team management", "booking"), - Arrays.asList("findRestaurants", "bookTravel", "scheduleAppointment", "getWeather"))); + Arrays.asList("findRestaurants", "bookTravel", "scheduleAppointment", "getWeather"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent4", new AgentInfo("agent4", "Fitness Guru", Arrays.asList("health", "nutrition", "motivation"), - Arrays.asList("findFitnessClasses", "getRecipe", "setReminder", "getWeather"))); + Arrays.asList("findFitnessClasses", "getRecipe", "setReminder", "getWeather"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent5", new AgentInfo("agent5", "Research Specialist", Arrays.asList("research", "writing", "analysis"), - Arrays.asList("webSearch", "getNewsUpdates", "translate", "compareProductPrices"))); + Arrays.asList("webSearch", "getNewsUpdates", "translate", "compareProductPrices"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent6", new AgentInfo("agent6", "Digital Marketing Expert", Arrays.asList("marketing", "social media", "content creation"), - Arrays.asList("webSearch", "getNewsUpdates", "scheduleAppointment", "getMovieRecommendations"))); + Arrays.asList("webSearch", "getNewsUpdates", "scheduleAppointment", "getMovieRecommendations"), + treeOfThought, webSocketService, toolRegistry)); agentRegistry.registerAgent("agent7", new AgentInfo("agent7", "Family Travel Coordinator", Arrays.asList("travel", "family planning", "budgeting"), - Arrays.asList("bookTravel", "calculateDistance", "getWeather", "findRestaurants", "getFinancialAdvice"))); + Arrays.asList("bookTravel", "calculateDistance", "getWeather", "findRestaurants", "getFinancialAdvice"), + treeOfThought, webSocketService, toolRegistry)); // Create all tasks List tasks = Arrays.asList( diff --git a/src/main/java/com/ioa/agent/AgentInfo.java b/src/main/java/com/ioa/agent/AgentInfo.java index f33d372..b4e2321 100644 --- a/src/main/java/com/ioa/agent/AgentInfo.java +++ b/src/main/java/com/ioa/agent/AgentInfo.java @@ -1,28 +1,101 @@ package com.ioa.agent; -import lombok.Data; -import java.util.List; +import com.ioa.util.TreeOfThought; +import com.ioa.service.WebSocketService; +import com.ioa.tool.ToolRegistry; + +import java.util.*; -@Data public class AgentInfo { private String id; private String name; private List capabilities; private List tools; + private TreeOfThought treeOfThought; + private WebSocketService webSocketService; + private ToolRegistry toolRegistry; - public AgentInfo(String id, String name, List capabilities, List tools) { +public AgentInfo(String id, String name, List capabilities, List tools, + TreeOfThought treeOfThought, WebSocketService webSocketService, ToolRegistry toolRegistry) { this.id = id; this.name = name; this.capabilities = capabilities; this.tools = tools; + this.treeOfThought = treeOfThought; + this.webSocketService = webSocketService; + this.toolRegistry = toolRegistry; } public List getCapabilities() { return this.capabilities; } + public String getId() { + return this.id; + } + + public List getTools() { + return this.tools; + } + @Override public String toString() { return "AgentInfo{id='" + id + "', name='" + name + "'}"; } + + public String executeTask(String taskDescription) { + System.out.println("DEBUG: Agent " + id + " executing task: " + taskDescription); + webSocketService.sendUpdate("agent_task", Map.of("agentId", id, "task", taskDescription)); + + // Use Tree of Thought to decide on tools and actions + Map reasoning = treeOfThought.reason("Select tools and actions for task: " + taskDescription + + "\nAvailable tools: " + tools, 2, 2); + String reasoningString = formatReasoning(reasoning); + System.out.println("DEBUG: Agent " + id + " reasoning:\n" + reasoningString); + webSocketService.sendUpdate("agent_reasoning", Map.of("agentId", id, "reasoning", reasoningString)); + + // Extract tool selection from reasoning + List selectedTools = extractToolSelection(reasoningString); + System.out.println("DEBUG: Agent " + id + " selected tools: " + selectedTools); + webSocketService.sendUpdate("agent_tools_selected", Map.of("agentId", id, "tools", selectedTools)); + + // Execute actions using selected tools + StringBuilder result = new StringBuilder(); + for (String tool : selectedTools) { + String actionResult = executeTool(tool, taskDescription); + result.append(actionResult).append("\n"); + } + + String finalResult = result.toString().trim(); + System.out.println("DEBUG: Agent " + id + " task result: " + finalResult); + webSocketService.sendUpdate("agent_task_result", Map.of("agentId", id, "result", finalResult)); + + return finalResult; + } + + private String formatReasoning(Map reasoning) { + // Implement a method to format the reasoning tree into a string + // This is a placeholder implementation + return reasoning.toString(); + } + + private List extractToolSelection(String reasoning) { + // Implement a method to extract tool selection from reasoning + // This is a placeholder implementation + return new ArrayList<>(tools); + } + + private String executeTool(String tool, String context) { + System.out.println("DEBUG: Agent " + id + " executing tool: " + tool); + webSocketService.sendUpdate("agent_tool_execution", Map.of("agentId", id, "tool", tool)); + + // Placeholder for tool execution + // In a real implementation, you would call the actual tool method from the ToolRegistry + String result = "Simulated result of using " + tool + " for context: " + context; + + System.out.println("DEBUG: Agent " + id + " tool result: " + result); + webSocketService.sendUpdate("agent_tool_result", Map.of("agentId", id, "tool", tool, "result", result)); + + return result; + } } \ 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 5d68a26..3126ddb 100644 --- a/src/main/java/com/ioa/model/BedrockLanguageModel.java +++ b/src/main/java/com/ioa/model/BedrockLanguageModel.java @@ -38,7 +38,7 @@ public class BedrockLanguageModel { ArrayNode messages = requestBody.putArray("messages"); ObjectNode message = messages.addObject(); message.put("role", "user"); - requestBody.put("max_tokens", 500); + requestBody.put("max_tokens", 2000); requestBody.put("temperature", 0.7); requestBody.put("top_p", 0.9); diff --git a/src/main/java/com/ioa/task/TaskManager.java b/src/main/java/com/ioa/task/TaskManager.java index f590271..e068495 100644 --- a/src/main/java/com/ioa/task/TaskManager.java +++ b/src/main/java/com/ioa/task/TaskManager.java @@ -5,11 +5,14 @@ import com.ioa.agent.AgentRegistry; 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 org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; +import java.util.List; +import java.util.ArrayList; @Component public class TaskManager { @@ -17,18 +20,22 @@ public class TaskManager { private AgentRegistry agentRegistry; private BedrockLanguageModel model; private ToolRegistry toolRegistry; + private TreeOfThought treeOfThought; @Autowired private WebSocketService webSocketService; - public TaskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry) { + public TaskManager(AgentRegistry agentRegistry, BedrockLanguageModel model, ToolRegistry toolRegistry, TreeOfThought treeOfThought) { this.agentRegistry = agentRegistry; this.model = model; this.toolRegistry = toolRegistry; + this.treeOfThought = treeOfThought; } 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) { @@ -41,18 +48,27 @@ public class TaskManager { "\nAssigned agent capabilities: " + agent.getCapabilities() + "\nAvailable tools: " + agent.getTools(); - String reasoning = model.generate(executionPlanningTask, null); + Map reasoningTree = treeOfThought.reason(executionPlanningTask, 3, 2); + String reasoning = formatReasoning(reasoningTree); + + System.out.println("DEBUG: Task execution reasoning:\n" + reasoning); + webSocketService.sendUpdate("task_reasoning", Map.of("taskId", taskId, "reasoning", reasoning)); + + updateTaskProgress(taskId, "IN_PROGRESS", 25); + + 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 executionPrompt = "Based on this execution plan:\n" + reasoning + - "\nExecute the task using the available tools and provide the result."; - String response = model.generate(executionPrompt, null); - - String result = executeToolsFromResponse(response, agent); + String result = executeTools(selectedTools, task.getDescription(), 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)); } private void updateTaskProgress(String taskId, String status, int progressPercentage) { @@ -63,27 +79,32 @@ public class TaskManager { webSocketService.sendUpdate("task_progress", progressUpdate); } - private String executeToolsFromResponse(String response, AgentInfo agent) { - StringBuilder result = new StringBuilder(); - 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(); + 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 class TaskProgress { - public String taskId; - public String status; - public int progressPercentage; + 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()); + } - TaskProgress(String taskId, String status, int progressPercentage) { - this.taskId = taskId; - this.status = status; - this.progressPercentage = progressPercentage; + private String executeTools(List tools, String taskDescription, 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)); } + return result.toString().trim(); } } \ 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 8456b90..3485348 100644 --- a/src/main/java/com/ioa/team/TeamFormation.java +++ b/src/main/java/com/ioa/team/TeamFormation.java @@ -5,6 +5,7 @@ import com.ioa.agent.AgentRegistry; import com.ioa.task.Task; import com.ioa.util.TreeOfThought; import com.ioa.service.WebSocketService; +import com.ioa.model.BedrockLanguageModel; import org.springframework.stereotype.Component; import java.util.*; @@ -15,11 +16,13 @@ public class TeamFormation { private final AgentRegistry agentRegistry; private final TreeOfThought treeOfThought; private final WebSocketService webSocketService; + private final BedrockLanguageModel model; - public TeamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService) { + public TeamFormation(AgentRegistry agentRegistry, TreeOfThought treeOfThought, WebSocketService webSocketService, BedrockLanguageModel model) { this.agentRegistry = agentRegistry; this.treeOfThought = treeOfThought; this.webSocketService = webSocketService; + this.model = model; } public List formTeam(Task task) { @@ -30,28 +33,52 @@ public class TeamFormation { String teamFormationTask = "Form the best team for this task: " + task.getDescription() + "\nRequired capabilities: " + requiredCapabilities + "\nRequired tools: " + requiredTools + - "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents) + - "\nAnalyze the task, evaluate agents, and propose a team composition. " + - "Conclude with a final team selection in the format: 'Final Team Selection: agent1, agent2, ...'"; + "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents); - String reasoning = treeOfThought.reason(teamFormationTask, 3, 2); + Map reasoningTree = treeOfThought.reason(teamFormationTask, 3, 2); + String reasoning = formatReasoning(reasoningTree); // Send update about the reasoning process - if (reasoning != null && !reasoning.isEmpty()) { - webSocketService.sendUpdate("team_formation_reasoning", reasoning); - } + webSocketService.sendUpdate("team_formation_reasoning", reasoning); - List team = parseTeamComposition(reasoning, potentialAgents); + String finalSelection = makeFinalSelection(teamFormationTask, reasoning); + List team = parseTeamComposition(finalSelection, potentialAgents); // Send update about the formed team - if (team != null && !team.isEmpty()) { - webSocketService.sendUpdate("team_formed", team); - } + webSocketService.sendUpdate("team_formed", team); return team; } + private String formatReasoning(Map treeData) { + StringBuilder sb = new StringBuilder(); + formatNode(treeData, sb, 0); + return sb.toString(); + } + private void formatNode(Map node, StringBuilder sb, int depth) { + String indent = " ".repeat(depth); + sb.append(indent).append(node.get("name")).append("\n"); + if (node.containsKey("evaluation")) { + sb.append(indent).append("Evaluation: ").append(node.get("evaluation")).append("\n"); + } + if (node.containsKey("conclusion")) { + sb.append(indent).append("Conclusion: ").append(node.get("conclusion")).append("\n"); + } + if (node.containsKey("children")) { + List> children = (List>) node.get("children"); + for (Map child : children) { + formatNode(child, sb, depth + 1); + } + } + } + + private String makeFinalSelection(String task, String reasoning) { + String prompt = "Based on the following reasoning about the task:\n" + task + "\n\nReasoning:\n" + reasoning + + "\n\nProvide a final team selection in the format: 'Final Team Selection: agent1, agent2, ...'\n" + + "Ensure you select at least one agent if any are suitable for the task."; + return model.generate(prompt, null); + } private String formatAgentTools(List agents) { return agents.stream() @@ -59,8 +86,10 @@ public class TeamFormation { .collect(Collectors.joining(", ")); } - private List parseTeamComposition(String reasoning, List potentialAgents) { - String[] lines = reasoning.split("\n"); + private List parseTeamComposition(String finalSelection, List potentialAgents) { + System.out.println("DEBUG: Final selection: " + finalSelection); + + String[] lines = finalSelection.split("\n"); String selectedTeamLine = ""; for (String line : lines) { if (line.toLowerCase().contains("final team selection")) { @@ -68,29 +97,28 @@ public class TeamFormation { break; } } - + System.out.println("DEBUG: Selected team line: " + selectedTeamLine); - + if (selectedTeamLine.isEmpty()) { - System.out.println("DEBUG: No team selection found in the response."); - return List.of(); + System.out.println("DEBUG: No explicit team selection found. Using all potential agents."); + return potentialAgents; } - + List selectedIds = Arrays.asList(selectedTeamLine.split("[,\\s]+")); System.out.println("DEBUG: Parsed agent IDs: " + selectedIds); - + List team = potentialAgents.stream() .filter(agent -> selectedIds.contains(agent.getId().trim())) .collect(Collectors.toList()); - + System.out.println("DEBUG: Final team: " + team); - - if (team.isEmpty() && !selectedIds.isEmpty()) { - // If no agents were matched but we did find IDs, add the first potential agent as a fallback - team = potentialAgents.stream().limit(1).collect(Collectors.toList()); - System.out.println("DEBUG: No agents matched IDs. Using fallback: " + team); + + if (team.isEmpty() && !potentialAgents.isEmpty()) { + System.out.println("DEBUG: No agents matched IDs. Using all potential agents as fallback."); + return potentialAgents; } - + return team; } } \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/CommonTools.java b/src/main/java/com/ioa/tool/CommonTools.java deleted file mode 100644 index 0608c70..0000000 --- a/src/main/java/com/ioa/tool/CommonTools.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.ioa.tool; - -import com.ioa.tool.Tool; - -public class CommonTools { - - @Tool("Search the web for information") - public String webSearch(String query) { - // Implement web search functionality - return "Web search results for: " + query; - } - - @Tool("Get current weather information") - public String getWeather(String location) { - // Implement weather API call - return "Weather information for " + location; - } - - @Tool("Set a reminder") - public String setReminder(String task, String time) { - // Implement reminder functionality - return "Reminder set for " + task + " at " + time; - } - - @Tool("Calculate distances between locations") - public String calculateDistance(String from, String to) { - // Implement distance calculation - return "Distance from " + from + " to " + to; - } - - @Tool("Translate text between languages") - public String translate(String text, String fromLang, String toLang) { - // Implement translation API call - return "Translated text from " + fromLang + " to " + toLang; - } - - @Tool("Get recipe suggestions") - public String getRecipe(String ingredients) { - // Implement recipe suggestion logic - return "Recipe suggestions for: " + ingredients; - } - - @Tool("Check product prices and compare") - public String compareProductPrices(String product) { - // Implement price comparison logic - return "Price comparison for: " + product; - } - - @Tool("Book travel arrangements") - public String bookTravel(String destination, String dates) { - // Implement travel booking logic - return "Travel arrangements for " + destination + " on " + dates; - } - - @Tool("Find nearby restaurants") - public String findRestaurants(String location, String cuisine) { - // Implement restaurant search - return "Restaurants near " + location + " serving " + cuisine; - } - - @Tool("Schedule appointments") - public String scheduleAppointment(String service, String date) { - // Implement appointment scheduling - return "Appointment scheduled for " + service + " on " + date; - } - - @Tool("Get movie recommendations") - public String getMovieRecommendations(String genres, String mood) { - // Implement movie recommendation logic - return "Movie recommendations for " + genres + " matching " + mood + " mood"; - } - - @Tool("Find and book fitness classes") - public String findFitnessClasses(String type, String location) { - // Implement fitness class search and booking - return "Fitness classes for " + type + " near " + location; - } - - @Tool("Get public transport information") - public String getPublicTransport(String from, String to) { - // Implement public transport routing - return "Public transport options from " + from + " to " + to; - } - - @Tool("Track package deliveries") - public String trackPackage(String trackingNumber) { - // Implement package tracking - return "Tracking information for package: " + trackingNumber; - } - - @Tool("Get news updates") - public String getNewsUpdates(String topics) { - // Implement news aggregation - return "Latest news updates on: " + topics; - } - - @Tool("Find and apply for jobs") - public String jobSearch(String field, String location) { - // Implement job search functionality - return "Job openings in " + field + " near " + location; - } - - @Tool("Get health and medical advice") - public String getMedicalAdvice(String symptoms) { - // Implement medical advice lookup (with disclaimer) - return "General health information for symptoms: " + symptoms; - } - - @Tool("Find and book event tickets") - public String findEventTickets(String event, String location) { - // Implement event ticket search and booking - return "Ticket options for " + event + " in " + location; - } - - @Tool("Get financial advice and budgeting tips") - public String getFinancialAdvice(String income, String expenses) { - // Implement financial advice generation - return "Financial advice based on income: " + income + " and expenses: " + expenses; - } - - @Tool("Find and book home services") - public String findHomeServices(String service, String location) { - // Implement home service search and booking - return "Home service options for " + service + " in " + location; - } -} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/Tool.java b/src/main/java/com/ioa/tool/Tool.java index 3db8918..c06fa4c 100644 --- a/src/main/java/com/ioa/tool/Tool.java +++ b/src/main/java/com/ioa/tool/Tool.java @@ -1,12 +1,5 @@ package com.ioa.tool; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface Tool { - String value(); +public interface Tool { + String execute(String... args); } \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/ToolRegistry.java b/src/main/java/com/ioa/tool/ToolRegistry.java index 03f6c90..e724a53 100644 --- a/src/main/java/com/ioa/tool/ToolRegistry.java +++ b/src/main/java/com/ioa/tool/ToolRegistry.java @@ -4,20 +4,29 @@ import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; +import java.util.Set; @Component public class ToolRegistry { - private Map tools = new HashMap<>(); + private Map tools = new HashMap<>(); - public void registerTool(String name, Object tool) { + public void registerTool(String name, Tool tool) { tools.put(name, tool); } - public Object getTool(String name) { + public Tool getTool(String name) { return tools.get(name); } - public Map getAllTools() { - return new HashMap<>(tools); + public boolean hasTool(String name) { + return tools.containsKey(name); + } + + public Set getAllToolNames() { + return tools.keySet(); + } + + public Map getAllTools() { + return tools; } } \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java b/src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java new file mode 100644 index 0000000..0644e30 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/AppointmentSchedulerTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class AppointmentSchedulerTool implements Tool { + @Override + public String execute(String... args) { + return "Appointment scheduled for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java b/src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java new file mode 100644 index 0000000..e243dff --- /dev/null +++ b/src/main/java/com/ioa/tool/common/DistanceCalculatorTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class DistanceCalculatorTool implements Tool { + @Override + public String execute(String... args) { + return "Distance calculated between: " + String.join(" and ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/FinancialAdviceTool.java b/src/main/java/com/ioa/tool/common/FinancialAdviceTool.java new file mode 100644 index 0000000..1e3009f --- /dev/null +++ b/src/main/java/com/ioa/tool/common/FinancialAdviceTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class FinancialAdviceTool implements Tool { + @Override + public String execute(String... args) { + return "Financial advice for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java b/src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java new file mode 100644 index 0000000..416b1db --- /dev/null +++ b/src/main/java/com/ioa/tool/common/FitnessClassFinderTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class FitnessClassFinderTool implements Tool { + @Override + public String execute(String... args) { + return "Fitness classes found for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/MovieRecommendationTool.java b/src/main/java/com/ioa/tool/common/MovieRecommendationTool.java new file mode 100644 index 0000000..fe2d9e9 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/MovieRecommendationTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class MovieRecommendationTool implements Tool { + @Override + public String execute(String... args) { + return "Movie recommendations for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/NewsUpdateTool.java b/src/main/java/com/ioa/tool/common/NewsUpdateTool.java new file mode 100644 index 0000000..e5a4c61 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/NewsUpdateTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class NewsUpdateTool implements Tool { + @Override + public String execute(String... args) { + return "News updates for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/PriceComparisonTool.java b/src/main/java/com/ioa/tool/common/PriceComparisonTool.java new file mode 100644 index 0000000..0854964 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/PriceComparisonTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class PriceComparisonTool implements Tool { + @Override + public String execute(String... args) { + return "Price comparison for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/RecipeTool.java b/src/main/java/com/ioa/tool/common/RecipeTool.java new file mode 100644 index 0000000..47f24fe --- /dev/null +++ b/src/main/java/com/ioa/tool/common/RecipeTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class RecipeTool implements Tool { + @Override + public String execute(String... args) { + return "Recipe found for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/ReminderTool.java b/src/main/java/com/ioa/tool/common/ReminderTool.java new file mode 100644 index 0000000..0448fcd --- /dev/null +++ b/src/main/java/com/ioa/tool/common/ReminderTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class ReminderTool implements Tool { + @Override + public String execute(String... args) { + return "Reminder set for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/RestaurantFinderTool.java b/src/main/java/com/ioa/tool/common/RestaurantFinderTool.java new file mode 100644 index 0000000..b9f595f --- /dev/null +++ b/src/main/java/com/ioa/tool/common/RestaurantFinderTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class RestaurantFinderTool implements Tool { + @Override + public String execute(String... args) { + return "Restaurants found near: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/TranslationTool.java b/src/main/java/com/ioa/tool/common/TranslationTool.java new file mode 100644 index 0000000..adbef2f --- /dev/null +++ b/src/main/java/com/ioa/tool/common/TranslationTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class TranslationTool implements Tool { + @Override + public String execute(String... args) { + return "Translation: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/TravelBookingTool.java b/src/main/java/com/ioa/tool/common/TravelBookingTool.java new file mode 100644 index 0000000..2b73a2c --- /dev/null +++ b/src/main/java/com/ioa/tool/common/TravelBookingTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class TravelBookingTool implements Tool { + @Override + public String execute(String... args) { + return "Travel booked for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/WeatherTool.java b/src/main/java/com/ioa/tool/common/WeatherTool.java new file mode 100644 index 0000000..a8bbe9d --- /dev/null +++ b/src/main/java/com/ioa/tool/common/WeatherTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class WeatherTool implements Tool { + @Override + public String execute(String... args) { + return "Weather information for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/tool/common/WebSearchTool.java b/src/main/java/com/ioa/tool/common/WebSearchTool.java new file mode 100644 index 0000000..f0d8810 --- /dev/null +++ b/src/main/java/com/ioa/tool/common/WebSearchTool.java @@ -0,0 +1,10 @@ +package com.ioa.tool.common; + +import com.ioa.tool.Tool; + +public class WebSearchTool implements Tool { + @Override + public String execute(String... args) { + return "Web search results for: " + String.join(" ", args); + } +} \ No newline at end of file diff --git a/src/main/java/com/ioa/util/TreeOfThought.java b/src/main/java/com/ioa/util/TreeOfThought.java index def7618..bc137e4 100644 --- a/src/main/java/com/ioa/util/TreeOfThought.java +++ b/src/main/java/com/ioa/util/TreeOfThought.java @@ -16,10 +16,10 @@ public class TreeOfThought { this.webSocketService = webSocketService; } - public String reason(String task, int depth, int branches) { + public Map reason(String task, int depth, int branches) { Map treeData = exploreThought(task, depth, branches, "Root"); webSocketService.sendUpdate("tree_of_thought", treeData); - return (String) treeData.getOrDefault("selection", "No selection made"); + return treeData; } private Map exploreThought(String task, int depth, int branches, String nodeName) { @@ -45,23 +45,26 @@ public class TreeOfThought { node.put("children", children); if (depth == 1) { - String selection = selectBestBranch(children); - node.put("selection", selection); + String conclusion = concludeThought(task, nodeName, children); + node.put("conclusion", conclusion); } return node; } private String evaluateLeaf(String task, String path) { - String prompt = "Evaluate the effectiveness of this approach for the task: " + task + "\nPath: " + path; + String prompt = "Evaluate this approach for the task: " + task + "\nPath: " + path; return model.generate(prompt, null); } - private String selectBestBranch(List> children) { - // Logic to select the best branch based on evaluations - // For simplicity, let's just select the first child - Map selectedChild = children.get(0); - selectedChild.put("selected", true); - return (String) selectedChild.get("name"); + private String concludeThought(String task, String path, List> children) { + StringBuilder childEvaluations = new StringBuilder(); + for (Map child : children) { + childEvaluations.append(child.get("name")).append(": ").append(child.get("evaluation")).append("\n"); + } + + String prompt = "Conclude on these approaches for the task: " + task + + "\nPath: " + path + "\nEvaluations:\n" + childEvaluations; + return model.generate(prompt, null); } } \ No newline at end of file diff --git a/target/classes/com/ioa/IoASystem.class b/target/classes/com/ioa/IoASystem.class index 25e6b9f..200ee20 100644 Binary files a/target/classes/com/ioa/IoASystem.class and b/target/classes/com/ioa/IoASystem.class differ diff --git a/target/classes/com/ioa/agent/AgentInfo.class b/target/classes/com/ioa/agent/AgentInfo.class index a534888..245b350 100644 Binary files a/target/classes/com/ioa/agent/AgentInfo.class and b/target/classes/com/ioa/agent/AgentInfo.class differ diff --git a/target/classes/com/ioa/agent/AgentRegistry.class b/target/classes/com/ioa/agent/AgentRegistry.class index e17b46f..17b6150 100644 Binary files a/target/classes/com/ioa/agent/AgentRegistry.class and b/target/classes/com/ioa/agent/AgentRegistry.class differ diff --git a/target/classes/com/ioa/model/BedrockLanguageModel.class b/target/classes/com/ioa/model/BedrockLanguageModel.class index 2570da7..b2f598d 100644 Binary files a/target/classes/com/ioa/model/BedrockLanguageModel.class and b/target/classes/com/ioa/model/BedrockLanguageModel.class differ diff --git a/target/classes/com/ioa/task/TaskManager$TaskProgress.class b/target/classes/com/ioa/task/TaskManager$TaskProgress.class deleted file mode 100644 index 13616d3..0000000 Binary files a/target/classes/com/ioa/task/TaskManager$TaskProgress.class and /dev/null differ diff --git a/target/classes/com/ioa/task/TaskManager.class b/target/classes/com/ioa/task/TaskManager.class index a210467..8a3ba1a 100644 Binary files a/target/classes/com/ioa/task/TaskManager.class and b/target/classes/com/ioa/task/TaskManager.class differ diff --git a/target/classes/com/ioa/team/TeamFormation.class b/target/classes/com/ioa/team/TeamFormation.class index 193eabe..4ea8bfc 100644 Binary files a/target/classes/com/ioa/team/TeamFormation.class and b/target/classes/com/ioa/team/TeamFormation.class differ diff --git a/target/classes/com/ioa/tool/CommonTools.class b/target/classes/com/ioa/tool/CommonTools.class deleted file mode 100644 index b2b6b2d..0000000 Binary files a/target/classes/com/ioa/tool/CommonTools.class and /dev/null differ diff --git a/target/classes/com/ioa/tool/Tool.class b/target/classes/com/ioa/tool/Tool.class index bb1dc5a..a8c24f5 100644 Binary files a/target/classes/com/ioa/tool/Tool.class and b/target/classes/com/ioa/tool/Tool.class differ diff --git a/target/classes/com/ioa/tool/ToolRegistry.class b/target/classes/com/ioa/tool/ToolRegistry.class index 56e3875..d424916 100644 Binary files a/target/classes/com/ioa/tool/ToolRegistry.class and b/target/classes/com/ioa/tool/ToolRegistry.class differ diff --git a/target/classes/com/ioa/tool/common/AppointmentSchedulerTool.class b/target/classes/com/ioa/tool/common/AppointmentSchedulerTool.class new file mode 100644 index 0000000..a7d4e5f Binary files /dev/null and b/target/classes/com/ioa/tool/common/AppointmentSchedulerTool.class differ diff --git a/target/classes/com/ioa/tool/common/DistanceCalculatorTool.class b/target/classes/com/ioa/tool/common/DistanceCalculatorTool.class new file mode 100644 index 0000000..066e3d9 Binary files /dev/null and b/target/classes/com/ioa/tool/common/DistanceCalculatorTool.class differ diff --git a/target/classes/com/ioa/tool/common/FinancialAdviceTool.class b/target/classes/com/ioa/tool/common/FinancialAdviceTool.class new file mode 100644 index 0000000..e7f7b39 Binary files /dev/null and b/target/classes/com/ioa/tool/common/FinancialAdviceTool.class differ diff --git a/target/classes/com/ioa/tool/common/FitnessClassFinderTool.class b/target/classes/com/ioa/tool/common/FitnessClassFinderTool.class new file mode 100644 index 0000000..f6a7aa1 Binary files /dev/null and b/target/classes/com/ioa/tool/common/FitnessClassFinderTool.class differ diff --git a/target/classes/com/ioa/tool/common/MovieRecommendationTool.class b/target/classes/com/ioa/tool/common/MovieRecommendationTool.class new file mode 100644 index 0000000..1cc6c64 Binary files /dev/null and b/target/classes/com/ioa/tool/common/MovieRecommendationTool.class differ diff --git a/target/classes/com/ioa/tool/common/NewsUpdateTool.class b/target/classes/com/ioa/tool/common/NewsUpdateTool.class new file mode 100644 index 0000000..bd16610 Binary files /dev/null and b/target/classes/com/ioa/tool/common/NewsUpdateTool.class differ diff --git a/target/classes/com/ioa/tool/common/PriceComparisonTool.class b/target/classes/com/ioa/tool/common/PriceComparisonTool.class new file mode 100644 index 0000000..17b3757 Binary files /dev/null and b/target/classes/com/ioa/tool/common/PriceComparisonTool.class differ diff --git a/target/classes/com/ioa/tool/common/RecipeTool.class b/target/classes/com/ioa/tool/common/RecipeTool.class new file mode 100644 index 0000000..02acd2b Binary files /dev/null and b/target/classes/com/ioa/tool/common/RecipeTool.class differ diff --git a/target/classes/com/ioa/tool/common/ReminderTool.class b/target/classes/com/ioa/tool/common/ReminderTool.class new file mode 100644 index 0000000..658477f Binary files /dev/null and b/target/classes/com/ioa/tool/common/ReminderTool.class differ diff --git a/target/classes/com/ioa/tool/common/RestaurantFinderTool.class b/target/classes/com/ioa/tool/common/RestaurantFinderTool.class new file mode 100644 index 0000000..da62f79 Binary files /dev/null and b/target/classes/com/ioa/tool/common/RestaurantFinderTool.class differ diff --git a/target/classes/com/ioa/tool/common/TranslationTool.class b/target/classes/com/ioa/tool/common/TranslationTool.class new file mode 100644 index 0000000..b58e9a1 Binary files /dev/null and b/target/classes/com/ioa/tool/common/TranslationTool.class differ diff --git a/target/classes/com/ioa/tool/common/TravelBookingTool.class b/target/classes/com/ioa/tool/common/TravelBookingTool.class new file mode 100644 index 0000000..3382aa3 Binary files /dev/null and b/target/classes/com/ioa/tool/common/TravelBookingTool.class differ diff --git a/target/classes/com/ioa/tool/common/WeatherTool.class b/target/classes/com/ioa/tool/common/WeatherTool.class new file mode 100644 index 0000000..9e419d2 Binary files /dev/null and b/target/classes/com/ioa/tool/common/WeatherTool.class differ diff --git a/target/classes/com/ioa/tool/common/WebSearchTool.class b/target/classes/com/ioa/tool/common/WebSearchTool.class new file mode 100644 index 0000000..36d1c65 Binary files /dev/null and b/target/classes/com/ioa/tool/common/WebSearchTool.class differ diff --git a/target/classes/com/ioa/util/TreeOfThought.class b/target/classes/com/ioa/util/TreeOfThought.class index df979f7..8b0a699 100644 Binary files a/target/classes/com/ioa/util/TreeOfThought.class and b/target/classes/com/ioa/util/TreeOfThought.class differ diff --git a/target/classes/static/asset-manifest.json b/target/classes/static/asset-manifest.json index a351196..86f22a1 100644 --- a/target/classes/static/asset-manifest.json +++ b/target/classes/static/asset-manifest.json @@ -1,15 +1,15 @@ { "files": { "main.css": "/static/css/main.e6c13ad2.css", - "main.js": "/static/js/main.03144112.js", + "main.js": "/static/js/main.720bb114.js", "static/js/453.d855a71b.chunk.js": "/static/js/453.d855a71b.chunk.js", "index.html": "/index.html", "main.e6c13ad2.css.map": "/static/css/main.e6c13ad2.css.map", - "main.03144112.js.map": "/static/js/main.03144112.js.map", + "main.720bb114.js.map": "/static/js/main.720bb114.js.map", "453.d855a71b.chunk.js.map": "/static/js/453.d855a71b.chunk.js.map" }, "entrypoints": [ "static/css/main.e6c13ad2.css", - "static/js/main.03144112.js" + "static/js/main.720bb114.js" ] } \ No newline at end of file diff --git a/target/classes/static/index.html b/target/classes/static/index.html index 3530511..b93df9f 100644 --- a/target/classes/static/index.html +++ b/target/classes/static/index.html @@ -1 +1 @@ -React App
\ No newline at end of file +React App
\ No newline at end of file diff --git a/target/classes/static/static/js/main.720bb114.js b/target/classes/static/static/js/main.720bb114.js new file mode 100644 index 0000000..cc6506b --- /dev/null +++ b/target/classes/static/static/js/main.720bb114.js @@ -0,0 +1,3 @@ +/*! For license information please see main.720bb114.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