@@ -125,7 +125,7 @@ func (p *Parser) parseToolCall() *api.ToolCall {
125125 }
126126
127127 var args map [string ]any
128- if found , i := findArguments (p .buffer ); found == nil {
128+ if found , i := findArguments (tool , p .buffer ); found == nil {
129129 return nil
130130 } else {
131131 args = found
@@ -219,7 +219,7 @@ func findTool(tools []api.Tool, buf []byte) (*api.Tool, int) {
219219// objects for functions that have all-optional parameters
220220// e.g. `{"name": "get_conditions", "arguments": {}}` will work but
221221// `{"name": "get_conditions"}` will not currently work
222- func findArguments (buffer []byte ) (map [string ]any , int ) {
222+ func findArguments (tool * api. Tool , buffer []byte ) (map [string ]any , int ) {
223223 if len (buffer ) == 0 {
224224 return nil , 0
225225 }
@@ -269,27 +269,30 @@ func findArguments(buffer []byte) (map[string]any, int) {
269269
270270 var findObject func (obj map [string ]any ) (map [string ]any , bool )
271271 findObject = func (obj map [string ]any ) (map [string ]any , bool ) {
272- if _ , hasName := obj [ "name" ]; hasName {
273- if args , ok := obj ["arguments" ].(map [string ]any ); ok {
272+ findMap := func ( name string , obj map [ string ] any ) ( map [ string ] any , bool ) {
273+ if args , ok := obj [name ].(map [string ]any ); ok {
274274 return args , true
275275 }
276- if argsStr , ok := obj ["arguments" ].(string ); ok {
276+ if argsStr , ok := obj [name ].(string ); ok {
277277 var argsData map [string ]interface {}
278278 if err := json .Unmarshal ([]byte (argsStr ), & argsData ); err == nil {
279279 return argsData , ok
280280 }
281281 }
282- if args , ok := obj ["parameters" ].(map [string ]any ); ok {
282+ return nil , false
283+ }
284+ if _ , hasName := obj ["name" ]; hasName {
285+ if args , ok := findMap ("arguments" , obj ); ok {
283286 return args , true
284287 }
285- if argsStr , ok := obj ["parameters" ].(string ); ok {
286- var argsData map [string ]interface {}
287- if err := json .Unmarshal ([]byte (argsStr ), & argsData ); err == nil {
288- return argsData , ok
289- }
288+ if args , ok := findMap ("parameters" , obj ); ok {
289+ return args , true
290290 }
291291 return nil , true
292292 }
293+ if args , ok := findMap (tool .Function .Name , obj ); ok {
294+ return args , true
295+ }
293296
294297 for _ , v := range obj {
295298 switch child := v .(type ) {
0 commit comments