14namespace entropic::inference::adapters {
23inline std::string
trim_ws(
const std::string&
s) {
24 auto first =
s.find_first_not_of(
" \t\n\r");
25 if (
first == std::string::npos) {
return {}; }
26 auto last =
s.find_last_not_of(
" \t\n\r");
36 static const std::regex
pat(R
"(<parameter=([^>]+)>)");
50 const std::string& body,
51 const std::shared_ptr<spdlog::logger>& logger) {
52 auto nested = body.find(
"<function=");
53 if (
nested == std::string::npos) {
return body; }
55 logger->warn(
"Truncating function body at nested <function= tag");
57 return body.substr(0,
nested);
72 const std::string& body,
size_t value_offset,
const std::string& key) {
77 if (
p_pos == std::string::npos &&
n_pos == std::string::npos) {
78 return {std::string::npos, 0};
90 std::unordered_map<std::string, std::string>& args,
91 const std::string& key,
93 const std::shared_ptr<spdlog::logger>& logger) {
97 logger->warn(
"Skipping empty XML parameter value: key='{}'", key);
101 args[key] = std::move(
value);
127 const std::shared_ptr<spdlog::logger>& logger) {
130 std::unordered_map<std::string, std::string> arguments;
139 static_cast<size_t>(std::distance(body.cbegin(),
value_begin));
142 if (logger) { logger->warn(
"Skipping <parameter=> with empty key"); }
148 if (
end_pos == std::string::npos) {
151 "Skipping <parameter={}> with no closing tag", key);
@ optional
optional: every escape asks the host's path approver
std::unordered_map< std::string, std::string > parse_xml_parameters(const std::string &func_body, const std::shared_ptr< spdlog::logger > &logger)
Extract <parameter=NAME>value</parameter> pairs from a function body.
Shared <parameter=NAME>value</parameter> extractor for XML-format chat adapters (Qwen 3....