| title | agentic-systems-demo | |||
|---|---|---|---|---|
| slug | agentic-systems-demo | |||
| updated_at | 2026-09-02 13:35:00 +0700 | |||
| tags |
|
Runnable demos of agentic-system patterns — one pattern per app, built with LangGraph. Every app comes up with a single command and a Docker Compose file.
Each app under apps/ is fully self-contained — its own dependencies, lockfile,
Dockerfile, gateway config and quality gates — so it can be lifted into its own repository
and pulled back in as a git submodule without changing a line.
| Order | App | Pattern |
|---|---|---|
| 1 | prompt-chaining | A raw topic becomes a finished blog post through a linear chain: outline → write each section → review and polish. Includes a mid-chain validation gate and an optional human approval step. Calls Gemini directly. |
| — | bifrost-gateway | Not a demo yet: a Bifrost LLM gateway, waiting for a pattern that needs several providers behind one endpoint, per-step model routing, or one request log across a whole run. |
mise run install # sync every app's dependencies
# Put the two provider keys somewhere the gateway can reach them — pick one:
mise run vault-bootstrap # (recommended) store them in Vault
cp .env.example .env && $EDITOR .env # or a local .env file
mise run demo prompt-chainingmise run demo builds the app image and runs it, with the keys resolved for that one
command. Arguments after the app name go to the app:
mise run demo prompt-chaining --topic "Why Rust is worth a Python developer's time"--help is the one flag mise keeps for itself; for an app's own help, invoke it
directly.
Without mise, from inside the app directory:
cd apps/prompt-chaining
../../scripts/with-secrets.sh docker compose run --rm --build demo --topic "..."The apps need GEMINI_API_KEY (used by prompt-chaining and the gateway) and
OPENROUTER_API_KEY (gateway only). Nothing is ever read from a file at run time or baked
into an image — a key reaches a container as an environment variable, for the length of one
command, and nowhere else.
Two backends, one entry point (scripts/with-secrets.sh):
- Vault (default when a token is available) — keys are read from
kv/minhdqdev/dev/agentic-systems-demoat run time and never touch the filesystem. .env(fallback) — fine for a throwaway experiment; it is still a credential at rest with nobody's name on its lifetime.
Full reasoning, AppRole setup for CI, and the Kubernetes/Vault-Agent story: docs/secrets.md.
apps/<pattern>/ a complete, self-contained demo — see below
scripts/ with-secrets.sh, vault-bootstrap.sh
.mise/tasks/ the task scripts behind `mise run ...`
docs/ architecture, secrets, how to add an app
Every app has the same shape:
apps/prompt-chaining/
├── docker-compose.yaml everything the app runs
├── Dockerfile build context is this directory and nothing above it
├── pyproject.toml deps *and* this app's ruff/mypy/pytest config
├── uv.lock
├── src/prompt_chaining/
└── tests/
An app brings whatever infrastructure it needs and nothing it does not: prompt-chaining
is one container, bifrost-gateway is a gateway with no app code yet.
- docs/architecture.md — how the pieces fit and why there is a gateway at all
- docs/adding-an-app.md — the checklist for app number two
- docs/secrets.md — where the keys live
mise tasks # everything available
mise run check # every gate CI runs, across every app
mise run check prompt-chaining # just one app
mise run fmt # ruff format + autofix
mise run gateway bifrost-gateway # start the standalone gatewayThe tests are offline by design: every graph keeps its checkable logic in plain Python nodes, so no key, gateway or network is needed to run them.
- mise (installs Python 3.13 and
uv) - Docker with Compose v2
- A Gemini API key (and an OpenRouter key, if you run the gateway)
- Optional: the
vaultCLI, for the Vault secrets backend