feat(tools): persona-driven multi-domain corpus + model routing

Generalize the family-locked legal tools into caveauAI persona profiles
(client 57 chat profiles, resolved in-process via the chat_profiles bridge).
Each tool accepts an optional `profile` slug that scopes the corpus package(s),
search method, system prompt and synthesis model; omitting it falls back to the
family-legal package so existing behaviour is unchanged.

- dbnToolsResolvePersona / dbnToolsListPersonas / dbnToolsBootChatProfiles in
  bootstrap.php; new api/personas.php + dbn.list_personas MCP tool.
- LegalTools search/ask/corpusContextForSummarize and the BvjAnalyzer /
  LegalAnalysis / translate paths take the persona's packages + prompt + model.
- Persona <select> on ask/search/summarize (populated from api/personas.php).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-01 20:49:58 +02:00
parent 5a0ef89dca
commit 662fbf7d6d
16 changed files with 404 additions and 58 deletions
+23 -10
View File
@@ -26,6 +26,16 @@ final class DbnLegalAnalysisAgent
private DbnAzureOpenAiGateway|DbnBedrockGateway $azureMini;
private DbnLegalToolsService $legalSvc;
/** Persona system prompt (from the resolved chat profile); null ⇒ use the built-in barnevern prompt. */
private ?string $personaPrompt = null;
public function withPersonaPrompt(?string $prompt): self
{
$prompt = is_string($prompt) ? trim($prompt) : '';
$this->personaPrompt = $prompt !== '' ? $prompt : null;
return $this;
}
public function __construct()
{
// On Azure: gpt-4o-mini for extraction/synthesis. On Bedrock: factory picks Haiku/Sonnet.
@@ -362,16 +372,19 @@ PROMPT;
{
$locale = dbnToolsLanguageName($language);
// The fine-tune was trained primarily in Norwegian; the Norwegian system
// prompt keeps its precision on barnevernsloven / EMD. We then add a
// language-coercion line so the prose comes back in the user's chosen
// language. Statute and case names stay in their original Norwegian form.
$sysMsg = 'Du er en ekspert på norsk barnevernsloven og EMD-praksis. '
. 'Bruk korrekt juridisk terminologi. '
. 'Bruk terskler fra barnevernsloven 2021: § 4-25 krever «klar nødvendighet». '
. 'Strand Lobben mot Norge (37283/13) setter krav om rehabiliteringsplan før adopsjon. '
. 'Aldri oppfinn paragrafnumre, saksnumre eller dommernavn. '
. 'Avslutt med en «Kilder:»-seksjon som lister lovparagrafer og dommer du har sitert. ';
// Base persona prompt comes from the resolved chat profile (default =
// Child-welfare/barnevern). The fine-tune was trained primarily in
// Norwegian; the Norwegian system prompt keeps its precision on
// barnevernsloven / EMD. We then add a language-coercion line so the
// prose comes back in the user's chosen language. Statute and case names
// stay in their original Norwegian form.
$sysMsg = ($this->personaPrompt
?? 'Du er en ekspert på norsk barnevernsloven og EMD-praksis. '
. 'Bruk korrekt juridisk terminologi. '
. 'Bruk terskler fra barnevernsloven 2021: § 4-25 krever «klar nødvendighet». '
. 'Strand Lobben mot Norge (37283/13) setter krav om rehabiliteringsplan før adopsjon. '
. 'Aldri oppfinn paragrafnumre, saksnumre eller dommernavn.')
. ' Avslutt med en «Kilder:»-seksjon som lister lovparagrafer og dommer du har sitert. ';
if ($language === 'no') {
$sysMsg .= 'Svar på norsk.';