# 在 LangChain 中使用 BigModel.io

> 用 ChatOpenAI（base_url 为 https://bigmodel.io/v1）或 ChatAnthropic（https://bigmodel.io）把 LangChain 接入 BigModel.io，含流式用量、工具绑定和 reasoning_content 限制。

网页版: https://bigmodel.io/zh-cn/docs/langchain · 更新于 2026-10-18

LangChain 通过 OpenAI 或 Anthropic 集成调用 BigModel.io。任何 Key 都可以用 `ChatOpenAI`；只有 Key 所在分组提供 `/v1/messages` 时才能用 `ChatAnthropic`。

| 类 | Base URL 参数 | 值 |
|---|---|---|
| `ChatOpenAI`（Python） | `base_url` | `https://bigmodel.io/v1` |
| `ChatOpenAI`（JS） | `configuration.baseURL` | `https://bigmodel.io/v1` |
| `ChatAnthropic`（Python） | `anthropic_api_url` | `https://bigmodel.io`（不带 `/v1`） |
| `ChatAnthropic`（JS） | `anthropicApiUrl` | `https://bigmodel.io`（不带 `/v1`） |

模型 ID 从[模型目录](https://bigmodel.io/zh-cn/models)复制，能否调用取决于 Key 所在分组。

```bash
export BIGMODEL_API_KEY="sk-..."
```

## 安装

```bash [Python]
pip install langchain-openai langchain-anthropic
```

```bash [TypeScript]
npm install @langchain/openai @langchain/anthropic @langchain/core zod
```

## ChatOpenAI

```python [Python]
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="glm-5.3",
    base_url="https://bigmodel.io/v1",
    api_key=os.environ["BIGMODEL_API_KEY"],
    stream_usage=True,
)
print(llm.invoke("列出上线前要检查的五件事。").content)
```

```ts [TypeScript]
import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
  model: "glm-5.3",
  apiKey: process.env.BIGMODEL_API_KEY,
  configuration: { baseURL: "https://bigmodel.io/v1" },
  streamUsage: true,
});
const result = await llm.invoke("列出上线前要检查的五件事。");
console.log(result.content);
```

Python 版在设置自定义 Base URL 后默认关闭 `stream_usage`，流式响应不会带 `usage_metadata`，需要像上面一样传 `stream_usage=True`。

传 `reasoning=...` 或 `use_responses_api=True` 会让 `ChatOpenAI` 改走 `/v1/responses`，GLM、DeepSeek 分组不提供该接口（返回 404）。这类 Key 不要设置这两个参数。

## ChatAnthropic

```python [Python]
import os
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(
    model="glm-5.3",
    anthropic_api_url="https://bigmodel.io",
    api_key=os.environ["BIGMODEL_API_KEY"],
    max_tokens=1024,
)
print(llm.invoke("列出上线前要检查的五件事。").content)
```

```ts [TypeScript]
import { ChatAnthropic } from "@langchain/anthropic";

const llm = new ChatAnthropic({
  model: "glm-5.3",
  anthropicApiUrl: "https://bigmodel.io",
  apiKey: process.env.BIGMODEL_API_KEY,
  maxTokens: 1024,
});
const result = await llm.invoke("列出上线前要检查的五件事。");
console.log(result.content);
```

`ChatAnthropic` 也会读取环境变量 `ANTHROPIC_API_URL` / `ANTHROPIC_BASE_URL`，显式传参优先。

## 流式输出

```python [Python]
for chunk in llm.stream("写一首关于延迟的俳句。"):
    print(chunk.content, end="", flush=True)
```

```ts [TypeScript]
const stream = await llm.stream("写一首关于延迟的俳句。");
for await (const chunk of stream) {
  process.stdout.write(typeof chunk.content === "string" ? chunk.content : "");
}
```

## 工具调用

`bind_tools` 发送标准的 OpenAI 或 Anthropic 工具定义，网关原样转发。是否支持工具取决于模型。

```python [Python]
from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    """查询城市当前天气。"""
    return f"{city}晴"

llm_with_tools = llm.bind_tools([get_weather])
msg = llm_with_tools.invoke("杭州现在天气怎么样？")
print(msg.tool_calls)
```

```ts [TypeScript]
import { tool } from "@langchain/core/tools";
import { z } from "zod";

const getWeather = tool(async ({ city }) => `${city}晴`, {
  name: "get_weather",
  description: "查询城市当前天气。",
  schema: z.object({ city: z.string() }),
});

const msg = await llm.bindTools([getWeather]).invoke("杭州现在天气怎么样？");
console.log(msg.tool_calls);
```

## reasoning_content 的限制

GLM、DeepSeek 分组上的思考模型会在 `reasoning_content` 字段返回推理过程。网关会透传这个字段，但 `ChatOpenAI` 不会把它暴露出来，你只能拿到最终回答。需要推理文本时，改用 [OpenAI SDK](https://bigmodel.io/zh-cn/docs/openai-sdk-langchain) 直接读取 `reasoning_content`。见[推理与思考](https://bigmodel.io/zh-cn/docs/reasoning)。

## 验证配置

```python [Python]
msg = llm.invoke("ping")
print(msg.content, msg.usage_metadata)
```

```ts [TypeScript]
const msg = await llm.invoke("ping");
console.log(msg.content, msg.usage_metadata);
```

能返回回答和 token 数就说明 Base URL 和 Key 正确，请求也应出现在[用量](https://bigmodel.io/usage)页面。

## 常见问题排查

**`ChatOpenAI` 所有请求都 404。** Base URL 少了 `/v1`。JS 中必须写在 `configuration` 里，不能写成顶层 `baseURL`。

**`ChatAnthropic` 所有请求都 404。** URL 末尾带了 `/v1`，改成 `https://bigmodel.io`。

**404 `... only supports /v1/chat/completions`。** 要么是用只支持 Chat Completions 的分组调用了 `ChatAnthropic`，要么是 `reasoning` / `use_responses_api` 让 `ChatOpenAI` 改走了 Responses API。改用普通的 `ChatOpenAI`。

**流式响应没有 token 用量。** 设置 `stream_usage=True`（Python）或 `streamUsage: true`（JS）。

**401 `INVALID_API_KEY`。** Key 没传到客户端，环境里的 `OPENAI_API_KEY` 或 `ANTHROPIC_API_KEY` 可能被优先使用。显式传 `api_key`。

**503 `No available accounts: no available accounts supporting model: ...`。** 模型 ID 写错或不在 Key 的分组里。从[模型目录](https://bigmodel.io/zh-cn/models)复制 ID。

**403 `INSUFFICIENT_BALANCE` 或 429。** 到[充值](https://bigmodel.io/purchase)页面充值；429 见[限额与速率](https://bigmodel.io/zh-cn/docs/rate-limits)。

## 相关文档

- [OpenAI SDK](https://bigmodel.io/zh-cn/docs/openai-sdk-langchain) 和 [Anthropic SDK](https://bigmodel.io/zh-cn/docs/anthropic-sdk)
- [LlamaIndex](https://bigmodel.io/zh-cn/docs/llamaindex) 和 [Vercel AI SDK](https://bigmodel.io/zh-cn/docs/vercel-ai-sdk)
- [工具调用](https://bigmodel.io/zh-cn/docs/tool-calling)和[流式输出](https://bigmodel.io/zh-cn/docs/streaming)
