# LangChain (/ja/docs/guides/langchain)

OpenAI互換APIで、LangChainからcheapaimodelのモデルを使います。



LangChainは、OpenAIインテグレーションの`ChatOpenAI`（Pythonは`langchain-openai`、TypeScriptは`@langchain/openai`）でOpenAI互換サービスに接続します。Base URLをcheapaimodelに変更し、cheapaimodelのAPIキーを渡します。

|          | LangChainの設定項目 | 値                                                             |
| -------- | -------------- | ------------------------------------------------------------- |
| Base URL | `base_url`     | `https://api.cheapaimodel.ai/v1`                              |
| APIキー    | `api_key`      | コンソールの[APIキー](https://console.cheapaimodel.ai/keys)ページで発行したキー |
| モデルID    | `model`        | `deepseek-v4-1-flash`、または[モデルカタログ](/ja/models)にある任意のID        |

## 設定 [#set-it-up]

表の項目名はPythonのものです。TypeScriptでは`configuration.baseURL`、`apiKey`、`model`になり、Base URLは`configuration`の中に書きます。

<Tabs items="[&#x22;Python&#x22;, &#x22;TypeScript&#x22;]">
  <Tab value="Python">
    現行の`langchain-openai`にはPython 3.10以降が必要です。

    ```bash title="ターミナル"
    pip install -U langchain-openai
    ```

    ```python title="main.py"
    import os
    from langchain_openai import ChatOpenAI

    llm = ChatOpenAI(
        model="deepseek-v4-1-flash",
        base_url="https://api.cheapaimodel.ai/v1",
        api_key=os.environ["CHEAPAIMODEL_API_KEY"],
    )

    response = llm.invoke("Explain recursion in one sentence.")
    print(response.text)

    # ストリーミング
    for chunk in llm.stream("Write a haiku about the sea."):
        print(chunk.text, end="", flush=True)
    ```
  </Tab>

  <Tab value="TypeScript">
    ```bash title="ターミナル"
    npm install @langchain/openai @langchain/core
    ```

    ```ts title="main.ts"
    import { ChatOpenAI } from "@langchain/openai";

    const llm = new ChatOpenAI({
      model: "deepseek-v4-1-flash",
      apiKey: process.env.CHEAPAIMODEL_API_KEY,
      configuration: {
        baseURL: "https://api.cheapaimodel.ai/v1",
      },
    });

    const response = await llm.invoke("Explain recursion in one sentence.");
    console.log(response.text);

    // ストリーミング
    const stream = await llm.stream("Write a haiku about the sea.");
    for await (const chunk of stream) {
      process.stdout.write(chunk.text);
    }
    ```
  </Tab>
</Tabs>

`ChatOpenAI`は`/v1/chat/completions`にリクエストを送ります。[モデルカタログ](/ja/models)でこのエンドポイントが記載されているモデルなら、どれでも`deepseek-v4-1-flash`の代わりに使えます。

## init\_chat\_modelを使う場合 [#with-init_chat_model]

Pythonでは、`langchain`パッケージの`init_chat_model`も同じ設定を受け取ります。`model_provider="openai"`を必ず渡してください。省略すると、LangChainはモデルIDからプロバイダーを推測し、誤ったインテグレーションを選ぶか、推測に失敗します。

```python title="main.py"
import os
from langchain.chat_models import init_chat_model

llm = init_chat_model(
    "deepseek-v4-1-flash",
    model_provider="openai",
    base_url="https://api.cheapaimodel.ai/v1",
    api_key=os.environ["CHEAPAIMODEL_API_KEY"],
)
```

## 埋め込み [#embeddings]

cheapaimodelにはまだ埋め込みモデルがありません。`OpenAIEmbeddings`（またはretrieverで使っている埋め込みクラス）は従来のプロバイダーのまま使い、cheapaimodelのBase URLを設定しないでください。

## よくある間違い [#common-mistakes]

* **`'baseURL' does not exist in type 'ChatOpenAIFields'`**（TypeScript）。`baseURL`は`configuration`の中に書きます。素のJavaScriptではトップレベルに書いた`baseURL`がエラーなしで無視され、cheapaimodelのAPIキーを付けたリクエストがOpenAIに送られます。
* **`init_chat_model`で`requires the langchain-deepseek package`または`Unable to infer model provider`が出る。** `model_provider="openai"`を追加してください。
* **`/v1/embeddings`で`model_not_found`付きの`503`が返る。** `OPENAI_BASE_URL`または`OPENAI_API_BASE`にcheapaimodelのBase URLがexportされています。この環境変数は`ChatOpenAI`だけでなく`OpenAIEmbeddings`も読み込むため、埋め込みのリクエストまでcheapaimodelに送られます。環境変数は使わず、コードで`base_url`を渡してください。
* **`<bound method BaseMessage.text ...>`と出力される。** Pythonが3.10より古いため、pipが0.3系をインストールしています。0.3系では`text`はメソッドです。Pythonをアップグレードして再インストールしてください。
* **`/v1/chat/completions`で`model_not_found`付きの`503`が返る。** `model`が未指定でLangChainがOpenAIのデフォルト`gpt-3.5-turbo`を送っているか、カタログにないIDを指定しています。`model`には[モデルカタログ](/ja/models)にあるIDを指定してください。

`/v1`の付け忘れなど、Base URLの誤りについては[Base URL](/ja/docs/api/base-url#common-mistakes)を参照してください。
