feat(tools): converge two-tier Quick/Pro selector onto .no fork

Port the dobetterlegal-tools two-tier quality stack to dobetternorge.no:
QUALITY_TIERS registry + resolveTier (ToolModels), dbnToolsResolveToolRun
(bootstrap), tier read+charge in the 6 analytical endpoints, Quick/Pro
UI + payload.tier on the 6 tool pages/JS, and the bounded
corpusContextForSummarize RAG fix (per-passage trim + total budget +
reranker_enabled). Back-compat: requests without `tier` keep legacy
engine behavior.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 12:23:46 +02:00
parent b217f18118
commit a8b1bb87a6
21 changed files with 339 additions and 103 deletions
+20 -2
View File
@@ -53,7 +53,23 @@ try {
$language = dbnToolsNormalizeLanguage($input['language'] ?? 'en');
$advocateRole = trim((string)($input['advocate_role'] ?? ''));
$engine = ToolModels::engineForUser($ftUid, (string)($input['engine'] ?? 'azure_mini'));
if (isset($input['tier'])) {
$run = ToolModels::resolveTier(dbnToolsFreeTierUid(), 'barnevernet', (string)$input['tier']);
$engine = $run['engine'];
$tierCredits = $run['credits'];
$tierMeta = ['tier' => $run['tier'], 'engine' => $engine];
if ($ftUid > 0) {
$gate = FreeTier::checkAmount($ftUid, 'barnevernet', $tierCredits);
if (empty($gate['ok'])) {
$emit('error', ['code' => $gate['reason'] ?? 'no_credits', 'message' => 'Insufficient credits for the selected tier.']);
exit;
}
}
} else {
$engine = ToolModels::engineForUser($ftUid, (string)($input['engine'] ?? 'azure_mini'));
$tierCredits = null;
$tierMeta = [];
}
$sliceInput = $input['slices'] ?? [];
$controls = is_array($input['controls'] ?? null) ? $input['controls'] : [];
$additionalNotes = mb_substr(dbnToolsInjectDocContent($input, trim((string)($input['additional_notes'] ?? ''))), 0, 8000, 'UTF-8');
@@ -154,7 +170,9 @@ try {
'bvj_doc_type' => $result['doc_meta']['doc_type'] ?? null,
]);
$ftRemaining = dbnToolsFreeTierDeduct($ftUid, 'barnevernet');
$ftRemaining = $tierCredits === null
? dbnToolsFreeTierDeduct($ftUid, 'barnevernet')
: dbnToolsFreeTierDeductAmount($ftUid, 'barnevernet', $tierCredits, $tierMeta);
if ($ftRemaining >= 0) {
$result['balance'] = $ftRemaining;
}