---
url: 'https://dxpr.com/ja/hc/documentation/learn-dxpr-builder/ai/api-reference'
title: 'AI APIリファレンス | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T11:25:44+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: 'DXPR Builderは3つのAIルートを公開します。ブラウザーが呼び出し、コントローラーがDrupal AIモジュール経由でDXPRプロバイダー(ai_provider_dxpr)にリクエストをプロキシーするため、APIキーがブラウザーに届くことはありません。ルートはdxpr_builder.routing.ymlで定義されています。下記の動作はsrc/Controller/AiChatController.phpとsrc/Controller/AiImageController.phpによるものです。'
tags:
  - 'Architectuur en API’s'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-24T11:25:44+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: 'AI APIリファレンス'
      description: 'DXPR Builderは3つのAIルートを公開します。ブラウザーが呼び出し、コントローラーがDrupal AIモジュール経由でDXPRプロバイダー(ai_provider_dxpr)にリクエストをプロキシーするため、APIキーがブラウザーに届くことはありません。ルートはdxpr_builder.routing.ymlで定義されています。下記の動作はsrc/Controller/AiChatController.phpとsrc/Controller/AiImageController.phpによるものです。'
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T11:25:44+0000'
      dateModified: '2026-10-24T11:25:44+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/ja/hc/documentation/learn-dxpr-builder/ai/api-reference'
      articleSection: 'Architectuur en API’s'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/ja/hc/documentation/learn-dxpr-builder/ai/api-reference'
      description: 'DXPR Builderは3つのAIルートを公開します。ブラウザーが呼び出し、コントローラーがDrupal AIモジュール経由でDXPRプロバイダー(ai_provider_dxpr)にリクエストをプロキシーするため、APIキーがブラウザーに届くことはありません。ルートはdxpr_builder.routing.ymlで定義されています。下記の動作はsrc/Controller/AiChatController.phpとsrc/Controller/AiImageController.phpによるものです。'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: ホーム
            item: 'https://dxpr.com/ja'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: ja
---
[Help Center](/ja/node/75)/[Documentation](/ja/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Extend](/hc/documentation/learn-dxpr-builder/extend) /[Architectuur en API’s](/hc/documentation/learn-dxpr-builder/extend/architecture) # AI APIリファレンス.

 Learn DXPR BuilderExtendArchitectuur en API’s

   ## In this guide

 Related guides

- [AIモデルとプロバイダー](/ja/hc/documentation/learn-dxpr-builder/ai/models-and-providers)
- [AI設定](/ja/hc/documentation/learn-dxpr-builder/ai/configuration)
- [AIのトラブルシューティング](/ja/hc/documentation/learn-dxpr-builder/ai/troubleshooting)

DXPR Builderは3つのAIルートを公開します。ブラウザーが呼び出し、コントローラーがDrupal AIモジュール経由でDXPRプロバイダー(`ai_provider_dxpr`)にリクエストをプロキシーするため、APIキーがブラウザーに届くことはありません。ルートは`dxpr_builder.routing.yml`で定義されています。下記の動作は`src/Controller/AiChatController.php`と`src/Controller/AiImageController.php`によるものです。

## アクセス要件(3ルート共通)

| 要件 | ソース |
|---|---|
| HTTPメソッド`POST` | `methods: [POST]`(ルート内) |
| 権限`edit with dxpr builder` | `_permission` |
| 課金対象ユーザー(有効なライセンスシート) | `_dxpr_builder_billable_user`。チェック元は`DxprBuilderBillableUserAccessCheck` |
| CSRFトークンは`token`クエリーパラメーター内にあります | `_csrf_token: 'TRUE'` |
| ログイン済みDrupalセッションCookie | Drupalのアクセスチェックはユーザーごとに実行 |

トークンはルートパス用のDrupalルートCSRFトークンです。DXPR Builderはサーバー側で生成し、`drupalSettings.dxprBuilder.aiAgent`に`endpointUrl`、`imageEndpointUrl`、`imageEditEndpointUrl`として埋め込みます(`DxprBuilderFormatter`参照)。有効なURLを得るには、エディターが読み込まれたページからこれらの値のいずれかを読み取ります。アクセスチェックの失敗はDrupal標準の`403`レスポンスを返します。

コントローラーは常に`dxpr`プロバイダーをインスタンス化します。`/admin/config/ai/settings`で設定したプロバイダーは使われません。

## Chat

`POST /dxpr_builder/ajax/ai/chat?token=...`

テキストコマンド、ページ作成、プロンプト候補が使います。コントローラーはJSONボディを読み取り、`$provider->chat()`を呼び出します。

### リクエストボディ

| フィールド | タイプ | 必須 | 備考 |
|---|---|---|---|
| `messages` | 配列の中身：`{role, content}` | はい | `role`は`system`、`user`、または`assistant` |
| `model` | string | いいえ | デフォルトは`kavya-m1`。プロバイダーのAllowed models一覧にある必要があります |
| `stream` | boolean | いいえ | デフォルトは`true` |
| `prediction` | object | いいえ | そのまま転送されます。例：`{"type":"content","content":"<p>...</p>"}` |
| `providers` | string | いいえ | カンマ区切りのプロバイダーID。例：`openai,mistral` |
| `allowed_html_tags` | string | いいえ | そのまま転送。送信内容は`Bootstrap 5 HTML` |
| `allowed_html_classes` | string | いいえ | そのまま転送。送信内容は`Bootstrap 5 Classes` |
| `web_search` | boolean | いいえ | 転送されるのは`false`のみです |
| `response_format` | object | いいえ | そのまま転送されます(例: `json_schema`オブジェクト) |

コントローラーは常にプロバイダー設定に`jsonrpc: false`を追加します。呼び出し前に**AI Output Filtering &gt; Allowed domains**のドメインをAIモジュールのホスト名フィルターにリクエスト中のみマージします(`*`でフィルターは完全信頼になります)。

### レスポンス

ストリーミング(`stream`がtrue、デフォルト)：`200`、`Content-Type: text/event-stream`。各イベントは`data: {json}`の後に空行が続き、ストリームは`data: [DONE]`で終わります。

```text
data: {"choices":[{"delta":{"content":"Hello"}}],"id":"...","model":"kavya-m1","usage":{...}}

data: [DONE]

```

`id`、`object`、`created`、`model`、 `original_model`、`usage`はプロバイダーの生チャンクにあればコピーされます。

非ストリーミング(`stream`がfalse)：`200`、`application/json`。

```json
{"choices":[{"message":{"role":"assistant","content":"..."}}]}

```

### エラー

| ステータス | ボディ |
|---|---|
| `400` | プレーンテキスト`Invalid request: messages required` |
| `403` | `{"error":{"code":"model_not_allowed","message":"The selected model is not allowed. Please refresh the page to update your model options."}}`。`ai_provider_dxpr`インストール時に`model`がAllowed models一覧にない場合 |
| `500` | `{"error":{"message":"The request could not be completed."}}`(詳細は`dxpr_builder`ログチャンネル) |

### 例

```js
const url = drupalSettings.dxprBuilder.aiAgent.endpointUrl;
const res = await fetch(url, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    model: "kavya-m1",
    stream: false,
    messages: [
      { role: "system", content: "You are a copywriter." },
      { role: "user", content: "Shorten: <p>Our team ...</p>" }
    ]
  })
});
const data = await res.json();
console.log(data.choices[0].message.content);

```

## 画像生成

`POST /dxpr_builder/ajax/ai/image?token=...`

呼び出すのは`$provider->textToImage()`です。

### リクエストボディ

| フィールド | タイプ | 必須 | 備考 |
|---|---|---|---|
| `prompt` | string | はい | 画像のテキスト説明 |
| `model` | string | いいえ | デフォルトは`kavya-image` |
| `size` | string | いいえ | ビルダーは`1024x1024`、`1536x1024`、`1024x1536`を送信します。Autoの場合は省略 |
| `quality` | string | いいえ | プロバイダーにそのまま渡されます |
| `background` | string | いいえ | プロバイダーにそのまま渡されます |

### レスポンス

`200`、`application/json`。返されるのは最初の画像のみで、base64エンコード済みです。DXPRプロバイダーは`webp`出力を要求します。

```json
{"data":[{"b64_json":"UklGRi..."}]}

```

### エラー

| ステータス | ボディ |
|---|---|
| `400` | `{"error":{"message":"Invalid request: prompt required"}}` |
| `500` | `{"error":{"message":"No image was generated"}}` |
| `500` | `{"error":{"message":"Image generation failed. Please try again."}}` |

### 例

```bash
curl -X POST "https://example.com/dxpr_builder/ajax/ai/image?token=TOKEN" \
  -H "Content-Type: application/json" \
  -H "Cookie: SESSxxx=..." \
  -d '{"prompt":"Flat illustration of a rocket","size":"1536x1024"}'

```

## 画像編集

`POST /dxpr_builder/ajax/ai/image/edit?token=...`

呼び出すのは`$provider->imageToImage()`で、アップロード画像とプロンプトを渡します。

### リクエストボディ

| フィールド | タイプ | 必須 | 備考 |
|---|---|---|---|
| `prompt` | string | はい | 編集指示 |
| `image` | string | はい | Base64画像データで、`data:`プレフィックスなし。厳密にデコードします |
| `mimeType` | string | いいえ | デフォルトは`image/png`。サブタイプがファイル拡張子になります |
| `model` | string | いいえ | デフォルトは`kavya-image` |
| `size`, `quality`, `background` | string | いいえ | 画像生成と同様 |

### レスポンス

画像生成と同じ形状です。`{"data":[{"b64_json":"..."}]}`。

### エラー

| ステータス | ボディ |
|---|---|
| `400` | `{"error":{"message":"Invalid request: prompt and image required"}}` |
| `400` | `{"error":{"message":"Invalid image data: base64 decode failed"}}` |
| `500` | `{"error":{"message":"No image was generated"}}` |
| `500` | `{"error":{"message":"Image editing failed. Please try again."}}` |

### 例

```js
const url = drupalSettings.dxprBuilder.aiAgent.imageEditEndpointUrl;
const res = await fetch(url, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    prompt: "Remove the background",
    image: base64String,
    mimeType: "image/jpeg"
  })
});
const { data } = await res.json();

```

## 生成画像の保存

ルートが返すのは画像バイトのみです。ビルダーは`b64_json`を`webp`ファイルに変換し、`POST /dxpr_builder/ajax/file_upload`(`drupalSettings.dxprBuilder.fileUploadUrl`、フォームフィールド`upload[]`)にアップロードします。応答はファイルの`url`と`fid`です。プロンプトはファイル名(先頭80文字)と代替テキストになります。

## 次のステップ

- [モデルとプロバイダー](/hc/documentation/learn-dxpr-builder/ai/models-and-providers)
- [AI設定](/hc/documentation/learn-dxpr-builder/ai/configuration)
- [AIのトラブルシューティング](/hc/documentation/learn-dxpr-builder/ai/troubleshooting)