Skip to content

Pluggable embedding providers (VoyageAI, OpenAI, Ollama) #22

@GoodbyePlanet

Description

@GoodbyePlanet

server/embeddings/base.py:7 already defines an EmbeddingProvider Protocol, but only
JinaEmbeddingProvider is wired up (server/embeddings/jina.py). claude-context supports OpenAI /
VoyageAI / Gemini / Ollama and lets users pick. Notably, Voyage voyage-code-3 outperforms
jinaai/jina-embeddings-v2-base-code on most code retrieval benchmarks, so this is also a quality
lever, not just a flexibility one.

Scope

  • Add VoyageEmbeddingProvider (POST https://api.voyageai.com/v1/embeddings, model default
    voyage-code-3, input_type="document" for indexing and "query" for search). Honour batching
    (Voyage caps batch size at 128).
  • Add OpenAIEmbeddingProvider (default text-embedding-3-large).
  • Add OllamaEmbeddingProvider (default nomic-embed-text, host from env).
  • Provider selection in server/config.py via EMBEDDINGS_PROVIDER=jina|voyage|openai|ollama
    (default jina, preserving current behaviour).
  • Each provider exposes its native dimensions; EMBEDDINGS_DIMENSIONS becomes optional /
    provider-derived. Make sure the dimension mismatch with an existing Qdrant collection produces a
    clear error, not a silent failure.
  • Update README.md env table.
  • Tests: mock-based unit tests for each provider's request shape and batching behaviour (respx is
    already in dev deps).

Acceptance

  • Setting EMBEDDINGS_PROVIDER=voyage + VOYAGE_API_KEY lets the server index and search without
    running the local TEI container.
  • Default behaviour (Jina via TEI) is unchanged when env is unset.
  • docker-compose.yaml keeps Jina TEI as the default but documents how to disable it for hosted
    providers.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions