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_startfirst_tokentext_deltausagerequest_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",
});