sh scripts/poc_demo.sh → localhost:8099
Keyless: no API keys, synthetic data
Verified: demo up in ~8s · 54 tests green
git fetch origin && git checkout poc/ollin-demo && sh scripts/poc_demo.sh → open http://localhost:8099. That's the whole thing running on synthetic data. Everything else below is for testing the pieces individually..venv-demo/ (gitignored) on first run; re-runs are instant.git fetch origin && git checkout poc/ollin-demo (it merges PRs #86/#87/#88).sh scripts/poc_demo.sh — first run builds the venv + installs the two services' deps (~1 min); later runs boot in seconds.http://localhost:8099. Three panels: Your evidence · Your dossier (click "Generate the dossier") · Career Radar.Ctrl-C, or from another shell pkill -f demo/server.py.With the server up, these three curls exercise the whole loop. Outputs shown are the real responses I got:
# Career Radar — the oll-scout tick (fixture jobs → scored) curl -s localhost:8099/api/demo/radar | python3 -m json.tool → 7 matches, ranked. Top: 91 — Senior Backend Engineer (Python), Helvetia Fintech AG # Grounding — cited retrieval over the synthetic corpus curl -s -X POST localhost:8099/api/demo/ground -H 'content-type: application/json' -d '{}' → { backend, collection:"mem:user:synthetic-nadia", grounded:[…], evidence:[…], floor, context_blob } # Grounding — the HONEST ABSTAIN path (off-corpus query) curl -s -X POST 'localhost:8099/api/demo/ground?abstain=1' -H 'content-type: application/json' -d '{}' → { "abstained": true } (cosine 0.072 < floor 0.08 — no fabricated citation) # Dossier — the 3 verbs on the retrieved context (offline mock model) curl -s -X POST localhost:8099/api/demo/dossier -H 'content-type: application/json' -d '{}' → { tailored_cv, cover_letter, interview_prep, citations } provider=mock-offline
Each POC is also its own branch you can check out and test in isolation. Standard house pattern: make a venv, install the service's requirements.txt + pytest, run the suite. Commands below are verified.
poc/ollin-dossier-verbs (PR #87)git checkout poc/ollin-dossier-verbs cd services/oll-write python3 -m venv .venv && . .venv/bin/activate pip install -q -r requirements.txt pytest python -m pytest -q # → 172 passed (150 baseline + 22 new) python scripts/poc_dossier.py # offline: prints the 3 dossier outputs from synthetic CV+JD
Watch for the honest gap-marker in the CV output — e.g. [add: German level not stated in profile — confirm C1] — proof the "write only from the evidence, leave a gap rather than invent" rule fires.
poc/oll-scout (PR #88)git checkout poc/oll-scout cd services/oll-scout python3 -m venv .venv && . .venv/bin/activate pip install -q -r requirements.txt pytest python -m pytest -q # → 32 passed python scout_cron.py --once # ONE synthetic tick → prints the ranked digest
scout_cron.py --once from inside services/oll-scout/. Its SQLite store path is relative, so launching it from the repo root fails with unable to open database file. The showcase demo sidesteps this by running the tick in-process.poc/ollin-rag-synthetic (PR #86)git checkout poc/ollin-rag-synthetic python3 scripts/poc/seed_synthetic_corpus.py # ingest 5 synthetic docs / 26 chunks python3 scripts/poc/retrieve_and_ground.py # retrieve cited passages + show the abstain demo python3 -m pytest scripts/poc/test_rag_poc.py -q # → 5 passed (relevance + abstain)
This fills a local RAG store with a synthetic candidate corpus and proves retrieval returns real cited passages and abstains on an off-corpus query. It uses a local stand-in (oll-memory's own default keyless embedder); it never touches the production memory service.
| Check | Command | Observed |
|---|---|---|
| Demo boots | sh scripts/poc_demo.sh | UP in ~8s on :8099 (venv cached) |
| Radar endpoint | GET /api/demo/radar | 7 matches ranked; top 91 Helvetia Fintech |
| Abstain path | POST /api/demo/ground?abstain=1 | abstained: true |
| Dossier endpoint | POST /api/demo/dossier | cv/cover/interview + citations, provider mock-offline |
| oll-scout tests | pytest (services/oll-scout) | 32 passed in 0.18s |
| New verb tests | pytest test_{tailor_cv,cover_letter,interview_prep} | 22 passed in 0.22s |
SCOUT_PROVIDER=jooble).