The idea
You upload a small bundle: one inference.yaml plus a scripts/ folder with your Python. The platform finds GPU workers that match your requirements, boots your model on them, and hands you back two things:
- an endpoint URL where your model listens,
- a predict API key, shown once at submit. Save it; every request needs it in the
X-API-Keyheader.
From that point the runtime is a normal HTTP service. Your code, your weights, your endpoint. Stop the job and billing stops with it.
Two runtime types
The engine field in your yaml picks one of two contracts. Everything else about submitting is the same.
Serving an open LLM? Use vLLM mode and skip writing inference code entirely. Serving anything else, or your own architecture? Use the custom contract. Start with Serve vLLM models or Serve custom models.
Submit a job
- 1
Get your bundle
Fastest path: copy a folder from the examples repository (vLLM examples, custom examples) and edit it. Each folder is complete: yaml, scripts, a submit script, a test client. - 2
Submit from Python
One call uploads the bundle and starts provisioning. - 3
Save the endpoint and key
The submit response prints both. The key is never shown again; you can rotate it later from the dashboard.
from resontech import InferenceConfig, ResonTech, ResonTechConfig
sdk = ResonTech(ResonTechConfig(
platform_api_key="rsk_...", # from /profile → Developer
s3_access_key_id="...",
s3_secret_access_key="...",
))
job = sdk.rt_submit_inference(
name="my-model",
inference=InferenceConfig(
gpu_models=["rtx_5070", "rtx_5090"], # ordered preference
max_price_per_gpu_hour=2.50, # $ per GPU per hour
),
inference_yaml="./inference.yaml",
scripts_dir="./scripts",
)
print(job.endpoint) # → https://<subdomain>.../predict
print(job.predict_api_key) # shown ONCE — save it now
job.wait_until_ready(timeout=3600)max_price_per_gpu_hour are required unless you pin worker_ids. Together they bound what the platform may pick for you: which GPUs, and at what price. gpu_models is an ordered preference of catalog ids, not a set — workers are taken from the first entry before the next. With two RTX 5070s and one 5090 free and two workers needed, you get the pair of 5070s. The price is per GPU per hour, the same unit the catalog quotes, so a 4-GPU worker costs four times it. Valid ids come from the list below.Loading GPU ids…
wait_until_ready() polls until the runtime is RUNNING. You can watch the same progress on the dashboard, worker by worker.Full parameter reference: Submit inference via SDK. Prefer the browser? The dashboard's inference wizard accepts the same two files.
Call it
A vLLM runtime speaks the OpenAI protocol. Point any OpenAI client at <endpoint>/v1:
curl "$ENDPOINT/v1/chat/completions" \
-H "X-API-Key: $PREDICT_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "assistant",
"messages": [{"role": "user", "content": "Say hello."}],
"max_tokens": 64
}'A custom runtime takes bytes on /predict and returns your class's JSON:
curl -X POST "$ENDPOINT" \
-H "X-API-Key: $PREDICT_KEY" \
-H "Content-Type: application/octet-stream" \
--data-binary @input.pngBoth runtime types also expose GET /health (no auth) as a readiness check, and the dashboard playground lets you test either kind from the browser.