Skip to content

Commit 16d0315

Browse files
Merge pull request #42 from GoodbyePlanet/feat/refactor-factory
feat: Refactor factory to use OCP
2 parents 5e6d3da + cd778ee commit 16d0315

11 files changed

Lines changed: 148 additions & 25 deletions

File tree

server/embeddings/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from server.embeddings.factory import close_embedding_provider, get_embedding_provider
2+
from . import jina as _jina # noqa: F401
3+
from . import jina_api as _jina_api # noqa: F401
4+
from . import voyage as _voyage # noqa: F401
5+
from . import openai as _openai # noqa: F401
6+
from . import ollama as _ollama # noqa: F401
7+
8+
__all__ = ["get_embedding_provider", "close_embedding_provider"]

server/embeddings/factory.py

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,27 @@
33
from server.config import settings
44
from server.embeddings.base import EmbeddingProvider
55

6+
_registry: dict[str, type[EmbeddingProvider]] = {}
67
_provider: EmbeddingProvider | None = None
78

89

10+
def register(name: str, cls: type[EmbeddingProvider]) -> None:
11+
_registry[name] = cls
12+
13+
914
def get_embedding_provider() -> EmbeddingProvider:
1015
global _provider
1116
if _provider is not None:
1217
return _provider
1318

1419
name = settings.embeddings_provider
15-
if name == "jina":
16-
from server.embeddings.jina import JinaEmbeddingProvider
17-
18-
_provider = JinaEmbeddingProvider()
19-
elif name == "jina-api":
20-
from server.embeddings.jina_api import JinaApiEmbeddingProvider
21-
22-
_provider = JinaApiEmbeddingProvider()
23-
elif name == "voyage":
24-
from server.embeddings.voyage import VoyageEmbeddingProvider
25-
26-
_provider = VoyageEmbeddingProvider()
27-
elif name == "openai":
28-
from server.embeddings.openai import OpenAIEmbeddingProvider
29-
30-
_provider = OpenAIEmbeddingProvider()
31-
elif name == "ollama":
32-
from server.embeddings.ollama import OllamaEmbeddingProvider
33-
34-
_provider = OllamaEmbeddingProvider()
35-
else:
20+
cls = _registry.get(name)
21+
if cls is None:
3622
raise ValueError(
3723
f"Unknown EMBEDDINGS_PROVIDER {name!r}. "
38-
"Expected one of: jina, jina-api, voyage, openai, ollama."
24+
f"Expected one of: {', '.join(sorted(_registry))}."
3925
)
26+
_provider = cls()
4027
return _provider
4128

4229

server/embeddings/jina.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,8 @@ async def embed_query(self, text: str) -> list[float]:
5858

5959
async def close(self) -> None:
6060
await self._client.aclose()
61+
62+
63+
from server.embeddings.factory import register # noqa: E402
64+
65+
register("jina", JinaEmbeddingProvider)

server/embeddings/jina_api.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,8 @@ async def _embed(self, texts: list[str], task: str) -> list[list[float]]:
152152

153153
async def close(self) -> None:
154154
await self._client.aclose()
155+
156+
157+
from server.embeddings.factory import register # noqa: E402
158+
159+
register("jina-api", JinaApiEmbeddingProvider)

server/embeddings/ollama.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,8 @@ async def embed_query(self, text: str) -> list[float]:
7171

7272
async def close(self) -> None:
7373
await self._client.aclose()
74+
75+
76+
from server.embeddings.factory import register # noqa: E402
77+
78+
register("ollama", OllamaEmbeddingProvider)

server/embeddings/openai.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,8 @@ async def embed_query(self, text: str) -> list[float]:
9494

9595
async def close(self) -> None:
9696
await self._client.aclose()
97+
98+
99+
from server.embeddings.factory import register # noqa: E402
100+
101+
register("openai", OpenAIEmbeddingProvider)

server/embeddings/voyage.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,8 @@ async def _embed(self, texts: list[str], input_type: str) -> list[list[float]]:
107107

108108
async def close(self) -> None:
109109
await self._client.aclose()
110+
111+
112+
from server.embeddings.factory import register # noqa: E402
113+
114+
register("voyage", VoyageEmbeddingProvider)

server/indexer/pipeline.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from server.config import settings
1414
from server.embeddings.base import EmbeddingProvider
1515
from server.embeddings.bm25 import BM25SparseProvider, get_sparse_embedding_provider
16-
from server.embeddings.factory import get_embedding_provider
16+
from server.embeddings import get_embedding_provider
1717
from server.indexer.github_source import fetch_blob_content, list_github_files
1818
from server.parser.base import CodeSymbol
1919
from server.parser.registry import parse_file

server/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from server.config import settings
1212
from server.embeddings.bm25 import BM25SparseProvider, close_sparse_embedding_provider
13-
from server.embeddings.factory import close_embedding_provider, get_embedding_provider
13+
from server.embeddings import close_embedding_provider, get_embedding_provider
1414
from server.state import (
1515
get_commit_store,
1616
get_store,

server/tools/search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from mcp.server.fastmcp import FastMCP
77

88
from server.config import settings
9-
from server.embeddings.factory import get_embedding_provider
9+
from server.embeddings import get_embedding_provider
1010
from server.indexer.github_source import fetch_file_content
1111
from server.state import get_sparse_provider, get_store
1212

0 commit comments

Comments
 (0)