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







把 Praxis 接入 [LangChain](https://js.langchain.com)（JS/TS 版）——链、记忆、工具全家桶照常用，模型侧只改一个 `baseURL`。本页以 Node 实测。

每一步都标了**期望结果**：照做即可，也可以把本页直接交给能操作电脑的 AI 助手，让它替你完成安装、运行与验证。

## 你将完成 [#你将完成]

* 用 LangChain 的 `ChatOpenAI` 调 Praxis 的模型，拿到回复与用量
* 完成标志：`hello.mjs` 打印中文回复与用量，`stream.mjs` 逐字打印回复
* 预计耗时：**3–5 分钟**（不含 Node.js 安装）
* 支持协议：OpenAI 兼容（`/openai/v1`）

## 前提 [#前提]

开始前逐项确认：

* **一个 Praxis API Key**（`sk-praxis-` 开头）。没有就到 [控制台 → API Keys](https://console.deepraxis.ai/keys&#x29; 创建：点「创建 Key」，名称必填，有效期可选 30/60/90 天或永久，默认 90 天；创建成功弹窗会展示完整 Key 并带「复制 Key」，关闭后列表只显示掩码，随时可点行内复制图标重新获取完整 Key。期望：弹出「创建 API Key」对话框，提交后弹窗展示完整 Key 与「复制 Key」按钮。新账号自带 **$1 免费额度**。完整流程见[快速开始](/docs/cloud/services/model/quickstart)。
* **Node.js 18 或更高**（`node --version` 检查；用 [Bun](https://bun.sh) 亦可）。
* **安装 SDK**：

  ```bash
  npm install @langchain/openai
  ```

  期望：安装无报错。空目录直接装即可（npm 会在当前目录生成 package.json、package-lock.json 与 node\_modules）；需要链、提示词模板、输出解析器时再 `npm install langchain`。

## 第一个请求 [#第一个请求]

先把 Key 放进环境变量（`export PRAXIS_API_KEY=sk-praxis-…`；PowerShell：`$env:PRAXIS_API_KEY="…"`），再新建 `hello.mjs`：

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

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

const res = await model.invoke("用一句话介绍你自己");
console.log(res.content);
console.log(res.usage_metadata);
```

运行：

```bash
node hello.mjs
```

期望：打印一段中文回复，随后是用量对象（`input_tokens` / `output_tokens` / `total_tokens`；推理 token 数见 `output_token_details.reasoning`）。注意与 OpenAI 官方 SDK 的差别：**地址与密钥写在 `configuration` 嵌套对象里**，不是顶层字段。

<img alt="终端运行示例脚本的真实输出" src="__img0" />

## 流式响应 [#流式响应]

新建 `stream.mjs`：

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

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

const stream = await model.stream("用两句话解释什么是 API");
for await (const chunk of stream) {
  process.stdout.write(chunk.content);
}
console.log();
```

期望：回复逐字打印、以换行收尾。流式支持因模型及其上游通道而异，个别可能暂未开放（报 `STREAMING_UNPROVEN` 时去掉流式或换模型重试）。

<img alt="终端运行流式示例：回复逐字输出" src="__img1" />

## 常见问题 [#常见问题]

| 症状                       | 原因                           | 解法                                                             |
| ------------------------ | ---------------------------- | -------------------------------------------------------------- |
| 401 / 无效令牌               | Key 复制不完整或未设进环境变量            | 重新完整复制（注意 `sk-praxis-` 前缀）；用 `echo $PRAXIS_API_KEY` 检查         |
| 404 / 路径不存在              | `baseURL` 少了 `/openai/v1` 后缀 | 必须是 `https://api.deepraxis.ai/openai/v1`（以 `/v1` 结尾）           |
| 配置不生效                    | 地址写在了顶层而不是 `configuration` 里 | 移进 `configuration: { baseURL, apiKey }`                        |
| 400 `STREAMING_UNPROVEN` | 该模型暂未开放流式                    | 改用 `invoke`，或换个模型重试                                            |
| 模型不存在                    | 模型 ID 与目录不一致                 | 到[控制台 → 模型 → 模型目录](https://console.deepraxis.ai/models)复制确切 ID |

## 进阶 [#进阶]

* **链式调用**：`model.pipe(...)` 接提示词模板、输出解析器即成链——Praxis 侧无需任何额外配置
* **查这次调用花了多少钱**：LangChain 的用量不带费用；用 [OpenAI SDK](/docs/cookbook/sdk/openai-sdk) 那条路 `usage.cost` 直接返回，或看[控制台 → 用量与费用](https://console.deepraxis.ai/usage)
* **换模型**：改 `model` 字段；`deepseek-flash` 是滚动入口始终指向最新一代 Flash

## 相关食谱 [#相关食谱]

* [OpenAI SDK](/docs/cookbook/sdk/openai-sdk) · [Anthropic SDK](/docs/cookbook/sdk/anthropic-sdk) · [Vercel AI SDK](/docs/cookbook/sdk/vercel-ai-sdk)
* 不想写代码？看 [Cherry Studio](/docs/cookbook/chat-clients/cherry-studio) · [Claude Code](/docs/cookbook/coding-agents/claude-code)
