@@ -1647,147 +1647,160 @@ private void validateConversationRequest(ConversationRequest conversationRequest
16471647 */
16481648 @ Override
16491649 public Mono <ConversationResponseAlpha2 > converseAlpha2 (ConversationRequestAlpha2 conversationRequestAlpha2 ) {
1650-
16511650 try {
16521651 validateConversationRequestAlpha2 (conversationRequestAlpha2 );
1652+ DaprProtos .ConversationRequestAlpha2 protoRequest = buildConversationRequestProto (conversationRequestAlpha2 );
1653+
1654+ Mono <DaprProtos .ConversationResponseAlpha2 > conversationResponseMono = Mono .deferContextual (
1655+ context -> this .createMono (
1656+ it -> intercept (context , asyncStub ).converseAlpha2 (protoRequest , it )
1657+ )
1658+ );
1659+
1660+ DaprProtos .ConversationResponseAlpha2 conversationResponse = conversationResponseMono .block ();
16531661
1654- DaprProtos .ConversationRequestAlpha2 .Builder protosConversationRequestBuilder =
1655- DaprProtos .ConversationRequestAlpha2
1656- .newBuilder ()
1657- .setTemperature (conversationRequestAlpha2 .getTemperature ())
1658- .setScrubPii (conversationRequestAlpha2 .isScrubPii ())
1659- .setName (conversationRequestAlpha2 .getName ());
1660-
1661- if (conversationRequestAlpha2 .getContextId () != null ) {
1662- protosConversationRequestBuilder .setContextId (conversationRequestAlpha2 .getContextId ());
1663- }
1662+ List <ConversationResultAlpha2 > results = buildConversationResults (conversationResponse .getOutputsList ());
1663+ return Mono .just (new ConversationResponseAlpha2 (conversationResponse .getContextId (), results ));
1664+ } catch (Exception ex ) {
1665+ return DaprException .wrapMono (ex );
1666+ }
1667+ }
16641668
1665- if (conversationRequestAlpha2 .getToolChoice () != null ) {
1666- protosConversationRequestBuilder .setToolChoice (conversationRequestAlpha2 .getToolChoice ());
1667- }
1669+ private DaprProtos .ConversationRequestAlpha2 buildConversationRequestProto (ConversationRequestAlpha2 request ) {
1670+ DaprProtos .ConversationRequestAlpha2 .Builder builder = DaprProtos .ConversationRequestAlpha2
1671+ .newBuilder ()
1672+ .setTemperature (request .getTemperature ())
1673+ .setScrubPii (request .isScrubPii ())
1674+ .setName (request .getName ());
16681675
1669- if (conversationRequestAlpha2 .getTools () != null ) {
1670- for (ConversationTools tool : conversationRequestAlpha2 .getTools ()) {
1676+ if (request .getContextId () != null ) {
1677+ builder .setContextId (request .getContextId ());
1678+ }
16711679
1672- ConversationFunction conversationFunction = tool .getFunction ();
1680+ if (request .getToolChoice () != null ) {
1681+ builder .setToolChoice (request .getToolChoice ());
1682+ }
16731683
1674- Map <String , Any > protosConversationToolFunctionParameters = conversationFunction .getParameters ()
1675- .entrySet ().stream ()
1676- .collect (Collectors .toMap (
1677- Map .Entry ::getKey ,
1678- e -> Any .pack ((Message ) e .getValue ())
1679- ));
1680- DaprProtos .ConversationToolsFunction protosConversationToolsFunction =
1681- DaprProtos .ConversationToolsFunction .newBuilder ()
1682- .setName (conversationFunction .getName ())
1683- .setDescription (conversationFunction .getDescription ())
1684- .putAllParameters (protosConversationToolFunctionParameters )
1685- .build ();
1684+ if (request .getTools () != null ) {
1685+ buildConversationTools (request .getTools (), builder );
1686+ }
16861687
1687- DaprProtos .ConversationTools conversationTool = DaprProtos .ConversationTools .newBuilder ()
1688- .setFunction (protosConversationToolsFunction ).build ();
1688+ for (ConversationInputAlpha2 input : request .getInputs ()) {
1689+ DaprProtos .ConversationInputAlpha2 .Builder inputBuilder = DaprProtos .ConversationInputAlpha2
1690+ .newBuilder ()
1691+ .setScrubPii (input .isScrubPii ());
16891692
1690- protosConversationRequestBuilder .addTools (conversationTool );
1693+ if (input .getMessages () != null ) {
1694+ for (ConversationMessage message : input .getMessages ()) {
1695+ DaprProtos .ConversationMessage protoMessage = buildConversationMessage (message );
1696+ inputBuilder .addMessages (protoMessage );
16911697 }
16921698 }
16931699
1694- for (ConversationInputAlpha2 input : conversationRequestAlpha2 .getInputs ()) {
1695- DaprProtos .ConversationInputAlpha2 .Builder conversationInputBuilder = DaprProtos .ConversationInputAlpha2
1696- .newBuilder ()
1697- .setScrubPii (input .isScrubPii ());
1698-
1699- if (input .getMessages () != null ) {
1700-
1701- for (ConversationMessage conversationMessage : input .getMessages ()) {
1702- DaprProtos .ConversationMessage .Builder messageBuilder =
1703- DaprProtos .ConversationMessage .newBuilder ();
1704-
1705- ConversationMessage .Role role = conversationMessage .getRole ();
1706- switch (role ) {
1707- case TOOL :
1708- messageBuilder .setOfTool (DaprProtos .ConversationMessageOfTool .newBuilder ()
1709- .setToolId (conversationMessage .getToolId ())
1710- .setName (conversationMessage .getName ())
1711- .addAllContent (getConversationMessageContent (conversationMessage )).build ());
1712- break ;
1713- case USER :
1714- messageBuilder .setOfUser (DaprProtos .ConversationMessageOfUser .newBuilder ()
1715- .setName (conversationMessage .getName ())
1716- .addAllContent (getConversationMessageContent (conversationMessage )).build ());
1717- break ;
1718- case ASSISTANT :
1719- messageBuilder .setOfAssistant (DaprProtos .ConversationMessageOfAssistant .newBuilder ()
1720- .setName (conversationMessage .getName ())
1721- .addAllToolCalls (getConversationToolCalls (conversationMessage ))
1722- .addAllContent (getConversationMessageContent (conversationMessage )).build ());
1723- break ;
1724- case DEVELOPER :
1725- messageBuilder .setOfDeveloper (DaprProtos .ConversationMessageOfDeveloper .newBuilder ()
1726- .setName (conversationMessage .getName ())
1727- .addAllContent (getConversationMessageContent (conversationMessage )).build ());
1728- break ;
1729- case SYSTEM :
1730- messageBuilder .setOfSystem (DaprProtos .ConversationMessageOfSystem .newBuilder ()
1731- .setName (conversationMessage .getName ())
1732- .addAllContent (getConversationMessageContent (conversationMessage )).build ());
1733- break ;
1734- default : throw new IllegalArgumentException ("No role of type " + role + " found" );
1735- }
1736-
1737- conversationInputBuilder .addMessages (messageBuilder .build ());
1738- }
1739- }
1700+ builder .addInputs (inputBuilder .build ());
1701+ }
1702+
1703+ return builder .build ();
1704+ }
1705+
1706+ private void buildConversationTools (List <ConversationTools > tools ,
1707+ DaprProtos .ConversationRequestAlpha2 .Builder builder ) {
1708+ for (ConversationTools tool : tools ) {
1709+ ConversationFunction function = tool .getFunction ();
1710+
1711+ Map <String , Any > protoParameters = function .getParameters ()
1712+ .entrySet ().stream ()
1713+ .collect (Collectors .toMap (
1714+ Map .Entry ::getKey ,
1715+ e -> Any .pack ((Message ) e .getValue ())
1716+ ));
1717+
1718+ DaprProtos .ConversationToolsFunction protoFunction = DaprProtos .ConversationToolsFunction .newBuilder ()
1719+ .setName (function .getName ())
1720+ .setDescription (function .getDescription ())
1721+ .putAllParameters (protoParameters )
1722+ .build ();
1723+
1724+ builder .addTools (DaprProtos .ConversationTools .newBuilder ()
1725+ .setFunction (protoFunction )
1726+ .build ());
1727+ }
1728+ }
17401729
1741- protosConversationRequestBuilder .addInputs (conversationInputBuilder .build ());
1742- }
1730+ private DaprProtos .ConversationMessage buildConversationMessage (ConversationMessage message ) {
1731+ DaprProtos .ConversationMessage .Builder messageBuilder = DaprProtos .ConversationMessage .newBuilder ();
1732+
1733+ switch (message .getRole ()) {
1734+ case TOOL :
1735+ messageBuilder .setOfTool (DaprProtos .ConversationMessageOfTool .newBuilder ()
1736+ .setToolId (message .getToolId ()).setName (message .getName ())
1737+ .addAllContent (getConversationMessageContent (message )).build ());
1738+ break ;
1739+ case USER :
1740+ messageBuilder .setOfUser (DaprProtos .ConversationMessageOfUser .newBuilder ()
1741+ .setName (message .getName ()).addAllContent (getConversationMessageContent (message )).build ());
1742+ break ;
1743+ case ASSISTANT :
1744+ messageBuilder .setOfAssistant (DaprProtos .ConversationMessageOfAssistant .newBuilder ()
1745+ .setName (message .getName ()).addAllToolCalls (getConversationToolCalls (message ))
1746+ .addAllContent (getConversationMessageContent (message )).build ());
1747+ break ;
1748+ case DEVELOPER :
1749+ messageBuilder .setOfDeveloper (DaprProtos .ConversationMessageOfDeveloper .newBuilder ()
1750+ .setName (message .getName ()).addAllContent (getConversationMessageContent (message )).build ());
1751+ break ;
1752+ case SYSTEM :
1753+ messageBuilder .setOfSystem (DaprProtos .ConversationMessageOfSystem .newBuilder ()
1754+ .setName (message .getName ()).addAllContent (getConversationMessageContent (message )).build ());
1755+ break ;
1756+ default :
1757+ throw new IllegalArgumentException ("No role of type " + message .getRole () + " found" );
1758+ }
17431759
1744- Mono <DaprProtos .ConversationResponseAlpha2 > conversationResponseMono = Mono .deferContextual (
1745- context -> this .createMono (
1746- it -> intercept (context , asyncStub )
1747- .converseAlpha2 (protosConversationRequestBuilder .build (), it )
1748- )
1749- );
1760+ return messageBuilder .build ();
1761+ }
17501762
1751- return conversationResponseMono .map (conversationResponse -> {
1752- List <ConversationResultAlpha2 > results = new ArrayList <>();
1763+ private List <ConversationResultAlpha2 > buildConversationResults (
1764+ List <DaprProtos .ConversationResultAlpha2 > protoResults ) {
1765+ List <ConversationResultAlpha2 > results = new ArrayList <>();
1766+
1767+ for (DaprProtos .ConversationResultAlpha2 protoResult : protoResults ) {
1768+ List <ConversationResultChoices > choices = new ArrayList <>();
17531769
1754- for (DaprProtos .ConversationResultAlpha2 result : conversationResponse .getOutputsList ()) {
1755- List <ConversationResultChoices > choices = new ArrayList <>();
1756-
1757- for (DaprProtos .ConversationResultChoices choice : result .getChoicesList ()) {
1758- ConversationResultMessage message = null ;
1759- if (choice .hasMessage ()) {
1760- List <ConversationToolCalls > toolCalls = new ArrayList <>();
1761-
1762- for (DaprProtos .ConversationToolCalls toolCall : choice .getMessage ().getToolCallsList ()) {
1763- ConversationToolCallsFunction function = null ;
1764- if (toolCall .hasFunction ()) {
1765- function = new ConversationToolCallsFunction (
1766- toolCall .getFunction ().getName (),
1767- toolCall .getFunction ().getArguments ()
1768- );
1769- }
1770-
1771- toolCalls .add (new ConversationToolCalls (toolCall .getId (), function ));
1772- }
1773-
1774- message = new ConversationResultMessage (
1775- choice .getMessage ().getContent (),
1776- toolCalls
1777- );
1778- }
1770+ for (DaprProtos .ConversationResultChoices protoChoice : protoResult .getChoicesList ()) {
1771+ ConversationResultMessage message = buildConversationResultMessage (protoChoice );
1772+ choices .add (new ConversationResultChoices (protoChoice .getFinishReason (), protoChoice .getIndex (), message ));
1773+ }
17791774
1780- choices .add (new ConversationResultChoices ( choice . getFinishReason (), choice . getIndex (), message ));
1781- }
1782-
1783- results . add ( new ConversationResultAlpha2 ( choices )) ;
1784- }
1775+ results .add (new ConversationResultAlpha2 ( choices ));
1776+ }
1777+
1778+ return results ;
1779+ }
17851780
1786- return new ConversationResponseAlpha2 (conversationResponse .getContextId (), results );
1787- });
1788- } catch (Exception ex ) {
1789- return DaprException .wrapMono (ex );
1781+ private ConversationResultMessage buildConversationResultMessage (DaprProtos .ConversationResultChoices protoChoice ) {
1782+ if (!protoChoice .hasMessage ()) {
1783+ return null ;
1784+ }
1785+
1786+ List <ConversationToolCalls > toolCalls = new ArrayList <>();
1787+
1788+ for (DaprProtos .ConversationToolCalls protoToolCall : protoChoice .getMessage ().getToolCallsList ()) {
1789+ ConversationToolCallsFunction function = null ;
1790+ if (protoToolCall .hasFunction ()) {
1791+ function = new ConversationToolCallsFunction (
1792+ protoToolCall .getFunction ().getName (),
1793+ protoToolCall .getFunction ().getArguments ()
1794+ );
1795+ }
1796+
1797+ toolCalls .add (new ConversationToolCalls (protoToolCall .getId (), function ));
17901798 }
1799+
1800+ return new ConversationResultMessage (
1801+ protoChoice .getMessage ().getContent (),
1802+ toolCalls
1803+ );
17911804 }
17921805
17931806 private List <DaprProtos .ConversationMessageContent > getConversationMessageContent (
0 commit comments