- TypeScript 95.3%
- Shell 2.5%
- Dockerfile 1.8%
- Nix 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| .vscode | ||
| scripts | ||
| src | ||
| test | ||
| .dockerignore | ||
| .gitignore | ||
| bun.lock | ||
| docker-compose.yml | ||
| Dockerfile | ||
| flake.nix | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
SingleKeyManyProviders
SKMP is a unified LLM routing platform designed to tackle the following problems:
- KEEP IT SIMPLE STUPID: Too many routing projects are over scoped, resulting in poor UX. SKMP keeps it focused.
- ZERO DEPENDENCIES: Lightweight and to the point, only implementing exactly what is needed to get the job done. No third party dependencies allowed.
- MODULAR: Unified core, reusing code wherever possible.
- Single Key, all the providers: Using a single key, you can access any available model and choose who and how it routes to providers.
- Single Pane of Glass: Powerful but simple to use web interface for easily connecting providers and configuring routing policy:
- The best model for the prompt: Always routes prompts to the best LLM for the job baesd on available providers
- Balance: Balance between usage and the right LLM for the job
- Maximize Usage: Prioritize maximizing usage while still keeping model intelligence in mind.
- Detailed token usage, which provider, etc.
- Automatic load-balancing/switching between rate-limited connections to ensure non-stop work while respecting individual ratelimits/useg restrictions.
- Utilizes its own prompt caching/compaction to improve usage across different providers when load balancing/swapping.
Quick start (Docker)
The nightly release artifact is a multi-arch container image
(linux/amd64 + linux/arm64), so deployment is a single command:
docker run -d --name skmp \
-p 8787:8787 \
-v skmp-data:/data \
git.ds.reinitialized.net/reinitialized.studio/skmp:nightly
Or with Compose:
docker compose up -d
docker compose logs skmp # the first run prints the generated API key
On first start SKMP generates an API key and prints it once; grab it with
docker logs skmp. To pin your own key instead, set SKMP_KEY (Compose reads
it from a local .env).
| Setting | Default in image | Notes |
|---|---|---|
SKMP_HOST |
0.0.0.0 |
bind address; already container-ready |
SKMP_PORT |
8787 |
also the exposed port |
SKMP_DATA_DIR |
/data |
SQLite lives here — mount a volume |
SKMP_KEY |
(unset) | set to pin the client key |
The database persists in the /data volume, the image runs as a non-root user
on a distroless base (no shell, no package manager), and a HEALTHCHECK is
built in, so docker ps reports real health.
Available tags: nightly (rolling), nightly-<YYYYMMDD>, and sha-<commit>
for pinning an exact build.
Build the image locally with bun run nightly:docker (or the Nightly Build
(Docker) VS Code task), then bun run docker:run.
Nightly builds
Nightly builds are on-demand: they run when you ask for them locally, and
automatically on every sync to git.ds.
Locally
Press Ctrl+Shift+B in VS Code to run the default Nightly Build task, or from a terminal:
bun run nightly # install, typecheck, test, compile
bash scripts/nightly.sh --skip-tests # fast iteration
bash scripts/nightly.sh --target bun-linux-arm64
The result lands in dist/skmp-<os>-<arch> alongside dist/BUILD_INFO and a
.sha256 checksum. Versions are stamped as
<version>-nightly.<YYYYMMDD>+<commit>.
A Nightly Build (skip tests) task is also available via Terminal → Run Task…, along with Test and Typecheck.
On sync to git.ds
.forgejo/workflows/nightly.yml runs on every push to indev, on manual
dispatch, and on a 04:00 UTC schedule. It builds linux-x64 and linux-arm64,
pushes the multi-arch container image to the git.ds registry, and republishes
a rolling nightly pre-release.
The container image is the primary artifact:
docker pull git.ds.reinitialized.net/reinitialized.studio/skmp:nightly
Standalone binaries remain attached to the release for non-container hosts:
curl -LO https://git.ds.reinitialized.net/reinitialized.studio/SKMP/releases/download/nightly/skmp-linux-x64
chmod +x skmp-linux-x64
Checksums for every asset are published as SHA256SUMS on the same release.
Requires a Forgejo Runner registered with the
dockerlabel. The image job runs directly on the runner host (not inside a job container), so the runner needs access to a Docker daemon (/var/run/docker.sockmounted, or DinD).If the release or registry push hits a permissions error, add a repo secret
RELEASE_TOKENwithwrite:repositoryandwrite:packagescope; the workflow prefers it over the default job token.