GenAIサーバー
ブラウザ、UI、サービス、またはリモートクライアントがHTTP経由で1つまたは複数のGenAIモデルを呼び出す必要がある場合は、GenAIServerを使用します。サーバーは、モデルの登録、リクエストのルーティング、ストリーミング応答、およびキャンセルを管理します。モデルと同じプロセスで実行されるアプリケーションロジックには、GenAI API を直接利用を使用します。
サーバーの作成と起動
サーバーはデフォルトで0.0.0.0:9998にバインドされます。サーバーを起動する前に、デプロイされた各LLiMaモデルディレクトリを、安定したサービス名で登録します。
#include <neat/genai.h>
int main() {
simaai::neat::genai::GenAIServer server;
server.add_model(
"/media/nvme/llima/models/Qwen3-4B-Instruct-2507-GPTQ-a16w4",
"llm");
server.add_model(
"/media/nvme/llima/models/Qwen3-VL-4B-Instruct-GPTQ-a16w4",
"vlm");
server.serve();
}
C++では、ブロッキング型のフォアグラウンドサーバーとしてserve()を使用します。C++またはPythonアプリケーションでサーバーのライフサイクルを管理する場合は、start()とstop()を使用します。デフォルトのホストまたはポートが適切でない場合は、GenAIServerOptionsを設定します。リッスンを開始する前に、サーバーは登録済みの各モデルに対して出力を伴わないウォームアップ推論を実行します。これにより、最初のクライアントリクエストが初期化コストを全額負担することはありません。ウォームアップでは、生成されたテキストやパフォーマンス統計は出力されません。stop()を呼び出すと、登録されているすべてのモデルが削除されます。同じサーバーオブジェクトを再起動する前に、モデルを再度追加してください。
GenAIServerは、認証やTLS終端機能を提供せず、任意のオリジンからのCORSリクエストを許可します。信頼できるインターフェースにのみバインドするか、必要なアクセス制御と暗号化を提供するネットワーク層の背後に配置してください。
提供されているモデルを特定する
生成リクエストを送信する前に、登録されているモデルの名前をリスト表示します。
curl http://<modalix-ip>:9998/v1/models
この応答では、OpenAIのモデル一覧の形式を使用しています。
{
"object": "list",
"data": [
{"id": "llm", "object": "model", "owned_by": "simaai"},
{"id": "vlm", "object": "model", "owned_by": "simaai"}
]
}
すべての生成およびオーディオ要求は、その
modelフィールドで、これらの利用可能な名前のいずれかを使用する必要があります。
エンドポイント
| メソッド | ルート | 目的 |
|---|---|---|
GET | /v1/models | 登録済みの利用可能なモデル名のリスト。 |
POST | /v1/chat/completions | テキスト、画像、ツール、ストリーミングを含む、OpenAI互換のチャット。 |
POST | /v1/completions | OpenAI互換のプロンプト補完。 |
POST | /v1/audio/transcriptions | 複数のパートからなるオーディオ入力を文字起こし。 |
POST | /v1/audio/translations | 複数のパートからなる音声を英語に翻訳。 |
POST | /api/chat | Ollama互換のチャット。デフォルトではNDJSONをストリーミング。 |
POST | /api/generate | Ollama互換のプロンプト生成。デフォルトではNDJSONをストリーミング。 |
POST | /stop | 1つのモデルまたはすべてのモデルの、アクティブなストリームをキャンセル。 |
POST | /set_lora | 動的なLoRAアダプターをアクティブにするか、置き換える。 |
POST | /unset_lora | 動的に適応されたモデルを、元のベースラインの重みに戻す。 |
互換性のあるエイリアス/audio/transcriptionsと/audio/translationsも受け入れられます。新しいクライアントでは、/v1/audio/...ルートを使用することを推奨します。
互換性とは、GenAIServerによって実装されたルートとレスポンスの形式を指します。これは、アップストリームのOpenAIまたはOllama APIのすべてのフィールドをサポートすることを意味するものではありません。サポートされているリクエストフィールドは以下に説明します。
OpenAI互換のリクエスト
チャットエンドポイントにmodelとmessagesを送信します。サーバー送信イベントの場合は、streamをtrueに設定します。デフォルトはfalseです。
curl http://<modalix-ip>:9998/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llm",
"messages": [
{"role": "user", "content": "Explain an API gateway in one sentence."}
],
"max_tokens": 64,
"stream": false
}'
/v1/chat/completions 受け入れます max_tokens または max_completion_tokens,
toolsおよび tool_choice それに加えて model, messagesおよび streamツール定義では、OpenAIの関数ツール形式を使用します。 tool_choice サポートします
"auto" そして "none"それを省略するか、次のように設定します。 null デフォルトのツール動作をそのまま維持します。
/v1/completions 受け入れます prompt 文字列、または文字列の配列に加えて
model, max_tokens または max_completion_tokensおよび stream、デフォルトでは false。~のとき prompt は配列であり、サーバーはその文字列要素を改行文字で結合し、1つの補完リクエストを実行します。
VLMリクエストの場合、OpenAIチャット image_url コンテンツの一部には、base64でエンコードされたデータURI(例:)が含まれている必要があります。 data:image/jpeg;base64,...画像デコードには、 Neat
OpenCVに対応した状態でビルドします。
Ollama互換のリクエスト
使用 /api/chat メッセージ履歴または /api/generate プロンプトに対して:
curl http://<modalix-ip>:9998/api/generate \
-H "Content-Type: application/json" \
-d '{
"model": "llm",
"prompt": "Give me three API design tips.",
"options": {"num_predict": 96},
"stream": false
}'
Ollama互換のエンドポイントは、デフォルトで改行で区切られたJSONをストリーム形式で送信します。1つの完全なJSONレスポンスが必要な場合は、stream を false に設定してください。/api/chat は、tools と tool_choice も受け入れます。VLMリクエストの場合、各/api/chatメッセージのimages配列、または最上位レベルのimages配列に、生のBase64画像文字列を配置してください。これは、/api/generateで使用されます。