@@ -17,11 +17,11 @@ import (
1717
1818 "github.com/google/uuid"
1919 "github.com/launchdarkly/eventsource"
20+ "github.com/wavetermdev/waveterm/pkg/aiusechat/aiutil"
2021 "github.com/wavetermdev/waveterm/pkg/aiusechat/chatstore"
2122 "github.com/wavetermdev/waveterm/pkg/aiusechat/uctypes"
2223 "github.com/wavetermdev/waveterm/pkg/util/logutil"
2324 "github.com/wavetermdev/waveterm/pkg/util/utilfn"
24- "github.com/wavetermdev/waveterm/pkg/wcore"
2525 "github.com/wavetermdev/waveterm/pkg/web/sse"
2626)
2727
@@ -862,8 +862,7 @@ func handleOpenAIEvent(
862862 }
863863 if st := state .blockMap [ev .ItemId ]; st != nil && st .kind == openaiBlockToolUse {
864864 st .partialJSON = append (st .partialJSON , []byte (ev .Delta )... )
865- toolDef := state .chatOpts .GetToolDefinition (st .toolName )
866- sendToolProgress (st , toolDef , sse , st .partialJSON , true )
865+ aiutil .SendToolProgress (st .toolCallID , st .toolName , st .partialJSON , state .chatOpts , sse , true )
867866 }
868867 return nil , nil
869868
@@ -876,10 +875,9 @@ func handleOpenAIEvent(
876875
877876 // Get the function call info from the block state
878877 if st := state .blockMap [ev .ItemId ]; st != nil && st .kind == openaiBlockToolUse {
879- toolDef := state .chatOpts .GetToolDefinition (st .toolName )
880- toolUseData := createToolUseData (st .toolCallID , st .toolName , toolDef , ev .Arguments , state .chatOpts )
878+ toolUseData := aiutil .CreateToolUseData (st .toolCallID , st .toolName , ev .Arguments , state .chatOpts )
881879 state .toolUseData [st .toolCallID ] = toolUseData
882- sendToolProgress (st , toolDef , sse , []byte (ev .Arguments ), false )
880+ aiutil . SendToolProgress (st . toolCallID , st . toolName , []byte (ev .Arguments ), state . chatOpts , sse , false )
883881 }
884882 return nil , nil
885883
@@ -936,75 +934,6 @@ func handleOpenAIEvent(
936934 }
937935}
938936
939- func sendToolProgress (st * openaiBlockState , toolDef * uctypes.ToolDefinition , sse * sse.SSEHandlerCh , jsonData []byte , usePartialParse bool ) {
940- if toolDef == nil || toolDef .ToolProgressDesc == nil {
941- return
942- }
943- var parsedJSON any
944- var err error
945- if usePartialParse {
946- parsedJSON , err = utilfn .ParsePartialJson (jsonData )
947- } else {
948- err = json .Unmarshal (jsonData , & parsedJSON )
949- }
950- if err != nil {
951- return
952- }
953- statusLines , err := toolDef .ToolProgressDesc (parsedJSON )
954- if err != nil {
955- return
956- }
957- progressData := & uctypes.UIMessageDataToolProgress {
958- ToolCallId : st .toolCallID ,
959- ToolName : st .toolName ,
960- StatusLines : statusLines ,
961- }
962- _ = sse .AiMsgData ("data-toolprogress" , "progress-" + st .toolCallID , progressData )
963- }
964-
965- func createToolUseData (toolCallID , toolName string , toolDef * uctypes.ToolDefinition , arguments string , chatOpts uctypes.WaveChatOpts ) * uctypes.UIMessageDataToolUse {
966- toolUseData := & uctypes.UIMessageDataToolUse {
967- ToolCallId : toolCallID ,
968- ToolName : toolName ,
969- Status : uctypes .ToolUseStatusPending ,
970- }
971-
972- if toolDef == nil {
973- toolUseData .Status = uctypes .ToolUseStatusError
974- toolUseData .ErrorMessage = "tool not found"
975- return toolUseData
976- }
977-
978- var parsedArgs any
979- if err := json .Unmarshal ([]byte (arguments ), & parsedArgs ); err != nil {
980- toolUseData .Status = uctypes .ToolUseStatusError
981- toolUseData .ErrorMessage = fmt .Sprintf ("failed to parse tool arguments: %v" , err )
982- return toolUseData
983- }
984-
985- if toolDef .ToolCallDesc != nil {
986- toolUseData .ToolDesc = toolDef .ToolCallDesc (parsedArgs , nil , nil )
987- }
988-
989- if toolDef .ToolApproval != nil {
990- toolUseData .Approval = toolDef .ToolApproval (parsedArgs )
991- }
992-
993- if chatOpts .TabId != "" {
994- if argsMap , ok := parsedArgs .(map [string ]any ); ok {
995- if widgetId , ok := argsMap ["widget_id" ].(string ); ok && widgetId != "" {
996- ctx , cancelFn := context .WithTimeout (context .Background (), 2 * time .Second )
997- defer cancelFn ()
998- fullBlockId , err := wcore .ResolveBlockIdFromPrefix (ctx , chatOpts .TabId , widgetId )
999- if err == nil {
1000- toolUseData .BlockId = fullBlockId
1001- }
1002- }
1003- }
1004- }
1005-
1006- return toolUseData
1007- }
1008937
1009938// extractMessageAndToolsFromResponse extracts the final OpenAI message and tool calls from the completed response
1010939func extractMessageAndToolsFromResponse (resp openaiResponse , state * openaiStreamingState ) ([]* OpenAIChatMessage , []uctypes.WaveToolCall ) {
0 commit comments