@@ -66,6 +66,7 @@ def _terminal_supports_unicode() -> bool:
6666else : _SPINNER_FRAMES = ["/" , "-" , "\\ " , "|" ]; _BAR_FILL = "#" ; _BAR_EMPTY = "." ; _CHECK = "+" ; _CIRCLE = "o" ; _HALF = ">" ; _BOX_TL = "+" ; _BOX_H = "-" ; _BOX_BL = "+" ; _BOX_V = "|" ; _DOT = "." ; _NBHYPHEN = "-"
6767
6868import ast
69+ import html
6970import json
7071import os
7172import queue
@@ -3658,6 +3659,26 @@ def _add(data: dict) -> None:
36583659 and len (obj ) <= 3 ): # action, args + optionally one more key
36593660 _add (obj )
36603661
3662+ marker = r"(?:||DSML||||DSML||\|\|DSML\|\||\|DSML\|)"
3663+ invoke_pattern = re .compile (
3664+ rf"<{ marker } \s*invoke\s+name=[\"'](?P<name>[^\"']+)[\"'][^>]*>"
3665+ rf"(?P<body>[\s\S]*?)</{ marker } \s*invoke\s*>" ,
3666+ re .IGNORECASE ,
3667+ )
3668+ parameter_pattern = re .compile (
3669+ rf"<{ marker } \s*parameter\s+name=[\"'](?P<name>[^\"']+)[\"'][^>]*>"
3670+ rf"(?P<value>[\s\S]*?)</{ marker } \s*parameter\s*>" ,
3671+ re .IGNORECASE ,
3672+ )
3673+ for invoke in invoke_pattern .finditer (text ):
3674+ parameters = list (parameter_pattern .finditer (invoke .group ("body" )))
3675+ raw_action = invoke .group ("name" ).strip ().lower ()
3676+ if (len (parameters ) == 1 and parameters [0 ].group ("name" ).strip ().lower () == "args"
3677+ and _is_valid_action (raw_action )):
3678+ args = html .unescape (parameters [0 ].group ("value" ).strip ())
3679+ if args :
3680+ _add ({"action" : TOOL_ALIASES .get (raw_action , raw_action ), "args" : args })
3681+
36613682 for data in _collect_unwrapped_tool_calls (text )[0 ]:
36623683 if _is_valid_action (data .get ("action" )):
36633684 _add (data )
0 commit comments