Voyage AI

Lightweight, dependency-free, in-memory Voyage AI API fake for testing code that uses the real voyageai SDK (and REST API). Embeddings (1024-dim) and rerank scores are deterministic (hash-derived).

Default port: 4865

Quick start

import { VoyageAiServer } from "./services/voyage-ai/src/server.js";

const server = new VoyageAiServer(4865);
await server.start();
// ... run your app/tests ...
await server.stop();

REST usage:

const res = await fetch("http://127.0.0.1:4865/v1/embeddings", {
  method: "POST",
  headers: { Authorization: "Bearer pa-parlel-voyage", "Content-Type": "application/json" },
  body: JSON.stringify({ model: "voyage-3", input: ["hello", "world"] }),
});
// => { object: "list", data: [{ object: "embedding", embedding: [...1024], index }], model, usage: { total_tokens } }

Access via MCP / preview URL

Implemented operations

Service & inspection operations (parlel extensions)

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

FeatureStatus
embeddings (1024-dim, deterministic)✅ Supported
rerank (deterministic ranked scores)✅ Supported
output_dimension, top_k, return_documents✅ Supported
Real semantic embeddings / reranking✓ By design — Intentionally unsupported (hash-derived)
Contextualized / multimodal embeddings⟳ Roadmap
input_type semantic differences◐ Accepted, no behavioral effect
Key validity / quota✓ By design — Never throttles — local tests run at full speed, zero cost

Error codes & shapes

Errors use { "detail": "..." }.

StatusWhen
401missing/invalid Authorization
400missing model/input/query/documents or bad JSON
404unknown endpoint

Manifest

See services/voyage-ai/manifest.json:

<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

VOYAGE_API_KEY=pa-parlel-voyage
VOYAGE_BASE_URL=http://parlel-bridge:4865/v1
<!-- parlel:testenv:end -->