Open models for agentic workloads, run on-premise.
A model you cannot re-run is a result you cannot defend. Closed models are retired on the vendor’s schedule, not yours; the 2023 cohort peaked in research use inside eighteen months. Open weights on our own hardware do not expire. Pin a version, cite it, reproduce it years later. And because the model never leaves the building, neither does your data.
OpenAI-compatible inference from Research Technology Services. Proof-of-Concept, invite-only, granted case by case.
Base URL
OpenAI-compatible · /v1 · 3 chat models · Bearer sk-… · up to 1M context · on-prem
Why open weights
Each successive release year is associated with a 27% shorter time-to-peak and a 23% shorter lifespan, with costs falling on reproducibility and migration.
For none of the five studies, we were able to fully reproduce the results.
The 2024 FMTI reported that transparency was improving, but the 2025 FMTI finds this progress has deteriorated: the average score out of 100 fell from 58 in 2024 to 40 in 2025.
Many organizations don’t want to depend on models they cannot run and control themselves.
We need a diverse AI assistant for the same reason we need a diverse press.
Study how the system works and inspect its components.
Degrees of openness are relevant to fairness and accountability at all points, from data collection and curation to model architecture, and from training and fine-tuning to release and deployment.
Open-source frameworks like LLaMA and Mixtral democratize access, foster collaboration, and support diverse applications.
Model roster
03 livespeed → depth
-
Fastrecommended qwen3.8-flash-next
-
High quality qwen3.8-27b
-
Deep reasoning glm-5.3-flash
Verified 16 September 2026 against both serving nodes and the gateway. The authoritative live model list is always GET /v1/models; this table is a summary.
Not what you need? These are general-purpose base models, and the roster is not fixed. If your work depends on a particular open-weight model, we can look at hosting it. Say so when you request access.
Inference nodes
02 serving nodesTwo GPU nodes reserved for serving this endpoint. Always-on and low-latency, not a batch or training cluster. Both on-premise at ResTech.
-
Primary rtsai1
-
Federated rtsai2
Capabilities
Platform-wide. Context and vision vary by model; see the roster.
- Context window1,000,000–1,048,576 tokens
- Tool callingfunctions
- Visionimage input
- StreamingSSE
- Structured outputJSON schema
- Separated reasoningreasoning_content
Supporting services
- Embeddings bge-m3 · 1024-dim
- Rerank bge-reranker-v2-m3
- Audio transcription qwen3-asr-1.7b · /v1/audio/transcriptions · word timestamps
Quickstart
Send your first request.
# the recommended model; a successful call returns a chat completion
curl https://inference.restech.unsw.edu.au/v1/chat/completions \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d '{"model": "qwen3.8-flash-next", "messages": [{"role": "user", "content": "Hello"}], "stream": true}'
# pip install openai
from openai import OpenAI
client = OpenAI(base_url="https://inference.restech.unsw.edu.au/v1", api_key="sk-...")
resp = client.chat.completions.create(
model="qwen3.8-flash-next",
messages=[{"role": "user", "content": "Hello"}],
)
print(resp.choices[0].message.content)
GET /v1/models requires your key (returns 401 without one). The status indicator checks gateway reachability only; it does not test individual models.
Keep your sk-… key in an environment variable or a local .env that is excluded from Git. Never commit it.
Coding agents
Terminal agents talk to the gateway like any OpenAI-compatible endpoint. Set a base URL, a key, and a model.
// install: npm i -g opencode-ai
// config: ~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"restech": {
"npm": "@ai-sdk/openai-compatible",
"name": "RTS Local Inference",
"options": {
"baseURL": "https://inference.restech.unsw.edu.au/v1",
"apiKey": "sk-..."
},
"models": {
"qwen3.8-flash-next": { "name": "Qwen3.8 Flash Next" },
"glm-5.3-flash": { "name": "GLM-5.3 Flash" }
}
}
}
}
// run: opencode → /models → RTS Local Inference
# install: npm i -g @openai/codex
# config: ~/.codex/config.toml
model = "qwen3.8-flash-next"
model_provider = "restech"
[model_providers.restech]
name = "RTS Local Inference"
base_url = "https://inference.restech.unsw.edu.au/v1"
env_key = "RESTECH_API_KEY"
wire_api = "responses"
# run: export RESTECH_API_KEY=sk-... && codex
# Codex speaks the Responses API only; this gateway serves /v1/responses.
# install: npm i -g @qwen-code/qwen-code
# config: ~/.qwen/.env (or export these in your shell)
OPENAI_BASE_URL=https://inference.restech.unsw.edu.au/v1
OPENAI_API_KEY=sk-...
OPENAI_MODEL=qwen3.8-flash-next
# run: qwen
# install: curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash
# config: ~/.kimi/config.toml
default_model = "rts-qwen"
[providers.restech]
type = "openai_legacy"
base_url = "https://inference.restech.unsw.edu.au/v1"
api_key = "sk-..."
[models.rts-qwen]
provider = "restech"
model = "qwen3.8-flash-next"
max_context_size = 1048576
# run: kimi
// install: npm i -g @mariozechner/pi-coding-agent
// config: ~/.pi/agent/models.json
// note: "models" replaces the provider's built-in list, so declare every model you want.
{
"providers": {
"restech": {
"baseUrl": "https://inference.restech.unsw.edu.au/v1",
"apiKey": "RESTECH_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "qwen3.8-flash-next",
"name": "Qwen3.8 Flash Next",
"reasoning": true,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 1048576,
"maxTokens": 32768
}
]
}
}
}
// apiKey takes a literal key or an environment variable NAME (no $).
// run: export RESTECH_API_KEY=sk-... && pi --model restech/qwen3.8-flash-next
# install: pip install hermes-agent
# config: ~/.hermes/config.yaml (put the key in ~/.hermes/.env if you prefer)
model:
default: qwen3.8-flash-next
provider: custom
base_url: https://inference.restech.unsw.edu.au/v1
api_key: sk-...
# run: hermes setup → hermes chat
# `provider: custom` is a first-class provider; with base_url set, Hermes calls
# this endpoint directly. `hermes model` configures the same thing interactively.
# config.yaml is the single source of truth. There is no LLM_MODEL env var.
Cursor is not supported here. That is by design, not by omission.
Cursor builds the final prompt on its own servers. Even when you supply your
own API key, every request travels:
your editor → Cursor's backend → this gateway
Two consequences:
1. It needs a *publicly reachable* HTTPS endpoint. This gateway is
campus-internal and has no public address, so Cursor cannot reach it.
2. Your prompts and source code would leave the campus network and pass
through a third party. That is the precise thing an on-premise inference
service exists to prevent.
Exposing the gateway publicly to satisfy point 1 would guarantee point 2.
So we do not.
Every agent in the other tabs sends its inference requests straight from your
machine to this gateway, so your prompts and code stay on the campus network.
(The tools themselves may still check for updates or phone home on their own.
That is between you and them; it is not this gateway.)
Function calling is available on qwen3.8-flash-next, qwen3.8-27b and glm-5.3-flash, the models these agents drive. Same key as the REST API; see Quickstart for the raw calls and Access to request one.
Access
Local Inference is a Proof-of-Concept. Access is invite-only and granted case by case. Each project receives its own virtual key (sk-…), sent as an Authorization: Bearer header.
To request access, email us your project, a contact, and expected use.