Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Feature: opt-in failover for embeddings virtual models

Open
#1,286 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
52/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
go
Domain
api, backend

Research direction

Read tryFailoverEmbeddings in internal/gateway/inference_execute.go and trace how virtual model configuration and failover targets are handled. The issue proposes an opt-in such as embeddings_failover, with compatibility asserted by the operator; check existing virtual model config and gateway tests to find the relevant entry points. Done means opted-in embedding requests can fail over while the default still prevents incompatible vectors.

Written by the indexing model from the issue text.

Description

Is your feature request related to a problem? Please describe.
Failover is skipped for /v1/embeddings (tryFailoverEmbeddings in internal/gateway/inference_execute.go returns the primary error: "intentionally disabled until the shared model contract can prove vector-size compatibility"). I understand the concern, but it makes a strategy: failover virtual model useless for embeddings when the operator knows the targets serve the same model. Our setup: two self-hosted OpenAI-compatible servers (oMLX on two Macs) both serving EmbeddingGemma-2; when the primary is off, embedding requests fail instead of going to the second server.

Describe the solution you'd like
An explicit opt-in on the virtual model, e.g.:

virtual_models:
  - source: embed
    strategy: failover
    embeddings_failover: true   # operator asserts targets produce compatible vectors
    targets:
      - {model: server1/EmbeddingGemma-2}
      - {model: server2/EmbeddingGemma-2}

Optionally, GoModel could still guard it automatically: allow failover when all targets share the same upstream model id, or compare the returned dimension with the primary's last known dimension and refuse a mismatch.

Describe alternatives you've considered
Declaring no model list per provider so a down server disappears from the inventory and the alias resolves to the live one. It works, but only after the inventory refresh (up to refresh_interval), and not for a server that fails while still listed.

Additional context
Migration from LiteLLM, where order-based fallback applies to embeddings as well. This was one of the two blockers for a like-for-like replacement.

Dominant language
Go
Stars
1.2k
Forks
111
Avg merge
1d 9h
Merged PRs (30d)
123

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from ENTERPILOT/GoModel

All issues in ENTERPILOT/GoModel

Similar issues

More Go issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.