From 747244d07842df355fb6b2572cc8260da693e6dd Mon Sep 17 00:00:00 2001 From: vegard Date: Fri, 13 Mar 2026 16:16:59 +0100 Subject: [PATCH] AI Gateway (LiteLLM) lokalt oppsett + collect-docs script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LiteLLM container i docker-compose.dev.yml med healthcheck - Config med sidelinja/rutine (Gemini 2.5 Flash Lite) og sidelinja/resonering (Gemini 2.5 Flash) — flere leverandører legges til når API-nøkler er klare - collect-docs.sh samler all dokumentasjon til én fil for deling - Gitignore: server_context.md (generert output) Co-Authored-By: Claude Opus 4.6 --- .gitignore | 3 +++ config/litellm/config.yaml | 25 +++++++++++++++++++++++++ docker-compose.dev.yml | 21 +++++++++++++++++++++ scripts/collect-docs.sh | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 config/litellm/config.yaml create mode 100755 scripts/collect-docs.sh diff --git a/.gitignore b/.gitignore index 5680e1d..f17b079 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ # Scratch (testfiler, notater, midlertidig) .scratch/ +# Generert kontekstfil +scripts/server_context.md + # Miljovariabler .env.local .env diff --git a/config/litellm/config.yaml b/config/litellm/config.yaml new file mode 100644 index 0000000..f548ecd --- /dev/null +++ b/config/litellm/config.yaml @@ -0,0 +1,25 @@ +model_list: + # === sidelinja/rutine — billig, høyt volum === + - model_name: "sidelinja/rutine" + litellm_params: + model: "gemini/gemini-2.5-flash-lite" + api_key: "os.environ/GEMINI_API_KEY" + - model_name: "sidelinja/rutine" + litellm_params: + model: "gemini/gemini-2.5-flash" + api_key: "os.environ/GEMINI_API_KEY" + + # === sidelinja/resonering — presis, lav volum === + # 2.5 Flash brukes til resonering inntil vi legger til Anthropic/OpenRouter + - model_name: "sidelinja/resonering" + litellm_params: + model: "gemini/gemini-2.5-flash" + api_key: "os.environ/GEMINI_API_KEY" + +router_settings: + routing_strategy: "simple-shuffle" + num_retries: 2 + timeout: 60 + +general_settings: + master_key: "os.environ/LITELLM_MASTER_KEY" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 64ab176..4019424 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -41,6 +41,27 @@ services: timeout: 5s retries: 5 + # === AI Gateway === + + ai-gateway: + image: ghcr.io/berriai/litellm:main-stable + restart: unless-stopped + command: --config /etc/litellm/config.yaml + environment: + LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY} + GEMINI_API_KEY: ${GEMINI_API_KEY} + volumes: + - ./config/litellm/config.yaml:/etc/litellm/config.yaml:ro + ports: + - "127.0.0.1:4000:4000" + networks: + - sidelinja-dev + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:4000/health/liveliness || exit 1"] + interval: 15s + timeout: 5s + retries: 3 + # === Whisper: Transkripsjon === whisper: diff --git a/scripts/collect-docs.sh b/scripts/collect-docs.sh new file mode 100755 index 0000000..b1560dd --- /dev/null +++ b/scripts/collect-docs.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# Samler all prosjektdokumentasjon til én fil for deling med AI-er etc. +# Bruk: ./collect-docs.sh → skriver scripts/server_context.md +# ./collect-docs.sh - → skriver til stdout (for piping) + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +OUT="$SCRIPT_DIR/server_context.md" + +files=( + "$ROOT/ARCHITECTURE.md" + "$ROOT/CLAUDE.md" + "$ROOT"/docs/features/*.md + "$ROOT"/migrations/*.sql +) + +collect() { + for f in "${files[@]}"; do + [[ -f "$f" ]] || continue + rel="${f#"$ROOT/"}" + echo "================================================================" + echo "FILE: $rel" + echo "================================================================" + echo "" + cat "$f" + echo "" + echo "" + done +} + +if [[ "${1:-}" == "-" ]]; then + collect +else + collect > "$OUT" + echo "Wrote $OUT ($(wc -l < "$OUT") lines)" +fi