MCPcopy Create free account
hub / github.com/FastFlowLM/FastFlowLM / normalize_messages

Function normalize_messages

src/server/rest_handler.cpp:26–125  ·  view source on GitHub ↗

@brief Normalize messages by merging consecutive user messages (like Ollama does) @param messages the original messages @return normalized messages with consecutive user messages merged

Source from the content-addressed store, hash-verified

24///@param messages the original messages
25///@return normalized messages with consecutive user messages merged
26static json normalize_messages(json messages) {
27 if (messages.empty()) return messages;
28
29 json normalized = nlohmann::ordered_json::array();
30
31 for (size_t i = 0; i < messages.size(); i++) {
32 auto current_msg = messages[i];
33 std::string role = current_msg.value("role", "");
34
35 if (role == "user") {
36 json merged_content_array = json::array();
37
38 // Merge all consecutive user messages into array format
39 while (i < messages.size() && messages[i].value("role", "") == "user") {
40 if (messages[i].contains("content")) {
41 if (messages[i]["content"].is_array()) {
42 for (auto& item : messages[i]["content"]) {
43 merged_content_array.push_back(item);
44 }
45 }
46 else if (messages[i]["content"].is_string()) {
47 std::string text = messages[i]["content"].get<std::string>();
48 if (!text.empty()) {
49 nlohmann::ordered_json text_item;
50 text_item["type"] = "text";
51 text_item["text"] = text;
52 merged_content_array.push_back(text_item);
53 }
54 }
55 }
56 if (i + 1 < messages.size() && messages[i + 1].value("role", "") == "user") i++;
57 else break;
58 }
59
60 current_msg["content"] = merged_content_array;
61 }
62 else if (role == "system") {
63 json merged_content_array = json::array();
64
65 // Merge all consecutive system messages into array format
66 while (i < messages.size() && messages[i].value("role", "") == "system") {
67 if (messages[i].contains("content")) {
68 if (messages[i]["content"].is_array()) {
69 for (auto& item : messages[i]["content"]) {
70 merged_content_array.push_back(item);
71 }
72 }
73 else if (messages[i]["content"].is_string()) {
74 std::string text = messages[i]["content"].get<std::string>();
75 if (!text.empty()) {
76 json text_item;
77 text_item["type"] = "text";
78 text_item["text"] = text;
79 merged_content_array.push_back(text_item);
80 }
81 }
82 }
83 if (i + 1 < messages.size() && messages[i + 1].value("role", "") == "system") i++;

Callers 1

Calls 8

is_arrayMethod · 0.80
push_backMethod · 0.80
is_stringMethod · 0.80
eraseMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45
valueMethod · 0.45
containsMethod · 0.45

Tested by

no test coverage detected