Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
0334e67f
Unverified
Commit
0334e67f
authored
Oct 22, 2025
by
frob
Committed by
GitHub
Oct 22, 2025
Browse files
tools: parse tool calls that don't conform to ("name": name, "arguments": args} (#12738)
parent
e0ead1ad
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
34 additions
and
12 deletions
+34
-12
tools/tools.go
tools/tools.go
+14
-11
tools/tools_test.go
tools/tools_test.go
+20
-1
No files found.
tools/tools.go
View file @
0334e67f
...
...
@@ -125,7 +125,7 @@ func (p *Parser) parseToolCall() *api.ToolCall {
}
var
args
map
[
string
]
any
if
found
,
i
:=
findArguments
(
p
.
buffer
);
found
==
nil
{
if
found
,
i
:=
findArguments
(
tool
,
p
.
buffer
);
found
==
nil
{
return
nil
}
else
{
args
=
found
...
...
@@ -219,7 +219,7 @@ func findTool(tools []api.Tool, buf []byte) (*api.Tool, int) {
// objects for functions that have all-optional parameters
// e.g. `{"name": "get_conditions", "arguments": {}}` will work but
// `{"name": "get_conditions"}` will not currently work
func
findArguments
(
buffer
[]
byte
)
(
map
[
string
]
any
,
int
)
{
func
findArguments
(
tool
*
api
.
Tool
,
buffer
[]
byte
)
(
map
[
string
]
any
,
int
)
{
if
len
(
buffer
)
==
0
{
return
nil
,
0
}
...
...
@@ -269,27 +269,30 @@ func findArguments(buffer []byte) (map[string]any, int) {
var
findObject
func
(
obj
map
[
string
]
any
)
(
map
[
string
]
any
,
bool
)
findObject
=
func
(
obj
map
[
string
]
any
)
(
map
[
string
]
any
,
bool
)
{
if
_
,
hasName
:=
obj
[
"name"
];
hasName
{
if
args
,
ok
:=
obj
[
"arguments"
]
.
(
map
[
string
]
any
);
ok
{
findMap
:=
func
(
name
string
,
obj
map
[
string
]
any
)
(
map
[
string
]
any
,
bool
)
{
if
args
,
ok
:=
obj
[
name
]
.
(
map
[
string
]
any
);
ok
{
return
args
,
true
}
if
argsStr
,
ok
:=
obj
[
"arguments"
]
.
(
string
);
ok
{
if
argsStr
,
ok
:=
obj
[
name
]
.
(
string
);
ok
{
var
argsData
map
[
string
]
interface
{}
if
err
:=
json
.
Unmarshal
([]
byte
(
argsStr
),
&
argsData
);
err
==
nil
{
return
argsData
,
ok
}
}
if
args
,
ok
:=
obj
[
"parameters"
]
.
(
map
[
string
]
any
);
ok
{
return
nil
,
false
}
if
_
,
hasName
:=
obj
[
"name"
];
hasName
{
if
args
,
ok
:=
findMap
(
"arguments"
,
obj
);
ok
{
return
args
,
true
}
if
argsStr
,
ok
:=
obj
[
"parameters"
]
.
(
string
);
ok
{
var
argsData
map
[
string
]
interface
{}
if
err
:=
json
.
Unmarshal
([]
byte
(
argsStr
),
&
argsData
);
err
==
nil
{
return
argsData
,
ok
}
if
args
,
ok
:=
findMap
(
"parameters"
,
obj
);
ok
{
return
args
,
true
}
return
nil
,
true
}
if
args
,
ok
:=
findMap
(
tool
.
Function
.
Name
,
obj
);
ok
{
return
args
,
true
}
for
_
,
v
:=
range
obj
{
switch
child
:=
v
.
(
type
)
{
...
...
tools/tools_test.go
View file @
0334e67f
...
...
@@ -1033,6 +1033,7 @@ func TestFindArguments(t *testing.T) {
name
string
buffer
[]
byte
want
map
[
string
]
any
tool
string
}{
{
name
:
"empty string"
,
...
...
@@ -1290,11 +1291,29 @@ func TestFindArguments(t *testing.T) {
"location"
:
"San Francisco, CA"
,
},
},
{
name
:
"simple tool call"
,
tool
:
"get_temperature"
,
buffer
:
[]
byte
(
`{"get_temperature": {"format": "fahrenheit", "location": "San Francisco, CA"}}`
),
want
:
map
[
string
]
any
{
"format"
:
"fahrenheit"
,
"location"
:
"San Francisco, CA"
,
},
},
{
name
:
"stringified simple tool call"
,
tool
:
"get_temperature"
,
buffer
:
[]
byte
(
`{"get_temperature": "{\"format\": \"fahrenheit\", \"location\": \"San Francisco, CA\"}"}`
),
want
:
map
[
string
]
any
{
"format"
:
"fahrenheit"
,
"location"
:
"San Francisco, CA"
,
},
},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
got
,
_
:=
findArguments
(
tt
.
buffer
)
got
,
_
:=
findArguments
(
&
api
.
Tool
{
Function
:
api
.
ToolFunction
{
Name
:
tt
.
tool
}},
tt
.
buffer
)
if
diff
:=
cmp
.
Diff
(
got
,
tt
.
want
);
diff
!=
""
{
t
.
Errorf
(
"scanArguments() args mismatch (-got +want):
\n
%s"
,
diff
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment