RaymondVerhoef 4a8dbee7df feat: phase 1 of AI pipeline hardening — single LLM client + tier-aware models
Implements phase 1 of AI_PIPELINE_HARDENING_PLAN.md. Every Anthropic call
now goes through one module that owns retry, timeout, abort, structured-
output parsing, schema validation, and best-effort call telemetry.

* src/lib/llm.js — single callLLM entry point. Resolves model per tier
  (fast / standard / reasoning) with admin:model legacy fallback for the
  standard tier; 60s default timeout via AbortController; balanced-brace
  JSON extraction; LLMHttpError, LLMTruncatedError, LLMOutputError, and
  LLMValidationError surface clearly distinct failure modes.
* src/lib/llmRetry.js — exponential backoff with full jitter, retries
  only on transient HTTP statuses, honours Retry-After up to 60s, never
  retries on AbortError.
* src/lib/llmSchemas.js — Zod schemas for every structured task plus
  normalizeHandbookResult (collapses legacy "executes" relations into
  the canonical "executed_by" vocabulary).
* src/lib/api.js — thin shim over callLLM so existing callers (extraction
  pipeline, learning, quiz, R42, knowledge graph) keep working unchanged.
* src/lib/__tests__/ — 32 Vitest cases covering parse paths, error
  surfaces, simulation mode, model resolution, and schema validation.
* src/pages/Admin/index.jsx — three model inputs (fast / standard /
  reasoning) replacing the single legacy field; legacy value falls back
  for the standard tier so existing overrides survive.

Adds Zod and Vitest, plus an "npm run test" script.

Also cleans up the pre-existing repo-wide ESLint failures so phase 1's
"npm run lint passes" acceptance criterion can be checked: drops unused
React imports across the JSX tree (React 19 JSX runtime auto-imports),
attaches cause to rethrown errors in the service modules, ignores
pb_migrations in the ESLint config (PocketBase JSVM globals), and
removes one dead handleCreateCustom function in Leren.jsx. A real
behaviour bug surfaced in Testen.jsx — the quiz timer captured a stale
finishQuiz via setInterval closure; now updated via finishQuizRef so the
timer always invokes the latest callback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 13:50:09 +02:00

Respellion Learning Platform

An internal AI-powered learning platform that keeps Respellion employees up to date with the company's evolving knowledge base.

Features

  • Weekly Learning Station — Each employee is assigned a topic each week (via deterministic hash of user ID + week number). They choose their preferred format: Article, Slides, or Infographic. Content is generated on-demand by Claude and cached per topic.
  • Weekly Test — AI-generated quiz based on the knowledge graph. Results are stored and feed the leaderboard.
  • Leaderboard & Gamification — Points for correct answers, badges for streaks and perfect scores.
  • R42 Chatbot — An always-available AI assistant (backed by Claude) with access to the full knowledge graph. Can propose graph updates that admins approve or reject.
  • Admin Panel — Manage the knowledge graph, sync from GitHub, review generated content, refine it with AI, and monitor team progress.

Tech Stack

Layer Technology
Frontend React 18 + Vite
Styling Vanilla CSS (custom properties) + Tailwind utility classes
Animations Framer Motion
Icons Lucide React
Graph viz D3.js (admin knowledge graph only)
Backend / DB PocketBase (self-hosted)
AI Anthropic Claude (via Caddy reverse proxy)
Infra Docker + Caddy

Getting Started (local dev)

# 1. Install dependencies
npm install

# 2. Start PocketBase (Windows)
./pocketbase.exe serve

# 3. Start the dev server
npm run dev

The Vite dev server proxies /api/anthropic and /pb — see vite.config.js.

Deployment (Docker)

docker compose up -d

The Caddyfile handles:

  • SPA fallback routing
  • /pb/* → PocketBase sidecar
  • /api/anthropic/* → Anthropic API (with server-side API key injection)

Key Files

File Purpose
src/lib/learningService.js Selective content generation (article / slides / infographic)
src/lib/extractionPipeline.js GitHub file → knowledge graph extraction
src/lib/api.js Anthropic API wrapper (generateContent + chat)
src/lib/db.js All PocketBase data access
src/lib/giteaService.js GitHub API client (folder listing + raw file fetch)
src/store/AppContext.jsx Global state; computes ISO week number on load
src/components/admin/UploadZone.jsx GitHub sync UI (default folder: docs/knowledge-base/)
AI_AGENT.md Detailed context guide for AI coding agents

Content Types

Learning content is generated on demand per type and merged into the cached object:

Type Key in DB Description
Article content.article Long-form reading
Slides content.slides Slide deck with speaker notes
Infographic content.infographic Visual summary with stats and steps

The podcast type was removed. Do not re-add it.

Documentation

  • AI_AGENT.md — Full architectural guide for AI coding agents (patterns, gotchas, decisions).
  • CHANGELOG.md — PocketBase upstream changelog (not application changelog).
Description
No description provided
Readme 95 MiB
Languages
JavaScript 95.6%
TypeScript 3.6%
CSS 0.8%