AI APIリファレンス.
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 > Allowed
domainsのドメインをAIモジュールのホスト名フィルターにリクエスト中のみマージします(*でフィルターは完全信頼になります)。
レスポンス
ストリーミング(streamがtrue、デフォルト):200、Content-Type: text/event-stream。各イベントはdata: {json}の後に空行が続き、ストリームはdata: [DONE]で終わります。
data: {"choices":[{"delta":{"content":"Hello"}}],"id":"...","model":"kavya-m1","usage":{...}}
data: [DONE]
id、object、created、model、
original_model、usageはプロバイダーの生チャンクにあればコピーされます。
非ストリーミング(streamがfalse):200、application/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ログチャンネル) |
例
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出力を要求します。
{"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."}} |
例
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."}} |
例
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文字)と代替テキストになります。