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 )