No description
  • TypeScript 95.3%
  • Shell 2.5%
  • Dockerfile 1.8%
  • Nix 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
reinitialized f464251155
Some checks failed
nightly / build (bun-linux-x64) (push) Successful in 4m12s
nightly / build (bun-linux-arm64) (push) Successful in 4m13s
nightly / docker (push) Failing after 11m42s
nightly / publish (push) Has been skipped
feat: add Docker support with nightly builds and healthcheck functionality
2026-09-21 12:49:08 -05:00
.forgejo/workflows feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
.vscode feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
scripts feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
src feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
test feat: add mock upstream server for testing OpenAIAdapter and server endpoints 2026-09-21 08:43:25 -05:00
.dockerignore feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
.gitignore feat: add mock upstream server for testing OpenAIAdapter and server endpoints 2026-09-21 08:43:25 -05:00
bun.lock feat: add mock upstream server for testing OpenAIAdapter and server endpoints 2026-09-21 08:43:25 -05:00
docker-compose.yml feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
Dockerfile feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
flake.nix feat: add mock upstream server for testing OpenAIAdapter and server endpoints 2026-09-21 08:43:25 -05:00
package.json feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
README.md feat: add Docker support with nightly builds and healthcheck functionality 2026-09-21 12:49:08 -05:00
tsconfig.json feat: add mock upstream server for testing OpenAIAdapter and server endpoints 2026-09-21 08:43:25 -05:00

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 docker label. 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.sock mounted, or DinD).

If the release or registry push hits a permissions error, add a repo secret RELEASE_TOKEN with write:repository and write:package scope; the workflow prefers it over the default job token.