2727}
2828
2929
30+ def process_messages (messages ):
31+ processed_messages = []
32+ last_tool_id = 0
33+
34+ i = 0
35+ while i < len (messages ):
36+ message = messages [i ]
37+
38+ if message .get ("function_call" ):
39+ last_tool_id += 1
40+ tool_id = f"toolu_{ last_tool_id } "
41+
42+ # Convert function_call to tool_calls
43+ function = message .pop ("function_call" )
44+ message ["tool_calls" ] = [
45+ {"id" : tool_id , "type" : "function" , "function" : function }
46+ ]
47+ processed_messages .append (message )
48+
49+ # Process the next message if it's a function response
50+ if i + 1 < len (messages ) and messages [i + 1 ].get ("role" ) == "function" :
51+ next_message = messages [i + 1 ].copy ()
52+ next_message ["role" ] = "tool"
53+ next_message ["tool_call_id" ] = tool_id
54+ processed_messages .append (next_message )
55+ i += 1 # Skip the next message as we've already processed it
56+ else :
57+ # Add an empty tool response if there isn't one
58+ processed_messages .append (
59+ {"role" : "tool" , "tool_call_id" : tool_id , "content" : "" }
60+ )
61+
62+ elif message .get ("role" ) == "function" :
63+ # This handles orphaned function responses
64+ last_tool_id += 1
65+ tool_id = f"toolu_{ last_tool_id } "
66+
67+ # Add a tool call before this orphaned tool response
68+ processed_messages .append (
69+ {
70+ "role" : "assistant" ,
71+ "tool_calls" : [
72+ {
73+ "id" : tool_id ,
74+ "type" : "function" ,
75+ "function" : {
76+ "name" : "execute" ,
77+ "arguments" : "# Automated tool call to fetch more output, triggered by the user." ,
78+ },
79+ }
80+ ],
81+ }
82+ )
83+
84+ # Process the function response
85+ message ["role" ] = "tool"
86+ message ["tool_call_id" ] = tool_id
87+ processed_messages .append (message )
88+
89+ else :
90+ # For non-tool-related messages, just add them as is
91+ processed_messages .append (message )
92+
93+ i += 1
94+
95+ return processed_messages
96+
97+
3098def run_tool_calling_llm (llm , request_params ):
3199 ## Setup
32100
@@ -36,43 +104,72 @@ def run_tool_calling_llm(llm, request_params):
36104 ]
37105 request_params ["tools" ] = [tool_schema ]
38106
39- last_tool_id = 0
40- for i , message in enumerate (request_params ["messages" ]):
41- if "function_call" in message :
42- last_tool_id += 1
43- function = message .pop ("function_call" )
44- message ["tool_calls" ] = [
45- {
46- "id" : "toolu_" + str (last_tool_id ),
47- "type" : "function" ,
48- "function" : function ,
49- }
50- ]
51- if message ["role" ] == "function" :
52- if i != 0 and request_params ["messages" ][i - 1 ]["role" ] == "tool" :
53- request_params ["messages" ][i ]["content" ] += message ["content" ]
54- message = None
55- else :
56- message ["role" ] = "tool"
57- message ["tool_call_id" ] = "toolu_" + str (last_tool_id )
58-
59- request_params ["messages" ] = [m for m in request_params ["messages" ] if m != None ]
60-
61- new_messages = []
62- for i , message in enumerate (request_params ["messages" ]):
63- new_messages .append (message )
64- if "tool_calls" in message :
65- tool_call_id = message ["tool_calls" ][0 ]["id" ]
66- if not any (
67- m
68- for m in request_params ["messages" ]
69- if m .get ("role" ) == "tool" and m .get ("tool_call_id" ) == tool_call_id
70- ):
71- new_messages .append (
72- {"role" : "tool" , "tool_call_id" : tool_call_id , "content" : "" }
73- )
107+ import pprint
108+
109+ pprint .pprint (
110+ [str (m )[:600 ] if len (str (m )) > 1000 else m for m in request_params ["messages" ]]
111+ )
112+
113+ print ("PROCESSING" )
114+
115+ request_params ["messages" ] = process_messages (request_params ["messages" ])
116+
117+ # # This makes any role: tool have the ID of the last tool call
118+ # last_tool_id = 0
119+ # for i, message in enumerate(request_params["messages"]):
120+ # if "function_call" in message:
121+ # last_tool_id += 1
122+ # function = message.pop("function_call")
123+ # message["tool_calls"] = [
124+ # {
125+ # "id": "toolu_" + str(last_tool_id),
126+ # "type": "function",
127+ # "function": function,
128+ # }
129+ # ]
130+ # if message["role"] == "function":
131+ # if i != 0 and request_params["messages"][i - 1]["role"] == "tool":
132+ # request_params["messages"][i]["content"] += message["content"]
133+ # message = None
134+ # else:
135+ # message["role"] = "tool"
136+ # message["tool_call_id"] = "toolu_" + str(last_tool_id)
137+ # request_params["messages"] = [m for m in request_params["messages"] if m != None]
138+
139+ # This adds an empty tool response for any tool call without a tool response
140+ # new_messages = []
141+ # for i, message in enumerate(request_params["messages"]):
142+ # new_messages.append(message)
143+ # if "tool_calls" in message:
144+ # tool_call_id = message["tool_calls"][0]["id"]
145+ # if not any(
146+ # m
147+ # for m in request_params["messages"]
148+ # if m.get("role") == "tool" and m.get("tool_call_id") == tool_call_id
149+ # ):
150+ # new_messages.append(
151+ # {"role": "tool", "tool_call_id": tool_call_id, "content": ""}
152+ # )
153+ # request_params["messages"] = new_messages
154+
155+ # messages = request_params["messages"]
156+ # for i in range(len(messages)):
157+ # if messages[i]["role"] == "user" and isinstance(messages[i]["content"], list):
158+ # # Found an image from the user
159+ # image_message = messages[i]
160+ # j = i + 1
161+ # while j < len(messages) and messages[j]["role"] == "tool":
162+ # # Move the image down until it's after all the role: tools
163+ # j += 1
164+ # messages.insert(j, image_message)
165+ # del messages[i]
166+ # request_params["messages"] = messages
167+
168+ import pprint
74169
75- request_params ["messages" ] = new_messages
170+ pprint .pprint (
171+ [str (m )[:600 ] if len (str (m )) > 1000 else m for m in request_params ["messages" ]]
172+ )
76173
77174 # Add OpenAI's recommended function message
78175 # request_params["messages"][0][
0 commit comments