フロントエンドは本 API を組み込むだけで、いま使っているツールに生成 AI の品質と統制を取り込めます。認証は Bearer トークン、レスポンスはすべて JSON。全応答に traceId が付与され、追跡・監査が容易です。
1. 認証
すべての業務エンドポイントは Bearer トークンが必要です。トークンは以下の 2 種類が使えます。
| 種類 | 取得方法 | 用途 |
|---|---|---|
| JWT | POST /auth/login | 対話ログイン・短期利用 |
PAT(Personal Access Token, flp_...) | POST /auth/personal-access-tokens | サーバ間連携・CI・長期利用 |
Authorization: Bearer <JWT または flp_...>
Content-Type: application/json
organizationId(テナント)はトークンから解決されるため、リクエストボディに含める必要はありません。
1.1 ログイン
POST/auth/login — レート制限 5 req/分。
{ "email": "you@example.com", "password": "********", "totpCode": "123456" }
totpCodeは 2 要素認証が有効なユーザーのみ必須。- 2FA 有効で
totpCode未指定の場合は{ "requiresTwoFactor": true }を返す。
{
"access_token": "eyJhbGciOi...",
"user": { "id": "...", "email": "...", "organizationId": "...", "role": "admin" }
}
1.2 Personal Access Token の発行
POST/auth/personal-access-tokens(要 JWT)。
{ "name": "ci-bot", "scopes": ["llm:call"], "expiresAt": "2027-01-01T00:00:00Z" }
レスポンス 201(raw token は発行時のみ返却)
{ "id": "...", "name": "ci-bot", "scopes": ["llm:call"], "expiresAt": "2027-01-01T00:00:00Z", "token": "flp_xxxxxxxx" }
- 一覧:
GET /auth/personal-access-tokens(raw token は含まない) - 失効:
DELETE /auth/personal-access-tokens/:id
2. LLM 統一ゲートウェイ
2.1 POST /llm/call — 統一呼び出し
ガードレール・ルーティング・コスト計測を通して LLM を呼び出す中核エンドポイント。model からプロバイダを自動推論するため、1 本で OpenAI も Claude も Gemini も呼べます。
レート制限: 60 req/分/テナント。
リクエスト{
"messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "user", "content": "Flauro のアーキテクチャを要約して" }
],
"model": "gpt-5.6-sol",
"provider": "openai",
"temperature": 0.2,
"max_tokens": 1024,
"reasoning_effort": "high",
"response_format": { "type": "json_object" },
"thinking_mode": "adaptive",
"thinking_effort": "medium",
"purpose": "external"
}
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
messages | {role, content}[] | ✔ | role は system/user/assistant。content は文字列またはマルチモーダルブロック配列([{type:"text",text},{type:"image_url",image_url:{url}}])。 |
model | string | 例 gpt-5.6-sol。省略時は組織デフォルト。 | |
provider | enum | openai/anthropic/google/bedrock。未指定なら model から自動推論。 | |
temperature | number | 生成のランダム性。 | |
max_tokens / max_completion_tokens | number | 最大出力トークン。 | |
reasoning_effort | string | 推論モデル(o系/gpt-5系)向け。low/medium/high。 | |
response_format | object | { "type": "json_object" } で JSON 強制。 | |
thinking_mode | enum | none/adaptive/legacy(拡張思考)。 | |
thinking_effort | enum | low/medium/high。 | |
purpose | string | 監査・ルーティングのヒント。 | |
bypassBackend | string | サーキット OPEN 時のバイパス指定。 |
{
"content": "...",
"model": "gpt-5.6-sol",
"costUsd": 0.00046,
"routedTo": "openai",
"traceId": "trace_1731490000000",
"decisionId": "...",
"usage": { "promptTokens": 120, "completionTokens": 340 }
}
エラー
| ステータス | 意味 | ボディ例 |
|---|---|---|
422 | ガードレールでブロック(PII 等) | { "blocked": true, "type": "pii", "reason": "...", "messageForUser": "...", "traceId": "..." } |
503 | サーキット OPEN(内部 LLM が連続失敗中) | { "error": "gateway_unavailable", "circuitState": "OPEN", "traceId": "..." } |
500 | 内部エラー | { "error": "internal_error", "message": "...", "traceId": "..." } |
2.2 プロバイダ互換プロキシ
既存 SDK / ツールをそのまま接続できる互換エンドポイント。いずれもゲートウェイのガードレール・コスト計測を通ります。
| エンドポイント | 互換対象 |
|---|---|
POST /llm/openai/chatPOST /llm/openai/chat/completions | OpenAI POST /v1/chat/completions(Cline / Continue.dev 連携用エイリアス含む) |
POST /llm/claude/chat | Anthropic POST /v1/messages(thinking / output_config 透過) |
POST /llm/gemini/chat | Google Gemini generateContent |
POST /llm/bedrock/chat | AWS Bedrock Converse API(ECS 上は IAM ロールで認証、API キー不要) |
Base URL = https://api.flauro-dev.com/api/v1/llm/openai
API Key = flauro の JWT または PAT
2.3 GET /llm/models — 利用可能モデル一覧
組織の設定済み API キーでフィルタしたモデルカタログを返す。
[
{ "id": "gpt-5.6-sol", "provider": "openai", "label": "GPT-5.6 Sol", "contextWindow": 256000, "capabilities": ["reasoning", "json", "vision"] }
]
主なモデル ID: gpt-5.6-sol / gpt-5.6-terra / gpt-5.6-luna / gpt-5.5 / gpt-5.5-pro / gpt-4o / gpt-4o-mini / o3 / o4-mini / claude-sonnet-5 / gemini-2.0-flash / Bedrock モデル ID ほか。
2.4 GET /llm/health — サーキットブレーカ状態
{
"status": "ok",
"circuitState": "CLOSED",
"failureCount": 0,
"failureThreshold": 5,
"localLlm": { "enabled": true, "baseUrl": "...", "model": "Qwen/Qwen2.5-7B-Instruct" },
"checkedAt": "2026-07-13T10:00:00.000Z"
}
status: ok(CLOSED)/ degraded(HALF_OPEN)/ unavailable(OPEN)。
3. オーケストレーション(RAG × パイプライン)
RAG 検索・生成・変換を組み合わせた多段パイプラインを 1 リクエストで実行します。
なぜ RAG × パイプラインを使うのか(メリット)
素の POST /llm/call は「単発の LLM 呼び出し」です。これに対し /orchestrate は次の課題を解決します。
| 課題 | 素の LLM 呼び出し | /orchestrate(RAG × パイプライン) |
|---|---|---|
| モデルが自社コード・社内文書を知らない | 一般知識のみで回答(ハルシネーション) | retrieve ステップが自社リポジトリ/文書を検索し、その根拠を生成に渡す |
| 複数ステップの処理をアプリ側で実装 | 検索→整形→生成を自前でオーケストレーション | retrieve→generate→transform を 1 リクエストで連結 |
| ステップごとに認証・コスト管理・PII 対策が必要 | 各呼び出しで個別対応 | 全ステップがゲートウェイ(ガードレール/コスト計測/ルーティング/サーキットブレーカ)を通過 |
| コスト最適化 | 手動でモデル選択 | options.preferLocal でローカル/クラウドを切替、maxCostUsd で上限制御 |
| 監査・再現性 | ログを自前収集 | 全実行に traceId と steps が付与され、内部で OrchestrationTrace に記録 |
利用の判断基準: 自社の知識(コード/仕様/インシデント履歴)に基づいた回答が必要なら RAG を、複数段の処理を一本化したいならパイプラインを使います。単純な生成だけなら /llm/call で十分です。
3.1 POST /orchestrate — 同期 / 非同期実行
レート制限: 30 req/分。
リクエスト(登録済みパイプライン利用){
"pipeline": "software_dev/pr_review",
"inputs": { "diff": "..." },
"mode": "sync",
"options": { "model": "gpt-5.6-sol", "preferLocal": false, "maxCostUsd": 0.5 }
}
リクエスト(inline ステップ定義)
{
"steps": [
{ "id": "ctx", "type": "retrieve", "source": "repo", "query": "{input.question}", "limit": 5 },
{ "id": "gen", "type": "generate", "prompt": "コンテキスト:\n{steps.ctx.output}\n\n質問: {input.question}" }
],
"inputs": { "question": "認証まわりの実装方針は?" },
"mode": "sync"
}
pipelineとstepsはどちらか一方が必須。- ステップ種別:
retrieve(RAG 検索)/generate(LLM 生成)/transform(整形)。 - 変数展開:
{input.*}{previousOutput}{context.<id>}{steps.<id>.output}。 options.preferLocal:true=ローカル LLM 優先 /false=クラウド強制 / 省略=自動判断。
| フィールド | 型 | 説明 |
|---|---|---|
model | string | 生成ステップで使うモデル |
responseFormat | object | { "type": "json_object" } 等 |
maxSteps | number | 実行ステップ上限 |
maxCostUsd | number | コスト上限(超過で中断) |
preferLocal | boolean | ローカル/クラウドの優先 |
{
"traceId": "...",
"content": "{ \"summary\": \"...\", \"sources_used\": true }",
"steps": [
{ "stepId": "ctx", "type": "retrieve", "status": "success", "resultCount": 5 },
{ "stepId": "gen", "type": "generate", "status": "success", "costUsd": 0.00046 }
]
}
レスポンス(mode: async)200
{ "ok": true, "runId": "...", "traceId": "..." }
3.2 POST /orchestrate/stream — SSE ストリーム実行
Content-Type: text/event-stream で段階的にイベントを返す。
event: step
data: {"stepId":"ctx","type":"retrieve","status":"success","resultCount":5}
event: token
data: {"delta":"..."}
event: error
data: {"message":"...","traceId":"..."}
3.3 実行状況・パイプライン管理
| エンドポイント | 説明 |
|---|---|
GET /orchestrate/runs/:id | 非同期実行の状況取得 |
GET /orchestrate/pipelines | 利用可能パイプライン一覧 |
GET /orchestrate/pipelines/:templateSlug/:pipelineId | パイプライン定義取得 |
PUT /orchestrate/pipelines/:templateSlug/:pipelineId | パイプライン定義更新({ "steps": [...] }) |
3.4 RAG のセットアップ(retrieve を機能させる)
retrieve ステップは、対象データがあらかじめ索引化されていて初めて結果を返します。索引が無い場合でもエラーにはならず、resultCount: 0 で生成ステップは続行します(=根拠なしの回答になる)。実運用では以下を設定してください。
ステップ 1: 検索ソースを選ぶ
retrieve の source で参照先を指定します。
source | 参照先 | 索引の投入方法 |
|---|---|---|
repo | 自社リポジトリのコード(pgvector 上のベクトル索引) | GitHub 連携による push 時の自動索引、または初回フル索引 |
documents | アップロード済み文書・ナレッジ | 管理コンソールから文書をアップロード |
both | 上記 2 つを並列検索してマージ | 両方 |
ステップ 2: コード索引(repo)を用意する
- 組織に GitHub 連携を設定する(Webhook を接続)。
- 初回は対象リポジトリのフル索引を作成する(管理者向け Indexer 実行)。
- 以降は既定ブランチへの
pushを契機に、変更ファイルのみ自動で増分索引される。
organizationId は Bearer トークンから解決され、RAG 検索に自動伝播します。他組織のコードが混ざることはありません。リクエストボディに organizationId を含める必要はありません。ステップ 3: 動作確認
生成結果の根拠が効いているかは、レスポンスの steps[].resultCount(0 より大きいか)と、生成側が返す sources_used などのフラグで判断できます。
{
"steps": [
{ "id": "ctx", "type": "retrieve", "source": "repo", "query": "{input.question}", "filePath": "apps/api/src/modules/auth", "limit": 5 },
{ "id": "gen", "type": "generate", "prompt": "次のコードを根拠に回答。根拠が無ければその旨を明記。\n\n{steps.ctx.output}\n\n質問: {input.question}" }
],
"inputs": { "question": "認証はどこで検証している?" },
"mode": "sync"
}
filePath(repoソース時、任意)で検索範囲を絞り込めます。- 索引が空のうちは
resultCount: 0になります。その場合はまず索引投入を完了させてください。
3.5 パイプラインの設計と登録
パイプラインの与え方は 2 通りあります。
A. インライン定義(steps)— 登録不要ですぐ試せる
リクエストの steps に直接ステップ配列を渡します。プロトタイピングや 1 回限りの実行に最適です(RAG を使わず generate だけなら索引も不要)。
{
"steps": [
{ "id": "gen", "type": "generate", "prompt": "{input.text} を 3 行で要約" }
],
"inputs": { "text": "..." },
"mode": "sync"
}
B. 登録済みパイプライン(pipeline)— 再利用・チーム共有向け
定義を保存し、"pipeline": "<templateSlug>/<pipelineId>" で呼び出します。プロンプトやステップ構成を利用側コードから分離でき、更新が全呼び出しに即反映されます。
| 操作 | エンドポイント |
|---|---|
利用可能なパイプライン一覧(pipeline に渡す ID を確認) | GET /orchestrate/pipelines |
定義(steps)を取得 | GET /orchestrate/pipelines/:templateSlug/:pipelineId |
| 定義を更新 | PUT /orchestrate/pipelines/:templateSlug/:pipelineId({ "steps": [...] }) |
retrieve/generate/transform ステップを構造エディタで編集し、同期テスト実行できます。代表的な設計パターン
| 目的 | ステップ構成 |
|---|---|
| 社内コード Q&A | retrieve(repo) → generate |
| PR レビュー(構造化出力) | retrieve(repo) → generate(options.responseFormat = { "type": "json_object" }) |
| 文書横断要約 | retrieve(both) → generate → transform |
| RAG 不要の整形タスク | generate のみ(索引セットアップ不要) |
設計のヒント
- 変数展開(
{input.*}{previousOutput}{context.<id>}{steps.<id>.output})で前段の結果を後段プロンプトへ渡します。 - JSON 出力が欲しい生成ステップでは
options.responseFormatを指定します(指定しない限り自由文で返り、json未指定の JSON 強制による 400 を避けられます)。 options.maxCostUsdとoptions.maxStepsで暴走を防ぎ、options.preferLocalでコスト/機密性に応じてローカル LLM を優先できます。
4. エラー・レート制限・コスト
- エラー形式:
4xx/5xxは JSON{ error, message, traceId }を返す。ガードレールブロックは422 { blocked: true, ... }、サーキット OPEN は503。 traceId: 全応答に付与。問い合わせ時に添付すると追跡が容易。- レート制限:
/auth/login5/分、/llm/*60/分、/orchestrate30/分(いずれもテナント単位)。超過時は429。 - コスト: 各応答の
costUsdで実コストを確認可能(GET /llm/modelsの料金表に基づく)。
5. クイックスタート(cURL)
# 1) ログインしてトークンを取得
TOKEN=$(curl -s https://api.flauro-dev.com/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","password":"********"}' | jq -r .access_token)
# 2) LLM を呼び出す
curl -s https://api.flauro-dev.com/api/v1/llm/call \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"こんにちは"}]}'
# 3) RAG つきオーケストレーション実行
curl -s https://api.flauro-dev.com/api/v1/orchestrate \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"pipeline":"software_dev/pr_review","inputs":{"diff":"..."},"mode":"sync","options":{"model":"gpt-5.6-sol","preferLocal":false}}'