Skip to main content

Hosted model aliases

A hosted model is a stable project-local alias for either a training job or a verified ReOpenly ModelArtifact. Aliases are routing identities over a shared serving pool; creating one does not allocate a dedicated GPU.

Model lifecycle endpoints​

GET /api/v1/projects/{owner_slug}/{project_slug}/models
POST /api/v1/projects/{owner_slug}/{project_slug}/models
PUT /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}
PATCH /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}
GET /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/target-compatibility
GET /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/download-metadata
POST /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/disable
POST /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/enable
GET /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/shares
POST /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/shares
DELETE /api/v1/projects/{owner_slug}/{project_slug}/models/{model_slug}/shares/{share_id}

Creating a text-generation alias requires its display name, stable slug, and source job:

{
"name": "Support assistant",
"slug": "support-assistant",
"training_job_id": 87
}

An embedding alias references a verified, project-owned artifact receipt through a discriminated source. The catalog id and Hugging Face provenance are server owned; a client cannot submit a repository URL or branch as a serving target:

{
"name": "Citation encoder",
"slug": "citation-encoder",
"task": "embedding",
"source": {
"kind": "provisioned_artifact",
"model_artifact_id": 101
}
}

For the text-generation example, the job must have a promoted artifact. Re-pointing an existing alias lets an owner publish a new training result without changing the client-facing model slug. The update body can carry only the new job reference; the alias name and slug remain stable:

{
"training_job_id": 87
}

The owner can select this operation from the project Models screen. A retired base or a text job with no promoted artifact is rejected with 409.

Embedding re-pointing is same-task only. If the candidate changes vector dimension or normalization, send index_compatibility_acknowledged: true after checking GET .../target-compatibility; otherwise the server returns 409. GET .../download-metadata returns verified file hashes and sizes for an authorized embedding alias, but never a storage URL, object prefix, or raw manifest. That download is for a model provisioned to your project; a model you trained is downloaded as its adapter from its training job (GET .../training-jobs/{job_id}/download, see Training jobs).

From a finished training job, Host model uses the same dialog for text and embedding projects. Choose a new endpoint or an existing project alias, then review the fine-tune and the suggested name and API slug. Repointing an embedding alias that changes vector dimension or normalization requires acknowledging that existing indexes must be re-embedded. The success receipt shows the saved alias and its status until you select Done; repointing a disabled alias keeps it disabled.

Trained embedding models​

As for a text fine-tune, a successful embedding training job can be hosted as soon as its adapter is verified and promoted; no evaluation is required first:

{
"name": "Citation encoder tuned",
"slug": "citation-encoder-tuned",
"task": "embedding",
"source": {"kind": "training_job", "training_job_id": 87}
}

PUT .../models/{model_slug} points an embedding alias at a different training job the same way. Each change increments the auditable target revision, and the alias records the adapter it serves; every request is served by exactly that adapter.

This release has no Retrieval quality or Retrieval evaluation panel. Separate model evaluation jobs for text and embeddings are planned for a later release. Training validation is checkpoint-selection evidence, not served quality. evaluation_receipt_sha256 and evaluation_acknowledged remain accepted and ignored for compatibility; neither is required to host a model.

Listing and pagination​

Project aliases always use a bounded cursor page. No pagination mode opt-in is required. The cursor belongs to this project and cannot be used with another project.

GET /api/v1/projects/{owner_slug}/{project_slug}/models?limit=25
GET /api/v1/projects/{owner_slug}/{project_slug}/models?limit=25&cursor=<next_cursor>

Cursor responses are {data, next_cursor, total_count}. The default limit is 25 and the maximum is 100. Cursors are opaque, ordered by immutable alias id, and must be sent back unchanged. Authorization and filters are applied before the page, so following next_cursor reaches every alias the caller is allowed to see.

The cross-project registry is the separate GET /api/v1/models endpoint. It uses the same cursor shape and 25-row default/100-row maximum; access, status and archive visibility filters are server-side. Its totals object contains usage rollups, not a client-derived total of registry rows.

Access​

An alias can be owner-only, shared with selected accounts, or public according to the model sharing fields. The OpenAI model list is caller-aware and only returns aliases the bearer can invoke. A caller who cannot access a model gets the same model_not_found response as an unknown alias; this prevents model slug enumeration.

Private shares​

An owner creates a private share for an account slug and chooses who pays:

{
"user_slug": "alex",
"payer": "user",
"extra_charge_percent": 10
}

payer is exactly owner or user. With owner, usage is charged to the model owner; with user, the recipient must have sufficient credits and pays the base inference charge plus extra_charge_percent. The surcharge is bounded from 0 through 100. Listing and deleting shares are owner-only operations.

Public access​

Update an alias with is_public and public_extra_charge_percent. Public callers pay their own inference charge plus the configured surcharge; the surcharge is also bounded from 0 through 100. A disabled alias remains disabled when sharing fields change: only the explicit /enable route activates it.

Serving a hosted alias​

Use the alias directly:

{
"model": "support-assistant",
"messages": [{"role": "user", "content": "Hello"}]
}

ReOpenly resolves the alias to its owner and payer and serves exactly the verified adapter it points at. A missing or invalid adapter never silently falls back to the base model.

For a stopped source job, cancelled is the terminal attempt state, not a signal that the adapter is absent. Serving uses the promoted artifact and model_available; a cancelled attempt without a promoted artifact is rejected.

Deprecation​

The catalog is authoritative. A fine-tune trained on a retired base is marked deprecated: true in training/model payloads, cannot be newly published or re-pointed, and returns 410 with error.code = "model_deprecated" when served. Existing artifact downloads remain available so owners can migrate or audit their data.

Project archives​

Archiving is reversible and does not delete chats, jobs, aliases, or artifacts. Archived projects are read-only: writes return the regular project-archive conflict, while OpenAI inference returns:

{
"error": {
"type": "invalid_request_error",
"code": "project_archived"
}
}

The OpenAI response is 404 with no Retry-After, because an archive is a deliberate owner action rather than a transient outage. Unarchive the project from project settings before serving again.

Revoking a share through the DELETE endpoint returns 200 with {"status":"deleted"}.

Base models​

Every existing or new project lists its task-appropriate base models in Hosted models. Use a base without creating an alias or fine-tuning first. Use model supplies Python, cURL and JavaScript examples with your project URL. Embedding bases support Search, Vector and Similarity without an alias. Base calls are available only to the project owner and depend on serving availability.

Embedding base Use model examples omit input_type: public bases have no query instruction to apply. Hosted examples explicitly set input_type to query for trained query instructions. Python sends this through extra_body={"input_type": "query"}; cURL and JavaScript include input_type in the request body. To embed corpus passages with a hosted model, choose document. The API still accepts the optional role for bases.

The global Base models section shows each public base once. When several projects can use it, choose a project on the card before selecting Use model; the SDK example and Playground link use that project.