Rydd sidelinja-referanser: generiske AI-nivåer + synops.no-domener

AI-aliaser: sidelinja/rutine → synops/low, sidelinja/resonering →
synops/high. Fire nivåer i LiteLLM: low/medium/high/extreme.
Oppdatert i: LiteLLM config, PG ai_job_routing, all Rust-kode
(maskinrommet + 5 CLI-verktøy).

Domener: sidelinja.org → synops.no i fallback-URLer, health-sjekker,
LiveKit WSS, bandwidth-logger, docs/erfaringer, docs/setup,
reference/server-state, .env.example.

Docker container-navn (sidelinja-*) beholdes — styrt av
COMPOSE_PROJECT_NAME i /srv/synops/.env, endres separat ved behov.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-19 17:22:22 +00:00
parent 09d0477680
commit 69997c6e87
22 changed files with 11401 additions and 67 deletions

View file

@ -14,7 +14,7 @@ XAI_API_KEY=
LITELLM_MASTER_KEY=sk-sidelinja-dev-1234 LITELLM_MASTER_KEY=sk-sidelinja-dev-1234
# === Authentik OIDC === # === Authentik OIDC ===
AUTHENTIK_ISSUER=https://auth.sidelinja.org/application/o/sidelinja/ AUTHENTIK_ISSUER=https://auth.synops.no/application/o/sidelinja/
AUTHENTIK_CLIENT_ID= AUTHENTIK_CLIENT_ID=
AUTHENTIK_CLIENT_SECRET= AUTHENTIK_CLIENT_SECRET=

View file

@ -40,7 +40,7 @@ callbacks: {
## 3. Redirect-URI i Authentik ## 3. Redirect-URI i Authentik
`@auth/sveltekit` bruker callback-URL `https://<domain>/auth/callback/<provider-id>`. For oss: `https://sidelinja.org/auth/callback/authentik`. `@auth/sveltekit` bruker callback-URL `https://<domain>/auth/callback/<provider-id>`. For oss: `https://ws.synops.no/auth/callback/authentik`.
Denne MÅ være registrert som redirect-URI i Authentik sin OAuth2-provider. Verifiser via: Denne MÅ være registrert som redirect-URI i Authentik sin OAuth2-provider. Verifiser via:

View file

@ -2,24 +2,24 @@
## Oversikt ## Oversikt
Authentik kjører på `auth.sidelinja.org` og fungerer som SSO for alle Authentik kjører på `auth.synops.no` og fungerer som SSO for alle
Synops-tjenester. To OIDC-providere er konfigurert: Synops-tjenester. To OIDC-providere er konfigurert:
| Provider | Application | Slug | Bruk | | Provider | Application | Slug | Bruk |
|---|---|---|---| |---|---|---|---|
| `forgejo` | forgejo | `forgejo` | Git-hosting (git.sidelinja.org) | | `forgejo` | forgejo | `forgejo` | Git-hosting (git.synops.no) |
| `sidelinja-web` | Sidelinja | `sidelinja` | Hovedapplikasjon (sidelinja.org) | | `sidelinja-web` | Sidelinja | `sidelinja` | Hovedapplikasjon (sidelinja.org) |
## Sidelinja OIDC-provider ## Sidelinja OIDC-provider
### Endepunkter ### Endepunkter
- **Issuer:** `https://auth.sidelinja.org/application/o/sidelinja/` - **Issuer:** `https://auth.synops.no/application/o/sidelinja/`
- **Discovery:** `https://auth.sidelinja.org/application/o/sidelinja/.well-known/openid-configuration` - **Discovery:** `https://auth.synops.no/application/o/sidelinja/.well-known/openid-configuration`
- **Authorization:** `https://auth.sidelinja.org/application/o/authorize/` - **Authorization:** `https://auth.synops.no/application/o/authorize/`
- **Token:** `https://auth.sidelinja.org/application/o/token/` - **Token:** `https://auth.synops.no/application/o/token/`
- **Userinfo:** `https://auth.sidelinja.org/application/o/userinfo/` - **Userinfo:** `https://auth.synops.no/application/o/userinfo/`
- **JWKS:** `https://auth.sidelinja.org/application/o/sidelinja/jwks/` - **JWKS:** `https://auth.synops.no/application/o/sidelinja/jwks/`
### Konfigurasjon ### Konfigurasjon
@ -34,7 +34,7 @@ Synops-tjenester. To OIDC-providere er konfigurert:
| Modus | URL | Formål | | Modus | URL | Formål |
|---|---|---| |---|---|---|
| strict | `https://sidelinja.org/auth/callback/authentik` | Produksjon | | strict | `https://ws.synops.no/auth/callback/authentik` | Produksjon |
| regex | `http://localhost:\d+/auth/callback/authentik` | Lokal utvikling | | regex | `http://localhost:\d+/auth/callback/authentik` | Lokal utvikling |
### Scopes ### Scopes
@ -44,7 +44,7 @@ Provideren tilbyr: `openid`, `email`, `profile`, `offline_access`.
### Miljøvariabler (.env på server) ### Miljøvariabler (.env på server)
``` ```
AUTHENTIK_ISSUER=https://auth.sidelinja.org/application/o/sidelinja/ AUTHENTIK_ISSUER=https://auth.synops.no/application/o/sidelinja/
AUTHENTIK_CLIENT_ID=<fra Authentik> AUTHENTIK_CLIENT_ID=<fra Authentik>
AUTHENTIK_CLIENT_SECRET=<fra Authentik> AUTHENTIK_CLIENT_SECRET=<fra Authentik>
``` ```
@ -56,7 +56,7 @@ for JWT-validering.
Maskinrommet (Rust/axum) validerer access tokens utstedt av denne provideren: Maskinrommet (Rust/axum) validerer access tokens utstedt av denne provideren:
1. Hent JWKS fra `https://auth.sidelinja.org/application/o/sidelinja/jwks/` 1. Hent JWKS fra `https://auth.synops.no/application/o/sidelinja/jwks/`
2. Valider signatur (RS256), issuer, og utløpstid 2. Valider signatur (RS256), issuer, og utløpstid
3. Slå opp `sub`-claim i `auth_identities`-tabellen → `node_id` 3. Slå opp `sub`-claim i `auth_identities`-tabellen → `node_id`
@ -87,14 +87,14 @@ Bruk tokenet med: `Authorization: Bearer <token>`
```bash ```bash
# OIDC discovery # OIDC discovery
curl -s https://auth.sidelinja.org/application/o/sidelinja/.well-known/openid-configuration | jq .issuer curl -s https://auth.synops.no/application/o/sidelinja/.well-known/openid-configuration | jq .issuer
# JWKS (for JWT-validering) # JWKS (for JWT-validering)
curl -s https://auth.sidelinja.org/application/o/sidelinja/jwks/ | jq '.keys | length' curl -s https://auth.synops.no/application/o/sidelinja/jwks/ | jq '.keys | length'
# List providere via API # List providere via API
curl -s -H "Authorization: Bearer <token>" \ curl -s -H "Authorization: Bearer <token>" \
https://auth.sidelinja.org/api/v3/providers/oauth2/ | jq '.results[].name' https://auth.synops.no/api/v3/providers/oauth2/ | jq '.results[].name'
``` ```
## Legge til ny redirect URI ## Legge til ny redirect URI
@ -104,14 +104,14 @@ Hvis en ny tjeneste trenger OIDC (f.eks. maskinrommet med egen callback):
```bash ```bash
# Hent provider pk # Hent provider pk
curl -s -H "Authorization: Bearer <token>" \ curl -s -H "Authorization: Bearer <token>" \
https://auth.sidelinja.org/api/v3/providers/oauth2/?name=sidelinja-web | jq '.results[0].pk' https://auth.synops.no/api/v3/providers/oauth2/?name=sidelinja-web | jq '.results[0].pk'
# Oppdater redirect_uris (PATCH) # Oppdater redirect_uris (PATCH)
curl -s -X PATCH -H "Authorization: Bearer <token>" \ curl -s -X PATCH -H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
https://auth.sidelinja.org/api/v3/providers/oauth2/<pk>/ \ https://auth.synops.no/api/v3/providers/oauth2/<pk>/ \
-d '{"redirect_uris": [ -d '{"redirect_uris": [
{"matching_mode": "strict", "url": "https://sidelinja.org/auth/callback/authentik"}, {"matching_mode": "strict", "url": "https://ws.synops.no/auth/callback/authentik"},
{"matching_mode": "regex", "url": "http://localhost:\\d+/auth/callback/authentik"}, {"matching_mode": "regex", "url": "http://localhost:\\d+/auth/callback/authentik"},
{"matching_mode": "strict", "url": "https://ny-tjeneste.sidelinja.org/callback"} {"matching_mode": "strict", "url": "https://ny-tjeneste.sidelinja.org/callback"}
]}' ]}'

View file

@ -0,0 +1,76 @@
# Header-unifikasjon, tema og panel-forbedringer
Diskusjonsnotat fra 2025-03-19. Grunnlag for neste implementeringsplan.
## Problemstilling
Headeren er inkonsistent mellom "Min arbeidsflate" (`+page.svelte`) og
samlinger (`/collection/[id]` med `ContextHeader.svelte`). Bruker mister
kontekst og verktøy ved kontekstbytte. Innstillinger finnes bare på
personlig flate. Fargevelgeren er for begrenset.
## Beslutninger
### 1. Én header-komponent overalt
ContextHeader brukes på alle sider — personlig flate og samlinger.
Inneholder alltid:
- **Kontekst-velger** (venstre): dropdown med arbeidsflater, rename,
ny, slett. Alltid tilgjengelig uansett hvilken flate du er på.
- **Verktøymeny** (midten-høyre): legge til paneler.
- **Tilkoblingsstatus** (før innstillinger, konsekvent plassert)
- **Innstillinger** (lengst til høyre): tema for *denne* flaten, logg ut.
### 2. Tema per arbeidsflate med arv
Tre lag (som layout):
1. **Flate-spesifikt** — lagret i samlingens/workspace-nodens metadata.preferences.theme
2. **Personlig default** — fra "Min arbeidsflate" sin tema
3. **Plattform-default** — nøytral mørk (#0a0a0b / #1c1c20 / #6366f1)
Arving: ny flate arver fra personlig. Endring lagres på flaten.
### 3. Fargevelger
Ikke tre hue-slidere med bare gråtoner. I stedet:
- HSL-basert: hue-stripe + saturation/lightness
- Eller: forhåndsdefinerte paletter + egendefinert modus
- Full fargepalett tilgjengelig, ikke begrenset til nøytrale toner
### 4. Traits vs verktøymeny
Verktøymenyen viser paneler som kan legges til:
- Aktiverte traits vises som standard (med ikon)
- Andre traits vises som "legg til" (grå, med forklaring)
- "Administrer traits" er en admin-handling (f.eks. ⚙️ nederst i menyen)
Brukeren trenger ikke forstå trait-konseptet — de ser verktøy.
### 5. Slett arbeidsflate
Bekreftelsesdialog som teller innhold:
- "Denne arbeidsflaten inneholder X noder."
- Innhold forblir tilgjengelig i andre kontekster (edges).
- Sletting fjerner samlingsnoden og tilhørende edges.
### 6. Panel-resize (BlockShell)
Paneler (BlockShell-bokser) bør ha synlige resize-handles på alle kanter,
ikke bare hjørner. Fritt resize i begge retninger. Sjekk nåværende
implementasjon — kanskje bare UI-forbedring, kanskje logikk-endring.
### 7. Tilkoblingsstatus
Flyttes til konsekvent posisjon: like før innstillinger-ikonet
(nest sist til høyre), eller helt til venstre i header-right.
Viktigst: alltid på samme sted.
## Filer som berøres
- `frontend/src/lib/components/ContextHeader.svelte` — hovedkomponent, utvides
- `frontend/src/routes/+page.svelte` — erstatt inline header med ContextHeader
- `frontend/src/routes/collection/[id]/+page.svelte` — allerede bruker ContextHeader
- `frontend/src/lib/components/blockshell/BlockShell.svelte` — resize-handles
- `frontend/src/app.css` — CSS custom properties for tema
- `frontend/src/lib/workspace/types.ts` — evt. tema-typer

View file

@ -41,7 +41,7 @@ source ~/.cargo/env
```bash ```bash
cd ~ cd ~
git clone ssh://git@git.sidelinja.org:222/vegard/synops.git git clone ssh://git@git.synops.no:222/vegard/synops.git
cd synops cd synops
``` ```

View file

@ -103,7 +103,7 @@ cat > /srv/synops/.env << 'EOF'
# === Domener === # === Domener ===
DOMAIN_SIDELINJA=sidelinja.org DOMAIN_SIDELINJA=sidelinja.org
DOMAIN_VEGARD=vegard.info DOMAIN_VEGARD=vegard.info
DOMAIN_AUTH=auth.sidelinja.org DOMAIN_AUTH=auth.synops.no
COMPOSE_PROJECT_NAME=sidelinja COMPOSE_PROJECT_NAME=sidelinja
# === PostgreSQL === # === PostgreSQL ===
@ -130,7 +130,7 @@ LIVEKIT_API_SECRET=<generer med: openssl rand -hex 32>
OPENROUTER_API_KEY=<fra openrouter.ai> OPENROUTER_API_KEY=<fra openrouter.ai>
# === Maskinrommet === # === Maskinrommet ===
AUTHENTIK_ISSUER=https://auth.sidelinja.org/application/o/sidelinja/ AUTHENTIK_ISSUER=https://auth.synops.no/application/o/sidelinja/
AUTHENTIK_CLIENT_ID=<fra Authentik OIDC-provider> AUTHENTIK_CLIENT_ID=<fra Authentik OIDC-provider>
AUTHENTIK_CLIENT_SECRET=<fra Authentik OIDC-provider> AUTHENTIK_CLIENT_SECRET=<fra Authentik OIDC-provider>
@ -153,7 +153,7 @@ Tjenestene startes i rekkefølge fordi noen avhenger av andre. Alle defineres i
1. **Docker-nettverk:** Opprett internt nettverk `sidelinja-net` 1. **Docker-nettverk:** Opprett internt nettverk `sidelinja-net`
2. **PostgreSQL:** Start, opprett databaser for Authentik og Forgejo, verifiser (`pg_isready`) 2. **PostgreSQL:** Start, opprett databaser for Authentik og Forgejo, verifiser (`pg_isready`)
3. **Caddy:** Start med Caddyfile for alle domener, verifiser at HTTPS fungerer 3. **Caddy:** Start med Caddyfile for alle domener, verifiser at HTTPS fungerer
4. **Authentik:** Start, gjennomfør initial setup via `https://auth.sidelinja.org` 4. **Authentik:** Start, gjennomfør initial setup via `https://auth.synops.no`
5. **Forgejo:** Start med Authentik som OAuth2-provider, opprett organisasjon og repo 5. **Forgejo:** Start med Authentik som OAuth2-provider, opprett organisasjon og repo
### Lag B: Sanntid (krever nettverk) ### Lag B: Sanntid (krever nettverk)
@ -185,8 +185,8 @@ networks:
services: services:
caddy: # Eneste tjeneste med eksponerte porter (80, 443) caddy: # Eneste tjeneste med eksponerte porter (80, 443)
postgres: # data:/srv/synops/data/postgres postgres: # data:/srv/synops/data/postgres
authentik: # SSO for alle domener, på auth.sidelinja.org authentik: # SSO for alle domener, på auth.synops.no
forgejo: # data:/srv/synops/data/forgejo, på git.sidelinja.org forgejo: # data:/srv/synops/data/forgejo, på git.synops.no
maskinrommet: # Rust/axum API, intern port 3100, proxyet via Caddy maskinrommet: # Rust/axum API, intern port 3100, proxyet via Caddy
livekit: # Intern port, proxyet via Caddy livekit: # Intern port, proxyet via Caddy
sveltekit: # Intern port, proxyet via Caddy sveltekit: # Intern port, proxyet via Caddy
@ -198,7 +198,7 @@ services:
```caddyfile ```caddyfile
# === SSO === # === SSO ===
auth.sidelinja.org { auth.synops.no {
reverse_proxy authentik-server:9000 reverse_proxy authentik-server:9000
} }
@ -225,7 +225,7 @@ api.sidelinja.org {
} }
# === Forgejo (Git) === # === Forgejo (Git) ===
git.sidelinja.org { git.synops.no {
reverse_proxy forgejo:3000 reverse_proxy forgejo:3000
} }
@ -264,7 +264,7 @@ CREATE DATABASE forgejo OWNER forgejo;
## 9. Authentik: Initial konfigurasjon ## 9. Authentik: Initial konfigurasjon
Etter oppstart, gå til `https://auth.sidelinja.org/if/flow/initial-setup/`: Etter oppstart, gå til `https://auth.synops.no/if/flow/initial-setup/`:
1. Opprett admin-konto 1. Opprett admin-konto
2. Opprett OAuth2/OpenID Connect-provider for Forgejo 2. Opprett OAuth2/OpenID Connect-provider for Forgejo
3. Opprett OAuth2/OpenID Connect-provider for SvelteKit (senere) 3. Opprett OAuth2/OpenID Connect-provider for SvelteKit (senere)
@ -275,7 +275,7 @@ Etter oppstart, gå til `https://auth.sidelinja.org/if/flow/initial-setup/`:
Forgejo konfigureres med Authentik som OAuth2-kilde: Forgejo konfigureres med Authentik som OAuth2-kilde:
- Authentication Source: OAuth2 - Authentication Source: OAuth2
- Provider: OpenID Connect - Provider: OpenID Connect
- Discovery URL: `https://auth.sidelinja.org/application/o/<slug>/.well-known/openid-configuration` - Discovery URL: `https://auth.synops.no/application/o/<slug>/.well-known/openid-configuration`
- Etter oppsett: opprett organisasjon `sidelinja`, opprett repo `sidelinja` - Etter oppsett: opprett organisasjon `sidelinja`, opprett repo `sidelinja`
## 11. Backup-strategi ## 11. Backup-strategi
@ -519,8 +519,8 @@ validering, node-opprettelse) ligger i synops-mail.
## 14. Verifisering etter oppsett ## 14. Verifisering etter oppsett
### Lag A (minimum fungerende server) ### Lag A (minimum fungerende server)
- [ ] `https://auth.sidelinja.org` viser Authentik login - [ ] `https://auth.synops.no` viser Authentik login
- [ ] `https://git.sidelinja.org` viser Forgejo, innlogging via Authentik fungerer - [ ] `https://git.synops.no` viser Forgejo, innlogging via Authentik fungerer
- [ ] PostgreSQL: `docker compose exec postgres pg_isready` returnerer OK - [ ] PostgreSQL: `docker compose exec postgres pg_isready` returnerer OK
- [ ] Git push til Forgejo fungerer - [ ] Git push til Forgejo fungerer

View file

@ -110,12 +110,12 @@ pub async fn resolve_routing_or_default(db: &PgPool, job_type: &str) -> String {
alias alias
} }
Ok(None) => { Ok(None) => {
tracing::warn!(job_type, "Ingen rutingregel — bruker sidelinja/rutine"); tracing::warn!(job_type, "Ingen rutingregel — bruker synops/low");
"sidelinja/rutine".to_string() "synops/low".to_string()
} }
Err(e) => { Err(e) => {
tracing::error!(job_type, error = %e, "Feil ved oppslag i ai_job_routing — bruker fallback"); tracing::error!(job_type, error = %e, "Feil ved oppslag i ai_job_routing — bruker fallback");
"sidelinja/rutine".to_string() "synops/low".to_string()
} }
} }
} }

View file

@ -12,7 +12,7 @@
// Flyten: // Flyten:
// 1. Hent kilde-node content fra PG // 1. Hent kilde-node content fra PG
// 2. Hent AI-preset prompt + modellprofil fra PG // 2. Hent AI-preset prompt + modellprofil fra PG
// 3. Map modellprofil → LiteLLM-alias (flash → sidelinja/rutine, standard → sidelinja/resonering) // 3. Map modellprofil → LiteLLM-alias (flash → synops/low, standard → synops/high)
// 4. Send til AI Gateway (LiteLLM) // 4. Send til AI Gateway (LiteLLM)
// 5. Logg forbruk i ai_usage_log // 5. Logg forbruk i ai_usage_log
// 6. Direction-logikk: // 6. Direction-logikk:
@ -90,9 +90,9 @@ struct MessageContent {
/// Ref: docs/features/ai_verktoy.md § 4, docs/infra/ai_gateway.md § 3.4 /// Ref: docs/features/ai_verktoy.md § 4, docs/infra/ai_gateway.md § 3.4
fn model_profile_to_alias(profile: &str) -> &'static str { fn model_profile_to_alias(profile: &str) -> &'static str {
match profile { match profile {
"flash" => "sidelinja/rutine", "flash" => "synops/low",
"standard" => "sidelinja/resonering", "standard" => "synops/high",
_ => "sidelinja/rutine", // fallback til billigste _ => "synops/low", // fallback til billigste
} }
} }

View file

@ -211,8 +211,8 @@ pub fn start_bandwidth_parser(db: PgPool) {
// Kjør parsing for alle loggfiler // Kjør parsing for alle loggfiler
let log_files = vec![ let log_files = vec![
"/var/log/caddy/access-sidelinja.log",
"/var/log/caddy/access-synops.log", "/var/log/caddy/access-synops.log",
"/var/log/caddy/access-ws.log",
]; ];
for path in &log_files { for path in &log_files {

View file

@ -147,7 +147,7 @@ async fn check_caddy() -> ServiceStatus {
async fn check_authentik() -> ServiceStatus { async fn check_authentik() -> ServiceStatus {
// Authentik via Caddy // Authentik via Caddy
check_http_service("Authentik", "https://auth.sidelinja.org/-/health/ready/").await check_http_service("Authentik", "https://auth.synops.no/-/health/ready/").await
} }
async fn check_litellm() -> ServiceStatus { async fn check_litellm() -> ServiceStatus {

View file

@ -3665,7 +3665,7 @@ pub async fn join_communication(
let livekit_url = std::env::var("LIVEKIT_WS_URL") let livekit_url = std::env::var("LIVEKIT_WS_URL")
.unwrap_or_else(|_| { .unwrap_or_else(|_| {
// Fallback: bruk domene med wss // Fallback: bruk domene med wss
"wss://sidelinja.org/livekit".to_string() "wss://ws.synops.no/livekit".to_string()
}); });
tracing::info!( tracing::info!(

View file

@ -124,7 +124,7 @@ async fn main() {
// JWKS — hent nøkler fra Authentik ved oppstart // JWKS — hent nøkler fra Authentik ved oppstart
let issuer = std::env::var("AUTHENTIK_ISSUER") let issuer = std::env::var("AUTHENTIK_ISSUER")
.unwrap_or_else(|_| "https://auth.sidelinja.org/application/o/sidelinja/".to_string()); .unwrap_or_else(|_| "https://auth.synops.no/application/o/sidelinja/".to_string());
let client_id = std::env::var("AUTHENTIK_CLIENT_ID") let client_id = std::env::var("AUTHENTIK_CLIENT_ID")
.expect("AUTHENTIK_CLIENT_ID må være satt"); .expect("AUTHENTIK_CLIENT_ID må være satt");

View file

@ -19,14 +19,14 @@ Slettes når Synops er oppe og stabilt.
| ai-gateway | litellm:main-stable | AI-ruter | BEHOLDES (uavhengig av app) | | ai-gateway | litellm:main-stable | AI-ruter | BEHOLDES (uavhengig av app) |
## Caddyfile (fungerende) ## Caddyfile (fungerende)
- auth.sidelinja.org → authentik-server:9000 - auth.synops.no → authentik-server:9000
- git.sidelinja.org → forgejo:3000 - git.synops.no → forgejo:3000
- sidelinja.org → web:3000 + /media/* (filservering) + JSON access log - synops.no → web:3000 + /media/* (filservering) + JSON access log
- vegard.info → placeholder - vegard.info → placeholder
- ~~rt.sidelinja.org → spacetimedb:3000~~ (fjernet) - ~~rt.synops.no → spacetimedb:3000~~ (fjernet)
## PG init-script ## PG init-script
`/srv/sidelinja/config/postgres/init/01-create-databases.sql` `/srv/synops/config/postgres/init/01-create-databases.sql`
Oppretter authentik og forgejo DB-brukere med hardkodede passord. Oppretter authentik og forgejo DB-brukere med hardkodede passord.
Disse passordene matcher .env-variablene og er allerede kjørt — scriptet Disse passordene matcher .env-variablene og er allerede kjørt — scriptet
kjøres kun ved *første* PG-oppstart. kjøres kun ved *første* PG-oppstart.
@ -61,7 +61,7 @@ Synops starter med nytt skjema (noder+edges). Disse migreringene er irrelevante.
## Crontab ## Crontab
Ingen crontab konfigurert (backup-strategi er dokumentert men ikke implementert). Ingen crontab konfigurert (backup-strategi er dokumentert men ikke implementert).
## Mappestruktur /srv/sidelinja/ ## Mappestruktur /srv/synops/
``` ```
config/authentik/ config/caddy/ config/postgres/init/ config/authentik/ config/caddy/ config/postgres/init/
data/authentik/ data/caddy/ data/forgejo/ data/postgres/ data/redis/ data/spacetimedb/ data/authentik/ data/caddy/ data/forgejo/ data/postgres/ data/redis/ data/spacetimedb/

View file

@ -36,7 +36,7 @@ struct PromptArgs {
#[arg(long)] #[arg(long)]
prompt: String, prompt: String,
/// Modellalias (f.eks. "sidelinja/rutine"). Hvis utelatt, slås opp fra ai_job_routing. /// Modellalias (f.eks. "synops/low"). Hvis utelatt, slås opp fra ai_job_routing.
#[arg(long)] #[arg(long)]
model: Option<String>, model: Option<String>,
@ -486,7 +486,7 @@ async fn create_budget_work_item(
); );
} }
/// Slå opp modellalias fra ai_job_routing. Fallback: sidelinja/rutine. /// Slå opp modellalias fra ai_job_routing. Fallback: synops/low.
async fn resolve_model(db: &sqlx::PgPool, job_type: &str) -> Result<String, String> { async fn resolve_model(db: &sqlx::PgPool, job_type: &str) -> Result<String, String> {
let row: Option<(String,)> = let row: Option<(String,)> =
sqlx::query_as("SELECT alias FROM ai_job_routing WHERE job_type = $1") sqlx::query_as("SELECT alias FROM ai_job_routing WHERE job_type = $1")
@ -501,7 +501,7 @@ async fn resolve_model(db: &sqlx::PgPool, job_type: &str) -> Result<String, Stri
Ok(alias) Ok(alias)
} }
None => { None => {
let fallback = "sidelinja/rutine".to_string(); let fallback = "synops/low".to_string();
tracing::info!( tracing::info!(
job_type, job_type,
fallback = %fallback, fallback = %fallback,
@ -778,7 +778,7 @@ async fn run_script(args: ScriptArgs) -> Result<(), String> {
tracing::info!(description_len = description.len(), "Sender til LLM for script-generering"); tracing::info!(description_len = description.len(), "Sender til LLM for script-generering");
let model = let model =
std::env::var("AI_SCRIPT_MODEL").unwrap_or_else(|_| "sidelinja/rutine".to_string()); std::env::var("AI_SCRIPT_MODEL").unwrap_or_else(|_| "synops/low".to_string());
let messages = vec![ let messages = vec![
ChatMessage { ChatMessage {

View file

@ -91,6 +91,12 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.5.0" version = "1.5.0"
@ -161,6 +167,12 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.44" version = "0.4.44"
@ -498,8 +510,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"js-sys",
"libc", "libc",
"wasi", "wasi",
"wasm-bindgen",
]
[[package]]
name = "getrandom"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"r-efi 5.3.0",
"wasip2",
"wasm-bindgen",
] ]
[[package]] [[package]]
@ -510,7 +538,7 @@ checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"r-efi", "r-efi 6.0.0",
"wasip2", "wasip2",
"wasip3", "wasip3",
] ]
@ -580,6 +608,106 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "http"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
dependencies = [
"bytes",
"itoa",
]
[[package]]
name = "http-body"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes",
"http",
]
[[package]]
name = "http-body-util"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
dependencies = [
"bytes",
"futures-core",
"http",
"http-body",
"pin-project-lite",
]
[[package]]
name = "httparse"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
[[package]]
name = "hyper"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
dependencies = [
"atomic-waker",
"bytes",
"futures-channel",
"futures-core",
"http",
"http-body",
"httparse",
"itoa",
"pin-project-lite",
"pin-utils",
"smallvec",
"tokio",
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.27.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"
dependencies = [
"http",
"hyper",
"hyper-util",
"rustls",
"rustls-pki-types",
"tokio",
"tokio-rustls",
"tower-service",
"webpki-roots 1.0.6",
]
[[package]]
name = "hyper-util"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
dependencies = [
"base64",
"bytes",
"futures-channel",
"futures-util",
"http",
"http-body",
"hyper",
"ipnet",
"libc",
"percent-encoding",
"pin-project-lite",
"socket2",
"tokio",
"tower-service",
"tracing",
]
[[package]] [[package]]
name = "iana-time-zone" name = "iana-time-zone"
version = "0.1.65" version = "0.1.65"
@ -733,6 +861,22 @@ dependencies = [
"serde_core", "serde_core",
] ]
[[package]]
name = "ipnet"
version = "2.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"
[[package]]
name = "iri-string"
version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"
dependencies = [
"memchr",
"serde",
]
[[package]] [[package]]
name = "is_terminal_polyfill" name = "is_terminal_polyfill"
version = "1.70.2" version = "1.70.2"
@ -825,6 +969,12 @@ version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "lru-slab"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
[[package]] [[package]]
name = "matchers" name = "matchers"
version = "0.2.0" version = "0.2.0"
@ -881,7 +1031,7 @@ dependencies = [
"num-integer", "num-integer",
"num-iter", "num-iter",
"num-traits", "num-traits",
"rand", "rand 0.8.5",
"smallvec", "smallvec",
"zeroize", "zeroize",
] ]
@ -978,6 +1128,12 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "pin-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]] [[package]]
name = "pkcs1" name = "pkcs1"
version = "0.7.5" version = "0.7.5"
@ -1048,6 +1204,61 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "quinn"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
dependencies = [
"bytes",
"cfg_aliases",
"pin-project-lite",
"quinn-proto",
"quinn-udp",
"rustc-hash",
"rustls",
"socket2",
"thiserror 2.0.18",
"tokio",
"tracing",
"web-time",
]
[[package]]
name = "quinn-proto"
version = "0.11.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098"
dependencies = [
"bytes",
"getrandom 0.3.4",
"lru-slab",
"rand 0.9.2",
"ring",
"rustc-hash",
"rustls",
"rustls-pki-types",
"slab",
"thiserror 2.0.18",
"tinyvec",
"tracing",
"web-time",
]
[[package]]
name = "quinn-udp"
version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
dependencies = [
"cfg_aliases",
"libc",
"once_cell",
"socket2",
"tracing",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.45" version = "1.0.45"
@ -1057,6 +1268,12 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "r-efi"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]] [[package]]
name = "r-efi" name = "r-efi"
version = "6.0.0" version = "6.0.0"
@ -1070,8 +1287,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [ dependencies = [
"libc", "libc",
"rand_chacha", "rand_chacha 0.3.1",
"rand_core", "rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.5",
] ]
[[package]] [[package]]
@ -1081,7 +1308,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core", "rand_core 0.6.4",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.5",
] ]
[[package]] [[package]]
@ -1093,6 +1330,15 @@ dependencies = [
"getrandom 0.2.17", "getrandom 0.2.17",
] ]
[[package]]
name = "rand_core"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
dependencies = [
"getrandom 0.3.4",
]
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.18" version = "0.5.18"
@ -1128,6 +1374,44 @@ version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
[[package]]
name = "reqwest"
version = "0.12.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
dependencies = [
"base64",
"bytes",
"futures-core",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-util",
"js-sys",
"log",
"percent-encoding",
"pin-project-lite",
"quinn",
"rustls",
"rustls-pki-types",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tokio-rustls",
"tower",
"tower-http",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"webpki-roots 1.0.6",
]
[[package]] [[package]]
name = "ring" name = "ring"
version = "0.17.14" version = "0.17.14"
@ -1155,13 +1439,19 @@ dependencies = [
"num-traits", "num-traits",
"pkcs1", "pkcs1",
"pkcs8", "pkcs8",
"rand_core", "rand_core 0.6.4",
"signature", "signature",
"spki", "spki",
"subtle", "subtle",
"zeroize", "zeroize",
] ]
[[package]]
name = "rustc-hash"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
[[package]] [[package]]
name = "rustls" name = "rustls"
version = "0.23.37" version = "0.23.37"
@ -1182,6 +1472,7 @@ version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
dependencies = [ dependencies = [
"web-time",
"zeroize", "zeroize",
] ]
@ -1329,7 +1620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
dependencies = [ dependencies = [
"digest", "digest",
"rand_core", "rand_core 0.6.4",
] ]
[[package]] [[package]]
@ -1495,7 +1786,7 @@ dependencies = [
"memchr", "memchr",
"once_cell", "once_cell",
"percent-encoding", "percent-encoding",
"rand", "rand 0.8.5",
"rsa", "rsa",
"serde", "serde",
"sha1", "sha1",
@ -1535,7 +1826,7 @@ dependencies = [
"md-5", "md-5",
"memchr", "memchr",
"once_cell", "once_cell",
"rand", "rand 0.8.5",
"serde", "serde",
"serde_json", "serde_json",
"sha2", "sha2",
@ -1614,6 +1905,15 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sync_wrapper"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
dependencies = [
"futures-core",
]
[[package]] [[package]]
name = "synops-calendar" name = "synops-calendar"
version = "0.1.0" version = "0.1.0"
@ -1621,6 +1921,7 @@ dependencies = [
"chrono", "chrono",
"clap", "clap",
"ical", "ical",
"reqwest",
"serde", "serde",
"serde_json", "serde_json",
"sqlx", "sqlx",
@ -1759,6 +2060,16 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "tokio-rustls"
version = "0.26.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
dependencies = [
"rustls",
"tokio",
]
[[package]] [[package]]
name = "tokio-stream" name = "tokio-stream"
version = "0.1.18" version = "0.1.18"
@ -1770,6 +2081,51 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "tower"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
dependencies = [
"futures-core",
"futures-util",
"pin-project-lite",
"sync_wrapper",
"tokio",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-http"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
dependencies = [
"bitflags",
"bytes",
"futures-util",
"http",
"http-body",
"iri-string",
"pin-project-lite",
"tower",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-layer"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
[[package]]
name = "tower-service"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.44" version = "0.1.44"
@ -1832,6 +2188,12 @@ dependencies = [
"tracing-log", "tracing-log",
] ]
[[package]]
name = "try-lock"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.19.0" version = "1.19.0"
@ -1931,6 +2293,15 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "want"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
dependencies = [
"try-lock",
]
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.1+wasi-snapshot-preview1" version = "0.11.1+wasi-snapshot-preview1"
@ -1974,6 +2345,20 @@ dependencies = [
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
[[package]]
name = "wasm-bindgen-futures"
version = "0.4.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8"
dependencies = [
"cfg-if",
"futures-util",
"js-sys",
"once_cell",
"wasm-bindgen",
"web-sys",
]
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.114" version = "0.2.114"
@ -2040,6 +2425,26 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "web-sys"
version = "0.3.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "web-time"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]] [[package]]
name = "webpki-roots" name = "webpki-roots"
version = "0.26.11" version = "0.26.11"

2941
tools/synops-clip/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -19,7 +19,7 @@
// DATABASE_URL — PostgreSQL-tilkobling (påkrevd med --write) // DATABASE_URL — PostgreSQL-tilkobling (påkrevd med --write)
// AI_GATEWAY_URL — LiteLLM gateway (default: http://localhost:4000) // AI_GATEWAY_URL — LiteLLM gateway (default: http://localhost:4000)
// LITELLM_MASTER_KEY — API-nøkkel for LiteLLM // LITELLM_MASTER_KEY — API-nøkkel for LiteLLM
// AI_CLIP_MODEL — Modellalias for oppsummering (default: sidelinja/rutine) // AI_CLIP_MODEL — Modellalias for oppsummering (default: synops/low)
// RUST_LOG — Loggnivå (default: synops_clip=info) // RUST_LOG — Loggnivå (default: synops_clip=info)
// //
// Ref: docs/retninger/unix_filosofi.md // Ref: docs/retninger/unix_filosofi.md
@ -462,7 +462,7 @@ async fn call_llm_analysis(
std::env::var("AI_GATEWAY_URL").unwrap_or_else(|_| "http://localhost:4000".to_string()); std::env::var("AI_GATEWAY_URL").unwrap_or_else(|_| "http://localhost:4000".to_string());
let api_key = std::env::var("LITELLM_MASTER_KEY").unwrap_or_default(); let api_key = std::env::var("LITELLM_MASTER_KEY").unwrap_or_default();
let model = let model =
std::env::var("AI_CLIP_MODEL").unwrap_or_else(|_| "sidelinja/rutine".to_string()); std::env::var("AI_CLIP_MODEL").unwrap_or_else(|_| "synops/low".to_string());
// Hent eksisterende topics for kontekst // Hent eksisterende topics for kontekst
let existing_topics = sqlx::query_scalar::<_, String>( let existing_topics = sqlx::query_scalar::<_, String>(

3000
tools/synops-health/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

2449
tools/synops-notify/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

2463
tools/synops-stats/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,7 @@
// DATABASE_URL — PostgreSQL-tilkobling (påkrevd) // DATABASE_URL — PostgreSQL-tilkobling (påkrevd)
// AI_GATEWAY_URL — LiteLLM gateway (default: http://localhost:4000) // AI_GATEWAY_URL — LiteLLM gateway (default: http://localhost:4000)
// LITELLM_MASTER_KEY — API-nøkkel for LiteLLM // LITELLM_MASTER_KEY — API-nøkkel for LiteLLM
// AI_EDGES_MODEL — Modellalias (default: sidelinja/rutine) // AI_EDGES_MODEL — Modellalias (default: synops/low)
// //
// Erstatter: maskinrommet/src/ai_edges.rs // Erstatter: maskinrommet/src/ai_edges.rs
// Ref: docs/retninger/unix_filosofi.md, docs/infra/ai_gateway.md, // Ref: docs/retninger/unix_filosofi.md, docs/infra/ai_gateway.md,
@ -317,7 +317,7 @@ async fn call_llm(user_content: &str) -> Result<(AiSuggestion, Option<UsageInfo>
let api_key = std::env::var("LITELLM_MASTER_KEY").unwrap_or_default(); let api_key = std::env::var("LITELLM_MASTER_KEY").unwrap_or_default();
let model = let model =
std::env::var("AI_EDGES_MODEL").unwrap_or_else(|_| "sidelinja/rutine".to_string()); std::env::var("AI_EDGES_MODEL").unwrap_or_else(|_| "synops/low".to_string());
let request = ChatRequest { let request = ChatRequest {
model, model,

View file

@ -8,7 +8,7 @@
// DATABASE_URL — PostgreSQL-tilkobling (påkrevd) // DATABASE_URL — PostgreSQL-tilkobling (påkrevd)
// AI_GATEWAY_URL — LiteLLM gateway (default: http://localhost:4000) // AI_GATEWAY_URL — LiteLLM gateway (default: http://localhost:4000)
// LITELLM_MASTER_KEY — API-nøkkel for LiteLLM // LITELLM_MASTER_KEY — API-nøkkel for LiteLLM
// AI_SUMMARY_MODEL — Modellalias (default: sidelinja/rutine) // AI_SUMMARY_MODEL — Modellalias (default: synops/low)
// //
// Erstatter: maskinrommet/src/summarize.rs // Erstatter: maskinrommet/src/summarize.rs
// Ref: docs/retninger/unix_filosofi.md, docs/infra/ai_gateway.md // Ref: docs/retninger/unix_filosofi.md, docs/infra/ai_gateway.md
@ -292,7 +292,7 @@ async fn call_llm_summary(
let api_key = std::env::var("LITELLM_MASTER_KEY").unwrap_or_default(); let api_key = std::env::var("LITELLM_MASTER_KEY").unwrap_or_default();
let model = let model =
std::env::var("AI_SUMMARY_MODEL").unwrap_or_else(|_| "sidelinja/rutine".to_string()); std::env::var("AI_SUMMARY_MODEL").unwrap_or_else(|_| "synops/low".to_string());
let request = ChatRequest { let request = ChatRequest {
model, model,