use ik_llama_cpp_sys as sys;
use crate::context::LlamaContext;
#[derive(Debug, PartialEq, Eq, thiserror::Error)]
pub enum EmbeddingsError {
#[error("embeddings were not enabled in the context params")]
NotEnabled,
#[error("no embeddings available for token index {0}")]
LogitsNotEnabled(i32),
#[error("no sequence embeddings for seq {0} (pooling type NONE, or out of range)")]
NonePoolType(i32),
}
impl LlamaContext<'_> {
#[must_use]
fn n_embd(&self) -> usize {
let n = unsafe { sys::llama_model_n_embd(sys::llama_get_model(self.context.as_ptr())) };
usize::try_from(n).unwrap_or(0)
}
pub fn embeddings_ith(&self, i: i32) -> Result<&[f32], EmbeddingsError> {
if !self.raw_params.embeddings {
return Err(EmbeddingsError::NotEnabled);
}
let n_embd = self.n_embd();
let ptr = unsafe { sys::llama_get_embeddings_ith(self.context.as_ptr(), i) };
if ptr.is_null() {
return Err(EmbeddingsError::LogitsNotEnabled(i));
}
Ok(unsafe { std::slice::from_raw_parts(ptr, n_embd) })
}
pub fn embeddings_seq_ith(&self, seq: i32) -> Result<&[f32], EmbeddingsError> {
if !self.raw_params.embeddings {
return Err(EmbeddingsError::NotEnabled);
}
let n_embd = self.n_embd();
let ptr = unsafe { sys::llama_get_embeddings_seq(self.context.as_ptr(), seq) };
if ptr.is_null() {
return Err(EmbeddingsError::NonePoolType(seq));
}
Ok(unsafe { std::slice::from_raw_parts(ptr, n_embd) })
}
}