18#include <nlohmann/json.hpp>
30 "Continue. Batch multiple tool calls in one response when possible.";
39 static std::atomic<uint64_t> counter{0};
40 return "tc-" + std::to_string(counter.fetch_add(1, std::memory_order_relaxed));
61 auto calls = parse_xml_function_calls(content);
83std::vector<ToolCall> Qwen35Adapter::parse_xml_function_calls(
84 const std::string& content)
const
86 std::vector<ToolCall>
calls;
87 std::regex
func_pattern(R
"(<function=([^>]+)>([\s\S]*?)</function>)");
90 auto end = std::sregex_iterator();
99 if (
ns != std::string::npos) {
103 auto arguments = extract_xml_parameters(
func_body);
108 tc.arguments = std::move(arguments);
109 calls.push_back(std::move(
tc));
111 logger->info(
"Parsed XML tool call: {}",
func_name);
127std::unordered_map<std::string, std::string> Qwen35Adapter::extract_xml_parameters(
146 const std::string& result)
const
150 msg.content =
"<tool_response>\n" + result +
165 const std::vector<std::string>&
tool_jsons)
const
167 nlohmann::json
tool_defs = nlohmann::json::array();
171 auto j = nlohmann::json::parse(
json_str);
173 {
"type",
"function"},
175 {
"name",
j.value(
"name",
"unknown")},
176 {
"description",
j.value(
"description",
"")},
177 {
"parameters",
j.value(
"inputSchema",
178 nlohmann::json::object())}
186 std::ostringstream out;
188 <<
"You may call one or more functions to assist with the user query.\n"
189 <<
"Put your final answer OUTSIDE of any tool calls.\n\n"
190 <<
"Here are the available tools:\n"
194 <<
"For each function call, return within <tool_call></tool_call> XML tags:\n"
196 <<
"<function=example_function>\n"
197 <<
"<parameter=param_name>value</parameter>\n"
212std::string Qwen35Adapter::clean_content(
const std::string& content)
const {
214 std::string
cleaned = std::regex_replace(content,
215 std::regex(R
"(<tool_call>\s*[\s\S]*?\s*</tool_call>)"), "");
219 std::regex(R
"(<function=[^>]+>[\s\S]*?</function>)"), "");
230 "\n\nYou can see and analyze images. When the user shares an "
231 "image, describe what you observe before responding to their "
243 const std::string& base_system,
259 const std::vector<ContentPart>&
parts)
const {
virtual std::string format_content_parts(const std::vector< ContentPart > &parts) const
Convert multimodal content parts to adapter-specific format.
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 in <tools> tags with OpenAI function JSON.
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 XML function calls, fallback to tagged JSON.
std::string format_system_with_vision(const std::string &base_system, bool has_vision) const override
Qwen3.5 vision system prompt extension.
std::string format_content_parts(const std::vector< ContentPart > &parts) const override
Qwen3.5 content part formatting.
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).
static constexpr const char * VISION_INSTRUCTION
Vision instruction appended to system prompt.
@ optional
optional: every escape asks the host's path approver
@ tool_call
Render-derived (COMMON_GRAMMAR_TYPE_TOOL_CALLS, needs prefill)
std::string generate_uuid()
Generate a UUID v4 string.
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....