# Vercel AI SDK (/en/docs/cookbook/sdk/vercel-ai-sdk)







Connect Praxis to the [Vercel AI SDK](https://ai-sdk.dev)—the de-facto standard library for AI apps in React/Vue/Svelte. A custom provider takes two parameters, and `generateText` / `streamText` plus the whole toolkit work as usual. This page is verified against Node.

Every step lists its **expected result**: follow along yourself, or hand this page to an AI assistant that can operate your computer and let it do the install, run, and verification for you.

## What you'll accomplish [#what-youll-accomplish]

* Call Praxis models with the AI SDK's `generateText` / `streamText`
* Done when: `hello.mjs` prints a reply with `usage`, and `stream.mjs` prints token by token
* Time needed: **3–5 minutes** (excluding the Node.js install)
* Protocol: OpenAI-compatible (`/openai/v1`)

## Prerequisites [#prerequisites]

Confirm each item before you start:

* **A Praxis API key** (starting with `sk-praxis-`). If you don't have one, create it at [Console → API Keys](https://console.deepraxis.ai/keys&#x29;: click "Create Key"—the name is required, validity defaults to 90 days (or pick permanent); the success dialog shows the full key with a "Copy Key" button, and after it closes the list shows only a masked value—re-copy the full key any time from the copy icon on its row. Expected: a "Create API Key" dialog appears, and after submitting, a dialog shows the full key with a "Copy Key" button. New accounts ship with **$1 of free credit**. See [Quickstart](/en/docs/developers/model/quickstart) for the full flow.
* **Node.js 18 or newer** (check `node --version`; [Bun](https://bun.sh) works too).
* **Install the SDK**:

  ```bash
  npm install ai @ai-sdk/openai
  ```

  Expected: the install succeeds. An empty directory works—no `npm init` needed first.

## First request [#first-request]

Put the key in an environment variable first (`export PRAXIS_API_KEY=sk-praxis-…`; PowerShell: `$env:PRAXIS_API_KEY="…"`), then create `hello.mjs`:

```javascript
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";

const praxis = createOpenAI({
  baseURL: "https://api.deepraxis.com/openai/v1",
  apiKey: process.env.PRAXIS_API_KEY,
});

const { text, usage } = await generateText({
  model: praxis("deepseek-flash"),
  prompt: "Introduce yourself in one sentence",
});

console.log(text);
console.log(usage);
```

Run it:

```bash
node hello.mjs
```

Expected: a reply prints, followed by the `usage` object—camelCase, with `inputTokens` / `outputTokens` / `totalTokens` and a `raw` block; a reasoning model's `reasoningTokens` sits inside `outputTokenDetails`.

<img alt="The real output of the sample script in a terminal" src="__img0" />

## Streaming [#streaming]

Create `stream.mjs`:

```javascript
import { createOpenAI } from "@ai-sdk/openai";
import { streamText } from "ai";

const praxis = createOpenAI({
  baseURL: "https://api.deepraxis.com/openai/v1",
  apiKey: process.env.PRAXIS_API_KEY,
});

const stream = streamText({
  model: praxis("deepseek-flash"),
  prompt: "Explain what an API is in two sentences",
});

for await (const chunk of stream.textStream) {
  process.stdout.write(chunk);
}
console.log();
```

Expected: the reply prints token by token, ending with a newline. Streaming support varies by model and its upstream channel; some aren't enabled yet reports `STREAMING_UNPROVEN`—drop streaming or switch models and retry.

<img alt="The streaming sample in a terminal: the reply arrives token by token" src="__img1" />

## FAQ [#faq]

| Symptom                  | Cause                                                   | Fix                                                                                            |
| ------------------------ | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| 401 / invalid token      | Key copied incompletely or missing from the environment | Copy it again in full (mind the `sk-praxis-` prefix); check with `echo $env:PRAXIS_API_KEY`    |
| 404 / path not found     | `baseURL` is missing the `/openai/v1` suffix            | It must be `https://api.deepraxis.com/openai/v1` (ending with `/v1`)                           |
| 400 `STREAMING_UNPROVEN` | That model route isn't streaming-enabled yet            | Use `generateText` instead, or retry with another model                                        |
| "Model not found"        | Model ID doesn't match the catalog                      | Copy the exact ID from [Console → Models → Model Catalog](https://console.deepraxis.ai/models) |

## Advanced [#advanced]

* **Chat components**: the AI SDK's `useChat` React hooks pair naturally with server-side `streamText` (see the [AI SDK docs](https://ai-sdk.dev)); the provider setup is identical to this page
* **What did that call cost?** The AI SDK's `usage` carries no price; the [OpenAI SDK](/en/docs/cookbook/sdk/openai-sdk) path returns it directly in `usage.cost`, or see [Console → Usage & Billing](https://console.deepraxis.ai/usage)
* **Switch models**: change the model ID inside `praxis("…")`; `deepseek-flash` always points at the latest Flash generation

## Related recipes [#related-recipes]

* [OpenAI SDK](/en/docs/cookbook/sdk/openai-sdk) · [Anthropic SDK](/en/docs/cookbook/sdk/anthropic-sdk) · [LangChain](/en/docs/cookbook/sdk/langchain)
* Rather not write code? See [Cherry Studio](/en/docs/cookbook/chat-clients/cherry-studio) · [Codex](/en/docs/cookbook/coding-agents/codex)
