# LangChain (/en/docs/cookbook/sdk/langchain)







Connect Praxis to [LangChain](https://js.langchain.com) (JS/TS)—chains, memory, and the whole toolkit work as usual; the model side changes one `baseURL`. 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 LangChain's `ChatOpenAI` and get replies plus usage
* 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 offers 30/60/90 days or permanent, defaulting to 90 days; 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 @langchain/openai
  ```

  Expected: the install succeeds. An empty directory works—npm generates package.json, package-lock.json, and node\_modules there; run `npm install langchain` when you need chains, prompt templates, or output parsers.

## 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 { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
  model: "deepseek-flash",
  configuration: {
    baseURL: "https://api.deepraxis.com/openai/v1",
    apiKey: process.env.PRAXIS_API_KEY,
  },
});

const res = await model.invoke("Introduce yourself in one sentence");
console.log(res.content);
console.log(res.usage_metadata);
```

Run it:

```bash
node hello.mjs
```

Expected: a reply prints, followed by the usage object (`input_tokens` / `output_tokens` / `total_tokens`; the reasoning token count sits at `output_token_details.reasoning`). Note the difference from the official OpenAI SDK: **the URL and key live inside the nested `configuration` object**, not at the top level.

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

## Streaming [#streaming]

Create `stream.mjs`:

```javascript
import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
  model: "deepseek-flash",
  configuration: {
    baseURL: "https://api.deepraxis.com/openai/v1",
    apiKey: process.env.PRAXIS_API_KEY,
  },
});

const stream = await model.stream("Explain what an API is in two sentences");
for await (const chunk of stream) {
  process.stdout.write(chunk.content);
}
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—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`)                           |
| Config has no effect     | The URL was written at the top level instead of inside `configuration` | Move it into `configuration: { baseURL, apiKey }`                                              |
| 400 `STREAMING_UNPROVEN` | That model isn't streaming-enabled yet                                 | Use `invoke`, 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]

* **Chaining**: `model.pipe(...)` plus prompt templates and output parsers makes a chain—no extra Praxis-side configuration needed
* **What did that call cost?** LangChain 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` field; `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) · [Vercel AI SDK](/en/docs/cookbook/sdk/vercel-ai-sdk)
* Rather not write code? See [Cherry Studio](/en/docs/cookbook/chat-clients/cherry-studio) · [Claude Code](/en/docs/cookbook/coding-agents/claude-code)
