diff --git a/advocate.php b/advocate.php index 7361fbc..91a93c1 100644 --- a/advocate.php +++ b/advocate.php @@ -16,6 +16,14 @@ require_once __DIR__ . '/includes/layout.php'; + +
diff --git a/assets/css/tools.css b/assets/css/tools.css index b6d1834..c4bbdcb 100644 --- a/assets/css/tools.css +++ b/assets/css/tools.css @@ -7960,3 +7960,22 @@ body.lt-landing { border-bottom-color: var(--dbn-blue); } +/* ── Korrespond legal-check card (dbn-legal-agent-v2) ────────────────────── */ +.korr-legal-check { + margin-top: 20px; + padding: 14px 16px; + background: rgba(186, 12, 47, 0.04); + border: 1px solid rgba(186, 12, 47, 0.15); + border-radius: 8px; +} +.korr-legal-check__title { + margin: 0 0 10px; + font-size: 0.92rem; + color: var(--ink); +} +.korr-legal-check__title small { + font-weight: 400; + color: var(--muted, #6b7280); + font-size: 0.78em; +} + diff --git a/assets/js/korrespond.js b/assets/js/korrespond.js index 7ad13c7..80b9a1f 100644 --- a/assets/js/korrespond.js +++ b/assets/js/korrespond.js @@ -574,6 +574,22 @@ ${data.disclaimer ? `

${esc(data.disclaimer)}

` : ''} + ${(data.legal_check && data.legal_check.length) ? ` + + ` : ''} +

${esc(t('refine_title'))} ${esc(t('one_extra_credit'))}

${esc(t('refine_hint'))}

@@ -682,6 +698,22 @@ `).join('')}
` : ''} + + ${(data.legal_check && data.legal_check.length) ? ` + + ` : ''} `; diff --git a/includes/BvjAnalyzerAgent.php b/includes/BvjAnalyzerAgent.php index 45a437f..db707c1 100644 --- a/includes/BvjAnalyzerAgent.php +++ b/includes/BvjAnalyzerAgent.php @@ -968,7 +968,7 @@ PROMPT; foreach ($checkFindings as $cf) { $json['procedural_red_flags'][] = $cf; } - $json['check_model'] = 'dbn-legal-agent'; + $json['check_model'] = 'dbn-legal-agent-v2'; } } diff --git a/includes/DeepResearchAgent.php b/includes/DeepResearchAgent.php index 27714d1..094d9de 100644 --- a/includes/DeepResearchAgent.php +++ b/includes/DeepResearchAgent.php @@ -494,7 +494,7 @@ PROMPT; $userMsg = ['role' => 'user', 'content' => $prompt]; if ($language === 'no' || $advocateRole !== '') { $resp = dbnToolsCallGpuLlm([$sysMsg, $userMsg], [ - 'model' => 'dbn-legal-agent', 'json' => true, + 'model' => 'dbn-legal-agent-v2', 'json' => true, 'temperature' => 0.1, 'max_tokens' => 500, 'timeout' => 40, ]); $raw = (string)($resp['choices'][0]['message']['content'] ?? ''); @@ -593,7 +593,7 @@ PROMPT; $userMsg = ['role' => 'user', 'content' => $prompt]; if ($language === 'no') { $resp = dbnToolsCallGpuLlm([$sysMsg, $userMsg], [ - 'model' => 'dbn-legal-agent', 'json' => true, + 'model' => 'dbn-legal-agent-v2', 'json' => true, 'temperature' => 0.2, 'max_tokens' => 700, 'timeout' => 50, ]); $raw = (string)($resp['choices'][0]['message']['content'] ?? ''); @@ -981,7 +981,7 @@ PROMPT; ], 'deploy_label' => match($engine) { 'gpu' => 'GPU (cuttlefish)', - 'dbn_legal' => 'dbn-legal-agent', + 'dbn_legal' => 'dbn-legal-agent-v2', 'azure_full'=> 'gpt-4o', default => $this->azure->chatDeployment(), }, @@ -1122,8 +1122,8 @@ PROMPT; try { if ($engine === 'dbn_legal') { - $response = dbnToolsCallGpuLlm($messages, array_merge($opts, ['model' => 'dbn-legal-agent', 'timeout' => 180])); - $deployLabel = 'dbn-legal-agent'; + $response = dbnToolsCallGpuLlm($messages, array_merge($opts, ['model' => 'dbn-legal-agent-v2', 'timeout' => 180])); + $deployLabel = 'dbn-legal-agent-v2'; $raw = (string)($response['choices'][0]['message']['content'] ?? ''); } elseif ($engine === 'gpu') { $response = dbnToolsCallGpuLlm($messages, $opts); diff --git a/includes/KorrespondAgent.php b/includes/KorrespondAgent.php index 73f0223..9bd9026 100644 --- a/includes/KorrespondAgent.php +++ b/includes/KorrespondAgent.php @@ -257,6 +257,12 @@ PROMPT; if ($emit) { $emit('progress', ['detail' => self::L('quality_check', $userLang)]); } $checked = $this->selfCheck($draftNo, $retrieval['sources'], $classify, $goal, $tone); + // ── Legal check: dbn-legal-agent-v2 threshold verification ──────────────── + $legalCheck = []; + try { + $legalCheck = dbnToolsRunLegalCheck($checked['draft'], $body); + } catch (Throwable $e) { /* silent — non-critical */ } + // ── Translate to user language (if not Norwegian) ─────────────────────── $draftUser = $checked['draft']; if ($userLang !== 'no') { @@ -278,6 +284,7 @@ PROMPT; 'draft_user_lang'=> $userLang, 'cited_law' => $checked['cited_sources'], 'self_check' => $checked['flags'], + 'legal_check' => $legalCheck, 'applicable_acts'=> $classify['applicable_acts'] ?? [], 'deadlines' => $classify['deadlines'] ?? [], 'parties' => $classify['parties'] ?? [], @@ -756,6 +763,11 @@ EOT, if ($emit) { $emit('progress', ['detail' => self::L('check_and_authorities', $userLang)]); } $checked = $this->selfCheck($refinedNo, $retrieval['sources'], $classify, $goal, $tone); + $legalCheckRefine = []; + try { + $legalCheckRefine = dbnToolsRunLegalCheck($checked['draft'], $body); + } catch (Throwable $e) { /* silent — non-critical */ } + $draftUser = $checked['draft']; if ($userLang !== 'no') { if ($emit) { $emit('progress', ['detail' => self::L('translating_to', $userLang, ['lang' => dbnToolsLanguageName($userLang)])]); } @@ -774,6 +786,7 @@ EOT, 'draft_user_lang'=> $userLang, 'cited_law' => $checked['cited_sources'], 'self_check' => $checked['flags'], + 'legal_check' => $legalCheckRefine, 'applied_slices' => $retrieval['applied_slices'], 'disclaimer' => dbnToolsDisclaimer($userLang), ]; diff --git a/includes/bootstrap.php b/includes/bootstrap.php index 9353176..e32c63a 100644 --- a/includes/bootstrap.php +++ b/includes/bootstrap.php @@ -863,7 +863,7 @@ function dbnToolsRunLegalCheck(string $brief, string $docType): array } $opts = [ - 'model' => 'dbn-legal-agent', + 'model' => 'dbn-legal-agent-v2', 'temperature' => 0.1, 'max_tokens' => 350, 'timeout' => 120, @@ -895,7 +895,7 @@ function dbnToolsRunLegalCheck(string $brief, string $docType): array 'legal_basis' => dbnToolsExtractCheckLegalBasis($clean), 'source_refs' => [], 'what_to_check'=> 'Verifiser med norsk familieretsadvokat', - 'check_model' => 'dbn-legal-agent', + 'check_model' => 'dbn-legal-agent-v2', ]]; }