mirror of
https://github.com/ggml-org/llama.cpp.git
synced 2025-06-27 12:05:03 +00:00
llama-chat : Do not throw when tool parsing fails (#14012)
Currently when a model generates output which looks like a tool call, but is invalid an exception is thrown and not handled, causing the cli or llama-server to bail. Instead, handle the chat parser exception and simply return the generated text in such cases. Signed-off-by: Piotr Stankiewicz <piotr.stankiewicz@docker.com>
This commit is contained in:
@ -49,6 +49,7 @@ bool common_chat_msg_parser::add_tool_call(const std::string & name, const std::
|
|||||||
|
|
||||||
// LOG_DBG("Tool call arguments:\n\traw: %s\n\tresult: %s\n", arguments.c_str(), tool_call.arguments.c_str());
|
// LOG_DBG("Tool call arguments:\n\traw: %s\n\tresult: %s\n", arguments.c_str(), tool_call.arguments.c_str());
|
||||||
result_.tool_calls.emplace_back(tool_call);
|
result_.tool_calls.emplace_back(tool_call);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool common_chat_msg_parser::add_tool_call(const json & tool_call) {
|
bool common_chat_msg_parser::add_tool_call(const json & tool_call) {
|
||||||
@ -378,3 +379,7 @@ std::optional<common_chat_msg_parser::consume_json_result> common_chat_msg_parse
|
|||||||
/* .is_partial = */ found_healing_marker,
|
/* .is_partial = */ found_healing_marker,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void common_chat_msg_parser::clear_tools() {
|
||||||
|
result_.tool_calls.clear();
|
||||||
|
}
|
||||||
|
@ -115,4 +115,6 @@ class common_chat_msg_parser {
|
|||||||
const std::vector<std::vector<std::string>> & args_paths = {},
|
const std::vector<std::vector<std::string>> & args_paths = {},
|
||||||
const std::vector<std::vector<std::string>> & content_paths = {}
|
const std::vector<std::vector<std::string>> & content_paths = {}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void clear_tools();
|
||||||
};
|
};
|
||||||
|
@ -1921,7 +1921,9 @@ common_chat_msg common_chat_parse(const std::string & input, bool is_partial, co
|
|||||||
} catch (const common_chat_msg_partial_exception & ex) {
|
} catch (const common_chat_msg_partial_exception & ex) {
|
||||||
LOG_DBG("Partial parse: %s\n", ex.what());
|
LOG_DBG("Partial parse: %s\n", ex.what());
|
||||||
if (!is_partial) {
|
if (!is_partial) {
|
||||||
throw std::runtime_error(ex.what());
|
builder.clear_tools();
|
||||||
|
builder.move_to(0);
|
||||||
|
common_chat_parse_content_only(builder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto msg = builder.result();
|
auto msg = builder.result();
|
||||||
|
Reference in New Issue
Block a user