33from dataclasses import dataclass
44from typing import Any , Dict , List , Optional
55
6+ from sglang_tool_parser import parse_tools
67from tau_bench .agents .tool_calling_agent import RESPOND_ACTION_NAME
78from tau_bench .types import Action
89
9- from sglang_tool_parser import parse_tools
10-
1110# Set up logger for this module
1211logger = logging .getLogger (__name__ )
1312
1413
1514@dataclass
1615class OpenAIToolCall :
1716 """OpenAI format tool call structure"""
17+
1818 id : str
1919 type : str = "function"
2020 function : Dict [str , Any ] = None
@@ -23,6 +23,7 @@ class OpenAIToolCall:
2323@dataclass
2424class OpenAIAssistantMessage :
2525 """OpenAI format assistant message structure"""
26+
2627 role : str = "assistant"
2728 content : Optional [str ] = None
2829 tool_calls : Optional [List [OpenAIToolCall ]] = None
@@ -36,8 +37,7 @@ class OpenAICompatibleToolCallAdapter:
3637 and provides OpenAI format output interface.
3738 """
3839
39- def __init__ (self , tools_info : List [Dict [str , Any ]],
40- parser_type : str = "qwen25" ):
40+ def __init__ (self , tools_info : List [Dict [str , Any ]], parser_type : str = "qwen25" ):
4141 """
4242 Initialize adapter
4343
@@ -48,10 +48,7 @@ def __init__(self, tools_info: List[Dict[str, Any]],
4848 self .tools_info = tools_info
4949 self .parser_type = parser_type
5050
51- def parse_response_to_openai_format (
52- self ,
53- response : str
54- ) -> Dict [str , Any ]:
51+ def parse_response_to_openai_format (self , response : str ) -> Dict [str , Any ]:
5552 """
5653 Parse sglang response to OpenAI compatible format
5754
@@ -69,33 +66,19 @@ def parse_response_to_openai_format(
6966 parsed = parse_tools (response , self .tools_info , self .parser_type )
7067
7168 # Extract parsing results
72- normal_text = parsed [' normal_text' ]
73- calls = parsed [' calls' ]
69+ normal_text = parsed [" normal_text" ]
70+ calls = parsed [" calls" ]
7471
7572 # Convert to OpenAI format
76- openai_message = self ._convert_to_openai_message (
77- normal_text , calls )
73+ openai_message = self ._convert_to_openai_message (normal_text , calls )
7874
79- return {
80- "openai_message" : openai_message ,
81- "parsed_result" : parsed ,
82- "success" : True
83- }
75+ return {"openai_message" : openai_message , "parsed_result" : parsed , "success" : True }
8476
8577 except Exception as e :
8678 logger .warning (f"Parsing failed with error: { str (e )} " )
87- return {
88- "openai_message" : None ,
89- "parsed_result" : None ,
90- "success" : False ,
91- "error" : str (e )
92- }
79+ return {"openai_message" : None , "parsed_result" : None , "success" : False , "error" : str (e )}
9380
94- def _convert_to_openai_message (
95- self ,
96- normal_text : str ,
97- calls : List [Dict [str , Any ]]
98- ) -> OpenAIAssistantMessage :
81+ def _convert_to_openai_message (self , normal_text : str , calls : List [Dict [str , Any ]]) -> OpenAIAssistantMessage :
9982 """
10083 Convert parsing results to OpenAI format assistant message
10184
@@ -108,61 +91,46 @@ def _convert_to_openai_message(
10891 """
10992 if not calls :
11093 # No tool calls, return plain text response
111- return OpenAIAssistantMessage (
112- role = "assistant" ,
113- content = normal_text ,
114- tool_calls = None
115- )
94+ return OpenAIAssistantMessage (role = "assistant" , content = normal_text , tool_calls = None )
11695
11796 # Convert tool calls to OpenAI format
11897 openai_tool_calls = []
11998 for i , call in enumerate (calls ):
12099 openai_tool_call = OpenAIToolCall (
121100 id = f"call_{ i } _{ call .get ('name' , 'unknown' )} " ,
122101 type = "function" ,
123- function = {
124- "name" : call .get ('name' , '' ),
125- "arguments" : call .get ('parameters' , '{}' )
126- }
102+ function = {"name" : call .get ("name" , "" ), "arguments" : call .get ("parameters" , "{}" )},
127103 )
128104 openai_tool_calls .append (openai_tool_call )
129105
130106 result = OpenAIAssistantMessage (
131- role = "assistant" ,
132- content = normal_text if normal_text .strip () else None ,
133- tool_calls = openai_tool_calls
107+ role = "assistant" , content = normal_text if normal_text .strip () else None , tool_calls = openai_tool_calls
134108 )
135109 return result
136110
137-
138- def _call_to_action_sglang (self , calls : List [Any ],
139- text_response : str ) -> Action :
111+ def _call_to_action_sglang (self , calls : List [Any ], text_response : str ) -> Action :
140112 """
141113 Convert sglang tool calls to Action object
142114
143115 This method replicates the original call_to_action_sglang logic,
144116 ensuring compatibility with existing code.
145117 """
146118 # Default action if no action found
147- action = Action (name = RESPOND_ACTION_NAME ,
148- kwargs = {"content" : text_response })
119+ action = Action (name = RESPOND_ACTION_NAME , kwargs = {"content" : text_response })
149120
150121 if calls :
151122 if len (calls ) > 1 :
152123 logger .debug ("Multiple tool calls identified, only taking first." )
153124
154125 tool_call = calls [0 ]
155-
126+
156127 try :
157128 params = json .loads (tool_call ["parameters" ])
158129
159130 if not isinstance (params , dict ):
160131 logger .warning (f"{ params } does not follow dict structure for action" )
161132 else :
162- action = Action (
163- name = tool_call ["name" ],
164- kwargs = params
165- )
133+ action = Action (name = tool_call ["name" ], kwargs = params )
166134 except json .JSONDecodeError as e :
167135 logger .warning (f"Failed to parse parameters as JSON: { e } " )
168136
@@ -180,21 +148,19 @@ def get_openai_tools_format(self) -> List[Dict[str, Any]]:
180148 openai_tool = {
181149 "type" : "function" ,
182150 "function" : {
183- "name" : tool [' function' ][ ' name' ],
184- "description" : tool [' function' ][ ' description' ],
185- "parameters" : tool [' function' ][ ' parameters' ]
186- }
151+ "name" : tool [" function" ][ " name" ],
152+ "description" : tool [" function" ][ " description" ],
153+ "parameters" : tool [" function" ][ " parameters" ],
154+ },
187155 }
188156 openai_tools .append (openai_tool )
189157
190158 return openai_tools
191159
192160
193-
194161# Usage examples and factory functions
195162def create_openai_adapter (
196- tools_info : List [Dict [str , Any ]],
197- parser_type : str = "qwen25"
163+ tools_info : List [Dict [str , Any ]], parser_type : str = "qwen25"
198164) -> OpenAICompatibleToolCallAdapter :
199165 """
200166 Factory function to create OpenAI compatible tool call adapter
0 commit comments