Skip to content

Commit 4479a29

Browse files
committed
Check fix
1 parent 90cd64c commit 4479a29

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

src/llm/io_processing/qwen3coder/qwen3coder_tool_parser.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ static const ParametersTypeMap_t parseToolSchema(const std::string& functionName
127127
return result;
128128
}
129129

130-
// helper function to escape \n
130+
// helper function to escape \n, "
131131
static std::string escapeString(const std::string& input) {
132132
std::string output;
133133
output.reserve(input.size());
@@ -136,6 +136,9 @@ static std::string escapeString(const std::string& input) {
136136
case '\n':
137137
output += "\\n";
138138
break;
139+
case '"':
140+
output += "\\\"";
141+
break;
139142
default:
140143
output += c;
141144
}
@@ -236,7 +239,9 @@ bool Qwen3CoderToolParserImpl::parseUntilStateChange(ToolCalls_t& toolCalls) {
236239
if (paramIt == this->toolsParametersTypeMap.end()) {
237240
SPDLOG_DEBUG("Tool schema not found for tool: {}, leaving parameter: {} as string", this->currentFunction.name, this->currentParameterName);
238241
} else {
239-
parameterValue = escapeString(setCorrectValueType(parameterValue, this->currentParameterName, paramIt->second));
242+
// we don't want to escape entry/exit " for string parameters
243+
auto escaped = escapeString(parameterValue);
244+
parameterValue =setCorrectValueType(escaped, this->currentParameterName, paramIt->second);
240245
}
241246
auto res = this->currentFunction.parameters.try_emplace(this->currentParameterName, parameterValue);
242247
if (!res.second)

src/test/llm/output_parsers/qwen3coder_output_parser_test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ END_VAR
642642
643643
END_FUNCTION</parameter>
644644
</function>
645-
</tool_call>)", ov::genai::GenerationFinishReason::NONE, R"({"delta":{"tool_calls":[{"index":5,"function":{"arguments":"{\"arg1\": \"FUNCTION FC_CreateJsonPayload : STRING\\nVAR_INPUT\\n Value1 : REAL;\\n Value2 : INT;\\n Value3 : BOOL;\\n Value4 : STRING(100);\\nEND_VAR\\nVAR_OUTPUT\\n JsonPayload : STRING(1000);\\nEND_VAR\\nVAR\\n TempStr : STRING(100);\\nEND_VAR\\n\\n JsonPayload := '{';\\n JsonPayload := JsonPayload + '\"value1\":' + REAL_TO_STRING(Value1, '', 2) + ',';\\n JsonPayload := JsonPayload + '\"value2\":' + INT_TO_STRING(Value2) + ',';\\n JsonPayload := JsonPayload + '\"value3\":' + BOOL_TO_STRING(Value3) + ',';\\n JsonPayload := JsonPayload + '\"value4\":\"' + Value4 + '\"';\\n JsonPayload := JsonPayload + '}';\\n\\nEND_FUNCTION\"}"}}]}})"},
645+
</tool_call>)", ov::genai::GenerationFinishReason::NONE, R"({"delta":{"tool_calls":[{"index":5,"function":{"arguments":"{\"arg1\": \"FUNCTION FC_CreateJsonPayload : STRING\\nVAR_INPUT\\n Value1 : REAL;\\n Value2 : INT;\\n Value3 : BOOL;\\n Value4 : STRING(100);\\nEND_VAR\\nVAR_OUTPUT\\n JsonPayload : STRING(1000);\\nEND_VAR\\nVAR\\n TempStr : STRING(100);\\nEND_VAR\\n\\n JsonPayload := '{';\\n JsonPayload := JsonPayload + '\\\"value1\\\":' + REAL_TO_STRING(Value1, '', 2) + ',';\\n JsonPayload := JsonPayload + '\\\"value2\\\":' + INT_TO_STRING(Value2) + ',';\\n JsonPayload := JsonPayload + '\\\"value3\\\":' + BOOL_TO_STRING(Value3) + ',';\\n JsonPayload := JsonPayload + '\\\"value4\\\":\\\"' + Value4 + '\\\"';\\n JsonPayload := JsonPayload + '}';\\n\\nEND_FUNCTION\"}"}}]}})"},
646646
{"<tool_call><function=string_tool><parameter=arg1>", ov::genai::GenerationFinishReason::NONE, R"({"delta":{"tool_calls":[{"id":"XXXXXXXXX","type":"function","index":6,"function":{"name":"string_tool"}}]}})"},
647647
{R"(
648648
if __name__ == "__main__":
@@ -651,7 +651,7 @@ if __name__ == "__main__":
651651
addresses["Arya"] = "Winterfell"
652652
for name, address in addresses.items():
653653
print(f'{name} lives at {address}')
654-
</parameter></function></tool_call>)", ov::genai::GenerationFinishReason::NONE, R"({"delta":{"tool_calls":[{"index":6,"function":{"arguments":"{\"arg1\": \"if __name__ == \"__main__\":\\n addresses = {}\\n addresses[\"Hodor\"] = \"\"\"The door\"\"\"\\n addresses[\"Arya\"] = \"Winterfell\"\\n for name, address in addresses.items():\\n print(f'{name} lives at {address}')\"}"}}]}})"}
654+
</parameter></function></tool_call>)", ov::genai::GenerationFinishReason::NONE, R"({"delta":{"tool_calls":[{"index":6,"function":{"arguments":"{\"arg1\": \"if __name__ == \\\"__main__\\\":\\n addresses = {}\\n addresses[\\\"Hodor\\\"] = \\\"\\\"\\\"The door\\\"\\\"\\\"\\n addresses[\\\"Arya\\\"] = \\\"Winterfell\\\"\\n for name, address in addresses.items():\\n print(f'{name} lives at {address}')\"}"}}]}})"}
655655
};
656656
for (const auto& [chunk, finishReason, expectedDelta] : chunkToDeltaVec) {
657657
i++;

0 commit comments

Comments
 (0)