From 1f25c50d500791621b6f2dd191d022ca5ff6e8af Mon Sep 17 00:00:00 2001 From: vegard Date: Mon, 16 Mar 2026 07:16:18 +0100 Subject: [PATCH] =?UTF-8?q?Worker:=20sl=C3=A5=20opp=20modellalias=20fra=20?= =?UTF-8?q?ai=5Fjob=5Frouting=20i=20stedet=20for=20hardkodet=20default?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fjerner hardkodet «sidelinja/rutine» — henter alias dynamisk fra ai_job_routing-tabellen slik at endringer i admin-grensesnittet (alias-rename, ny ruting) fungerer uten å endre worker-kode. Co-Authored-By: Claude Opus 4.6 --- worker/src/handlers/ai_text_process.rs | 44 +++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/worker/src/handlers/ai_text_process.rs b/worker/src/handlers/ai_text_process.rs index 2133849..e1e0090 100644 --- a/worker/src/handlers/ai_text_process.rs +++ b/worker/src/handlers/ai_text_process.rs @@ -80,15 +80,26 @@ impl JobHandler for AiTextProcessHandler { let prompt_override = payload.get("prompt_override").and_then(|v| v.as_str()); + // Slå opp modellalias fra jobbrutingen, fall tilbake til payload eller default + let model_from_routing: Option = sqlx::query_scalar( + "SELECT a.alias FROM ai_job_routing r JOIN ai_model_aliases a ON a.id = r.alias_id WHERE r.job_type = 'ai_text_process'" + ) + .fetch_optional(pool) + .await + .ok() + .flatten(); + let model = payload .get("model") .and_then(|v| v.as_str()) - .unwrap_or("sidelinja/rutine"); + .map(|s| s.to_string()) + .or(model_from_routing) + .unwrap_or_else(|| "sidelinja/rutine".to_string()); info!( message_id = %message_id, action = action, - model = model, + model = %model, workspace_id = %workspace_id, "AI-behandling starter" ); @@ -146,12 +157,12 @@ impl JobHandler for AiTextProcessHandler { // 4. Bygg system-prompt basert på action let system_prompt = match prompt_override { Some(custom) => custom.to_string(), - None => get_system_prompt(action), + None => get_system_prompt_from_db(pool, action).await, }; // 5. Send til AI Gateway let ai_resp = self - .call_ai_gateway(&system_prompt, &plain_text, model) + .call_ai_gateway(&system_prompt, &plain_text, &model) .await .context("AI Gateway-kall feilet")?; @@ -322,9 +333,29 @@ impl AiTextProcessHandler { } } -fn get_system_prompt(action: &str) -> String { +/// Hent system-prompt fra ai_prompts-tabellen, med fallback til hardkodet prompt. +async fn get_system_prompt_from_db(pool: &PgPool, action: &str) -> String { + match sqlx::query_scalar::<_, String>("SELECT system_prompt FROM ai_prompts WHERE action = $1") + .bind(action) + .fetch_optional(pool) + .await + { + Ok(Some(prompt)) => prompt, + Ok(None) => { + warn!(action = action, "Ingen prompt funnet i DB, bruker fallback"); + get_system_prompt_fallback(action) + } + Err(e) => { + warn!(action = action, error = %e, "Feil ved henting av prompt fra DB, bruker fallback"); + get_system_prompt_fallback(action) + } + } +} + +fn get_system_prompt_fallback(action: &str) -> String { match action { "fix_text" => r#"Fiks denne teksten. Output på norsk. +- Returner KUN den fiksede teksten — ingen innledning, kommentar eller meta-tekst - Fiks skrivefeil og grammatikk - Start med en kort oppsummering av det viktigste (2–3 setninger) - Fjern metainformasjon, navigasjon, annonser og annen støy fra innlimt webinnhold @@ -334,6 +365,7 @@ fn get_system_prompt(action: &str) -> String { .to_string(), "extract_facts" => r#"Analyser denne teksten og trekk ut fakta. Output på norsk. +- Returner KUN faktalisten — ingen innledning, kommentar eller meta-tekst - Identifiser konkrete påstander, tall, sitater og fakta - List dem opp som punktliste - For hver fakta: noter hvilken person eller organisasjon den gjelder (bruk #Navn-format) @@ -342,6 +374,7 @@ fn get_system_prompt(action: &str) -> String { .to_string(), "rewrite" => r#"Skriv om denne teksten til artikkelformat. Output på norsk. +- Returner KUN artikkelen — ingen innledning, kommentar eller meta-tekst - Lag en tittel som fanger essensen - Skriv en ingress på 2–3 setninger - Strukturer resten med mellomtitler der det er naturlig @@ -350,6 +383,7 @@ fn get_system_prompt(action: &str) -> String { .to_string(), "translate" => r#"Oversett denne teksten til norsk. +- Returner KUN oversettelsen — ingen innledning, kommentar eller meta-tekst - Behold formatering og struktur - Oversett fagtermer korrekt, behold engelske termer i parentes der det er vanlig - Behold egennavn uoversatt"#