AI APIリファレンス.

Learn DXPR BuilderExtendArchitectuur en API’s

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

「Add a paragraph with 3 feature boxes」というプロンプト、「Enhance prompt」と「Chat mode」リンク、「Generate content」ボタン、「Choose a template」と「Add Elements」ボタンがあるGenerate contentパネル

アクセス要件(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文字)と代替テキストになります。

次のステップ