localaiforum
Đăng nhập
Hướng dẫn › Chạy & phục vụ

Phục vụ một endpoint tương thích OpenAI

Chạy một engine một lần và nói chuyện trong cửa sổ chat, bạn có một món đồ chơi. Phục vụ nó qua HTTP theo hình dáng ai cũng đã nói, bạn có hạ tầng: trình soạn thảo, UI, agent và script của chính bạn đều lái được cùng mô hình cục bộ. Trang này dựng một endpoint cục bộ lên, rồi bao streaming, SDK, bảo mật, và nạp giữ ấm.

Vì sao hình dáng OpenAI thắng

Định dạng request chat-completions — một tên mô hình, một danh sách tin nhắn {role, content}, vài núm — trở thành chuẩn de facto vì mọi tác giả công cụ viết client cho nó trước. Bạn nghĩ gì về công ty thì nghĩ, hình dáng là trung tính: nó chỉ là JSON trên POST. Hệ quả thực tế: bất kỳ server cục bộ nào bắt chước nó tương thích tức thì với một đống phần mềm sẵn có. Lựa chọn engine và lựa chọn client của bạn thành hai quyết định độc lập (xem engine).

llama-server trong một phút

llama-server -m model.gguf -c 8192 --port 8080
# UI tại http://127.0.0.1:8080 — API tại /v1/chat/completions

Một request có chú thích:

curl http://127.0.0.1:8080/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"model","messages":[{"role":"user","content":"Why run local? One sentence."}],"temperature":0.7,"max_tokens":60}'
  • model — llama-server phục vụ bất cứ gì bạn khởi động; trường này thường bị bỏ qua, nhưng gửi một tên tử tế.
  • messages — toàn bộ hội thoại, system prompt trước; server không trạng thái, bạn giữ lịch sử.
  • max_tokens — chặn câu trả lời; bảo vệ bạn khỏi các bản sinh thoát dây cương.

Phản hồi (đã cắt) mang câu trả lời cộng phần kê khai token bạn sẽ muốn cho việc gỡ lỗi miễn phí:

{
  "choices": [
    { "message": { "role": "assistant", "content": "No accounts, no rate limits, and your data never leaves the machine." } }
  ],
  "usage": { "prompt_tokens": 14, "completion_tokens": 15 }
}

usage là cách bạn biết prompt thực sự tốn bao nhiêu ngữ cảnh — kiểm tra nó trước khi than trách mô hình "đãng trí" (xem token).

Streaming

Thêm "stream": true và server chuyển sang sự kiện do server gửi: các mảnh data: phân tách bằng xuống dòng, mỗi mảnh mang một delta nhỏ, kết thúc bằng lệnh đánh dấu.

data: {"choices":[{"delta":{"content":"No "}}]}
data: {"choices":[{"delta":{"content":"accounts"}}]}
data: [DONE]

Phía client: tích lũy delta.content đến khi gặp dòng [DONE]. Streaming không làm việc sinh nhanh hơn — nó làm việc chờ chịu đựng được, mà với UX chat là một (xem tốc độ).

Ollama: một dịch vụ, hai API

API bản địa của Ollama giàu hơn chút — tùy chọn theo-từng-request và điều khiển vòng đời mô hình:

curl http://127.0.0.1:11434/api/chat -d '{"model":"qwen3:8b","messages":[{"role":"user","content":"hi"}],"stream":false,"keep_alive":-1}'

Nó cũng phục vụ lối tương thích OpenAI tại /v1/chat/completions, nên client hình-OpenAI chạy với Ollama không cần sửa. Dùng API bản địa khi muốn keep_alive hoặc tùy chọn engine theo-từng-request; dùng /v1 cho mọi thứ khác.

vLLM cho server GPU

vllm serve Qwen/Qwen3-8B --max-model-len 16384 --port 8000

vLLM kéo trọng số safetensors, nạp một lần, và phục vụ cùng hình dáng OpenAI với batching liên tục bên dưới — công cụ đúng một khi người dùng đồng thời xuất hiện (xem đồng thời). Nó muốn VRAM NVIDIA và một GPU thật; đừng bận tâm cho desktop một người dùng.

Trỏ SDK chính thức vào localhost

Các thư viện OpenAI chính thức chỉ là client HTTP; đổi base URL và trường khóa API thành đồ trang trí:

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="local")
r = client.chat.completions.create(
    model="qwen3-8b",
    messages=[{"role": "user", "content": "Why run local?"}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "ollama" });
const r = await client.chat.completions.create({
  model: "qwen3:8b",
  messages: [{ role: "user", content: "Why run local?" }],
});

Bất kỳ chuỗi nào cũng được cho khóa trừ khi server có cấu hình khóa. Phép hoán đổi base-URL này là toàn bộ mẹo phía sau mọi công cụ "chạy được với mô hình cục bộ".

Điều này mở khóa gì

  • Trình soạn thảo và UI chat — xem UI & tích hợp.
  • Ứng dụng của chính bạn: mô hình cục bộ sau backend của bạn, chi phí mỗi token bằng không.
  • Pipeline script với schema đảm bảo — xem đầu ra có cấu trúc.
  • Vòng lặp agent gọi công cụ và lặp lại — xem agent.
  • Góc trò chơi của diễn đàn này: các agent cờ vua và cờ janggi chơi bằng cách đánh vào một endpoint chat-completions cục bộ y như curl phía trên.

Khóa cửa lại

Một server mô hình là LLM miễn phí cho bất kỳ ai với tới cổng. Mặc định an toàn — llama-server và Ollama buộc 127.0.0.1 — nên giữ vậy trên laptop. Để phơi trên LAN: đặt khóa API (--api-key trên llama-server và vLLM, và xác thực trong bất kỳ UI phía trước), và ưu tiên reverse proxy cho TLS. Không bao giờ buộc 0.0.0.0 không xác thực: bất kỳ ai trên mạng có thể đốt GPU của bạn, lấp đầy ngữ cảnh của bạn, và dò thiết lập của bạn.

Giữ nó ấm

Nạp nguội — trọng số từ đĩa vào VRAM — tốn vài giây đến vài chục giây TTFT. llama-server và vLLM nạp lúc khởi động và ở lại thường trực, nên chỉ request đầu trả giá. Ollama dỡ sau keep_alive (mặc định ~5 phút): gửi "keep_alive": -1 để giữ mô hình vô hạn, hoặc 0 để giải phóng VRAM ngay sau một đợt bùng nổ. Nếu thiết lập của bạn "lúc đầu chậm, sau đó ổn", đó là nạp nguội, không phải mô hình chậm — và dưới tải, một cơn bão nạp là chế độ hỏng thật (xem đồng thời).

Liên quan: Đồng thời · UI & tích hợp · Engine · Đầu ra có cấu trúc