Get started

Models

Three models, three names. You choose a name; we choose and maintain what runs behind it. That indirection is the point — when a better model appears we move the name to it, and your code does not change.

The three models#

IdContextMax outputInputOutput
upfyn-bala262,1444,096TextText
upfyn-yuva1,000,00016,384Text, image, audio, documentsText, image, audio
upfyn-rishi1,000,00032,768Text, image, audio, video, documentsText, image, audio, video

Bala — fast and cheap, text only

Send it text, get text. It cannot see an image; attaching one returns 400 media_not_supported rather than silently ignoring it. Use it for high-volume work where latency matters more than depth.

Yuva — the production default

Reads screenshots, scans, audio and documents. Generates images and speech. Supports parallel tool calls and the full range of reasoning effort. If you are unsure which to choose, choose this one.

Rishi — deepest, and the only one that does video

Everything Yuva does, plus video in and video out, a larger output budget and the strongest reasoning. It is the most expensive of the three.

No model here is free

All three are metered per token. The free plan comes with a monthly credit allowance you spend across any of them; the models themselves are not free, and Bala is not an exception. Any older page describing Bala as a free model is wrong.

Reading capabilities from the API#

Do not hardcode what a model supports. GET /v1/models reports it, and it is the same data the dashboard renders.

List models
curl https://ai.upfyn.com/v1/models \
-H "Authorization: Bearer $UPFYN_API_KEY"
One entry (trimmed)
{
"id": "upfyn-yuva",
"object": "model",
"owned_by": "upfynai",
"name": "Yuva",
"context_window": 1000000,
"max_output_tokens": 16384,
"capabilities": ["chat", "tools", "vision", "code", "analysis"],
"modalities": {
"input": ["text", "image", "audio", "pdf", "document"],
"output": ["text", "image", "audio"]
},
"features": {
"tools": true,
"parallel_tools": true,
"structured_outputs": true,
"vision": true,
"streaming": true,
"fast_mode": true
},
"supported_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"],
"web_search": true
}
  • modalities.input / modalities.output — what it accepts and returns.
  • features — tools, parallel tools, structured outputs, vision, streaming, fast mode.
  • supported_efforts — which reasoning_effort values it accepts. Bala’s list is empty.
  • context_window and max_output_tokens — the two limits you will hit first.

No key needed to introspect one model

GET /v1/models/{id}/schema requires no authentication, so a client can discover a model’s shape before it has credentials.

Ids and names#

The id is what you send. Display names also resolve, case-insensitively — "Yuva" works as well as "upfyn-yuva" — but prefer the id in code.

OpenAI model names are not aliases

gpt-4o, claude-3-5-sonnet and friends are not accepted and are not mapped to anything. Sending one returns 400 unknown_model. This is deliberate: silently substituting a different model for the one you asked for would make your bill and your output unexplainable.

upfyn-auto no longer exists

An automatic router model was removed. If you have upfyn-auto in old code it will now fail with unknown_model; pick one of the three explicitly.

Which model can do what#

Media support is not advisory — the gateway enforces it before your request costs anything.

AttemptBalaYuvaRishi
Send an image400 media_not_supportedYesYes
Send a video400400Yes
Generate an image400 model_generation_unsupportedYesYes
Generate speech400YesYes
Generate video400400Yes

Images, audio and video in covers how to attach media, and Generating media covers producing it.