Skip to content

feat(providers): add Infersia provider profile - #78038

Open
infersia wants to merge 3 commits into
NousResearch:mainfrom
infersia:add-infersia-provider
Open

feat(providers): add Infersia provider profile#78038
infersia wants to merge 3 commits into
NousResearch:mainfrom
infersia:add-infersia-provider

Conversation

@infersia

@infersia infersia commented Aug 3, 2026

Copy link
Copy Markdown

Adds Infersia as a model provider profile: two files under plugins/model-providers/infersia/, no core changes, per plugins/model-providers/README.md.

Affiliation: I work on Infersia.

Duplicate check: no existing issues or PRs mention Infersia.

What it is

Open-weight models served on dedicated GPUs through an OpenAI-compatible chat-completions endpoint. Every model publishes the exact quantisation served, the hardware behind it, and measured latency and uptime — catalogue at https://infersia.com/models.

The reason it may be worth having alongside the existing profiles: DeepSeek V4 Flash is served at its full 1,048,576-token window, where most pools cap the same model at 262,144. A 260,000-token request answers in about 20 seconds.

The judgement calls, and how they were settled

Each flag was tested against the live endpoint rather than taken from docs:

  • supports_vision=True — verified by sending an image inside a tool-result message (multipart image_url part) to the served vision model, Step 3.7 Flash. Accepted.
  • supports_prompt_cache_key=False — prefix caching here is automatic and unkeyed. The endpoint tolerates a prompt_cache_key field rather than honouring it, and the flag is documented as opt-in for endpoints that explicitly accept it, so setting True would advertise behaviour that doesn't exist. (Noted perf(transport): capability-gated prompt_cache_key for Chat Completions (#56798 salvage) #77609 landing the capability gate for this.)
  • fallback_models=() — following the DeepInfra profile's reasoning. The live catalogue at {base_url}/models is authoritative and returns OpenAI-shaped entries including pricing and context_length. An empty picker on a failed fetch beats routing someone to an id that has since been retired, and this catalogue is still changing week to week.
  • default_aux_model="qwen/qwen3-8b" — the only hardcoded model id, since aux resolution is synchronous. Smallest model in the catalogue.

/v1/models answers unauthenticated, so the doctor health probe works before a key is configured.

Models

deepseek/deepseek-v4-flash-0731 (1M context) · stepfun-ai/step-3.7-flash (262K, vision) · qwen/qwen3.6-35b-a3b · qwen/qwen3-14b · qwen/qwen3-8b. All support tool calling. A :free suffix selects a rate-limited free variant where one is published, so a user can try before configuring billing.

Keys: https://infersia.com/dashboard/keys

Infersia serves open-weight models on dedicated GPUs through an
OpenAI-compatible chat-completions endpoint. Two files, no core changes,
per plugins/model-providers/README.md.

Verified against the live endpoint rather than transcribed from docs:

  supports_vision=True — an image inside a tool-result message is
    accepted, tested with a multipart tool message against the served
    vision model (Step 3.7 Flash).

  supports_prompt_cache_key=False — prefix caching is automatic and
    unkeyed. The endpoint tolerates the field rather than honouring it,
    and the flag is documented as opt-in for endpoints that explicitly
    accept it, so setting it would advertise behaviour that does not
    exist.

  fallback_models=() — following the DeepInfra profile's reasoning: the
    live catalogue at {base_url}/models is authoritative and returns
    OpenAI-shaped entries with pricing and context_length. An empty
    picker on a failed fetch beats routing someone to a retired id, and
    this catalogue is still changing week to week.

default_aux_model is the only hardcoded model id, since aux resolution
is synchronous. /models answers unauthenticated, so the doctor probe
works before a key is configured.
@alt-glitch alt-glitch added type/feature New feature or request comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have labels Aug 3, 2026
supports_vision was justified by a check against Step 3.7 Flash, which
we retired today. The flag is still correct — qwen/qwen3.6-35b-a3b
accepts image input — but the comment pointed at a model that no longer
exists, so the claim was unverifiable by anyone reading it.

Re-ran the check against the live endpoint: a two-pixel test image sent
as a base64 data URI to qwen/qwen3.6-35b-a3b came back correctly
described. Comment now names that model and that date.

No functional change; fallback_models stays empty so the live catalogue
remains the source of truth.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@infersia

infersia commented Aug 6, 2026

Copy link
Copy Markdown
Author

Small follow-up: supports_vision was justified in a comment by a check against Step 3.7 Flash, which we retired today. The flag is still correct — qwen/qwen3.6-35b-a3b accepts image input — but the comment named a model that no longer exists.

Re-verified against the live endpoint (a two-pixel base64 data URI came back correctly described) and updated the comment to name the model and date. No functional change; fallback_models stays empty, so the live catalogue at {base_url}/models remains the source of truth.

One note for the runtime path: that catalogue now also contains a reranker, which answers /v1/rerank rather than chat completions. It's distinguishable by architecture.output_modalities being ["embedding"] rather than ["text"].

fallback_models is empty here, so whatever fetch_models returns is exactly
what the picker shows. The catalogue at {base_url}/models describes the whole
account rather than one endpoint, so it also carries a reranker
(/v1/rerank) and two audio models (/v1/audio/transcriptions,
/v1/audio/speech). Selecting one of those would send a chat completion to a
route that does not answer it.

An OpenAI-shaped model object has no capability field, so the entry alone
cannot say which route serves it. The architecture block does, and the test
is text on BOTH sides: a chat model takes text in and emits text out.
Checking the output side alone is not enough — speech-to-text is audio->text,
so its output modality is ["text"] and it passes a one-sided test.

Written as an allow-list, so a modality this profile has not been taught
about drops out of the picker rather than appearing and failing on first use.

Verified against the live catalogue: 8 entries in, the 5 chat models out.
@infersia

infersia commented Aug 7, 2026

Copy link
Copy Markdown
Author

Pushed c28bab0 — and it corrects something I got wrong in my earlier comment on this PR.

I said a reranker "is distinguishable by architecture.output_modalities". That test is not sufficient, and I should not have offered it as one. Speech-to-text is audio->text: its output modality is ["text"], so it passes a one-sided check while answering /v1/audio/transcriptions rather than /v1/chat/completions. We have since put a transcription model into production, so this stopped being hypothetical.

The correct test is text on both sides — input_modalities and output_modalities. That rejects transcription on the input, speech synthesis on the output, and rerankers on the output.

The commit implements it in the plugin rather than asking for anything from core: ProviderProfile.fetch_models is documented as overridable and seven bundled plugins already override it, so InfersiaProfile now filters its own discovery. The request path mirrors the base implementation exactly — same open_credentialed_url and _profile_user_agent — so the redirect credential-stripping behaviour is unchanged.

Two decisions worth surfacing:

  • An entry with no architecture block is kept. Absence is no information rather than evidence, and fallback_models is empty here, so failing closed would leave a user with an empty picker and nothing to explain it. INFERSIA_BASE_URL is user-overridable, so that path is reachable.
  • It is an allow-list, not a skip-list of known-bad modalities. A modality nobody has accounted for drops out of the picker rather than appearing and failing on first use.

Worth noting this is a general property of OpenAI-shaped /v1/models rather than anything specific to us: OpenAI's own list returns whisper-1 and tts-1 beside gpt-4o, and the model object in their schema carries no capability field at all. We publish an architecture block precisely so a client has something to branch on.

Checks with your pinned tooling: pytest tests/plugins/model_providers/ tests/providers/ 225 passed, the new test file 8/8, ruff and ty clean. Verified against our live catalogue: 8 entries in, 5 chat models out.

Disclosure: I work on Infersia.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants