From 983c423740d7b0f411f11f9e412dc16f5a76d120 Mon Sep 17 00:00:00 2001 From: davegilligan Date: Mon, 25 May 2026 10:51:24 +0200 Subject: [PATCH] Fix nova-lite JSON: drop response_format, strip markdown fences nova-lite ignores json_object constraint and returns {} empty; without it, it wraps output in ```json fences. Strip fences before decodeJsonObject. Co-Authored-By: Claude Sonnet 4.6 --- includes/LegalTools.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/includes/LegalTools.php b/includes/LegalTools.php index 1919a2e..4a112b0 100644 --- a/includes/LegalTools.php +++ b/includes/LegalTools.php @@ -457,7 +457,7 @@ PROMPT; try { if ($engine === 'nova_lite') { - $response = dbnToolsCallGpuLlm($messages, ['model' => 'nova-lite', 'json' => true, 'max_tokens' => $maxTokens, 'temperature' => 0.1, 'timeout' => 120]); + $response = dbnToolsCallGpuLlm($messages, ['model' => 'nova-lite', 'max_tokens' => $maxTokens, 'temperature' => 0.1, 'timeout' => 120]); } elseif ($engine === 'azure_full') { $response = $this->azure->withDeployment('gpt-4o')->chat($messages, $chatOptions); } else { @@ -470,6 +470,11 @@ PROMPT; $onProgress && $onProgress("Parsing events\u{2026}"); $raw = (string)($response['choices'][0]['message']['content'] ?? ''); + if ($engine === 'nova_lite') { + $raw = (string)preg_replace('/^```(?:json)?\s*\n?/m', '', $raw); + $raw = (string)preg_replace('/\n?```\s*$/m', '', $raw); + $raw = trim($raw); + } $json = $this->azure->decodeJsonObject($raw); if (!$json) { dbnToolsAbort('The selected engine did not return valid structured JSON.', 502, 'llm_invalid_json');