From e6f1caaf2cd4c4548bc0b0fdbb8058c3e925b6d5 Mon Sep 17 00:00:00 2001 From: David C Date: Thu, 11 Jun 2026 22:04:04 -0700 Subject: [PATCH] Allow for reasoning models; handle structured content arrays in API responses Parse JSONArray content format with type and text fields. Extract reasoning_content when main content is blank. Fall back to firstChoice text field if content extraction fails. --- .../keyboard/latin/utils/ProofreadService.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/app/src/standard/java/helium314/keyboard/latin/utils/ProofreadService.kt b/app/src/standard/java/helium314/keyboard/latin/utils/ProofreadService.kt index 4edd4a2ec..bd9e4a19b 100644 --- a/app/src/standard/java/helium314/keyboard/latin/utils/ProofreadService.kt +++ b/app/src/standard/java/helium314/keyboard/latin/utils/ProofreadService.kt @@ -520,6 +520,39 @@ class ProofreadService(private val context: Context) { val firstChoice = choices.getJSONObject(0) val message = firstChoice.optJSONObject("message") var content = message?.optString("content", "") ?: "" + + if (message != null) { + val contentArray = message.optJSONArray("content") + if (contentArray != null) { + val parts = mutableListOf() + for (i in 0 until contentArray.length()) { + when (val part = contentArray.opt(i)) { + is String -> if (part.isNotBlank()) parts.add(part) + is JSONObject -> { + val type = part.optString("type", "") + val text = part.optString("text", "").ifBlank { + part.optString("content", "") + } + if (text.isNotBlank() && (showThinking || type != "reasoning")) { + parts.add(text) + } + } + } + } + content = parts.joinToString("\n") + } + + content = content.trim() + if (content.isBlank() && showThinking) { + content = message.optString("reasoning_content", "").trim().ifBlank { + message.optString("reasoning", "").trim() + } + } + } + + if (content.isBlank()) { + content = firstChoice.optString("text", "").trim() + } if (!showThinking && content.isNotBlank()) { // Filter out ... blocks