Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,8 @@ codeql-db/
codeql-results.sarif
docs/reviews/
grob-codex-proxy.toml

# Generated demo recordings
docs/demos/showcase-rssi/demo.cast
docs/demos/showcase-rssi/demo.gif
docs/demos/showcase-rssi/demo.webm
14 changes: 13 additions & 1 deletion deploy/demo/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
# make demo-logs Suit les logs du seed (trafic) et du watcher (coupure)
# make demo-reset Remet la démo à l'état s0 (idempotent)
# make demo-stop Arrête le pod sans supprimer les images
# make demo-cast Enregistre la doublure asciinema de la démo
# make demo-gif Convertit la doublure asciinema en GIF partageable
# make gen Régénère demo.kube.yaml depuis les fichiers source
# make grob-img (Re)construit l'image grob patchée (caviardages C1/C2)
# make tools (Re)construit l'image localhost/grob-demo-tools
Expand All @@ -25,8 +27,9 @@ POD := grob-demo
# Racine du dépôt (contexte de build pour l'image grob : le Containerfile fait
# COPY . . sur tout l'arbre source). Le Makefile vit dans deploy/demo.
REPO_ROOT := $(abspath $(CURDIR)/../..)
DEMO_DOCS := $(REPO_ROOT)/docs/demos/showcase-rssi

.PHONY: demo grob-img tools gen demo-logs demo-stop demo-reset urls
.PHONY: demo grob-img tools gen demo-logs demo-stop demo-reset demo-cast demo-gif urls

# Image grob PATCHÉE, buildée depuis l'arbre source local : elle embarque le
# correctif feat(audit) qui classe les caviardages en C1/C2 (DLP_WARN), encore
Expand All @@ -53,6 +56,15 @@ demo: grob-img tools gen ## Construit, régénère, puis déploie la démo compl
demo-logs: ## Suit le trafic (seed) et la coupure en direct (watcher).
$(PODMAN) logs -f $(POD)-seed $(POD)-watcher

demo-cast: ## Enregistre la doublure asciinema (stack déjà lancée).
@command -v asciinema >/dev/null 2>&1 || { echo "asciinema est requis. Installez asciinema puis relancez make demo-cast."; exit 1; }
cd $(REPO_ROOT) && asciinema rec -y -c "sh docs/demos/showcase-rssi/replay.sh" docs/demos/showcase-rssi/demo.cast

demo-gif: ## Convertit demo.cast en GIF partageable (nécessite agg).
@test -f $(DEMO_DOCS)/demo.cast || { echo "demo.cast introuvable. Lancez d'abord : make demo-cast"; exit 1; }
@command -v agg >/dev/null 2>&1 || { echo "agg est requis pour générer le GIF. Installez https://github.com/asciinema/agg puis relancez make demo-gif."; exit 1; }
agg $(DEMO_DOCS)/demo.cast $(DEMO_DOCS)/demo.gif

demo-stop: ## Arrête le pod (conserve images et manifeste).
$(PODMAN) kube down $(KUBE)

Expand Down
574 changes: 276 additions & 298 deletions deploy/demo/demo.kube.yaml

Large diffs are not rendered by default.

185 changes: 90 additions & 95 deletions deploy/demo/web/governance.html

Large diffs are not rendered by default.

19 changes: 18 additions & 1 deletion docs/demos/showcase-rssi/DEMO.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,21 @@

---

## Parcours visuel

```mermaid
flowchart LR
seed["Trafic de démo<br/>propre, caviardé, bloqué"] --> api["Grob demo API<br/>:8080"]
api --> audit["Journal d'audit<br/>signé"]
audit --> watcher["Watcher<br/>état par identité"]
watcher --> governance["Console gouvernance<br/>seuil + coupure"]
audit --> grafana["Grafana + Loki<br/>drill-down agent"]
governance --> logs["Lien Logs<br/>pré-filtré"]
logs --> grafana
```

---

## ⚡ Ouverture choc (le « waouh » d'abord) — 60 s

> **Avant de parler d'architecture, montrez le résultat.**
Expand Down Expand Up @@ -192,7 +207,9 @@ debugger devant le public :

```sh
# Enregistrement (une fois, stack lancée) :
asciinema rec -c "sh docs/demos/showcase-rssi/replay.sh" docs/demos/showcase-rssi/demo.cast
make -C deploy/demo demo-cast
# GIF visuel partageable, si agg est installé :
make -C deploy/demo demo-gif
# Rejeu devant le public :
asciinema play docs/demos/showcase-rssi/demo.cast
```
Expand Down
5 changes: 4 additions & 1 deletion docs/demos/showcase-rssi/PREFLIGHT.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@

- [ ] **Images récupérées** : `docker compose -f deploy/demo/docker-compose.yml pull`
(évite un téléchargement de plusieurs centaines de Mo devant le public).
- [ ] **Doublure enregistrée** : `demo.cast` produit et **rejoué en entier** au
- [ ] **Doublure enregistrée** : `make -C deploy/demo demo-cast`, puis
`asciinema play docs/demos/showcase-rssi/demo.cast` rejoué en entier au
moins une fois (voir DEMO.md → La doublure).
- [ ] **GIF visuel optionnel** : `make -C deploy/demo demo-gif` produit
`docs/demos/showcase-rssi/demo.gif` si `agg` est installé.
- [ ] **Captures de secours** du tableau de bord et de la page de blocages
placées dans ce dossier (mode hors-ligne).

Expand Down
4 changes: 2 additions & 2 deletions docs/demos/showcase-rssi/replay.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
# Sert à enregistrer l'« understudy » (cast asciinema) ET de repli si le live
# échoue. La stack doit déjà tourner (`cd deploy/demo && make demo`).
#
# asciinema rec -c "sh docs/demos/showcase-rssi/replay.sh" \
# docs/demos/showcase-rssi/demo.cast
# make -C deploy/demo demo-cast
# make -C deploy/demo demo-gif # optionnel, si agg est installé
# =============================================================================

set -eu
Expand Down
22 changes: 17 additions & 5 deletions docs/index.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Grob Documentation

Grob is a multi-provider LLM routing proxy. It sits between your AI coding assistant (Claude Code, Aider, Cline, etc.) and your LLM providers, routing requests with automatic failover, format translation, and spend tracking.
Grob is a multi-provider LLM routing proxy. It sits between your AI coding tools (Claude Code, Codex CLI, Aider, Cursor, Cline, etc.) and your LLM providers, routing requests with automatic failover, format translation, and spend tracking.

## Who is this for?

Expand All @@ -12,10 +12,22 @@ Grob is a multi-provider LLM routing proxy. It sits between your AI coding assis

```mermaid
flowchart TB
clients["Claude Code / Aider / Cline"] --> grob["Grob<br/>(proxy on localhost:13456)"]
grob --> a["Anthropic (priority 1)"]
grob --> or["OpenRouter (priority 2, fallback)"]
grob --> ol["Ollama (priority 3, local fallback)"]
subgraph clients["AI coding tools"]
claude["Claude Code"]
codex["Codex CLI"]
aider["Aider"]
cursor["Cursor"]
end

claude --> grob["Grob<br/>(proxy on localhost:13456)"]
codex --> grob
aider --> grob
cursor --> grob

grob --> anthropic["Anthropic<br/>(primary)"]
grob --> openrouter["OpenRouter<br/>(fallback)"]
grob --> gemini["Gemini"]
grob --> ollama["Ollama<br/>(local fallback)"]
```

Grob accepts requests in both Anthropic and OpenAI API formats, normalizes them, classifies by task type (thinking, web search, background, default), and dispatches to the best available provider. If one provider fails, the next in the priority chain is tried automatically.
Expand Down
Loading