GenAI 伺服器
當瀏覽器、使用者介面、服務或遠端使用者端需要透過 HTTP 呼叫一個或多個 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 | 取消一個模型或所有模型的活動串流。 |
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 是一個陣列時,伺服器會將其字串元素與換行字元連接,然後執行一個完成請求。
對於 VLM 請求,OpenAI 對話 image_url 內容部分必須包含一個 base64 資料 URI,例如 data:image/jpeg;base64,...。影像解碼需要一個具有 OpenCV 支援的 Neat 版本。