Persistence API¶
ninja_persistence
¶
Ninja Persistence — unified polyglot persistence layer for Ninja Stack.
__all__
module-attribute
¶
__all__ = [
"AdapterRegistry",
"ChromaVectorAdapter",
"ConnectionManager",
"ConnectionProfile",
"EmbeddingStrategy",
"GraphAdapter",
"MilvusVectorAdapter",
"MongoAdapter",
"Repository",
"SQLAdapter",
]
ChromaVectorAdapter
¶
ChromaVectorAdapter(
entity: EntitySchema, client: Any = None
)
Chroma-backed vector store adapter.
Implements the Repository protocol with native semantic search support.
Requires the chromadb optional dependency:
pip install ninja-persistence[chroma]
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/chroma.py
find_by_id
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/chroma.py
find_many
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/chroma.py
create
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/chroma.py
update
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/chroma.py
delete
async
¶
search_semantic
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/chroma.py
upsert_embedding
async
¶
GraphAdapter
¶
GraphAdapter(entity: EntitySchema, driver: Any = None)
Async Neo4j adapter for graph-backed entities.
Implements the Repository protocol for graph databases.
Requires the neo4j optional dependency:
pip install ninja-persistence[graph]
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/graph.py
MilvusVectorAdapter
¶
MilvusVectorAdapter(
entity: EntitySchema, client: Any = None
)
Milvus-backed vector store adapter.
Implements the Repository protocol with native semantic search support.
Requires the pymilvus optional dependency:
pip install ninja-persistence[milvus]
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/milvus.py
MongoAdapter
¶
MongoAdapter(entity: EntitySchema, database: Any = None)
Async MongoDB adapter backed by Motor.
Implements the Repository protocol for document databases.
Requires the motor optional dependency:
pip install ninja-persistence[mongo]
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/mongo.py
find_by_id
async
¶
find_many
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/mongo.py
create
async
¶
update
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/mongo.py
delete
async
¶
search_semantic
async
¶
Semantic search requires a sidecar vector index for Mongo-backed entities.
upsert_embedding
async
¶
Embedding storage requires a sidecar vector adapter for Mongo-backed entities.
SQLAdapter
¶
SQLAdapter(engine: AsyncEngine, entity: EntitySchema)
Async SQL adapter backed by SQLAlchemy.
Implements the Repository protocol for relational databases.
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
ensure_table
async
¶
find_by_id
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
find_many
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
create
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
update
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
delete
async
¶
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
search_semantic
async
¶
Semantic search is not natively supported in SQL.
For SQL-backed entities, this requires a sidecar vector index. Returns an empty list when no sidecar is configured.
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
upsert_embedding
async
¶
Embedding storage is not natively supported in SQL.
For SQL-backed entities, embeddings are managed by a sidecar vector adapter. This is a no-op when no sidecar is configured.
Source code in libs/ninja-persistence/src/ninja_persistence/adapters/sql.py
ConnectionManager
¶
ConnectionManager(
profiles: dict[str, ConnectionProfile] | None = None,
)
Manages connection pools for all configured engines.
Reads connection profiles from .ninjastack/connections.json and lazily
creates engine-specific connection objects on first access.
Source code in libs/ninja-persistence/src/ninja_persistence/connections.py
from_file
classmethod
¶
from_file(
path: str | Path = ".ninjastack/connections.json",
) -> ConnectionManager
Load connection profiles from a JSON file.
Source code in libs/ninja-persistence/src/ninja_persistence/connections.py
get_profile
¶
get_profile(name: str) -> ConnectionProfile
Get a connection profile by name.
Source code in libs/ninja-persistence/src/ninja_persistence/connections.py
get_sql_engine
¶
Get or create an async SQLAlchemy engine for the given profile.
Source code in libs/ninja-persistence/src/ninja_persistence/connections.py
close_all
async
¶
ConnectionProfile
¶
EmbeddingStrategy
¶
Bases: BaseModel
Configuration for how to generate embeddings for an entity.
Examines the entity schema to determine which fields have embedding configs and produces the text payload to send to the embedding model.
model_name
class-attribute
instance-attribute
¶
model_name: str = Field(
default="text-embedding-3-small",
description="Default embedding model.",
)
dimensions
class-attribute
instance-attribute
¶
separator
class-attribute
instance-attribute
¶
get_embeddable_fields
¶
get_embeddable_fields(
entity: EntitySchema,
) -> list[FieldSchema]
Return all fields in the entity that have embedding configuration.
build_text_for_embedding
¶
build_text_for_embedding(
entity: EntitySchema, record: dict[str, Any]
) -> str
Build the text payload to embed from a record's embeddable fields.
If no fields have explicit embedding config, falls back to concatenating all string/text fields.
Source code in libs/ninja-persistence/src/ninja_persistence/embedding/strategy.py
get_model_for_field
¶
get_model_for_field(field: FieldSchema) -> str
Return the embedding model to use for a specific field.
get_dimensions_for_field
¶
get_dimensions_for_field(field: FieldSchema) -> int
Return the vector dimensions to use for a specific field.
Repository
¶
Bases: Protocol[T]
Unified persistence interface for all storage engines.
Every adapter (SQL, Mongo, Graph, Vector) implements this protocol so that Data Agents can perform CRUD and semantic search without knowing the backend.
AdapterRegistry
¶
AdapterRegistry(connection_manager: ConnectionManager)
Routes entity schemas to the correct persistence adapter.
Given an entity's StorageEngine from the ASD, the registry returns a configured Repository instance backed by the appropriate adapter.
Source code in libs/ninja-persistence/src/ninja_persistence/registry.py
register
¶
register(
entity_name: str, repository: Repository[Any]
) -> None
Register a custom repository override for an entity.
get_repository
¶
get_repository(
entity: EntitySchema, profile_name: str = "default"
) -> Repository[Any]
Resolve the correct repository adapter for an entity.
Checks overrides first, then falls back to engine-based routing.