Together AI

Lightweight, dependency-free, in-memory Together AI API fake. Together AI is OpenAI-compatible, so this works with the official together-ai / openai SDKs. All output is deterministic (hash-derived) and SSE streaming is supported.

Default port: 4863

Quick start

import { TogetherAiServer } from "./services/together-ai/src/server.js";

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

Point the openai SDK at it:

import OpenAI from "openai";

const client = new OpenAI({ apiKey: "parlel-together", baseURL: "http://127.0.0.1:4863/v1" });
const res = await client.chat.completions.create({
  model: "meta-llama/Llama-3.3-70B-Instruct-Turbo",
  messages: [{ role: "user", content: "hello" }],
});

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
chat.completions (non-stream + SSE)✅ Supported
completions (legacy)✅ Supported
embeddings✅ Supported
images/generations✅ Supported
models list✅ Supported
Deterministic, reproducible output✅ Supported
Real model inference✓ By design — Deterministic stub output — repeatable assertions, no API spend
Fine-tuning / files / batch jobs⟳ Roadmap
Tool/function calling, JSON mode◐ Accepted, not specially handled

Error codes & shapes

Errors use the OpenAI envelope: { "error": { "message", "type", "code" } }.

StatusWhen
401missing/invalid Authorization
400missing model/messages/prompt/input or bad JSON
404unknown endpoint

Manifest

See services/together-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.

TOGETHER_API_KEY=parlel-together
TOGETHER_BASE_URL=http://parlel-bridge:4863/v1
<!-- parlel:testenv:end -->