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#
| Id | Context | Max output | Input | Output |
|---|---|---|---|---|
upfyn-bala | 262,144 | 4,096 | Text | Text |
upfyn-yuva | 1,000,000 | 16,384 | Text, image, audio, documents | Text, image, audio |
upfyn-rishi | 1,000,000 | 32,768 | Text, image, audio, video, documents | Text, 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.
curl https://ai.upfyn.com/v1/models \-H "Authorization: Bearer $UPFYN_API_KEY"
{"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— whichreasoning_effortvalues it accepts. Bala’s list is empty.context_windowandmax_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 haveupfyn-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.
| Attempt | Bala | Yuva | Rishi |
|---|---|---|---|
| Send an image | 400 media_not_supported | Yes | Yes |
| Send a video | 400 | 400 | Yes |
| Generate an image | 400 model_generation_unsupported | Yes | Yes |
| Generate speech | 400 | Yes | Yes |
| Generate video | 400 | 400 | Yes |
Images, audio and video in covers how to attach media, and Generating media covers producing it.
