What Evalwright is
Evalwright versions your LLM prompts and settles, by measurement, which version to run. You edit and benchmark in the app, then deploy a version to an environment of its project — development, staging and production to start with, and any your project adds. Your backend asks the SDK for a prompt, by its id, with a key for one of those environments, and runs the result with your own model.
prompts.resolve() returns the text deployed in the key's environment with its {{variables}} bound — the same text the version's benchmark ran. That is all it does — no LLM is called on this path, so it never touches your provider, your keys or your tokens.
The point: deploying a new version in the app changes what that environment runs, with no deploy on your side.
Install
npm install @evalwright/sdkNode 18+. No runtime dependencies — the SDK uses the platform's own fetch.
Ten lines
import { EvalwrightClient } from "@evalwright/sdk";
const client = new EvalwrightClient({
apiKey: process.env.EVALWRIGHT_API_KEY!,
baseUrl: process.env.EVALWRIGHT_BASE_URL!,
});
// The prompt's id, from its page in the app.
const { prompt } = await client.prompts.resolve("6a1f0c3e9b2d4a7f8e5c1b90", {
vars: { customerName: "Ada", tone: "warm" },
});
const reply = await myModel.complete({ system: prompt, user: message }); // your provider, your keysNext: Quick start.