#[non_exhaustive]pub enum EmbedderBackend {
LlamaCpp,
OpenAiRemote,
OllamaRemote,
Noop,
Unresolved,
}Expand description
Which embedder backend Lunaris::open actually resolved in this process.
W1.2 (2026-08-21). The Noop arm is a silent degradation: every vector
is zeros, so hybrid recall collapses to BM25 + insertion-order tie-breaks
while every surface keeps answering 200. Until this enum existed the only
evidence was one tracing::warn! fired once per process — which
lunaris-server’s /readyz could not see, so a server built without
llamacpp (the workspace entry sets default-features = false) reported
itself READY with a zero-vector embedder. dim() cannot distinguish the
cases: NoopEmbedder reports a non-zero dim on purpose so the operator’s
existing FT.CREATE index geometry stays valid.
This is deliberately a structural signal. A probe must never call
embed_batch to find out — a wedged ggml pool cannot be cancelled from
async Rust, so an inference-based probe wedges on a timer forever (see
lunaris-server/src/readiness.rs module docs).
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
LlamaCpp
In-process llama.cpp over a staged GGUF — the shipped local path.
OpenAiRemote
Remote OpenAI-compatible /embeddings endpoint.
OllamaRemote
Remote Ollama endpoint (operator escape hatch).
Noop
Zero-vector fallback. Real vectors are NOT being produced.
Unresolved
Lunaris::open has not run in this process — the handle was built
through a with_parts* test seam, so no backend was resolved. Callers
must treat this as “unknown”, never as “degraded”.
Implementations§
Source§impl EmbedderBackend
impl EmbedderBackend
Sourcepub const fn as_str(self) -> &'static str
pub const fn as_str(self) -> &'static str
Stable lowercase identifier, safe to compare against across releases.
This is the SDK-facing spelling: the Python and TypeScript bindings
cannot carry a Rust enum, so Lunaris::embedder_backend hands them
this string. Treat these values as API — changing one is a breaking
change for every caller doing if backend == "noop".
Sourcepub const fn produces_real_vectors(self) -> bool
pub const fn produces_real_vectors(self) -> bool
Whether this backend produces real vectors.
Noop does not — every vector is zeros, so hybrid recall silently
collapses to BM25 plus insertion-order tie-breaks while every surface
keeps answering successfully. Unresolved means open has not run in
this process, which is “unknown”, NOT “degraded”, so it answers true
here rather than raising a false alarm in a test-seam handle.
Trait Implementations§
Source§impl Clone for EmbedderBackend
impl Clone for EmbedderBackend
Source§fn clone(&self) -> EmbedderBackend
fn clone(&self) -> EmbedderBackend
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for EmbedderBackend
Source§impl Debug for EmbedderBackend
impl Debug for EmbedderBackend
Source§impl Display for EmbedderBackend
impl Display for EmbedderBackend
impl Eq for EmbedderBackend
Source§impl PartialEq for EmbedderBackend
impl PartialEq for EmbedderBackend
impl StructuralPartialEq for EmbedderBackend
Auto Trait Implementations§
impl Freeze for EmbedderBackend
impl RefUnwindSafe for EmbedderBackend
impl Send for EmbedderBackend
impl Sync for EmbedderBackend
impl Unpin for EmbedderBackend
impl UnsafeUnpin for EmbedderBackend
impl UnwindSafe for EmbedderBackend
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> ToCompactString for Twhere
T: Display,
impl<T> ToCompactString for Twhere
T: Display,
Source§fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
ToCompactString::to_compact_string() Read moreSource§fn to_compact_string(&self) -> CompactString
fn to_compact_string(&self) -> CompactString
CompactString. Read moreSource§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
Source§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.