@@ -44,6 +44,35 @@ private class ToolCallAccumulator {
4444 public StringBuilder Arguments { get ; } = new StringBuilder ( ) ;
4545 }
4646
47+ internal static string NormalizeToolCallId ( string toolCallId ) {
48+ return string . IsNullOrWhiteSpace ( toolCallId )
49+ ? $ "call_{ Guid . NewGuid ( ) : N} "
50+ : toolCallId . Trim ( ) ;
51+ }
52+
53+ internal static string NormalizeToolCallName ( string toolCallName ) {
54+ return string . IsNullOrWhiteSpace ( toolCallName )
55+ ? "unknown"
56+ : toolCallName . Trim ( ) ;
57+ }
58+
59+ internal static string NormalizeToolCallArguments ( string argumentsJson ) {
60+ return string . IsNullOrWhiteSpace ( argumentsJson ) ? "{}" : argumentsJson ;
61+ }
62+
63+ internal static Dictionary < string , string > DeserializeToolArgumentsForDisplay ( string argumentsJson ) {
64+ try {
65+ var normalized = NormalizeToolCallArguments ( argumentsJson ) ;
66+ var values = JsonConvert . DeserializeObject < Dictionary < string , object > > ( normalized ) ;
67+ return values ? . ToDictionary (
68+ kvp => kvp . Key ,
69+ kvp => kvp . Value ? . ToString ( ) ?? string . Empty )
70+ ?? new Dictionary < string , string > ( ) ;
71+ } catch {
72+ return new Dictionary < string , string > ( ) ;
73+ }
74+ }
75+
4776 private readonly ILogger < OpenAIService > _logger ;
4877 public static string _botName ;
4978 public string BotName {
@@ -1022,13 +1051,16 @@ private async IAsyncEnumerable<string> ExecWithNativeToolCallingAsync(
10221051 // Build the assistant message with tool calls
10231052 chatToolCalls = new List < ChatToolCall > ( ) ;
10241053 foreach ( var ( index , acc ) in toolCallAccumulators ) {
1025- if ( acc . Id == null ) {
1054+ if ( string . IsNullOrWhiteSpace ( acc . Id ) ) {
10261055 _logger . LogWarning ( "{ServiceName}: Tool call at index {Index} has no ID, generating fallback." , ServiceName , index ) ;
10271056 }
1057+ var toolCallId = NormalizeToolCallId ( acc . Id ) ;
1058+ var toolName = NormalizeToolCallName ( acc . Name ) ;
1059+ var argumentsJson = NormalizeToolCallArguments ( acc . Arguments . ToString ( ) ) ;
10281060 chatToolCalls . Add ( ChatToolCall . CreateFunctionToolCall (
1029- acc . Id ?? $ "call_ { Guid . NewGuid ( ) : N } " ,
1030- acc . Name ?? "unknown" ,
1031- BinaryData . FromString ( acc . Arguments . Length > 0 ? acc . Arguments . ToString ( ) : "{}" ) ) ) ;
1061+ toolCallId ,
1062+ toolName ,
1063+ BinaryData . FromString ( argumentsJson ) ) ) ;
10321064 }
10331065
10341066 var assistantMessage = new AssistantChatMessage ( chatToolCalls ) ;
@@ -1041,15 +1073,13 @@ private async IAsyncEnumerable<string> ExecWithNativeToolCallingAsync(
10411073
10421074 var toolIndicators = new StringBuilder ( ) ;
10431075 foreach ( var toolCall in chatToolCalls ) {
1044- var argsJson = toolCall . FunctionArguments ? . ToString ( ) ?? "{}" ;
1045- var argsDict = JsonConvert . DeserializeObject < Dictionary < string , string > > ( argsJson )
1046- ?? new Dictionary < string , string > ( ) ;
1076+ var argsDict = DeserializeToolArgumentsForDisplay ( toolCall . FunctionArguments ? . ToString ( ) ) ;
10471077 toolIndicators . Append ( McpToolHelper . FormatToolCallDisplay ( toolCall . FunctionName , argsDict ) ) ;
10481078 }
10491079 currentMessageContentBuilder . Append ( toolIndicators . ToString ( ) ) ;
10501080 } catch ( Exception ex ) {
10511081 _logger . LogError ( ex , "{ServiceName}: Error building tool calls, returning error to LLM for self-correction" , ServiceName ) ;
1052- var errorMsg = $ "Error processing tool call: { ex . Message } . Please check your tool call parameters and try again.";
1082+ const string errorMsg = "Tool call failed before execution due to malformed tool metadata. Please verify the tool name and parameters, then try again.";
10531083 providerHistory . Add ( new UserChatMessage ( errorMsg ) ) ;
10541084 continue ;
10551085 }
@@ -1065,7 +1095,7 @@ private async IAsyncEnumerable<string> ExecWithNativeToolCallingAsync(
10651095 string toolResultString ;
10661096 try {
10671097 // Parse arguments from JSON
1068- var argsJson = toolCall . FunctionArguments ? . ToString ( ) ?? "{}" ;
1098+ var argsJson = NormalizeToolCallArguments ( toolCall . FunctionArguments ? . ToString ( ) ) ;
10691099 var argsDict = JsonConvert . DeserializeObject < Dictionary < string , string > > ( argsJson )
10701100 ?? new Dictionary < string , string > ( ) ;
10711101
0 commit comments