Tardis Docs

SDK Examples

Practical @tardis/ai examples for buffered, streaming, telemetry, and custom adapters.

All examples use the request-first API from packages/ai.

Create SDK with an OpenAI-compatible adapter

import { createAiSdk, createOpenAICompatibleAdapter } from "@tardis/ai";

const openrouter = createOpenAICompatibleAdapter({
  name: "openrouter",
  defaultModel: "openai/gpt-4o-mini",
  apiKeyEnvVar: "OPENROUTER_API_KEY",
  baseUrl: "https://openrouter.ai/api/v1",
});

const aiSdk = createAiSdk([openrouter]);

Buffered complete()

Use this when you only need final text:

const output = await aiSdk.complete(
  [{ role: "user", content: "Define an Inference Request." }],
  {
    provider: "openrouter",
    model: "openai/gpt-4o-mini",
    temperature: 0.2,
    maxTokens: 120,
  },
);

console.log(output);

Streaming via stream() and canonical events

let text = "";

for await (const event of aiSdk.stream(
  [{ role: "user", content: "Stream a short answer." }],
  { provider: "openrouter" },
)) {
  switch (event.type) {
    case "response_start":
      console.log("response started");
      break;
    case "first_token":
      console.log("first token received");
      break;
    case "text_delta":
      text += event.text;
      process.stdout.write(event.text);
      break;
    case "usage":
      console.log("\nusage:", event.usage);
      break;
    case "request_end":
      console.log("\nrequest ended");
      break;
  }
}

Canonical lifecycle types are:

  • response_start
  • first_token
  • text_delta
  • usage
  • request_end

Raw payload hooks (onRawRequest / onRawResponse)

const rawRequests: unknown[] = [];
const rawResponses: unknown[] = [];

const text = await aiSdk.complete(
  [{ role: "user", content: "Capture provider payloads." }],
  {
    provider: "openrouter",
    onRawRequest: (payload) => rawRequests.push(payload),
    onRawResponse: (payload) => rawResponses.push(payload),
  },
);

console.log({ text, requestCount: rawRequests.length, responseCount: rawResponses.length });

These hooks are used by the Runtime API to optionally persist raw provider payloads on an Inference Request.

Register a custom ProviderAdapter

import { createAiSdk, type ProviderAdapter } from "@tardis/ai";

const aiSdk = createAiSdk();

const mockProvider: ProviderAdapter = {
  name: "mock",
  defaultModel: "mock-v1",
  async complete(messages) {
    const lastUser = [...messages].reverse().find((m) => m.role === "user");
    return `echo: ${lastUser?.content ?? ""}`;
  },
  async *stream(messages) {
    const lastUser = [...messages].reverse().find((m) => m.role === "user");
    const text = `echo: ${lastUser?.content ?? ""}`;

    yield { type: "response_start" };
    if (text.length > 0) {
      yield { type: "first_token" };
      yield { type: "text_delta", text };
    }
    yield { type: "usage", usage: {} };
    yield { type: "request_end" };
  },
};

aiSdk.registerProvider(mockProvider);

Then call it with:

const result = await aiSdk.complete([{ role: "user", content: "hello" }], {
  provider: "mock",
});

On this page