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
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

> The kill-switch isn't a dashboard button you press after the fact - it's an HTTP 402 the gateway returns mid-run, before the provider bills you.

![release](https://img.shields.io/badge/release-v1.20.0-brightgreen)
![release](https://img.shields.io/badge/release-v1.20.1-brightgreen)
![tests](https://img.shields.io/badge/tests-2422-brightgreen)
![image](https://img.shields.io/badge/ghcr.io-tokenfuse-blue?logo=docker)
![license](https://img.shields.io/badge/license-Apache--2.0-blue)
Expand All @@ -26,7 +26,7 @@ TokenFuse is a **drop-in proxy** between your AI agents and their LLM providers.

> **⚡ Try it in one command**, no signup, no account:
> ```bash
> docker run -p 4100:4100 -e TOKENFUSE_ALLOW_STUB=1 -e TOKENFUSE_PROFILE=observe ghcr.io/taipanbox/tokenfuse:v1.20.0
> docker run -p 4100:4100 -e TOKENFUSE_ALLOW_STUB=1 -e TOKENFUSE_PROFILE=observe ghcr.io/taipanbox/tokenfuse:v1.20.1
> ```
> `TOKENFUSE_ALLOW_STUB=1` is what makes this offline: with no provider behind
> it, the gateway answers from a built-in stub and meters a fixed 1000/500
Expand Down Expand Up @@ -317,7 +317,7 @@ TokenFuse is a **proxy**: start it, then point your agent at it instead of the p
Published to GitHub Container Registry, so it runs anywhere with Docker, nothing to compile:

```bash
docker run -p 4100:4100 -e TOKENFUSE_ALLOW_STUB=1 -e TOKENFUSE_PROFILE=observe ghcr.io/taipanbox/tokenfuse:v1.20.0
docker run -p 4100:4100 -e TOKENFUSE_ALLOW_STUB=1 -e TOKENFUSE_PROFILE=observe ghcr.io/taipanbox/tokenfuse:v1.20.1
```

A working gateway on **http://localhost:4100**, answering from a built-in fake
Expand Down Expand Up @@ -356,7 +356,7 @@ Tell TokenFuse where the provider is with `TOKENFUSE_UPSTREAM`, then send your a
docker run -p 4100:4100 \
-e TOKENFUSE_PROFILE=observe \
-e TOKENFUSE_UPSTREAM=https://api.anthropic.com/v1/messages \
ghcr.io/taipanbox/tokenfuse:v1.20.0
ghcr.io/taipanbox/tokenfuse:v1.20.1
```

`TOKENFUSE_PROFILE=observe` in that command is the choice to run **without client
Expand Down Expand Up @@ -405,7 +405,7 @@ curl http://localhost:4100/v1/messages \
docker run -p 4100:4100 -e TOKENFUSE_MODE=shadow \
-e TOKENFUSE_PROFILE=observe \
-e TOKENFUSE_UPSTREAM=https://api.anthropic.com/v1/messages \
ghcr.io/taipanbox/tokenfuse:v1.20.0
ghcr.io/taipanbox/tokenfuse:v1.20.1
```

`TOKENFUSE_MODE` = `enforce` (default under the governed profile) · `shadow` (default under `observe`) · `warn`.
Expand All @@ -416,7 +416,7 @@ docker run -p 4100:4100 -e TOKENFUSE_MODE=shadow \
docker run -p 4100:4100 -e TOKENFUSE_MODE=enforce -e TOKENFUSE_MAX_RUN_BUDGET_USD=25 \
-e TOKENFUSE_PROFILE=observe \
-e TOKENFUSE_UPSTREAM=https://api.anthropic.com/v1/messages \
ghcr.io/taipanbox/tokenfuse:v1.20.0
ghcr.io/taipanbox/tokenfuse:v1.20.1
```

A clamped call's response carries `x-fuse-budget-clamped: <ceiling>` (absent when nothing was clamped) and the first clamp of each run is logged once. A caller may still ask for less than the ceiling. An open run never moves up on a caller's declaration, so a later call cannot widen it, to the ceiling or otherwise (invariant 135); the answer to a call whose raise was refused carries `x-fuse-budget: raise-refused; kept=<usd>`, naming the budget the run kept, on both doors and on a stream too. A budget an operator set in the Cloud is the operator's own word and is not clamped, and it moves the run either way. Unset (the default) changes nothing. A value the gateway cannot read (`0`, `-1`, `1e9`, `abc`) exits 2 at startup rather than starting with no ceiling. It is one figure per run, not a per-agent limit: tying a budget to an agent identity needs client keys.
Expand Down Expand Up @@ -457,7 +457,7 @@ curl -s localhost:4100/v1/price-book
Every release from v0.5.0 on is signed keyless with Sigstore and carries a build-provenance attestation and an SBOM. The image tag is pinned on purpose: there is no `:latest`, so what you run is what a release page describes. With `cosign` and `gh` installed:

```bash
tag=v1.20.0
tag=v1.20.1
cosign verify-blob --bundle SHA256SUMS.sigstore.json \
--certificate-identity "https://github.com/TAIPANBOX/tokenfuse/.github/workflows/release.yml@refs/tags/${tag}" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com SHA256SUMS
Expand All @@ -468,13 +468,13 @@ gh attestation verify tokenfuse-x86_64-unknown-linux-musl -R TAIPANBOX/tokenfuse
The image:

```bash
cosign verify ghcr.io/taipanbox/tokenfuse:v1.20.0 \
cosign verify ghcr.io/taipanbox/tokenfuse:v1.20.1 \
--certificate-identity-regexp '^https://github.com/TAIPANBOX/tokenfuse/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
gh attestation verify oci://ghcr.io/taipanbox/tokenfuse:v1.20.0 -R TAIPANBOX/tokenfuse
gh attestation verify oci://ghcr.io/taipanbox/tokenfuse:v1.20.1 -R TAIPANBOX/tokenfuse
```

The v1.20.0 gateway image's digest is `sha256:84f6856dcfe609410429774c965bbc531d063b29c640871dd44b1c34b07ba628`. `cosign verify` on the tag checks that digest. Pin `ghcr.io/taipanbox/tokenfuse@sha256:84f6856dcfe609410429774c965bbc531d063b29c640871dd44b1c34b07ba628` if you want the bytes fixed rather than the tag.
The v1.20.1 gateway image's digest is `sha256:8de459eca2a10ae36a01d0249b91c3b0c62b50b47ad2c4a309e2ea02e0a460dd`. `cosign verify` on the tag checks that digest. Pin `ghcr.io/taipanbox/tokenfuse@sha256:8de459eca2a10ae36a01d0249b91c3b0c62b50b47ad2c4a309e2ea02e0a460dd` if you want the bytes fixed rather than the tag.

Releases before v0.5.0 carry checksums only. Verified on 2026-09-13 from a machine that built nothing: `sha256sum -c` OK on a downloaded binary, and `gh attestation verify` on the binary and on the image both returned a SLSA provenance v1 statement signed by this workflow at `refs/tags/v0.5.0`. The release assets are plain binaries, not archives: `tokenfuse-<target>` and `tokenfuse-cloud-<target>`.

Expand Down Expand Up @@ -660,7 +660,7 @@ Since v0.4.0, on `main` and in the releases after it (see `docs/releases/`): Tok
It has **not** yet had a production hardening pass or a security audit; treat it as an early, capable release you can evaluate today, not a turnkey enterprise product. Run it in **shadow mode** first.

```bash
docker run -p 4100:4100 -e TOKENFUSE_ALLOW_STUB=1 -e TOKENFUSE_PROFILE=observe ghcr.io/taipanbox/tokenfuse:v1.20.0 # gateway, offline
docker run -p 4100:4100 -e TOKENFUSE_ALLOW_STUB=1 -e TOKENFUSE_PROFILE=observe ghcr.io/taipanbox/tokenfuse:v1.20.1 # gateway, offline
cd cloud && docker compose up # + Cloud dashboard (:3000)
```

Expand Down
6 changes: 3 additions & 3 deletions cloud/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
# is also the id every row on the dashboard is keyed by.
services:
control-plane:
image: ghcr.io/taipanbox/tokenfuse-control-plane:v1.20.0
image: ghcr.io/taipanbox/tokenfuse-control-plane:v1.20.1
# Or build locally instead of pulling: `docker compose build`
# build:
# context: ..
Expand All @@ -50,7 +50,7 @@ services:
- "127.0.0.1:8080:8080"

dashboard:
image: ghcr.io/taipanbox/tokenfuse-dashboard:v1.20.0
image: ghcr.io/taipanbox/tokenfuse-dashboard:v1.20.1
# Or build locally: `docker compose build`
# build: ./dashboard
ports:
Expand All @@ -59,7 +59,7 @@ services:
- control-plane

gateway:
image: ghcr.io/taipanbox/tokenfuse:v1.20.0
image: ghcr.io/taipanbox/tokenfuse:v1.20.1
environment:
TOKENFUSE_ADDR: "0.0.0.0:4100"
# This is a local demo, reached only through the 127.0.0.1 port below, and it
Expand Down
Loading