21#include <nlohmann/json.hpp>
33 "Continue. Batch multiple tool calls in one response when possible.";
42 static std::atomic<uint64_t> counter{0};
43 return "tc-" + std::to_string(counter.fetch_add(1, std::memory_order_relaxed));
65 auto calls = parse_dsml_function_calls(content);
67 calls = parse_xml_function_calls(content);
92std::vector<ToolCall> Nemotron3Adapter::parse_dsml_function_calls(
93 const std::string& content)
const
95 std::vector<ToolCall>
calls;
100 R
"re(<|DSML|invoke name="([^"]+)">([\s\S]*?)</|DSML|invoke>)re");
103 auto end = std::sregex_iterator();
108 tc.name = (*it)[1].str();
109 tc.arguments = extract_dsml_parameters((*
it)[2].
str());
110 calls.push_back(std::move(
tc));
112 logger->info(
"Parsed DSML invoke: {}",
calls.back().name);
128std::unordered_map<std::string, std::string> Nemotron3Adapter::extract_dsml_parameters(
131 std::unordered_map<std::string, std::string> arguments;
135 R
"re(<|DSML|parameter name="([^"]+)"\s+(?:string|int|bool|value)="([^"]*)"\s*/>)re");
138 auto end = std::sregex_iterator();
141 arguments[(*it)[1].str()] = (*it)[2].str();
153std::vector<ToolCall> Nemotron3Adapter::parse_xml_function_calls(
154 const std::string& content)
const
156 std::vector<ToolCall>
calls;
157 std::regex
func_pattern(R
"(<function=([^>]+)>([\s\S]*?)</function>)");
160 auto end = std::sregex_iterator();
168 if (
ns != std::string::npos) {
176 calls.push_back(std::move(
tc));
178 logger->info(
"Parsed XML tool call: {}",
func_name);
194std::unordered_map<std::string, std::string> Nemotron3Adapter::extract_xml_parameters(
213 const std::string& result)
const
217 msg.content =
"<tool_response>\n" + result +
234 nlohmann::json
tool_defs = nlohmann::json::array();
237 auto j = nlohmann::json::parse(
json_str);
239 {
"type",
"function"},
241 {
"name",
j.value(
"name",
"unknown")},
242 {
"description",
j.value(
"description",
"")},
243 {
"parameters",
j.value(
"inputSchema",
244 nlohmann::json::object())}
267 const std::vector<std::string>&
tool_jsons)
const
269 std::ostringstream out;
271 <<
"You may call one or more functions to assist with the user query.\n"
272 <<
"Put your final answer OUTSIDE of any tool calls.\n\n"
273 <<
"Here are the available tools:\n"
277 <<
"For each function call, emit a DSML invoke block:\n"
278 <<
"<|DSML|function_calls>\n"
279 <<
"<|DSML|invoke name=\"example.tool\">\n"
280 <<
"<|DSML|parameter name=\"param_name\" string=\"value\"/>\n"
281 <<
"</|DSML|invoke>\n"
282 <<
"</|DSML|function_calls>";
304std::string Nemotron3Adapter::clean_content(
const std::string& content)
const {
305 std::string
cleaned = std::regex_replace(content,
306 std::regex(R
"(<tool_call>\s*[\s\S]*?\s*</tool_call>)"), "");
308 std::regex(R
"(<function=[^>]+>[\s\S]*?</function>)"), "");
310 std::regex(R
"(<|DSML|function_calls>[\s\S]*?</|DSML|function_calls>)"), "");
312 std::regex(R
"(<|DSML|invoke[\s\S]*?</|DSML|invoke>)"), "");
314 std::regex(R
"(</?|[^>]*>)"), "");
std::vector< ToolCall > parse_tagged_tool_calls(const std::string &content) const
Parse <tool_call>JSON</tool_call> tagged blocks.
std::string strip_think_blocks(const std::string &content) const
Strip this family's reasoning blocks from content (gh#108).
std::string format_tools(const std::vector< std::string > &tool_jsons) const override
Format tools as a <tools> JSON array, then teach DSML invoke.
Message format_tool_result(const ToolCall &tool_call, const std::string &result) const override
Wrap tool result in <tool_response> tags.
ParseResult parse_tool_calls(const std::string &content) const override
Parse DSML invoke calls; fall back to qwen XML, then tagged JSON.
spdlog initialization and logger access.
ENTROPIC_EXPORT std::shared_ptr< spdlog::logger > get(const std::string &name)
Get or create a named logger.
Activate model on GPU (WARM → ACTIVE).
@ optional
optional: every escape asks the host's path approver
std::string generate_uuid()
Generate a UUID v4 string.
static nlohmann::json build_tool_defs(const std::vector< std::string > &tool_jsons)
Build the OpenAI-function <tools> JSON array for injection.
Nemotron 3 chat adapter (v2.1.9, gh#47).
A message in a conversation.
std::string role
Message role.
Parsed tool call result: cleaned content + extracted calls.
std::string cleaned_content
Content with tool calls removed.
std::vector< ToolCall > tool_calls
Extracted tool calls.
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....