| 66 | } |
| 67 | |
| 68 | QJsonObject ChatSerializer::serializeMessage( |
| 69 | const ChatModel::Message &message, const QString &chatFilePath) |
| 70 | { |
| 71 | QJsonObject messageObj; |
| 72 | messageObj["role"] = static_cast<int>(message.role); |
| 73 | messageObj["content"] = message.content; |
| 74 | messageObj["id"] = message.id; |
| 75 | |
| 76 | if (message.isRedacted) { |
| 77 | messageObj["isRedacted"] = true; |
| 78 | } |
| 79 | |
| 80 | if (!message.signature.isEmpty()) { |
| 81 | messageObj["signature"] = message.signature; |
| 82 | } |
| 83 | |
| 84 | if (message.role == ChatModel::ChatRole::Tool) { |
| 85 | if (!message.toolName.isEmpty()) |
| 86 | messageObj["toolName"] = message.toolName; |
| 87 | if (!message.toolArguments.isEmpty()) |
| 88 | messageObj["toolArguments"] = message.toolArguments; |
| 89 | if (!message.toolResult.isEmpty()) |
| 90 | messageObj["toolResult"] = message.toolResult; |
| 91 | } |
| 92 | |
| 93 | if (!message.attachments.isEmpty()) { |
| 94 | QJsonArray attachmentsArray; |
| 95 | for (const auto &attachment : message.attachments) { |
| 96 | QJsonObject attachmentObj; |
| 97 | attachmentObj["fileName"] = attachment.filename; |
| 98 | attachmentObj["storedPath"] = attachment.content; |
| 99 | attachmentsArray.append(attachmentObj); |
| 100 | } |
| 101 | messageObj["attachments"] = attachmentsArray; |
| 102 | } |
| 103 | |
| 104 | if (!message.images.isEmpty()) { |
| 105 | QJsonArray imagesArray; |
| 106 | for (const auto &image : message.images) { |
| 107 | QJsonObject imageObj; |
| 108 | imageObj["fileName"] = image.fileName; |
| 109 | imageObj["storedPath"] = image.storedPath; |
| 110 | imageObj["mediaType"] = image.mediaType; |
| 111 | imagesArray.append(imageObj); |
| 112 | } |
| 113 | messageObj["images"] = imagesArray; |
| 114 | } |
| 115 | |
| 116 | if (message.promptTokens > 0 || message.completionTokens > 0) { |
| 117 | QJsonObject usageObj; |
| 118 | usageObj["promptTokens"] = message.promptTokens; |
| 119 | usageObj["completionTokens"] = message.completionTokens; |
| 120 | if (message.cachedPromptTokens > 0) |
| 121 | usageObj["cachedPromptTokens"] = message.cachedPromptTokens; |
| 122 | if (message.reasoningTokens > 0) |
| 123 | usageObj["reasoningTokens"] = message.reasoningTokens; |
| 124 | messageObj["usage"] = usageObj; |
| 125 | } |