# LlamaIndex (/ja/docs/guides/llamaindex)

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



LlamaIndexは、`llama-index-llms-openai-like`パッケージの`OpenAILike`でOpenAI互換サービスに接続します。未知のモデルIDからはモデルの仕様を判別できないため、チャットモデルであることとコンテキストウィンドウの2点を明示的に設定します。

|             | LlamaIndexの設定項目  | 値                                                             |
| ----------- | ---------------- | ------------------------------------------------------------- |
| Base URL    | `api_base`       | `https://api.cheapaimodel.ai/v1`                              |
| APIキー       | `api_key`        | コンソールの[APIキー](https://console.cheapaimodel.ai/keys)ページで発行したキー |
| モデルID       | `model`          | `deepseek-v4-1-flash`、または[モデルカタログ](/ja/models)にある任意のID        |
| チャットモデル     | `is_chat_model`  | `True`                                                        |
| コンテキストウィンドウ | `context_window` | モデルのコンテキスト長（トークン数）。[モデルカタログ](/ja/models)の各モデルのページに記載          |

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

現行のLlamaIndexパッケージにはPython 3.10以降が必要です。

```bash title="ターミナル"
pip install llama-index-llms-openai-like
```

モデルのページ（たとえば[deepseek-v4-1-flash](/ja/models/deepseek-v4-1-flash)）でコンテキスト長を確認し、`CONTEXT_WINDOW`に入れます。

```python title="main.py"
import os
from llama_index.core.llms import ChatMessage
from llama_index.llms.openai_like import OpenAILike

CONTEXT_WINDOW = ...  # モデルのページに記載のコンテキスト長（トークン数）

llm = OpenAILike(
    model="deepseek-v4-1-flash",
    api_base="https://api.cheapaimodel.ai/v1",
    api_key=os.environ["CHEAPAIMODEL_API_KEY"],
    is_chat_model=True,
    context_window=CONTEXT_WINDOW,
)

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

# ストリーミング
messages = [ChatMessage(role="user", content="Write a haiku about the sea.")]
for chunk in llm.stream_chat(messages):
    print(chunk.delta, end="", flush=True)
```

`is_chat_model=True`にすると、`complete`も含めてすべての呼び出しが`/v1/chat/completions`に送られます。

## LlamaIndex全体で使う [#use-it-across-llamaindex]

`Settings`に設定すると、インデックス、クエリエンジン、チャットエンジンのデフォルトになります。

```python title="main.py"
from llama_index.core import Settings

Settings.llm = llm
```

ベクトルインデックスには埋め込みモデルも必要で、`Settings.embed_model`のデフォルトはOpenAIのモデルです。cheapaimodelにはまだ埋め込みモデルがないため、`Settings.embed_model`には別のプロバイダーの埋め込みモデルかローカルモデルを設定し、cheapaimodelのBase URLは設定しないでください。

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

* **リクエストが`/v1/completions`に送られる。** `is_chat_model`のデフォルトは`False`で、この場合は`complete`だけでなく`chat`も単一のプロンプトとして旧来のcompletionsエンドポイントに送られます。cheapaimodelのモデルが対応しているのは`/v1/chat/completions`と`/v1/responses`だけです。`is_chat_model=True`を設定してください。
* **`ValueError: Unknown model 'deepseek-v4-1-flash'. Please provide a valid OpenAI model name`。** LLMに`llama_index.llms.openai`の`OpenAI`を使っています。これはOpenAI自身のモデル名しか受け付けません。`OpenAILike`を使ってください。
* **インデックスの作成時に`Could not load OpenAI embedding model`が出る。** `Settings.embed_model`がOpenAIのデフォルトのままです。別のプロバイダーの埋め込みモデルかローカルモデルを設定してください。
* **`/v1/embeddings`で`model_not_found`付きの`503`が返る。** 原因は上と同じで、加えて`OPENAI_API_KEY`と`OPENAI_API_BASE`にcheapaimodelのAPIキーとBase URLが設定されています。デフォルトの埋め込みモデルがこれらを読み込み、cheapaimodelに埋め込みをリクエストします。環境変数ではなく`OpenAILike`に`api_key`と`api_base`を渡し、`Settings.embed_model`を設定してください。
* **`kimi-k3`で`400`が返る。** `OpenAILike`は`temperature`を必ず送り、デフォルトは`0.1`ですが、kimi-k3が受け付けるのは`1`または`0.6`だけです。`temperature=1.0`を渡してください。[サンプリングパラメーターの制限](/ja/docs/concepts/models#sampling-limits)を参照してください。
* **1回のクエリで複数のリクエストが送られる。** `context_window`のデフォルトは3900トークンで、LlamaIndexは取得したテキストをそこに収まるよう分割するため、クエリエンジンが必要以上のリクエストを送ります。モデルのコンテキスト長を設定してください。

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