}), false);
caps_.supports_tools = contains(out, "some_tool");
+ auto out_empty = try_raw_render(json::array({dummy_user_msg, {{"role", "assistant"}, {"content", ""}}}), {}, false);
+ auto out_null = try_raw_render(json::array({dummy_user_msg, {{"role", "assistant"}, {"content", nullptr}}}), {}, false);
+ caps_.requires_non_null_content = contains(out_empty, user_needle) && !contains(out_null, user_needle);
+
+ json j_null;
auto make_tool_calls_msg = [&](const json & tool_calls) {
return json {
{"role", "assistant"},
- {"content", nullptr},
+ {"content", caps_.requires_non_null_content? "" : j_null},
{"tool_calls", tool_calls},
};
};
caps_.supports_tool_calls = tool_call_renders_str_arguments || tool_call_renders_obj_arguments;
caps_.requires_object_arguments = !tool_call_renders_str_arguments && tool_call_renders_obj_arguments;
- auto out_empty = try_raw_render(json::array({dummy_user_msg, {{"role", "assistant"}, {"content", ""}}}), {}, false);
- auto out_null = try_raw_render(json::array({dummy_user_msg, {{"role", "assistant"}, {"content", nullptr}}}), {}, false);
- caps_.requires_non_null_content = contains(out_empty, user_needle) && !contains(out_null, user_needle);
if (caps_.supports_tool_calls) {
auto dummy_args = caps_.requires_object_arguments ? dummy_args_obj : json(dummy_args_obj.dump());
};
const json tool_call_msg {
{"role", "assistant"},
- {"content", nullptr},
+ {"content", caps_.requires_non_null_content ? "" : j_null},
{"tool_calls", json::array({
{
// TODO: detect if requires numerical id or fixed length == 6 like Nemo
case Op::Gt: return l > r;
case Op::Le: return l <= r;
case Op::Ge: return l >= r;
- case Op::In: return (r.is_array() || r.is_object()) && r.contains(l);
- case Op::NotIn: return !(r.is_array() && r.contains(l));
+ case Op::In: return (((r.is_array() || r.is_object()) && r.contains(l)) ||
+ (l.is_string() && r.is_string() &&
+ r.to_str().find(l.to_str()) != std::string::npos));
+ case Op::NotIn:
+ return !(((r.is_array() || r.is_object()) && r.contains(l)) ||
+ (l.is_string() && r.is_string() &&
+ r.to_str().find(l.to_str()) != std::string::npos));
default: break;
}
throw std::runtime_error("Unknown binary operator");
else res[i] = std::tolower(res[i]);
}
return res;
+ } else if (method->get_name() == "replace") {
+ vargs.expectArgs("replace method", {2, 3}, {0, 0});
+ auto before = vargs.args[0].get<std::string>();
+ auto after = vargs.args[1].get<std::string>();
+ auto count = vargs.args.size() == 3 ? vargs.args[2].get<int64_t>()
+ : str.length();
+ size_t start_pos = 0;
+ while ((start_pos = str.find(before, start_pos)) != std::string::npos &&
+ count-- > 0) {
+ str.replace(start_pos, before.length(), after);
+ start_pos += after.length();
+ }
+ return str;
}
}
throw std::runtime_error("Unknown method: " + method->get_name());
}
}
- if ((has_first_colon || has_second_colon) && (start || end || step)) {
+ if ((has_first_colon || has_second_colon)) {
index = std::make_shared<SliceExpr>(slice_loc, std::move(start), std::move(end), std::move(step));
} else {
index = std::move(start);