Skip to content

Local Models Catalogue

Qevron serves our own models — running on our own GPU servers — through the same OpenAI-compatible interface as third-party providers (OpenAI / Anthropic / Gemini). For the client, the only thing that changes is the "model" field in the request body.

This page lists every locally-hosted model that's online right now, what it does, and how to call it — all in one table.

Quick table

Model nameTypeNotesEndpoint (via qevron)
verinovachatgpt-oss-20b Q8 — reasoning OFF, fast for telephonyPOST /v1/chat/completions
verinova-largechatQwen3-30B-A3B-Instruct (Q8 MoE) — reasoning ON, rich/detailed answersPOST /v1/chat/completions
veriEmbeddingembeddingMultilingual embeddings (vLLM)POST /v1/embeddings
verireragrerankTEI cross-encoder; reorders search resultsPOST /v1/rerank
solab-sttsttWhisper TR/EN — speech-to-textPOST /v1/audio/transcriptions
blab-ttsttsPiper TTS (CPU) — good for short clipsPOST /v1/audio/speech
blab-fast-tr-nazttsPiper GPU — Turkish Naz voicePOST /v1/audio/speech
blab-fast-en-emmattsPiper GPU — English Emma voicePOST /v1/audio/speech
blab-stablettsSupertonic v3 — high quality, natural tonePOST /v1/audio/speech
spook-visionvisionImage understanding / VQAPOST /v1/chat/completions (image input)
spook-detectdetectObject detection — bbox listPOST /api/channel/:id/custom_test
spook-backgroundimageBackground removal / replacementPOST /api/channel/:id/custom_test
spook-ocrocrExtract text from imagesPOST /api/channel/:id/custom_test
spook-generateimageText-to-image generationPOST /v1/images/generations

Important

You don't need to know which server or port a model runs on. All requests go through the Qevron gateway (http://localhost:3001 internally, https://app.qevron.ai externally). Qevron looks at the model name and routes to the right backend channel. If a server is moved, added or removed, your code doesn't change.

Connection basics

Two environments, two base URLs:

From where?Base URLAPI key
Same-host services (calleague-platform, callekit-agents, …)http://localhost:3001QEVRON_API_KEY (= qevron's ADMIN_KEY)
External / SaaS clients, browser SDKshttps://app.qevron.aiThe user's own sk-... key

Auth is the same in both cases:

Authorization: Bearer <KEY>

Why a single model might live in two channels (the verinova case)

Sometimes you want two configurations of the same model. Example:

  • verinova → fast, short answers for the CalleKit telephony agent (reasoning off). This channel runs on port 8903 — channel #9.
  • verinova-large → detailed, "thinking" answers for the docs / chatbot side (reasoning on). This is actually a different model (Qwen3 30B), channel #143, port 8907.

The caller picks the behavior by picking the model name. There is no need to add the same model as a second channel — that just causes confusion, and Qevron's distributor will pick one of them at random, making results unstable.

Common mistake

If you add a second channel with model name verinova and base URL :8900, requests will be refused. Port 8900 belongs to vllm / veriEmbedding — there is no llama-server there. verinova is already defined as channel #9, you don't need a second one.

Chat — verinova / verinova-large

curl

bash
curl https://app.qevron.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "verinova",
    "messages": [
      {"role": "system", "content": "Be concise."},
      {"role": "user",   "content": "What is 1 + 1?"}
    ]
  }'

Python (openai SDK)

python
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",
    base_url="https://app.qevron.ai/v1",
)

# Fast (telephony, short chat)
fast = client.chat.completions.create(
    model="verinova",
    messages=[{"role": "user", "content": "Write me a limerick"}],
)

# Detailed / "thinking" (reports, analysis)
deep = client.chat.completions.create(
    model="verinova-large",
    messages=[{"role": "user", "content": "Draft a PRD for a SaaS product"}],
)

Streaming

Add "stream": true — the server sends Server-Sent Events with partial chunks:

python
for chunk in client.chat.completions.create(
    model="verinova",
    messages=[{"role": "user", "content": "..."}],
    stream=True,
):
    print(chunk.choices[0].delta.content or "", end="", flush=True)

Embedding — veriEmbedding

bash
curl https://app.qevron.ai/v1/embeddings \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{"model": "veriEmbedding", "input": ["merhaba dünya", "hello world"]}'
python
emb = client.embeddings.create(
    model="veriEmbedding",
    input=["merhaba dünya", "hello world"],
)
vectors = [item.embedding for item in emb.data]

Rerank — verirerag

bash
curl https://app.qevron.ai/v1/rerank \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "verirerag",
    "query": "what is qevron",
    "documents": ["Qevron is an AI gateway.", "The weather is nice today.", "Channels follow the OpenAI schema."]
  }'

The response returns indices into the documents array you sent, sorted by relevance (results[].index + relevance_score).

STT (speech-to-text) — solab-stt

bash
curl https://app.qevron.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer sk-..." \
  -F "model=solab-stt" \
  -F "file=@/path/to/audio.wav" \
  -F "language=tr"

Language hint

The language parameter is optional but recommended — it prevents Whisper from drifting to the wrong language. Use tr for Turkish, en for English.

TTS (text-to-speech) — blab-*

Same endpoint, three quality/voice options:

bash
# Fast, CPU, short clips (notification, IVR menu)
curl https://app.qevron.ai/v1/audio/speech \
  -H "Authorization: Bearer sk-..." \
  -d '{"model": "blab-tts", "input": "Hello", "voice": "en"}' \
  -o out.wav

# GPU, Naz voice (Turkish)
curl https://app.qevron.ai/v1/audio/speech \
  -H "Authorization: Bearer sk-..." \
  -d '{"model": "blab-fast-tr-naz", "input": "Tanıştığımıza memnun oldum"}' \
  -o naz.wav

# Highest quality, natural tone (long-form, product demo)
curl https://app.qevron.ai/v1/audio/speech \
  -H "Authorization: Bearer sk-..." \
  -d '{"model": "blab-stable", "input": "Qevron serves your own models through one API."}' \
  -o stable.wav

Which one should I pick?

  • blab-tts — latency-critical, content is short (notification, IVR).
  • blab-fast-* — real-time phone conversation; fixed voice character (Naz/Emma).
  • blab-stable — when quality matters (training video, product launch, podcast prototype).

Vision — spook-vision

Uses OpenAI's image-input format. Accepts URL or base64 data URLs.

python
resp = client.chat.completions.create(
    model="spook-vision",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "What's in this image?"},
            {"type": "image_url", "image_url": {"url": "https://.../photo.jpg"}},
        ],
    }],
)

Image generation — spook-generate

bash
curl https://app.qevron.ai/v1/images/generations \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "spook-generate",
    "prompt": "Bosphorus at sunset, cinematic lighting",
    "size": "1024x1024"
  }'

Utility models — spook-detect / -ocr / -background

These three don't fit the pure OpenAI schema, so they're called via the admin custom_test endpoint:

bash
curl https://app.qevron.ai/api/channel/85/custom_test \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{"model": "spook-detect", "image": "data:image/jpeg;base64,..."}'

Channel IDs: spook-detect=85, spook-background=86, spook-ocr=87. (You can also try them interactively from the Channels page in the admin UI via the "Test" button.)

Calleague-platform side

Calleague projects connect to Qevron through two ENV vars:

bash
# .env
QEVRON_URL=http://localhost:3001          # If you're on the same host
QEVRON_API_KEY=<qevron ADMIN_KEY>         # qevron's .env ADMIN_KEY

In Pro / Plus flows, the [...path].ts self-host handler reads these and points the OpenAI SDK at Qevron — you only need to change the model name in code.

For callekit-agents:

bash
QEVRON_INTERNAL_URL=http://localhost:3001
QEVRON_API_KEY=<same>

Troubleshooting

"connection refused"

In 99% of cases the base URL is pointing at the wrong port. The correct port is already wired up on the qevron side — you should not be setting ports manually. In the Qevron admin SPA:

  1. Go to /channel
  2. Find the model
  3. Hit the "Test" button — a 200 OK means the endpoint is healthy

If it still fails, look at /cluster/assignments and check the Actual column for that runtime:

  • active → the service is running; the problem is elsewhere (channel base_url, network, …)
  • inactive / failed → the service is down; use Start on the right

Response is too slow

  • Are you streaming? ("stream": true)
  • verinova-large is naturally ~3-5× slower than verinova (30B vs 20B + reasoning on).
  • Cap output for long contexts; max_tokens: 256-512 is a sane ceiling for verinova.

"model not found"

The "model" value in the request body must match the table above. Typical mistakes: Verinova (capitalized), verinova_large (underscore instead of dash), the old name gpt-oss-20b. Live list of valid models:

bash
curl https://app.qevron.ai/v1/models -H "Authorization: Bearer sk-..."

See also

Qevron — AI gateway. Arpanet / OpenAI / Anthropic / Gemini compatible.