Coverage for node / src / stigmem_node / embedding / __init__.py: 100%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-05-25 01:49 +0000

1"""Embedding adapter factory — Phase 9 (spec §20 / design memo §2). 

2 

3Usage:: 

4 

5 from stigmem_node.embedding import get_embedding_model 

6 model = get_embedding_model(settings) 

7 vectors = model.embed(["alice memory:role CEO"]) 

8""" 

9 

10from __future__ import annotations 

11 

12from typing import TYPE_CHECKING 

13 

14from .base import EmbeddingError, EmbeddingModel, Vector, compose_triple_text, l2_normalize 

15 

16if TYPE_CHECKING: 

17 pass 

18 

19__all__ = [ 

20 "EmbeddingModel", 

21 "EmbeddingError", 

22 "Vector", 

23 "compose_triple_text", 

24 "l2_normalize", 

25 "get_embedding_model", 

26] 

27 

28 

29def get_embedding_model(settings: object | None = None) -> EmbeddingModel: 

30 """Return the configured EmbeddingModel instance. 

31 

32 Reads provider + model_id + dimension from *settings* (or the live 

33 ``stigmem_node.settings.settings`` singleton when *settings* is None). 

34 """ 

35 if settings is None: 

36 from stigmem_node.settings import settings as _s 

37 

38 settings = _s 

39 

40 provider: str = getattr(settings, "embed_model_provider", "local") 

41 model_id: str = getattr(settings, "embed_model_id", "nomic-embed-text-v1.5") 

42 dimension: int = int(getattr(settings, "embed_dimension", 768)) 

43 

44 if provider == "stub": 

45 from .stub_adapter import StubEmbeddingModel 

46 

47 return StubEmbeddingModel(dim=dimension, model_id=model_id) 

48 

49 if provider == "openai": 

50 api_key_env: str = getattr(settings, "embed_openai_api_key_env", "OPENAI_API_KEY") 

51 from .openai_adapter import OpenAIEmbeddingModel 

52 

53 return OpenAIEmbeddingModel( 

54 model_id=model_id, 

55 api_key_env=api_key_env, 

56 dimension=dimension, 

57 ) 

58 

59 # default: "local" → Ollama 

60 ollama_url: str = getattr(settings, "embed_ollama_url", "http://localhost:11434") 

61 from .local_adapter import OllamaEmbeddingModel 

62 

63 return OllamaEmbeddingModel( 

64 model_id=model_id, 

65 ollama_url=ollama_url, 

66 dimension=dimension, 

67 )