LLM Inference API Guide¶
The UT HPC Center provides an OpenAI-compatible LLM API with access to chat, transcription, and embedding models.
Base URL: https://llm.hpc.ut.ee/v1
Getting Access¶
API Key Required
Order the UT HPC LLM inference resource in the minu.etais.ee self-service portal and create an API key for the resource. The full procedure, from ordering the resource to revealing and revoking keys, is described in Ordering an LLM inference resource.
Keys are used for authentication and usage tracking - keep yours confidential and do not share it.
Contact support@hpc.ut.ee if you have questions about access to the service.
Available Models¶
Chat & Reasoning¶
| Model name | Base model | Quantization | Best for | Context | Pricing |
|---|---|---|---|---|---|
deepseek-v4.1-flash | DeepSeek V4.1 Flash — multimodal MoE (552 B total) | FP8 (native), FP8 KV cache | Complex reasoning, coding, math, and agentic tasks; text + image input. Reasoning is on by default — tune its depth with reasoning_effort. | 1,048,576 (1M) | Input: €0.30 / 1M tokens Output: €1.20 / 1M tokens Cache: €0.06 / 1M tokens |
qwen3.8-27b | Qwen3.8 27B NVFP4 — dense, vision-language | NVFP4 (W4A4) | General chat, coding, research, and summarization; text + image input. Thinking is on by default — tune the depth with reasoning_effort or turn it off per request. | 262,144 (256K) | Input: €0.17 / 1M tokens Output: €0.50 / 1M tokens Cache: €0.005 / 1M tokens |
nemotron-3.5-super-vl | Nemotron 3.5 Super VL 120B-A12B — MoE (120 B total / 12 B active), vision-language | NVFP4 | Long-context reasoning and document/video understanding; text + image + video input. Reasoning is on by default — tune its depth with reasoning_effort. | 524,288 (512K) | Input: €0.17 / 1M tokens Output: €0.50 / 1M tokens Cache: €0.005 / 1M tokens |
Reasoning & thinking
- DeepSeek V4.1 Flash — reasoning is enabled by default.
reasoning_efforttakes a string (low,medium, orhigh) to tune its depth, ornoneto turn off reasoning. Reasoning tokens are reported inusage.completion_tokens_details.reasoning_tokens. - Qwen3.8 27B — thinking is enabled by default.
reasoning_effortselects the depth:xhigh(default),medium, orlow. For a direct, non-thinking response, setreasoning_efforttononeor pass"chat_template_kwargs": {"enable_thinking": false}. - Nemotron 3.5 Super VL — reasoning is enabled by default.
reasoning_efforttakeslow,medium,high, orxhighto tune its depth, ornoneto turn off reasoning. Reasoning tokens are reported inusage.completion_tokens_details.reasoning_tokens.
Transcription¶
| Model name | Base model | Quantization | Best for | Pricing |
|---|---|---|---|---|
whisper-large-v3-turbo-et | TalTechNLP whisper-large-v3-turbo-et-verbatim-2604 — Estonian verbatim fine-tune of Whisper large-v3-turbo | BF16 | Audio transcription, Estonian speech-to-text (verbatim, including filler words) | Input: €0.0001 / second |
Embeddings¶
| Model name | Base model | Quantization | Dimensions | Context | Best for | Pricing |
|---|---|---|---|---|---|---|
qwen3-embedding-8B | Qwen3-Embedding-8B — dense, decoder-only | BF16 | 4096 | 32,768 | Text retrieval, semantic search, RAG pipelines, multilingual classification | Input: €0.01 / 1M tokens |
bge-m3 | BGE-M3 — dense, multilingual (100+ languages) | BF16 | 1024 | 8,192 | Cheaper multilingual retrieval and RAG over long documents | Input: €0.002 / 1M tokens |
Examples¶
Chat Completion¶
curl https://llm.hpc.ut.ee/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.8-27b",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain the CAP theorem in two sentences."}
],
"temperature": 0.7,
"top_p": 0.8,
"max_tokens": 1024
}'
Install the SDK if you haven't already:
pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://llm.hpc.ut.ee/v1",
api_key="YOUR_API_KEY",
)
response = client.chat.completions.create(
model="qwen3.8-27b",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain the CAP theorem in two sentences."},
],
temperature=0.7,
top_p=0.8,
max_tokens=1024,
)
print(response.choices[0].message.content)
import requests
response = requests.post(
"https://llm.hpc.ut.ee/v1/chat/completions",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"model": "qwen3.8-27b",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain the CAP theorem in two sentences."},
],
"temperature": 0.7,
"top_p": 0.8,
"max_tokens": 1024,
},
)
print(response.json()["choices"][0]["message"]["content"])
Streaming¶
Streaming returns tokens incrementally as they are generated, rather than waiting for the full response.
curl https://llm.hpc.ut.ee/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.8-27b",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Write a short poem about distributed systems."}
],
"stream": true,
"temperature": 0.7,
"top_p": 0.8,
"max_tokens": 1024
}'
import httpx
from openai import OpenAI
client = OpenAI(
base_url="https://llm.hpc.ut.ee/v1",
api_key="YOUR_API_KEY",
timeout=httpx.Timeout(300.0, connect=10.0), # (1)!
)
stream = client.chat.completions.create(
model="qwen3.8-27b",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Write a short poem about distributed systems."},
],
stream=True,
temperature=0.7,
top_p=0.8,
max_tokens=1024,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print()
- A generous read timeout is recommended for streaming — long responses may take several minutes to complete.
Image Understanding¶
Pass an image URL alongside your text prompt. Supported by the deepseek-v4.1-flash, qwen3.8-27b and nemotron-3.5-super-vl models (the latter also accepts video).
curl https://llm.hpc.ut.ee/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{
"type": "image_url",
"image_url": {
"url": "https://hpc.ut.ee/assets/images/server_room_3.png"
}
}
]
}
],
"temperature": 0.7,
"top_p": 0.8,
"max_tokens": 1024
}'
from openai import OpenAI
client = OpenAI(
base_url="https://llm.hpc.ut.ee/v1",
api_key="YOUR_API_KEY",
)
response = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{
"type": "image_url",
"image_url": {
"url": "https://hpc.ut.ee/assets/images/server_room_3.png"
},
},
],
},
],
temperature=0.7,
top_p=0.8,
max_tokens=1024,
)
print(response.choices[0].message.content)
Transcription¶
Convert audio files to text using whisper-large-v3-turbo-et, an Estonian verbatim fine-tune of Whisper large-v3-turbo. Use the language parameter to improve accuracy for a known language.
curl https://llm.hpc.ut.ee/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "model=whisper-large-v3-turbo-et" \
-F "language=et" \
-F "file=@/path/to/clip.mp3"
from openai import OpenAI
client = OpenAI(
base_url="https://llm.hpc.ut.ee/v1",
api_key="YOUR_API_KEY",
)
with open("/path/to/clip.mp3", "rb") as audio_file:
transcription = client.audio.transcriptions.create(
model="whisper-large-v3-turbo-et",
file=audio_file,
language="et", # (1)!
)
print(transcription.text)
- Optional. Providing the language (ISO-639-1 code) improves speed and accuracy. Omit to enable automatic language detection.
Embeddings¶
Generate vector representations of text for use in semantic search, RAG pipelines, or classification.
curl https://llm.hpc.ut.ee/v1/embeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-embedding-8B",
"input": "The University of Tartu HPC cluster provides GPU compute resources."
}'
from openai import OpenAI
client = OpenAI(
base_url="https://llm.hpc.ut.ee/v1",
api_key="YOUR_API_KEY",
)
response = client.embeddings.create(
model="qwen3-embedding-8B",
input="The University of Tartu HPC cluster provides GPU compute resources.",
)
vector = response.data[0].embedding # 4096-dimensional float list
print(f"Embedding dimensions: {len(vector)}")
Recommended Parameters¶
Tip
Use a lower temperature for factual, analytical, or structured tasks. Use a higher temperature for creative or generative ones.
Recommended values from the official model card.
| Parameter | Recommended value | Description |
|---|---|---|
temperature | 1.0 | Controls randomness. |
top_p | 0.95 (or 1.0) | Nucleus sampling — sample from the top 95% probability mass. |
max_tokens | ≥ 262144 | Maximum tokens to generate. The served context window is 1,048,576 tokens. |
reasoning_effort | low / medium / high / none | String level; higher values spend more tokens on reasoning, none disables it. Reasoning tokens are reported in usage.completion_tokens_details.reasoning_tokens. |
Recommended values from the official model card. They differ by mode — thinking is on by default.
Thinking mode
| Parameter | Recommended value |
|---|---|
temperature | 1.0 |
top_p | 0.95 |
top_k | 20 |
min_p | 0.0 |
presence_penalty | 0.0 |
repetition_penalty | 1.0 |
reasoning_effort | xhigh (default) |
Non-thinking (instruct) mode
| Parameter | Recommended value |
|---|---|
temperature | 0.7 |
top_p | 0.80 |
top_k | 20 |
min_p | 0.0 |
presence_penalty | 1.5 |
repetition_penalty | 1.0 |
reasoning_effort | none |
The model card's separate reasoning/output budgets (up to 262,144 tokens for reasoning content and 131,072 for the final response) assume the extended 1M-token context. On this endpoint the combined input + output is capped at 262,144 tokens.
Rate Limits¶
HTTP 429 — Too Many Requests
Rate limits are enforced per API key. If you receive 429 responses, you have exceeded your quota. Contact support@hpc.ut.ee to review or increase your limits.
Compatibility¶
The API is fully compatible with the OpenAI API specification. Any OpenAI-compatible library or tool works out of the box — set the base URL to https://llm.hpc.ut.ee/v1 and provide your API key.
Compatible tools & frameworks
- LangChain — use
ChatOpenAIwithbase_url="https://llm.hpc.ut.ee/v1" - LlamaIndex — use the
OpenAILLM class with a customapi_base - Continue — configure as an OpenAI-compatible provider in your IDE
- Any tool supporting the
OPENAI_BASE_URLandOPENAI_API_KEYenvironment variables