Langertha
view release on metacpan or search on metacpan
t/82_live_embedding.t view on Meta::CPAN
}
ok(ref $query_vec eq 'ARRAY', 'query returns arrayref');
# All vectors should have same dimensions
my $dim = scalar @{$vectors[0]};
for my $i (1 .. $#vectors) {
is(scalar @{$vectors[$i]}, $dim, "text $i has same dimensions as text 0");
}
is(scalar @$query_vec, $dim, 'query has same dimensions');
# Semantic similarity: programming query should be closer to programming texts
my $sim_prog1 = cosine_similarity($query_vec, $vectors[0]);
my $sim_prog2 = cosine_similarity($query_vec, $vectors[1]);
my $sim_cook = cosine_similarity($query_vec, $vectors[2]);
diag sprintf " similarity to programming text 1: %.4f", $sim_prog1;
diag sprintf " similarity to programming text 2: %.4f", $sim_prog2;
diag sprintf " similarity to cooking text: %.4f", $sim_cook;
ok($sim_prog1 > $sim_cook, 'programming text 1 is more similar to query than cooking text');
ok($sim_prog2 > $sim_cook, 'programming text 2 is more similar to query than cooking text');
# Cross-similarity: programming texts should be more similar to each other than to cooking
my $sim_prog_prog = cosine_similarity($vectors[0], $vectors[1]);
my $sim_prog_cook = cosine_similarity($vectors[0], $vectors[2]);
diag sprintf " programming-programming similarity: %.4f", $sim_prog_prog;
diag sprintf " programming-cooking similarity: %.4f", $sim_prog_cook;
ok($sim_prog_prog > $sim_prog_cook, 'programming texts are more similar to each other than to cooking');
};
}
# --- OpenAI ---
if ($ENV{TEST_LANGERTHA_OPENAI_API_KEY}) {
require Langertha::Engine::OpenAI;
my $openai = Langertha::Engine::OpenAI->new(
api_key => $ENV{TEST_LANGERTHA_OPENAI_API_KEY},
);
test_engine('OpenAI', $openai);
}
# --- Mistral ---
if ($ENV{TEST_LANGERTHA_MISTRAL_API_KEY}) {
require Langertha::Engine::Mistral;
my $mistral = Langertha::Engine::Mistral->new(
api_key => $ENV{TEST_LANGERTHA_MISTRAL_API_KEY},
embedding_model => 'mistral-embed',
);
test_engine('Mistral', $mistral);
}
# --- Ollama (native) ---
if ($ENV{TEST_LANGERTHA_OLLAMA_URL}) {
require Langertha::Engine::Ollama;
my $ollama = Langertha::Engine::Ollama->new(
url => $ENV{TEST_LANGERTHA_OLLAMA_URL},
$ENV{TEST_LANGERTHA_OLLAMA_EMBEDDING_MODEL}
? (embedding_model => $ENV{TEST_LANGERTHA_OLLAMA_EMBEDDING_MODEL})
: (),
);
test_engine('Ollama', $ollama);
# --- OllamaOpenAI (same server, /v1 endpoint) ---
require Langertha::Engine::OllamaOpenAI;
my $ollama_oai = Langertha::Engine::OllamaOpenAI->new(
url => $ENV{TEST_LANGERTHA_OLLAMA_URL} . '/v1',
model => 'dummy', # not used for embeddings
$ENV{TEST_LANGERTHA_OLLAMA_EMBEDDING_MODEL}
? (embedding_model => $ENV{TEST_LANGERTHA_OLLAMA_EMBEDDING_MODEL})
: (),
);
test_engine('OllamaOpenAI', $ollama_oai);
}
# --- LlamaCpp ---
if ($ENV{TEST_LANGERTHA_LLAMACPP_URL}) {
require Langertha::Engine::LlamaCpp;
my $llamacpp = Langertha::Engine::LlamaCpp->new(
url => $ENV{TEST_LANGERTHA_LLAMACPP_URL},
);
test_engine('LlamaCpp', $llamacpp);
}
done_testing;
( run in 0.739 second using v1.01-cache-2.11-cpan-71847e10f99 )