OpenAI 互換 API
OpenAI 互換エンドポイント(/v1/*)。既存の OpenAI SDK / ツールから、base URL と API キーを差し替えて使う。Anthropic 互換の /v1/messages にも対応する。
エンドポイント一覧
OpenAI / Anthropic 互換
| エンドポイント | 説明 |
|---|---|
POST /v1/chat/completions | チャット補完(OpenAI 互換・ストリーミング対応) |
POST /v1/embeddings | 埋め込みベクトルの生成(OpenAI 互換) |
POST /v1/audio/transcriptions | 音声の文字起こし(OpenAI 互換、文字起こし) |
POST /v1/images/generations | 画像の生成(画像生成) |
POST /v1/images/edits | 画像の編集(multipart) |
POST /v1/videos | 動画の作成を開始(非同期ジョブ、動画生成) |
GET /v1/videos/{id} | 動画ジョブの状態 |
GET /v1/videos/{id}/content | 完成した動画(mp4) |
POST /v1/messages | メッセージ API(Anthropic 互換) |
POST /v1/messages/count_tokens | 入力トークン数の計測(Anthropic 互換) |
POST /v1/responses | Responses API(OpenAI 互換・Codex 等向け) |
GET /v1/models | 利用可能なモデル一覧(OpenAI 互換) |
GET /v1/tools | この API キーに提示されるツール一覧 |
GET/POST/DELETE /v1/assistants・/v1/assistants/{id} | アシスタント管理(OpenAI Assistants 形式。DigitalBase の Bot にマップ) |
GET /v1/vector_stores・/v1/vector_stores/{id}・/v1/vector_stores/{id}/files | ナレッジ参照(OpenAI Vector Stores 形式。RAG にマップ、読み取りのみ) |
GET /v1/health | 認証不要のヘルスチェック(ライセンス) |
DigitalBase 独自(管理系)
| エンドポイント | 説明 |
|---|---|
POST/GET/PATCH/DELETE /v1/api-keys | APIアクセスキー(sk-)の発行・管理 |
/v1/bi-keys・/v1/data/* | BI キー(bk-)とデータ参照(APIアクセスキー・ダッシュボード) |
組み込み API リファレンス
| URL | 内容 | 認証 |
|---|---|---|
GET /v1/docs | ReDoc 形式の API リファレンス | 不要 |
GET /v1/openapi.json | /v1/* と /mcp の OpenAPI 定義 | 不要 |
- オフラインでも表示できる。
[API キー]画面の[API リファレンス]からも開ける。 GATEWAY_DOCS_ENABLED=falseで両 URL を非公開にする(404)。GET /v1/toolsは、キーに提示するツールを OpenAI function 形式で返す。基準は MCP のtools/listと同じ。アシスタントを紐づけていないキーは空。xdb.levelは必要権限。xdb.write_levelは書込文で上がる権限(query_dataset/query_sql)。
利用例
curl でチャット補完を呼ぶ。
curl http://<HOST>:8000/v1/chat/completions \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "<model>",
"messages": [{"role": "user", "content": "こんにちは"}],
"stream": true
}'
OpenAI Python SDK は base_url を差し替えて使う。
from openai import OpenAI
client = OpenAI(base_url="http://<HOST>:8000/v1", api_key="<API_KEY>")
res = client.chat.completions.create(
model="<model>",
messages=[{"role": "user", "content": "こんにちは"}],
)
リクエストパラメータとモデル別の挙動
/v1/chat/completions のパラメータの扱いは接続先モデルで異なる。stream(SSE)は全モデルで対応する。n は 1 のみで、2 以上は 400。
| パラメータ | ローカル (vLLM / SGLang / Ollama) | OpenAI / Grok | Anthropic | Gemini |
|---|---|---|---|---|
temperature / top_p / top_k | 適用 | 適用(top_k と、OpenAI の reasoning モデルでのサンプリング指定は送らない) | 思考オフ時のみ適用 | 適用 |
max_tokens | コンテキストに収まるよう自動調整 | 適用 | モデル上限内に丸め | 送らない(モデル既定) |
reasoning_effort | 下表参照 | 下表参照(Grok は無視) | 下表参照 | 下表参照 |
その他の標準パラメータ(stop / seed / response_format など) | 転送 | 転送 | 無視(xdb.warnings で通知) | 無視(xdb.warnings で通知) |
tools/tool_choiceは、API キーのtool_passthrough(ツール呼び出しの透過)が ON の時だけモデルへ渡し、tool_callsを返す。ローカルは tool 対応モデルのみ。- OFF のキーでは
tools/tool_choiceを無視し、紐づけたアシスタントのツールをサーバー側で実行する。 - サーバー側でツールを実行する応答では、
stop/response_formatなどは使えない。無視してxdb.warningsで通知する。
reasoning_effort(思考の深さ)
値は "none" / "low" / "medium" / "high" / "max"。未指定はモデル既定。
| モデル | 挙動 |
|---|---|
| ローカル vLLM | オン/オフ(none=オフ) |
| ローカル Ollama / Gemini | none〜high を適用(max は high) |
| OpenAI(reasoning モデル) | そのまま適用。tools 併用時は送信しない |
| Anthropic(Opus / Sonnet 4.6 以降) | adaptive thinking + effort。none は思考オフ |
| Anthropic(旧世代) | オン/オフ(low 以上=オン) |
| Grok | 未対応 |
metadata.xdb.thinking(bool 可: true=high / false=none)でも指定できる。両方ある場合は metadata が優先。- 思考非対応モデルに指定してもエラーにならない。
アシスタント(Bot)を指定する
model にアシスタントの名前(または asst_ で始まる ID)を渡すと、そのアシスタントの設定(ナレッジ・プロンプト・ツール)で応答する。
GET /v1/modelsはチャット用モデルとアシスタント名を列挙する。埋め込みモデルは含まない。- 一覧に無いモデル名と
model省略時は、既定のチャットモデルで応答する。応答のmodelは実際に使ったモデル ID。 - 存在しない / 参照できないアシスタント ID は
404(code: model_not_found)。
エラー応答
OpenAI と同じ形の JSON を返す(/v1/messages* は Anthropic 形式 {"type":"error","error":{"type","message"}})。
{"error": {"message": "The model 'asst_xxxx' does not exist or you do not have access to it", "type": "invalid_request_error", "param": "model", "code": "model_not_found"}}
| ステータス | 主な原因 | 補足 |
|---|---|---|
401 | API キーが無効・失効済み・削除済み、またはセッションが失効 | WWW-Authenticate: Bearer ヘッダ付き |
403 | ライセンス切れ、IP 制限、API キーでの API キー発行 | |
404 | 存在しない、またはキーの権限外のリソース(権限外も存在を伏せて 404) | アシスタントは code: model_not_found |
400 unsupported_parameter | n > 1、アシスタント以外への metadata.xdb.tools_scope など | |
413 | 入力の上限超過(AIエージェント) | |
429 | レート制限(rpm)・月次上限 | Retry-After ヘッダに再試行までの秒数 |
/v1/* は API キー(sk-)で呼び出す。画面ログインのセッション(JWT)でも呼べるのは、アシスタント管理(/v1/assistants)と API キー管理(/v1/api-keys)だけ。API キーの発行はログインのセッションからのみ(sk- では 403)。
RAG の出典
RAG を使う応答は、参照した社内文書(出典)を拡張フィールド xdb.sources に含む。
ツール実行の経過
ツールを使った応答は、実行したツールを実行順に拡張フィールド xdb.tool_steps に含む(ストリームでは最終チャンク)。
| フィールド | 内容 |
|---|---|
id | 実行ごとの ID |
name | ツール名(例: read_file、query_dataset) |
summary | 実行内容の 1 行要約 |
status | done(成功)/ error(失敗) |
ms | 所要時間(ミリ秒) |
result | 結果の先頭(最大 160 文字) |
/v1/messages と /v1/responses では、metadata.xdb.extra_events: true を指定した時だけ、経過を独自イベント(xdb_tool_step / xdb.tool_step)で逐次送出する。
画像生成
POST /v1/images/generations / POST /v1/images/edits で画像を生成・編集する。OpenAI の画像 API と同じ形で、管理者が設定した画像エンジン(AIエージェントの画像生成)が処理する。
from openai import OpenAI
import base64
client = OpenAI(base_url="https://<host>/v1", api_key="sk-...")
r = client.images.generate(model="gpt-image-1", prompt="夕焼けの工場の水彩画", size="1024x1024")
open("out.png", "wb").write(base64.b64decode(r.data[0].b64_json))
modelは受け付けるが、処理は設定済みのエンジン(IMAGE_GEN_MODEL)が行う。- 応答は base64(
response_formatはb64_jsonのみ)。 n: 1〜4。size:幅x高さかauto。output_format:png/jpeg/webp。- 編集の入力は multipart の
image(複数はimage[])。PNG / JPEG / WEBP、1 枚 25 MB まで。maskは非対応。 - エラー: エンジン未設定
503(image_generation_not_configured)、エンジン側エラー502、時間切れ504。 - 利用量はチャネル
imageで記録する(レート制限・月次上限の対象)。
動画生成
/v1/videos で動画を生成する。OpenAI の動画 API と同じ非同期ジョブ形式で、管理者が設定した動画エンジン(AIエージェントの動画生成)が処理する。
from openai import OpenAI
import time
client = OpenAI(base_url="https://<host>/v1", api_key="sk-...")
video = client.videos.create(model="grok-imagine-video-1.5", prompt="夕焼けの工場をドローンで横切る映像", seconds="8", size="1280x720")
while video.status in ("queued", "in_progress"):
time.sleep(5)
video = client.videos.retrieve(video.id)
if video.status == "completed":
client.videos.download_content(video.id).write_to_file("out.mp4")
作成すると status: "queued" のジョブを返す。完成後に /content で mp4 を取得する。
modelは受け付けるが、処理は設定済みのエンジン(VIDEO_GEN_MODEL)が行う。seconds: 1〜15。size(例1280x720)、またはaspect_ratio/resolution(480p/720p/1080p、既定VIDEO_GEN_RESOLUTION)。input_reference: 最初のコマの画像。reference_images: 参照画像(最大 4 枚)。PNG / JPEG / WEBP、25 MB まで。- 状態:
queued/in_progress/completed/failed/cancelled。VIDEO_GEN_TIMEOUT_SECを過ぎたものはfailed。 - 状態確認・取得はジョブを作った API キーのみ。未完成ジョブの
/contentは409(video_not_ready)。 - 完成した動画はキーの持ち主の 個人フォルダ/generated-videos/ にも保存する。
- エラー: エンジン未設定
503(video_generation_not_configured)、入力の誤り400、エンジン側エラー502。 - 利用量はチャネル
videoで記録する(レート制限・月次上限の対象)。
文字起こし
POST /v1/audio/transcriptions で文字起こしする。OpenAI の Audio Transcriptions と同じ multipart 形式で、この環境の Whisper が処理する(音声を外部に送らない)。
from openai import OpenAI
client = OpenAI(base_url="https://<host>/v1", api_key="sk-...")
with open("meeting.m4a", "rb") as f:
r = client.audio.transcriptions.create(model="whisper-1", file=f, language="ja")
print(r.text)
modelは受け付けるが、処理は導入済みの Whisper モデルが行う。- 入力: wav / mp3 / m4a / webm / ogg / flac / aac(動画ファイルの音声トラックも可)。1 ファイル
FILE_UPLOAD_MAX_MBまで(既定は空 = 上限なし)。 language(ja/enなど。省略時はWHISPER_LANGUAGE、未設定なら自動判定)、prompt(社名・専門用語などの語彙)。response_format:json(既定)/text/verbose_json(区間付き)。- エラー: Whisper モデル未導入
503(model_not_installed)、非対応の形式400、上限超過413。
Anthropic 互換(/v1/messages)
Anthropic Messages API 形式。Claude 向け SDK / ツールから、base URL と API キー(sk-)を差し替えて使う。
system/messages・tools/tool_choice・ストリーミング(SSE)に対応する。応答は Anthropic 形式。- 認証は
x-api-key: sk-...またはAuthorization: Bearer sk-...。 toolsはtool_passthroughが ON のキーだけモデルへ渡す(Claude Code 接続)。thinkingとoutput_config.effortはreasoning_effortと同じ思考制御に変換する。