* chat : split specialized parsers into common/parsers Move the 14 dedicated template parsers out of chat.cpp into one file each under common/parsers, mirroring the src/models split. chat.cpp keeps the template detection in common_chat_try_specialized_template() and drops from 3915 to 1513 lines. common/parsers/parsers.h holds the shared helpers and one declaration per parser. foreach_function/foreach_parameter become inline there since nothing in chat.cpp uses them any more; common_chat_template_direct_apply_impl and common_chat_template_generation_prompt_impl lose static and carry their default arguments in the header. Parser-specific helpers move with their parser: is_lfm2_template, deepseek_v4_sort_tool_results and the gemma4 turn builder. No functional change. Assisted-by: Claude Opus 5 * chat : enumerate parser sources instead of globbing file(GLOB) does not re-run CMake when a source file is added or removed, so an incremental build silently keeps building the old set. List the parsers in common/parsers/sources.cmake and include it from common/CMakeLists.txt. Assisted-by: Claude Opus 5 * split helpers, add newlines
35 lines
1.2 KiB
C++
35 lines
1.2 KiB
C++
#include "parsers.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include <set>
|
|
|
|
void foreach_function(const json & tools, const std::function<void(const json &)> & fn) {
|
|
for (const auto & tool : tools) {
|
|
if (!tool.contains("type") || tool.at("type") != "function" || !tool.contains("function")) {
|
|
LOG_INF("Skipping tool without function: %s", tool.dump(2).c_str());
|
|
continue;
|
|
}
|
|
fn(tool);
|
|
}
|
|
}
|
|
|
|
void foreach_parameter(const json & function, const std::function<void(const std::string &, const json &, bool)> & fn) {
|
|
if (!function.contains("parameters") || !function.at("parameters").is_object()) {
|
|
return;
|
|
}
|
|
const auto & params = function.at("parameters");
|
|
if (!params.contains("properties") || !params.at("properties").is_object()) {
|
|
return;
|
|
}
|
|
const auto & props = params.at("properties");
|
|
std::set<std::string> required;
|
|
if (params.contains("required") && params.at("required").is_array()) {
|
|
required = params.at("required").get<std::set<std::string>>();
|
|
}
|
|
for (const auto & [name, prop] : props.items()) {
|
|
bool is_required = (required.find(name) != required.end());
|
|
fn(name, prop, is_required);
|
|
}
|
|
}
|