共通ルール
- 規範的
- ドラフト 1.0
- 更新日
- Markdown で表示
9.1 バージョンと拡張
LMSP のリクエストは、次のヘッダーを携えてもよい。
LMSP-Version: 1.0
LMSP-Client: example-client/1.2.0
LMSP-Version は、クライアントが対象とするプロトコルのバージョンである。LMSP-Client は、診断用にクライアントソフトウェアを name/version の形式で識別する。サービスは、これに基づいてプロトコルの動作を変更してはならない。
規則:
- パス中の
v1はメジャーバージョンを表す。 - 未知のメジャーバージョンを指定するリクエストには、
426 Upgrade Requiredとエラーコードunsupported_protocol_versionで応答する。 - 新しい任意フィールドは、1.x の互換性を壊してはならない。
- サービスとクライアントは、知らないフィールドを無視しなければならない。
- 非公開の拡張は
extensionsオブジェクトに入れ、逆ドメイン表記で名前を付ける。
{
"extensions": {
"com.example.cache": {
"enabled": true
}
}
}
9.2 冪等性
レスポンスの作成、タスクの作成、モデルのロードのように、何かを作成するリクエストは、冪等キーを受け付ける。
Idempotency-Key: <client-generated-unique-value>
サービスは、キーを、リクエスト本文のダイジェストと結果と併せて保存する。
- 同じキーで同じ本文なら、元の結果を返す。
- 同じキーで異なる本文なら、
409 Conflictとidempotency_conflictで応答する。
キーのスコープは、クライアントとエンドポイントである。キーは、ULID や UUID のような、最大 255 文字の一意な値であるべきである。サービスは、キーを少なくとも 24 時間保持するべきである。
サービスは、ストリーミングリクエストではキーを無視してもよい。安全な再試行が必要なクライアントは、タスクを使う。
9.3 エラー
LMSP インターフェース上のすべてのエラーは application/problem+json(RFC 9457)を使う。
{
"type": "urn:lmsp:error:model-not-found",
"title": "Model not found",
"status": 404,
"code": "model_not_found",
"detail": "No local model with id 'qwen3:14b-q4_k_m'",
"request_id": "req_01J8M9S6Y4W8C3P5R1V7Z2A0DH",
"retryable": false
}
| フィールド | 必須 | 意味 |
|---|---|---|
type |
はい | エラーの種類を識別する URI。LMSP は urn:lmsp:error: に、アンダースコアをハイフンに置き換えたコードを続けたものを使う。 |
title |
はい | 人間が読める短い要約。 |
status |
はい | HTTP ステータスコード。 |
code |
はい | 下の一覧にある、機械可読なエラーコード。 |
detail |
いいえ | このエラーの発生についての、人間が読める説明。シークレット、プロンプト、生成内容を含んではならない。 |
request_id |
いいえ | リクエストの識別子。サービスのログとの突き合わせに使う。 |
retryable |
はい | 後でリクエストを繰り返せば成功し得るかどうか。 |
一般的なエラーコード:
| コード | HTTP ステータス | 再試行可 | 意味 |
|---|---|---|---|
invalid_request |
400 | いいえ | リクエストの形式が正しくないか、パラメーターが無効である。 |
unauthorized |
401 | いいえ | トークンがない、無効、期限切れ、または失効している。あるいはペアリングコードが誤っている。 |
forbidden |
403 | いいえ | トークンに必要なスコープがない、または Origin か Host の検査に失敗した。 |
model_not_found |
404 | いいえ | この ID のローカルモデルがない。 |
model_not_ready |
409 | はい | モデルがロードされておらず、オンデマンドでもロードされない。 |
model_load_failed |
500 | はい | モデルのロードに失敗した。 |
context_length_exceeded |
400 | いいえ | 入力がモデルのコンテキストウィンドウに収まらない。 |
unsupported_capability |
400 または 501 | いいえ | モデルまたはサービスが、リクエストに必要なものに対応していない。未実装の任意エンドポイントは 501 で応答する。 |
unsupported_protocol_version |
426 | いいえ | サービスが、要求されたメジャーバージョンに対応していない。 |
response_not_found |
404 | いいえ | この ID の保存済みレスポンスがない。 |
task_not_found |
404 | いいえ | この ID のタスクがない。 |
task_not_cancelable |
409 | いいえ | タスクはすでに成功または失敗している。 |
idempotency_conflict |
409 | いいえ | その冪等キーは、すでに別のリクエスト本文で使われている。 |
event_history_expired |
410 | いいえ | 要求されたイベントが保持期間より古い。 |
rate_limited |
429 | はい | リクエストが多すぎる。 |
resource_exhausted |
503 | はい | デバイスのメモリまたはその他のリソースが不足している。 |
backend_unavailable |
503 | はい | モデルランタイムに到達できない。 |
server_restarted |
503 | はい | タスクが未完了の間にサービスが再起動した。 |
internal_error |
500 | 場合による | サービス内部での予期しない障害。 |
retryable フィールドが正である。上の列は通常の値を示している。サービスは、さらにコードを定義してもよい。クライアントは、知らないコードを、その HTTP ステータスと retryable フィールドによって処理しなければならない。
9.4 ヘルスチェック
GET /lmsp/v1/health
{
"status": "ready",
"service_id": "svc_01J8M4Y8K6M5E6K6Z7Z0Y8W3M2",
"uptime_seconds": 86420,
"loaded_models": 1,
"active_tasks": 2,
"storage": "ok"
}
| フィールド | 意味 |
|---|---|
status |
starting、ready、degraded、stopping。 |
service_id |
サービス記述にあるサービス ID。 |
uptime_seconds |
サービスの起動からの秒数。 |
loaded_models |
ready 状態のモデルの数。 |
active_tasks |
queued、loading、running、cancelling のタスクの数。 |
storage |
ok または error。 |
status が ready または degraded のときは 200 OK、それ以外は 503 Service Unavailable を返す。
ヘルスエンドポイントが返すのは、運用上のステータスだけである。モデルのパス、プロンプト、アクセストークン、その他の機微な情報を返してはならない。