if (!args_diff.empty() || pref.id != newf.id) {
auto & diff = diffs.emplace_back();
diff.tool_call_index = idx;
- diff.tool_call_delta.name = newf.name;
if (pref.id != newf.id) {
diff.tool_call_delta.id = newf.id;
+ diff.tool_call_delta.name = newf.name;
}
diff.tool_call_delta.arguments = args_diff;
}
delta["content"] = diff.content_delta;
}
if (diff.tool_call_index != std::string::npos) {
+ json tool_call;
+ tool_call["index"] = diff.tool_call_index;
+ if (!diff.tool_call_delta.id.empty()) {
+ tool_call["id"] = diff.tool_call_delta.id;
+ tool_call["type"] = "function";
+ }
json function = json::object();
if (!diff.tool_call_delta.name.empty()) {
function["name"] = diff.tool_call_delta.name;
}
- if (!diff.tool_call_delta.id.empty()) {
- function["id"] = diff.tool_call_delta.id;
- }
- if (!diff.tool_call_delta.arguments.empty()) {
- function["arguments"] = diff.tool_call_delta.arguments;
- }
- delta["tool_calls"] = json::array({
- json {
- {"index", diff.tool_call_index},
- {"function", function}
- }
- });
+ function["arguments"] = diff.tool_call_delta.arguments;
+ tool_call["function"] = function;
+ delta["tool_calls"] = json::array({tool_call});
}
return delta;
}
common_chat_msg_diff diff12;
diff12.tool_call_index = 0;
- diff12.tool_call_delta.name = "special_function";
- // Note: id doesnt change here.
+ // Note: neither id nor name change here.
diff12.tool_call_delta.arguments = "g1\": 1}";
assert_equals(
if 'function' not in tc:
raise ValueError(f"Expected function type, got {tc['type']}")
if tc['index'] >= len(tool_calls):
+ assert 'id' in tc
+ assert tc.get('type') == 'function'
+ assert 'function' in tc and 'name' in tc['function'] and len(tc['function']['name']) > 0, \
+ f"Expected function call with name, got {tc.get('function')}"
tool_calls.append(dict(
id="",
type="function",
if tc.get('id') is not None:
tool_call['id'] = tc['id']
fct = tc['function']
+ assert 'id' not in fct, f"Function call should not have id: {fct}"
if fct.get('name') is not None:
- tool_call['function']['name'] = fct['name']
+ tool_call['function']['name'] = tool_call['function'].get('name', '') + fct['name']
if fct.get('arguments') is not None:
- assert len(fct['arguments']) > 0, f'Expected non empty arguments delta!'
tool_call['function']['arguments'] += fct['arguments']
print(f'Streamed response had {content_parts} content parts, {tool_call_parts} tool call parts incl. {arguments_parts} arguments parts')