From a310b2364baae6ab1abfac97dfb0ece69c6833cc Mon Sep 17 00:00:00 2001 From: Mahesh Kommareddi Date: Tue, 16 Jul 2024 20:57:58 -0400 Subject: [PATCH] Fully working Claude 3.5 on Bedrock code that uses agents --- src/main/java/com/ioa/IoASystem.java | 21 ++++++++----- .../com/ioa/conversation/ConversationFSM.java | 4 +-- .../com/ioa/model/BedrockLanguageModel.java | 28 +++++++++++++++--- src/main/java/com/ioa/task/TaskManager.java | 4 +-- src/main/java/com/ioa/team/TeamFormation.java | 27 +++++++++++------ src/main/java/com/ioa/util/TreeOfThought.java | 4 +-- target/classes/com/ioa/IoASystem.class | Bin 5400 -> 5555 bytes .../ioa/conversation/ConversationFSM.class | Bin 3488 -> 3492 bytes .../com/ioa/model/BedrockLanguageModel.class | Bin 4794 -> 5823 bytes target/classes/com/ioa/task/TaskManager.class | Bin 4468 -> 4529 bytes .../classes/com/ioa/team/TeamFormation.class | Bin 4864 -> 5416 bytes .../classes/com/ioa/util/TreeOfThought.class | Bin 2424 -> 2385 bytes 12 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ioa/IoASystem.java b/src/main/java/com/ioa/IoASystem.java index 746501a..86b64de 100644 --- a/src/main/java/com/ioa/IoASystem.java +++ b/src/main/java/com/ioa/IoASystem.java @@ -62,11 +62,11 @@ public class IoASystem { public static void main(String[] args) { var context = SpringApplication.run(IoASystem.class, args); - + AgentRegistry agentRegistry = context.getBean(AgentRegistry.class); TeamFormation teamFormation = context.getBean(TeamFormation.class); TaskManager taskManager = context.getBean(TaskManager.class); - + // Register some example agents AgentInfo agent1 = new AgentInfo("agent1", "General Assistant", Arrays.asList("general", "search"), @@ -77,23 +77,28 @@ public class IoASystem { agentRegistry.registerAgent(agent1.getId(), agent1); agentRegistry.registerAgent(agent2.getId(), agent2); - + // Create a sample task Task task = new Task("task1", "Plan a weekend trip to Paris", Arrays.asList("travel", "booking"), Arrays.asList("bookTravel", "findRestaurants", "getWeather")); - + // Form a team for the task List team = teamFormation.formTeam(task); System.out.println("Formed team: " + team); - - // Assign the task to the first agent in the team (simplified) + + if (team.isEmpty()) { + System.out.println("No suitable agents found for the task. Exiting."); + return; + } + + // Assign the task to the first agent in the team task.setAssignedAgent(team.get(0)); - + // Execute the task taskManager.addTask(task); taskManager.executeTask(task.getId()); - + // Print the result System.out.println("Task result: " + task.getResult()); } diff --git a/src/main/java/com/ioa/conversation/ConversationFSM.java b/src/main/java/com/ioa/conversation/ConversationFSM.java index 893871c..2bf96ac 100644 --- a/src/main/java/com/ioa/conversation/ConversationFSM.java +++ b/src/main/java/com/ioa/conversation/ConversationFSM.java @@ -22,11 +22,11 @@ public class ConversationFSM { String stateTransitionTask = "Decide the next conversation state based on this message: " + message.getContent() + "\nCurrent state: " + currentState; - String reasoning = model.generate(stateTransitionTask); + 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); + String response = model.generate(decisionPrompt, null); ConversationState newState = ConversationState.valueOf(response.trim()); transitionTo(newState); diff --git a/src/main/java/com/ioa/model/BedrockLanguageModel.java b/src/main/java/com/ioa/model/BedrockLanguageModel.java index 3b42c71..5d68a26 100644 --- a/src/main/java/com/ioa/model/BedrockLanguageModel.java +++ b/src/main/java/com/ioa/model/BedrockLanguageModel.java @@ -12,6 +12,10 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import org.springframework.stereotype.Component; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Base64; + @Component public class BedrockLanguageModel { private final BedrockRuntimeClient bedrockClient; @@ -27,19 +31,35 @@ public class BedrockLanguageModel { this.modelId = modelId; } - public String generate(String prompt) { + public String generate(String prompt, String imagePath) { try { ObjectNode requestBody = objectMapper.createObjectNode(); requestBody.put("anthropic_version", "bedrock-2023-05-31"); ArrayNode messages = requestBody.putArray("messages"); ObjectNode message = messages.addObject(); message.put("role", "user"); - message.put("content", prompt); - requestBody.put("max_tokens", 500); requestBody.put("temperature", 0.7); requestBody.put("top_p", 0.9); + ArrayNode content = message.putArray("content"); + + if (imagePath != null && !imagePath.isEmpty()) { + byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath)); + String base64Image = Base64.getEncoder().encodeToString(imageBytes); + + ObjectNode imageNode = content.addObject(); + imageNode.put("type", "image"); // Add type field + ObjectNode imageContent = imageNode.putObject("image"); + imageContent.put("format", "png"); + ObjectNode source = imageContent.putObject("source"); + source.put("bytes", base64Image); + } + + ObjectNode textNode = content.addObject(); + textNode.put("type", "text"); // Add type field + textNode.put("text", prompt); + String jsonPayload = objectMapper.writeValueAsString(requestBody); InvokeModelRequest invokeRequest = InvokeModelRequest.builder() @@ -53,7 +73,7 @@ public class BedrockLanguageModel { String responseBody = response.body().asUtf8String(); ObjectNode responseJson = (ObjectNode) objectMapper.readTree(responseBody); - return responseJson.path("content").asText(); + return responseJson.path("content").get(0).path("text").asText(); } catch (Exception e) { throw new RuntimeException("Error generating text with Bedrock", e); diff --git a/src/main/java/com/ioa/task/TaskManager.java b/src/main/java/com/ioa/task/TaskManager.java index 33169ac..664c0e4 100644 --- a/src/main/java/com/ioa/task/TaskManager.java +++ b/src/main/java/com/ioa/task/TaskManager.java @@ -41,13 +41,13 @@ public class TaskManager { "\nAssigned agent capabilities: " + agent.getCapabilities() + "\nAvailable tools: " + agent.getTools(); - String reasoning = model.generate(executionPlanningTask); + String reasoning = model.generate(executionPlanningTask, null); 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); + String response = model.generate(executionPrompt, null); String result = executeToolsFromResponse(response, agent); diff --git a/src/main/java/com/ioa/team/TeamFormation.java b/src/main/java/com/ioa/team/TeamFormation.java index 0da1e67..c60a8dd 100644 --- a/src/main/java/com/ioa/team/TeamFormation.java +++ b/src/main/java/com/ioa/team/TeamFormation.java @@ -25,29 +25,38 @@ public class TeamFormation { List requiredTools = task.getRequiredTools(); List potentialAgents = agentRegistry.searchAgents(requiredCapabilities); + System.out.println("Potential agents: " + potentialAgents); + String teamFormationTask = "Form the best team for this task: " + task.getDescription() + + "\nRequired capabilities: " + requiredCapabilities + "\nRequired tools: " + requiredTools + - "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents); + "\nAvailable agents and their tools: " + formatAgentTools(potentialAgents) + + "\nPlease respond with a comma-separated list of agent IDs that form the best team for this task."; - String reasoning = model.generate(teamFormationTask); - - String finalDecisionPrompt = "Based on this reasoning:\n" + reasoning + - "\nProvide the final team composition as a comma-separated list of agent IDs."; - String response = model.generate(finalDecisionPrompt); + System.out.println("Sending prompt to language model: " + teamFormationTask); + + String response = model.generate(teamFormationTask, null); + System.out.println("Language model response: " + response); + return parseTeamComposition(response, potentialAgents); } private String formatAgentTools(List agents) { return agents.stream() - .map(agent -> agent.getId() + ": " + agent.getTools()) + .map(agent -> agent.getId() + " (capabilities: " + agent.getCapabilities() + ", tools: " + agent.getTools() + ")") .collect(Collectors.joining(", ")); } private List parseTeamComposition(String composition, List potentialAgents) { List selectedIds = Arrays.asList(composition.split(",")); - return potentialAgents.stream() - .filter(agent -> selectedIds.contains(agent.getId())) + System.out.println("Parsed agent IDs: " + selectedIds); + + List team = potentialAgents.stream() + .filter(agent -> selectedIds.contains(agent.getId().trim())) .collect(Collectors.toList()); + + System.out.println("Final team: " + team); + return team; } } \ 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 fbbecb5..60facdc 100644 --- a/src/main/java/com/ioa/util/TreeOfThought.java +++ b/src/main/java/com/ioa/util/TreeOfThought.java @@ -22,7 +22,7 @@ public class TreeOfThought { for (int i = 0; i < branches; i++) { String branchPrompt = "Consider the task: " + task + "\nCurrent path: " + path + "\nExplore a new branch of thought (branch " + (i+1) + "/" + branches + "):"; - String thought = model.generate(branchPrompt); + String thought = model.generate(branchPrompt, null); result.append("Branch ").append(i + 1).append(":\n"); result.append(thought).append("\n"); @@ -33,7 +33,7 @@ public class TreeOfThought { private String evaluateLeaf(String task, String path) { String prompt = "Evaluate the effectiveness of this approach for the task: " + task + "\nPath: " + path; - return model.generate(prompt); + return model.generate(prompt, null); } public BedrockLanguageModel getModel() { diff --git a/target/classes/com/ioa/IoASystem.class b/target/classes/com/ioa/IoASystem.class index 31d543851ad51b0711374bb32e37b97c04c4d824..9d479b3a42ada15b980467c35ab46d6b47ecc981 100644 GIT binary patch delta 1192 zcmZvbTWl0n7{`BSciA&LyV=$%kWFhDElujSwnzvK7co8*3<(AkNGL)=rPH#3wx&Bp z^UM~vXV@UEj<;HxC(uvC|#2&?U`-%1%sMnZY1v1|D}je z@91o^n=Qv~YMX2+gMY;5rCXhLx@(yuzM?RfOfGXpb2Y{quDQMOBcYp$O7~2>GOYPm zQ7&e=d$g#0TCbE}hms$RNaj!(F#>FrG3+}>lNCFb4m18kFQm{Eu~ctJ9@OI|Vc?BFZO-6`)&3Et;PglVcqYfR18N=Tmij}d$; z0UpA4GAq7km$#wV&l402A_G)3R_CbPEQ`RjA;?ue@~C`N0YTym2#@OSW{;=qrXDNp zepvLgLy9&F3XkUPWnY2kB`G>62<8BFjny?dp7Vi*@QnA>tbEiUk0~|%AeBib`#C^h z)Uc8d@}rNIC@C9)R_}{>ordV3SaeV2LTC9nKYg0zGl}#(oBQcOHg>&x81kFgLc%S1Vn+9Tfqhl3`~nqWkxH;wSv0F8 zt!gq$eAWed1deh{vbCDP&-@~QkE<%bKLN(5GWK#@x>BQxILHavV-Y8r#jkSZ*0O;X zvBI2Yp?H5o^CxpTC2M0jzl*5%A>>_Wq$fMYGZuAUh$5OlG!2>xO`T?fW~TpNsihBI jDQ9I2aBlE8&dd6OJaO?}^i{p_Z?22a6zc}JxJ}{#PG9i= delta 994 zcmZva*-sNu6vn^Xmg&s2wgsf5k<=2Rl7gaWY+P`AunCE8K8P3s`@Vps+DfaUf?9DG6$QZ^cYM?bV?1{{wv?F3%suy;bAD&JH&WK-Rr~(LuK-w% zA7Qmg=1JKj?YH6p4)QU1zI51%BRI;vN_o)h(;e<5?Nng}7(GCaHwG3a!+;L@N}5=Rb7Wgn4hW-@ zb_@}mC$DzC%dv)a@F7RZ9O31KiQWQSK$M~ZzwR$%DMb(*4)|~pT@)MV6}iq(f>Gk) zU&z5_@)sG!$QZhDRq)BKf{`phNuZ>rEQVj|^5*Kl3O&Lb=X z@6FAdo9T7txL#Eql?~`YuK;i*Z;C$?SERRz zg)%Ik#uAeREa`SEX_iH2iN9i|#tGCu+|gUCq*Y{>6If6a!=j0UTb$|E3;93oD!7Y# zgrH+E$TU%fPNtO4&i`3ucFD#rv>E7>s-xKFGP%rA97-+6qB!1(-9kAP$63%_;Nnsl zwM(@YPQGojKUB*ktY?$3ffZsCn}K?*n02WfxQ_=EVP?g6h(}aGJ}b}$V8B$Spa+kM zR*v6DqMrt}k=9jsLYHVSJzL0OiWL~ZbL#K~F~vnDWf@6>B$+Toq5&_{ dQyixK2)#B^-;whx?fV9wNmFV61>Z0R*I(R7!Ycp( diff --git a/target/classes/com/ioa/conversation/ConversationFSM.class b/target/classes/com/ioa/conversation/ConversationFSM.class index 1a51bbd1f54ec74a894d7c5f44ed9c943ee796bb..9f915b66a5679d1b876e626f3c2e2188cc4d1d4a 100644 GIT binary patch delta 284 zcmXAjKQBXJ6vlt=^;V^S1|1~Lt0DL5ReFo23lgy!)M^&FT3V$-Vi6WTKs$6b_yCeh z(=-;}#g{M$j~JfhJm;L}&$D}RuT{?$4Svt~dBaR2?!;F|*KrO*lwpaAAuRR0<>A2l zO4jz7A_+W|N6f9hksUKX!H2p?E;1v+gUW<5Y}>z0-kSbLDsZqPl@YA4D3pW^VYC08 zs@*#r0R`4sU`zL1u_i^%3Axno4J+Kr_Kt`L)_9~!EcM=h8%}75sTZf5DQ8xS7HvHF lw&c=Q?|@@EnygX|xzLnQR$cy?EYox)_euQF9KNSN%`X*ciNf1Omg3`P}4-gn4 zj)GpLw`fo+8Z20Qv%j_WtM}r)#ny!ee_;GM!)zz%Cb!4^#1Pa5wwf(si1Mrvj-Ksz zCT?NL08inVg^hO#6BeiVu&<$59}^rzQ|hqo{uU)S{LEHLJ0gtaq-80PHl@bU{6jkl{4L4Qsaho`h?sm_g>s1F^TBb|0kT#(WIY5oU3PE#Dz#pnNzOh hQp!J~E9ca5$hBNrU3>J%7nl)%PSQWLM<2N_^9va`EWH2# diff --git a/target/classes/com/ioa/model/BedrockLanguageModel.class b/target/classes/com/ioa/model/BedrockLanguageModel.class index 60774605dee3768a984af60abf5e1a5e5d53fec2..2570da7034fbadbee3f3e734f0210c182e6eba9c 100644 GIT binary patch delta 1965 zcmZux2~<>782;|S%zN|Zf%rgbT+xF$Ae_NK$X+uji@eOMK7HxU%5_WD)M=0X|w;ywmzxK=AE zt5ki|#}N+dS>cfT87$?Ynrg2m;z8}KO( z8INFvzFHWTxDt;EcwB}JPcV$q7blL=bHyo%4OlJUNf|j*eGKYUSvqu`BmIorM?8X~GR*iy z@0PHE4bsyRy6fxBR{eNFa;9WZ**2f1QV+GMjE|gaG^dz|HO_ewOA-fmmyNICtyhsu zYt-4bYDDvdX3}+Y@|^X2ONSJ?gw<*!VgQJoSMuK+Oca^a3dgUVu60-{w2iE8P8wkT z6bzr~`AK7=$LRIwMGXe*h(~9lzYCJl72VMd8MM0416Lyr$H^iUCR*J%fzN5@QVwzn ziQy!^;D~_f1fe7VtRQm>`o%D)I9nO442fab@Eaobk-KOaFsA%X6Kfx}L-!elXD9ieCfme|o z!*aLSh)3ze)r3_hC{H!vnbvKc33fVrz6qO6Xu?*8W~_8u$+VB%+Jr_Ec<>lrj^P!z zjlVk9Sc|!CY)04kHf7sN)NX zDWz-Lia6^-+&GX)T)Ai+g1#uCdp!Y8Oh-Qi&>s;Dpcl`D`51^r#MpA;Y!wD! z9rCa#iow{9eC)l~`5a19{Vf+dNTqA(5zy<1j+{H66 k!C>SZIhyb{&eLuo%nO7{A{5fj!(2u;nx4Lu%w)0t0~z-Gg#Z8m delta 1027 zcmX|<*>eR(#^<#^z zAO9J<0<7eR3)UH9q1lzq6w;YOn2ic+cdCDDA-gM`>9vHh$>B~m>jtwz|6(+$hjrAP zZKV9^8|b*kl!LdR@Ftr>u?9 zJUu484$Tx4?bGR~-J>4Y`|X)4^7K0l_!axVqpcsvrET&&<*>)k8>z0Ybgp2rk3o~C z9rp8#qFVo6Qmy~A?+@oW;Bb)V^cv@2NuFw(Fozrt^Md}>IcE>^lF7?H|(jVT( zQ3uV4E{)b2uQ|NVG2I$%pZkWxn;cUFbE(2ki?=ypa?;@xBZ?ZG3(nI&MJ>xn^{!9% z7fjyOb7Ph2jBbw2Q)l&qu^Rg{=Nv+Ops3Zup(=egHXOKqi9Qu7*PBbrVs=kD-*HPa$Wit}9X6+w-QiY2wF+DkNg zEMHsa-s;}&(b`exuJ*Y5zIu;)lfgvLUFSaFG1%H6aKqATgpRoS%cE1M50$gUW1FC^ za?(EX_3Au!Btw_kB|l9?ask}FB2QckPX7{hJCq2*c;^4NmeE!iHN(w8HZj|>Yq$%(i8=Wz=wspu5Dlc9zm9w|E;jvV#UPG}0%Gz1+l*m^#AEoDlQG|K%c| zQq~$S85lt{I z)vz4b=1W--5r)lIT$!HU)c@0)VuF@t>2OlE4Ws^M)ST|~YxxiG4O0>gsedc+J9#a^ KdAj-Di2Mut`|0EW diff --git a/target/classes/com/ioa/task/TaskManager.class b/target/classes/com/ioa/task/TaskManager.class index b56b9c928253777af82a3f135be7ccc78b438c5f..0e7c460a309379762ece07ca043728cc002e9450 100644 GIT binary patch delta 1147 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 I7JtC^FGakRod5s; delta 1607 zcmYk6X?Igq6o#LZCb{X&ZRtd7inO7$O-WOfih=G(&)NID``z!^=bnh}ZnQ7{ zJ9-wF$FHaC1Io53W0FH1ll28pG}u6+MZ}?rDf&;+9L6sBO}}`NxOax2L;usZ4rSkR>d& zSmtmW%Y}?S?yb@lz6F&l6`okwrjy$(?r>Peor(#1z*nvJ`Pu_ZSnY5(YxM8Fw(5Ho zDrVEbeGcomU$SNUdQv$>M0a>9^nCyLV1o4)T@KwO^?HAMpn#1In@H(1{@DVy#i55@ z{f~c9pp%S4A6xZeD_UZcC1CS@s!8L*HDqOfNnaF0+sq{ug`G!LsT|mlnm^1DsSO=O?ns?r`R$Wy27V!Lj@9Ofy9w|S?; z{CAD>bH=OWp@4~w4+v-hhE$`Q;2L~{u&EYW{nt`U4O4{Ibh&JE zsAsW+8K!IVYz$MG2``@J8L81Hz5OiD32U20JTF#(0L|fmSYAPD;sp*$)O05DqF8?M zRd7fwORx*kVg-0f5JijrD{zO$;0}+$9TB*fCCtMs^2k+}QG}9i_Q(%vnn$=rG0H+1 zVX=p@6~lClaF>U3G+eDZe-u%IG|REXgjUoouu@R^1!ka(4TjNX55uId@M*isr&4N0TFhn|{gt#b zK|V{3GBK)0^O$3tB9iBz%O&C}Y*e4fYp&`>LsNus5Z@88@;)PBp7HB)<)ztWzhT@a z5hgkqm3G=T!h=%(Ntt`x=J2~&TF0c3I5&?3i1il7QGzDd=?dB`*=IB=jS84N4@-NF z@)(#({}0*hLgoc6b%Br~-*uywy~q1vnA{)8`-D7ABF~pH|Ii&j=Dbw%37_$~YYlRm TFI>+EKS{JLkw0^ZUkLpNeCsKn diff --git a/target/classes/com/ioa/util/TreeOfThought.class b/target/classes/com/ioa/util/TreeOfThought.class index 69f5f4c6f474f2f2950068bfdc6f06ad5cd9b3d0..626813ca4fbc6ebb64721fa2de5e522112c7d87a 100644 GIT binary patch delta 826 zcmY*XId2m|6#iy+c6TyfC&~)jERKV5OybyaAe`}n12N$UM-DDS2q7n;Aq5Q;a$y7# z?ew%12nhso;esBzh(7~J9B;ySn|<@%cg%bbb^`hJcl$GdX>5IvUl>m^Zg zihAgLV{0mMi+qD&P*vSQ^}@|L6+(;DJ2zc9MIw4(QxxFnp-njLtIlHZ zsf*zZ&YEuKr5AO#OFJNLx{5U8|E_7&OkLs}X8z4QPnk`5KeXxyV3Y6&8EC4UYhx0a)7F%=Gg^*imKU9OZ6Kj-ZHU{2UL;tcNOcT GB>W2(r)A9m delta 886 zcmYjP+fEZv6kTWToVJ*bmO4TKxd~GcMFp${6$Hf#C|+t65Cn-YYT|=WCQTZDz|5O3 zCcfw+cqvIueAmPn<3IQfYT{*`87$-^XZAjO@3q%nd%n6qT>0rw^#g#DSY4MNh0!k1 z_Vhtp@KeMLfv)bLMRcYebPCvG50~yQ-))shV_zKI=m{FN5i6_A-e5u7+p}Ll%Si_Z z1cY=UFc3!*8XO#EKuT3O7{?HXgI8LY7eVKJ=P(HII#pyP=g3_7A9*HX0|EgCMwvmMlZs&m;)qAA($VfZ37#_c$gq@ z3KN^HCTZ!klTezFv>1X-LO{9c8Df6cGb-4*_8#ft2E3f94_YZJ^8!l@q%31GQ^g)2 zXZvqqdv*oQImeqZ-Hr;nRJa1)?W0}rOwZxh?T;LiH&!y9;W