# LLM API

> endue の APIキーを使い、自分のコードからモデルを直接呼び出します。使い慣れた OpenAI や Anthropic の SDK をそのまま使え、呼び出しごとの料金はクレジットから支払われます。

**LLM API** を使うと、自分のコードから endue の APIキーでモデルを直接呼び出せます。リクエスト形式は OpenAI や Anthropic の API と同じで、呼び出しごとの料金はクレジットから支払われます。

## 使いどころ

エージェントではなくモデルを使いたいときです。自分のアプリ内でのテキスト生成、すでに OpenAI や Anthropic の API を呼び出しているコード、Claude Code などが該当します。変更するのはベース URL とキーだけで、ほかのコードはそのまま使えます。

プロンプト、メモリ、ツール、コネクターを備えたエージェントに作業を任せたい場合は、代わりに[エージェント API](/ja/docs/build/agent-api/) で呼び出してください。

## 最初の呼び出し

<Steps>

1. **アカウント全体のキーを発行します**。**設定 → アカウント → APIキー**で発行し、表示されたらすぐにコピーしてください。キーは一度しか表示されません。エージェントの API セクションで発行したキーはそのエージェント専用で、モデルを直接呼び出すことはできません。

2. **キーはコードに書き込まないでください**。`ENDUE_API_KEY` などの環境変数に入れます。

3. 次のベース URL を指定して **SDK の接続先を endue にし**、[モデル一覧](#モデルと料金)にあるモデルを呼び出します。

   ```
   https://platform.endue.ai/api/v1/llm
   ```

</Steps>

<Tabs syncKey="llm-api-lang">
  <TabItem label="Python">
    ```python
    import os
    from openai import OpenAI

    client = OpenAI(base_url="https://platform.endue.ai/api/v1/llm", api_key=os.environ["ENDUE_API_KEY"])
    res = client.chat.completions.create(
        model="openai/gpt-5.4",
        messages=[{"role": "user", "content": "Hello"}],
    )
    print(res.choices[0].message.content)
    ```
  </TabItem>
  <TabItem label="Node.js">
    ```js
    import OpenAI from 'openai';

    const client = new OpenAI({ baseURL: 'https://platform.endue.ai/api/v1/llm', apiKey: process.env.ENDUE_API_KEY });
    const res = await client.chat.completions.create({
      model: 'openai/gpt-5.4',
      messages: [{ role: 'user', content: 'Hello' }],
    });
    console.log(res.choices[0].message.content);
    ```
  </TabItem>
  <TabItem label="curl">
    ```bash
    curl https://platform.endue.ai/api/v1/llm/chat/completions \
      -H "Authorization: Bearer $ENDUE_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"model":"openai/gpt-5.4","messages":[{"role":"user","content":"Hello"}]}'
    ```
  </TabItem>
  <TabItem label="Anthropic SDK">
    ```python
    import os
    import anthropic

    client = anthropic.Anthropic(base_url="https://platform.endue.ai/api/v1/llm", api_key=os.environ["ENDUE_API_KEY"])
    msg = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}],
    )
    print(msg.content[0].text)
    ```
  </TabItem>
  <TabItem label="Claude Code">
    ```bash
    export ANTHROPIC_BASE_URL=https://platform.endue.ai/api/v1/llm
    export ANTHROPIC_API_KEY=$ENDUE_API_KEY
    claude
    ```
  </TabItem>
</Tabs>

**設定 → アカウント → LLM API** にも同じベース URL と例があり、そのままコピーできます。

## モデルと料金

`GET https://platform.endue.ai/api/v1/llm/models` は、呼び出せるすべてのモデルを、コンテキスト長と料金とともに返します。取得にキーは必要ありません。

- **モデル ID** は `openai/gpt-5.4` や `x-ai/grok-4.6` のように、プロバイダー、モデルの順で表します。
- **料金**はトークンあたりのクレジットで、10進数の文字列で表されます。入力は `prompt`、出力は `completion` に記載され、キャッシュされた入力を割り引くモデルでは `input_cache_read` にも記載されます。1クレジットは1米ドルです。
- 非常に長いプロンプトに高い料金を設定しているモデルもあります。その料金は、適用が始まるプロンプトの長さとともに `overrides` に記載されます。

同じモデルは[モデルページ](/ja/models)でも一覧できます。

## ストリーミング

`"stream": true` を指定します。回答は OpenAI のチャンク形式の Server-Sent Events として届き、`data: [DONE]` で終わります。`[DONE]` の直前のチャンクには、その呼び出しのコストを含む `usage` が入っています。

## 支払いの仕組み

<Steps>

1. **モデルを実行する前に**、endue はその呼び出しでかかりうる最大額（プロンプトと、`max_tokens` 分の出力）をまかなえるだけのクレジットを確保します。残高がそれより少ない場合、モデルは呼び出されず、`402` が返ります。

2. **呼び出しが終わると**、実際にかかった分だけが請求され、確保していた残りは残高に戻ります。

3. **レスポンスで請求額がわかります**。`usage.cost` がこの呼び出しで差し引かれたクレジットで、問い合わせが必要な場合は `X-Endue-Request-Id` ヘッダーで呼び出しを特定できます。

</Steps>

`max_tokens` を省略し、残高がモデルの最大出力長をまかなえない場合は、残高でまかなえる長さまで `max_tokens` を下げて呼び出します。ただし、その長さが1,024トークン以上であることが条件で、それを下回る場合は `402` が返ります。

LLM API の呼び出しは、**購入クレジットとプロモーションクレジット**からのみ支払われます。プランに含まれる利用枠はエージェント用で、ここでは使われません。呼び出しは[使用量ダッシュボード](/ja/docs/account/usage/#利用元)の**利用元**タブに **LLM API** として表示されます。

## Anthropic 形式と Claude Code

同じベース URL は、Anthropic Messages 形式も受け付けます。Anthropic SDK と Claude Code はベース URL に `/v1/messages` を自動で付け加えるので、設定は上のタブにある2行だけです。

- キーは `x-api-key` と `Authorization: Bearer` のどちらで送っても構いません。
- Claude のモデル名は、Anthropic で指定するときと同じ書き方（`claude-sonnet-4-5`、または `claude-sonnet-4-5-20250929` のような日付付きの名前）で使えます。ただし、そのモデルがモデル一覧に載っている必要があります。モデル一覧の ID もそのまま使え、Claude 以外のモデルも呼び出せます。
- ストリーミングは Anthropic のイベント形式、エラーは Anthropic のエラー形式で返ります。
- `/v1/messages/count_tokens` は、入力トークン数の推定値を返します。課金はされません。また、トークナイザーで数えた正確な値ではなく、概算です。

## エラー

エラーは、呼び出した形式に合わせた構造で返ります。OpenAI 形式なら `{"error": {…}}`、Anthropic 形式なら `{"type": "error", "error": {…}}` です。

| ステータス | 原因 | 対処 |
| --- | --- | --- |
| `400` | リクエストの形式が正しくない、`n` が1より大きい、またはモデルが入力を拒否した | リクエストを修正します。何が問題かはメッセージに示されます |
| `401` | キーがない、無効化されている、または間違っている | キーと、その送り方を確認します |
| `402` | クレジット残高が呼び出しをまかなえない（`insufficient_credits`、Anthropic 形式では `billing_error`） | クレジットを購入するか、`max_tokens` を下げます |
| `403` | キーが1つのエージェント専用になっている | アカウント全体のキーを発行します |
| `404` | モデル一覧にないモデルを指定した | `/models` にある ID を選びます |
| `429` | リクエストが多すぎる | `Retry-After` に示された秒数だけ待ちます |
| `502` | モデルプロバイダー側でエラーが発生した | 再試行します |
| `503` | 課金処理またはモデル一覧が一時的に利用できない。モデルは呼び出されておらず、請求も発生していない | しばらくしてから再試行します |

## 制限事項

- 呼び出せるのは、モデル一覧にあるモデルだけです。
- 対応している形式は、OpenAI Chat Completions と Anthropic Messages の2つです。埋め込み、画像、音声、Responses のエンドポイントはありません。
- `n` は1でなければなりません。
- 標準のリクエストに含まれないフィールド（ほかのモデルへのフォールバックリスト、プロバイダーのルーティング、プラグインなど）は無視されます。Anthropic 形式では、Web 検索などのサーバーツールは拒否され、`top_k` は無視されます。
- プランの利用枠は使われません。呼び出しには、購入クレジットかプロモーションクレジットが必要です。
- 1つのエージェント専用のキーでは、モデルを呼び出せません。
- 呼び出しは1分あたり100回までで、キー単位とアカウント単位の両方で数えます。リクエストボディの上限は8 MB です。
- `count_tokens` の値は推定値です。

## 関連項目

<CardGrid>
  <LinkCard
    title="エージェント API"
    href="/ja/docs/build/agent-api/"
    description="モデル単体ではなく、プロンプト、メモリ、ツールを備えたエージェントを呼び出す。"
  />
  <LinkCard
    title="使用量ダッシュボード"
    href="/ja/docs/account/usage/"
    description="利用元タブで、LLM API の支出をエージェントの支出と並べて確認する。"
  />
  <LinkCard
    title="モデルの選び方"
    href="/ja/docs/build/models/"
    description="モデルごとの違いと、相対的なコスト。"
  />
  <LinkCard
    title="セキュリティと権限"
    href="/ja/docs/account/security/"
    description="キーでアクセスできる範囲と、キーを無効化する方法。"
  />
</CardGrid>
