mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-30 08:42:00 +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
	 Piotr
					Piotr