Skip to content

feat(embedding): multi-provider abstraction layer#62

Merged
Siddhant-K-code merged 1 commit into
mainfrom
feat/33-multi-provider-embedding
May 2, 2026
Merged

feat(embedding): multi-provider abstraction layer#62
Siddhant-K-code merged 1 commit into
mainfrom
feat/33-multi-provider-embedding

Conversation

@Siddhant-K-code

Copy link
Copy Markdown
Owner

Closes #33

What

Adds a unified embedding.NewProvider factory that supports OpenAI, Ollama, and Cohere via a single ProviderConfig. Providers self-register via init() so callers only need a blank import. Custom providers can be registered at startup via RegisterFactory.

Changes

pkg/embedding/registry.go (new)

  • ProviderConfig: Type, APIKey, Model, BaseURL, CacheSize
  • NewProvider(cfg): resolves provider from registry, wraps in CachedProvider when CacheSize >= 0
  • RegisterFactory(type, fn): registers a custom provider factory
  • SupportedProviders(): returns ["openai", "ollama", "cohere"]

pkg/embedding/ollama/ (new)

  • Client: calls /api/embeddings on a local Ollama server
  • EmbedBatch is sequential (Ollama has no batch API)
  • Default model: nomic-embed-text; default URL: http://localhost:11434
  • register.go: self-registers into the factory via init()

pkg/embedding/cohere/ (new)

  • Client: calls Cohere /v1/embed with input_type support
  • EmbedBatch sends all texts in a single API call
  • Default model: embed-english-v3.0 (1024 dims)
  • Returns ErrRateLimited / ErrInvalidAPIKey on 429/401
  • register.go: self-registers into the factory via init()

pkg/embedding/openai/register.go (new)

  • Self-registers the existing OpenAI client into the factory

pkg/embedding/registry_test.go (new) — 5 tests: custom provider, unknown type, empty type, Ollama resolution, cache wrapping

Usage

import (
    "github.com/Siddhant-K-code/distill/pkg/embedding"
    _ "github.com/Siddhant-K-code/distill/pkg/embedding/ollama"
)

p, err := embedding.NewProvider(embedding.ProviderConfig{
    Type:  embedding.ProviderOllama,
    Model: "nomic-embed-text",
})

Compatibility

Existing cmd/ code uses openai.NewClient directly and is unaffected. The registry is additive — nothing breaks if a provider package is not imported.

@Siddhant-K-code Siddhant-K-code force-pushed the feat/33-multi-provider-embedding branch from d4fbf04 to 7a76a85 Compare May 2, 2026 14:30
Add embedding.NewProvider factory supporting OpenAI, Ollama, and Cohere
via a unified ProviderConfig. Providers self-register via init() so
callers only need a blank import.

New packages:
  pkg/embedding/ollama  - local Ollama server (/api/embeddings)
  pkg/embedding/cohere  - Cohere API (embed-english-v3.0 default)

New files:
  pkg/embedding/registry.go       - NewProvider, RegisterFactory,
                                    ProviderConfig, SupportedProviders
  pkg/embedding/openai/register.go - registers OpenAI into the factory
  pkg/embedding/ollama/register.go - registers Ollama into the factory
  pkg/embedding/cohere/register.go - registers Cohere into the factory
  pkg/embedding/registry_test.go  - custom provider, unknown type,
                                    ollama resolution, cache wrapping

CacheSize=-1 disables the in-memory cache; 0 uses the default (10k).
Existing cmd/ code continues to use openai.NewClient directly and is
unaffected.

Co-authored-by: Ona <[email protected]>
@Siddhant-K-code Siddhant-K-code force-pushed the feat/33-multi-provider-embedding branch from 7a76a85 to c4ff45f Compare May 2, 2026 14:30
@Siddhant-K-code Siddhant-K-code merged commit 1c67071 into main May 2, 2026
@Siddhant-K-code Siddhant-K-code deleted the feat/33-multi-provider-embedding branch May 2, 2026 14:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Multi-provider embedding abstraction layer

1 participant