Hướng dẫn
API mô hình và văn bản
Quy chuẩn yêu cầu và phản hồi của truy vấn mô hình khả dụng, hội thoại văn bản (bao gồm dạng luồng)
API mô hình và văn bản
Danh mục mô hình và hội thoại văn bản đều dùng cùng một khóa API nền tảng. Quy ước chung (địa chỉ cơ sở, xác thực, giới hạn tần suất, thử lại) xem Xác thực và quy chuẩn cơ bản.
Truy vấn danh sách mô hình
/v1/modelsPhương thức xác thực
Authorization: Bearer <API_KEY>.
Tham số yêu cầu
Không có phần thân yêu cầu, chỉ cần mang khóa API trong header yêu cầu.
Ví dụ yêu cầu
Bước này không cần phần thân yêu cầu, chỉ cần mang khóa API trong header yêu cầu.
data[].id trả về chính là ID mô hình dùng cho tất cả các lần gọi sau.
Yêu cầu
curl "https://locopalai.com/v1/models" \
-H "Authorization: Bearer $LOCOPAL_API_KEY"Tham số phản hồi
| Tham số | Kiểu | Mô tả |
|---|---|---|
object | string | Cố định là list |
success | boolean | Là true khi truy vấn thành công |
data | array | Danh sách mô hình mà Key hiện tại có thể gọi |
data[].id | string | ID mô hình, điền nguyên văn khi gửi yêu cầu |
data[].object | string | Cố định là model |
data[].created | integer | Thời gian ghi nhận trong danh mục (giây Unix) |
data[].owned_by | string | Định danh nhà cung cấp mô hình, chỉ để tham khảo |
data[].supported_endpoint_types | string[] | Loại API khả dụng của mô hình đó |
objectvàsuccesslà trường cấp cao nhất, không nằm trongdata[].objectcố định làlist,successlàtruekhi thành công. Để phán đoán yêu cầu có thành công hay không hãy lấy mã trạng thái HTTP làm chuẩn,successchỉ mang tính hỗ trợ.
Phần thân phản hồi
{
"data": [
{
"id": "doubao-seedance-2.0",
"object": "model",
"created": 1626777600,
"owned_by": "doubaovideo",
"supported_endpoint_types": ["openai"]
},
{
"id": "claude-sonnet-4-5-20250929",
"object": "model",
"created": 1626777600,
"owned_by": "claude",
"supported_endpoint_types": ["anthropic", "openai"]
}
],
"object": "list",
"success": true
}Trả về "data": [] nghĩa là nhóm gọi của Key hiện tại không có mô hình khả dụng, vui lòng xác nhận cấu hình nhóm trước hoặc liên hệ hỗ trợ nền tảng, đừng đổi sang tên hiển thị trên trang để thử lại. Danh mục mô hình sẽ thay đổi theo ủy quyền và tính khả dụng của nền tảng, khuyến nghị làm mới một lần khi khởi động dịch vụ, khi người dùng chọn mô hình hoặc khi nhận "mô hình không khả dụng".
Phản hồi lỗi
| HTTP | Phản hồi | Mô tả |
|---|---|---|
401 | {"error":{"code":"","message":"Invalid token (request id: ...)","type":"new_api_error"}} | Khóa API thiếu, sai hoặc đã hết hiệu lực |
500 | {"error":{"message":"...","type":"new_api_error"}} | Truy vấn danh mục thất bại, giữ định danh yêu cầu rồi thử lại |
Hội thoại văn bản
/v1/chat/completionsPhương thức xác thực
Authorization: Bearer <API_KEY>.
Phần thân yêu cầu · application/json
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
model | string | Có | ID mô hình văn bản trả về từ /v1/models |
messages | array | Có | Các tin nhắn sắp xếp theo thứ tự thời gian |
messages[].role | string | Có | system, user hoặc assistant |
messages[].content | string | Có | Nội dung tin nhắn hiện tại |
stream | boolean | Không | Khi true dùng trả về dạng luồng SSE, đọc đến [DONE] thì kết thúc |
temperature | number | Không | Việc có hỗ trợ hay không căn cứ vào năng lực thực tế của mô hình hiện tại |
max_tokens | integer | Không | Việc có hỗ trợ hay không căn cứ vào năng lực thực tế của mô hình hiện tại |
Ví dụ yêu cầu
model phải viết bằng id trả về từ /v1/models, đừng dùng tên hiển thị trên trang.
Khi đặt stream là true sẽ trả về từng đoạn theo SSE, đọc đến [DONE] thì kết thúc.
Bên phải đưa ra cách viết tương đương của ba ngôn ngữ, chuyển tab để đối chiếu.
curl -X POST "https://locopalai.com/v1/chat/completions" \
-H "Authorization: Bearer $LOCOPAL_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"model": "从 /v1/models 选择的文本模型 ID",
"messages": [{ "role": "user", "content": "只回复两个字:你好" }],
"stream": false
}
JSONTham số phản hồi
| Tham số | Kiểu | Mô tả |
|---|---|---|
id | string | Định danh phản hồi lần này, dùng để khắc phục và đối soát |
object | string | Là chat.completion khi không dùng luồng |
created | integer | Thời gian phản hồi (giây Unix) |
model | string | ID mô hình dùng cho yêu cầu lần này |
choices | array | Danh sách kết quả |
choices[].index | integer | Số thứ tự kết quả |
choices[].message.role | string | Cố định là assistant |
choices[].message.content | string | Văn bản được tạo |
choices[].finish_reason | string | Lý do kết thúc, length nghĩa là bị cắt do độ dài |
usage.prompt_tokens | integer | Lượng dùng đầu vào |
usage.completion_tokens | integer | Lượng dùng đầu ra |
usage.total_tokens | integer | Tổng lượng dùng |
choices[].message.refusal | string / null | Giải thích khi mô hình từ chối nội dung, câu trả lời thông thường thường là null |
choices[].message.annotations | array | Chú thích bổ sung của mô hình, có thể rỗng |
usage còn có thể chứa các trường lượng dùng chi tiết của lần tính phí này (cache hit, phân tách đầu vào/đầu ra, v.v.), lấy theo thực tế trả về. Một số kênh còn trả về các trường mở rộng như latency_checkpoint, routing, system_fingerprint, client nên bỏ qua các trường không nhận diện được, đừng phân tích theo tập trường cố định đầy đủ.
Phần thân phản hồi
{
"id": "msg_011CevNtsfivFKb6YP3WcL7A",
"model": "claude-haiku-4-5-20251001",
"object": "chat.completion",
"created": 1789071575,
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "你好" },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 20587,
"completion_tokens": 6,
"total_tokens": 20593
}
}Phản hồi dạng luồng (thêm "stream": true vào phần thân yêu cầu, phản hồi là text/event-stream):
data: {"choices":[{"delta":{"content":"这是"}}]}
data: {"choices":[{"delta":{"content":"模型输出"}}]}
data: [DONE]Client phải tiếp tục đọc cho đến [DONE]; phản hồi dạng luồng không nên bị lớp trung gian cache hoặc ghép thành nội dung trùng lặp. Khối dữ liệu cuối cùng có thể chỉ chứa usage, lúc đó choices có thể rỗng.
Mô hình suy luận có thể trả về nội dung rỗng
Một số mô hình suy luận sẽ ưu tiên dùng hạn mức đầu ra cho suy luận ẩn. Thực tế khi yêu cầu gpt-5-nano và max_tokens quá nhỏ, HTTP trả về 200, nhưng message.content rỗng, finish_reason là length, usage.completion_tokens_details.reasoning_tokens bằng giới hạn đầu ra. Gặp trường hợp này nên tăng hạn mức hoặc đổi sang mô hình văn bản không suy luận, không được coi chuỗi rỗng là lỗi mô hình hay lỗi API.
Ví dụ phía máy chủ
const response = await fetch('https://locopalai.com/v1/chat/completions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LOCOPAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: '从 /v1/models 选择的模型 ID',
messages: [{ role: 'user', content: '写一条产品简介。' }],
}),
})
if (!response.ok) throw new Error(await response.text())
const data = await response.json()Đừng đặt khóa API vào mã trình duyệt; yêu cầu từ frontend trước tiên đến backend nghiệp vụ của bạn, rồi backend chuyển tiếp.
Phản hồi lỗi
{
"error": {
"code": "model_not_found",
"message": "No available channel for model xxx under group xxx (distributor) (request id: ...)",
"type": "new_api_error"
}
}| HTTP | Phản hồi / Nguyên nhân | Xử lý |
|---|---|---|
400 | {"error":{"code":"","message":"Model name not specified, model name cannot be empty (request id: ...)","type":"new_api_error"}} | Phần thân yêu cầu thiếu model |
401 | Invalid token | Khóa API thiếu, sai hoặc đã hết hiệu lực |
503 | {"error":{"code":"model_not_found","message":"No available channel for model ..."}} | Nhóm hiện tại không có kênh khả dụng cho mô hình đó, đổi sang mô hình cùng loại hoặc liên hệ hỗ trợ nền tảng |
429 | Tần suất yêu cầu bị giới hạn | Lùi lại rồi thử lại |
Giải thích đầy đủ xem Mã lỗi và khắc phục.
