AI & ML interests

None defined yet.

Recent Activity

edurdias  updated a Space 12 days ago
capyctl/README
edurdias  published a Space 12 days ago
capyctl/README
edurdias  published a model 17 days ago
capyctl/FrogNano-4B-2609-NVFP4
View all activity

Organization Card
CapyCTL, control what runs next

Run more models than your GPU can hold.

CapyCTL deploys, parks, wakes and switches models on vLLM, SGLang and TensorFold, on GPU machines you own, behind one OpenAI-compatible endpoint.

v0.1.2 · Apache-2.0 · one binary, written in Rust · Linux x86-64 and ARM64 · NVIDIA GPUs

$ capyctl list deployments
NAME           STATE    READY   REVISION   HOSTS
coding-small   ready    1/1     3          gpu-box
chat-large     ready    1/1     1          workstation
vision-small   parked   0/1     2          gpu-box

Example output. A parked model releases its GPU memory and wakes on the next request for it.

  • More models than memoryMost GPU machines hold one or two models at a time. CapyCTL parks the idle ones and wakes the one a request asks for, making room by parking or stopping an idle model.
  • One endpointOpenAI-compatible chat completions with streaming and tool calls, behind an API key. Your apps keep one base URL and pick a model by name.
  • Your engines, your weightsRegister the vLLM, SGLang or TensorFold installation you already have. Models come from a directory or from the Hub, pinned to a commit when you deploy.

Quick start

On Linux with an NVIDIA GPU and a vLLM, SGLang or TensorFold environment:

curl -fsSL https://edurdias.github.io/capyctl/install.sh | sh
capyctl engine add ~/venvs/vllm   # a vLLM, SGLang or TensorFold environment
capyctl start standalone

In another shell, deploy a model from the Hub. Three fields are enough:

# qwen3-4b.yaml
name: qwen3-4b
engine: vllm
model: {hf: Qwen/Qwen3-4B-Instruct-2507}
capyctl deploy model --file qwen3-4b.yaml --activate --wait

Any OpenAI client can now send qwen3-4b as the model name (Make a request). To free its GPU memory, run capyctl park deployment qwen3-4b; the next request wakes it. One server can also drive several GPU machines (Run on several machines).

Measured recipes

Deployment files run through CapyCTL, each sized so the model fits in 32 GiB once ready. Measured on a GB10 on 2026-10-07.

Model and checkpoint Engine Decode, one stream More streams
Qwen3.6-35B-A3B, MLX 4-bit, MTP drafts TensorFold 0.6.5 164 tokens/s 368 tokens/s at 8 streams
Qwen3.6-35B-A3B, NVFP4 vLLM 0.30.0 76.7 tokens/s 180 tokens/s at 4 streams
Qwen3.6-35B-A3B, NVFP4 SGLang 0.5.21 83.5 tokens/s 186 tokens/s at 4 streams
Nemotron 3.5 Lightning 30B-A3B, MLX 4-bit, MTP drafts TensorFold 0.6.5 137 tokens/s one request at a time
Nemotron 3.5 Lightning 30B-A3B, NVFP4 vLLM 0.30.0 69.9 tokens/s 164 tokens/s at 4 streams
Nemotron 3.5 Lightning 30B-A3B, NVFP4 SGLang 0.5.21 69.9 tokens/s 163 tokens/s at 4 streams

The TensorFold and NVFP4 rows serve different checkpoints, so they are not a one-to-one engine comparison. Each recipe lists the model revision, the commands, ready times, memory and a capyctl-bench report; the recipes repository has gpt-oss-20b, Gemma 4, Qwen3.8-27B and more.

In this organization

Checkpoints converted so a recipe can serve them. Each card says what changed from the original and how it was made.

Status

0.1.2 is early software: one GPU per model, CLI only, and breaking changes are possible between minor versions while the version starts with 0. Models that span several GPUs or machines are coming; they are not in a release yet. Questions and bug reports go to GitHub. Licensed under Apache-2.0.

datasets 0

None public yet