VI ▾
Lấy khóa API

OpenAI tương thích nghĩa là gì đối với API?

Một API được gọi là tương thích OpenAI khi bạn có thể trỏ SDK OpenAI vào URL của nó, đổi khóa và mã hiện có của bạn vẫn hoạt động. Nhãn này mô tả định dạng truyền tải, không hơn.

Cập nhật

Hai máy khác nhau được nối bởi một bộ kết nối tiêu chuẩn, minh họa cho một định dạng API chung

Điểm chính

  • Nhãn này bao gồm đường dẫn URL, cấu trúc (shape) của yêu cầu và phản hồi JSON, xác thực Bearer và truyền phát (streaming) SSE.
  • Nhãn này không nói gì về mô hình nào đưa ra câu trả lời, cách nó hoạt động hoặc chi phí của nó.
  • Việc chuyển đổi thường có nghĩa là thay đổi hai giá trị: URL cơ sở và khóa API.
  • Hãy kiểm tra streaming, công cụ (tools), chế độ JSON và mã lỗi trước khi dựa vào một nhà cung cấp.

Câu trả lời ngắn gọn

Khi một nhà cung cấp nói rằng API của họ là openai-compatible, điều đó có nghĩa là nó chấp nhận cùng các yêu cầu HTTP mà các thư viện client của OpenAI gửi và trả về phản hồi cùng hình dạng. Bạn giữ nguyên mã, thay đổi base URL và khóa, và lệnh gọi sẽ được gửi đến một máy chủ khác.

Đó là toàn bộ lời hứa. Đó là một tuyên bố về giao diện, giống như việc nói rằng hai bộ sạc sử dụng cùng một phích cắm. Nó không cho bạn biết những gì ở đầu kia của cáp. Mô hình, các quy tắc an toàn, giá cả và giới hạn của nó đều do nhà cung cấp quyết định và chúng khác nhau rất nhiều.

Nhãn này thực sự bao gồm những gì

Trong thực tế, tương thích OpenAI là một danh sách ngắn các thứ cụ thể. Nếu một nhà cung cấp hỗ trợ tất cả những thứ này, hầu hết mã client sẽ chạy mà không cần thay đổi.

  • Đường dẫn. Yêu cầu chat được gửi đến POST /v1/chat/completions và danh sách mô hình đến từ GET /v1/models.
  • Xác thực. Khóa được truyền trong tiêu đề Authorization: Bearer.
  • Thân yêu cầu. Một chuỗi model, một mảng messages các đối tượng có role và content, và các trường lấy mẫu tùy chọn như temperature, top_p, stop và seed.
  • Thân phản hồi. Một mảng choices chứa tin nhắn của trợ lý, một finish_reason và một đối tượng usage với số lượng token.
  • Streaming. Với stream: true, máy chủ gửi các sự kiện do máy chủ gửi đi (SSE), mỗi sự kiện chứa một delta JSON nhỏ, kết thúc bằng một dấu hiệu cuối cùng.
  • Tính năng tùy chọn. Gọi hàm, chế độ JSON và các trường tương tự, nơi nhà cung cấp chọn hỗ trợ chúng.

Vì quá nhiều công cụ được viết dựa trên định dạng này, nó đã trở thành một mục tiêu chung. Các trình soạn thảo, khung agent, giao diện roleplay và các tập lệnh đơn giản đều cho phép bạn nhập base URL tùy chỉnh và đó là tất cả những gì họ cần.

Tại sao một định dạng trở thành mục tiêu chung

Định dạng chat completions lan rộng vì nó đơn giản và xuất hiện sớm. Một tác giả công cụ hỗ trợ nó một lần có thể tiếp cận nhiều backend, và một tác giả backend hỗ trợ nó một lần có thể tiếp cận nhiều công cụ. Đó là một thỏa thuận tốt cho cả hai bên, vì vậy định dạng này đã tồn tại, ngay cả giữa các dịch vụ không liên quan đến công ty đã thiết kế ra nó.

Đối với bạn với tư cách là một nhà phát triển, điều này có ý nghĩa thực tế. Mã của bạn không cần một tích hợp khác cho mỗi nhà cung cấp. Bạn có thể di chuyển một nguyên mẫu giữa các endpoint trong một buổi chiều, so sánh hai mô hình trên cùng các prompt hoặc giữ một nhà cung cấp thứ hai làm dự phòng khi nhà cung cấp đầu tiên chậm. Chi phí thay đổi ý kiến của bạn rất thấp và điều đó giúp dễ dàng thử một dịch vụ mới mà không cần cam kết với nó.

Mặt trái là bề mặt chia sẻ che giấu những khác biệt thực sự. Vì việc chuyển đổi rất dễ dàng, nên dễ dàng giả định rằng mọi thứ phía sau URL đều tương đương. Không phải vậy, và các phần bên dưới cho thấy những khoảng trống thường xuất hiện ở đâu.

Nhãn này không cho bạn biết điều gì

Đây là nơi mọi người ngạc nhiên. Nhãn này bỏ qua mọi thứ quyết định xem API có hữu ích cho công việc của bạn hay không.

Mô hình phía sau nó

Một endpoint tương thích có thể phục vụ bất kỳ mô hình nào. Một số phục vụ các mô hình open-weight, một số định tuyến đến nhiều nhà cung cấp, một số bao bọc một mô hình độc quyền. Tính tương thích không có nghĩa là dịch vụ được chạy bởi OpenAI, và nó không có nghĩa là mô hình hoạt động như một trong số chúng. Tên mô hình bạn truyền trong model chỉ là một chuỗi do nhà cung cấp xác định.

Hành động từ chối

Các quy tắc nội dung thuộc về mô hình và nhà cung cấp, không phải giao thức. Hai API tương thích có thể trả lời cùng một prompt theo các cách đối lập. Nếu trường hợp sử dụng của bạn là truyện hư cấu, roleplay hoặc nội dung người trưởng thành hợp pháp khác, hãy kiểm tra những gì nhà cung cấp nói về các lần từ chối trước khi kết nối bất cứ thứ gì.

Độ sâu tính năng

Một số nhà cung cấp chỉ triển khai chat. Những nhà cung cấp khác thêm tools, chế độ JSON, xác suất log hoặc các endpoint bổ sung. Một client gửi một trường mà máy chủ bỏ qua sẽ không luôn luôn báo lỗi rõ ràng, vì vậy một sự không khớp im lặng là có thể.

Giới hạn, giá cả và lỗi

Giới hạn tốc độ, độ dài ngữ cảnh, kích thước thân tối đa và giá mỗi token đều là lựa chọn của nhà cung cấp. Các thân lỗi cũng khác nhau về chi tiết ngay cả khi mã trạng thái HTTP khớp nhau, vì vậy logic thử lại nên dựa vào mã trạng thái và tiêu đề thay vì văn bản thông báo.

Bài kiểm tra tương thích nhanh

Bạn có thể xác minh một nhà cung cấp trong vài phút với ba yêu cầu. Thay thế khóa bằng khóa của riêng bạn. Ví dụ này sử dụng base URL của trang web này.

curl https://api.kimicode.top/v1/models \
  -H "Authorization: Bearer YOUR_API_KEY"

curl https://api.kimicode.top/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Reply with the word ready."}]
  }'

Cuộc gọi đầu tiên xác nhận khóa và liệt kê các model ID. Cuộc gọi thứ hai kiểm tra cấu trúc chat. Sau đó kiểm tra các phần mà ứng dụng của bạn phụ thuộc vào: thêm "stream": true và xem các chunk tăng dần, truyền một mảng tools nếu bạn sử dụng gọi hàm và đặt response_format thành {"type":"json_object"} nếu bạn cần đầu ra có thể phân tích cú pháp.

Hãy kích hoạt một lỗi có chủ đích, chẳng hạn như khóa không hợp lệ. Bạn muốn thấy một mã HTTP sạch và một thân lỗi JSON mà client của bạn có thể xử lý.

Cùng lệnh gọi trong Node

SDK JavaScript lấy cùng hai giá trị. Đây là một cuộc gọi streaming, là cấu trúc mà hầu hết các giao diện chat sử dụng.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.kimicode.top/v1",
  apiKey: process.env.API_KEY,
});

const stream = await client.chat.completions.create({
  model: "uncensored",
  stream: true,
  messages: [{ role: "user", content: "Name three uses of SSE." }],
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Nếu điều này in văn bản từng từ một, đường dẫn streaming hoạt động từ đầu đến cuối. Vòng lặp tương tự hoạt động chống lại bất kỳ nhà cung cấp tương thích nào, đó là mục đích chính của định dạng.

Việc chuyển đổi trông như thế nào trong mã

Với SDK Python chính thức, thay đổi là hai đối số hàm tạo. Phần còn lại chương trình của bạn vẫn như cũ.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.kimicode.top/v1",
    api_key="YOUR_API_KEY",
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Summarize SSE in one sentence."}],
)
print(resp.choices[0].message.content)

SDK Node.js sử dụng cùng nguyên tắc với các tùy chọn baseURL và apiKey. Nhiều công cụ đọc OPENAI_BASE_URL và OPENAI_API_KEY từ môi trường, vì vậy bạn đôi khi có thể chuyển đổi mà không cần chạm vào mã nguồn.

Hãy nhớ thay đổi chuỗi tên mô hình nữa. Một yêu cầu đặt tên một mô hình mà máy chủ mới không lưu trữ sẽ thất bại và đó là lỗi đầu tiên phổ biến nhất.

API của trang web này phù hợp ở đâu

Dịch vụ này là một API chỉ văn bản được lưu trữ, tuân theo định dạng OpenAI. Nó chạy một mô hình open-weight, do một nhà cung cấp độc lập vận hành và được tinh chỉnh để trả lời mà không có từ chối nội dung cho việc sử dụng người trưởng thành hợp pháp. Nó không phải là API chính thức của bất kỳ nhà cung cấp mô hình nào và nó không định tuyến giữa các nhà cung cấp. ID mô hình là uncensored.

Nó hỗ trợ streaming qua SSE với việc báo cáo sử dụng ở cuối, gọi hàm, chế độ JSON và chuyển tiếp temperature, top_p, stop, seed và các khoản phạt. Cửa sổ ngữ cảnh là 100,000 token cho prompt và completion cộng lại. Nó không tạo hình ảnh hoặc âm thanh và nó không cung cấp embeddings hoặc fine-tuning. Một quy tắc được cố định: không có nội dung tình dục liên quan đến người chưa thành niên.

Thanh toán theo hình thức trả trước và đo đếm: $0.15 cho mỗi 1 triệu token đầu vào và $0.50 cho mỗi 1 triệu token đầu ra, không có gói đăng ký. Bạn có thể xem các con số trên trang giá cả, và tài liệu sẽ hướng dẫn bạn thực hiện yêu cầu đầu tiên. Nếu bạn muốn dùng thử mà không cần trả phí, tài khoản mới có thể nhận tín dụng dùng thử trị giá $0.50 chỉ với một cú nhấp chuột trên trang khóa API.

Các lỗi tương thích thường gặp

  1. Sai base URL. URL phải kết thúc ở /v1. Client tự thêm /chat/completions vào, nên nếu thêm vào base URL sẽ dẫn đến lỗi 404.
  2. Tham số không được hỗ trợ. Nếu một thư viện gửi một trường mà server không nhận biết, hãy kiểm tra xem nó có bị từ chối hay bị bỏ qua lặng lẽ không, sau đó loại bỏ nó.
  3. Streaming và yêu cầu đồng thời. Một yêu cầu streaming chiếm một khe yêu cầu đồng thời cho đến khi stream kết thúc. Nếu ứng dụng của bạn mở nhiều stream, bạn có thể chạm mức giới hạn 429 với mã concurrency dù số lượng yêu cầu mỗi phút của bạn thấp.
  4. Thử lại khi nhận 429. Coi 429 là tín hiệu để chờ. Khi có tiêu đề Retry-After, hãy tuân thủ nó.
  5. Đếm token. Đừng giả định bộ đếm token của nhà cung cấp khác giống với của chúng tôi. Hãy đọc đối tượng usage trong phản hồi để biết các số liệu bạn sẽ phải trả tiền.

Không có lỗi nào trong số này khó sửa khi bạn biết cách tìm chúng, và hầu hết đều chỉ là việc đọc kỹ thông báo lỗi đầu tiên.

Hỏi đáp

API tương thích OpenAI có do OpenAI tạo ra không?

Không. Thuật ngữ này mô tả định dạng yêu cầu và phản hồi. Nhiều nhà cung cấp độc lập tuân theo định dạng này, và mỗi bên chạy các mô hình của riêng họ.

Tôi có thể dùng SDK Python hoặc Node.js của OpenAI với API này không?

Có. Đặt base URL và khóa API trong hàm tạo client, và sử dụng ID mô hình mà nhà cung cấp cung cấp cho bạn. Với dịch vụ này, đó là uncensored.

Mọi tính năng của OpenAI đều hoạt động trên API tương thích không?

Không nhất thiết. Các nhà cung cấp chọn các tính năng nào để triển khai. Tại đây bạn có thể dùng hoàn thành hội thoại, truyền phát, gọi hàm và chế độ JSON, nhưng không có hỗ trợ ảnh, âm thanh hay nhúng.

Tính tương thích có nghĩa là câu trả lời giống với một mô hình khác không?

Không. Câu trả lời phụ thuộc vào mô hình và các quy tắc của nhà cung cấp. Hãy thử nghiệm với các prompt của riêng bạn thay vì giả định hành vi tương tự.

Khóa của bạn chỉ cách một bước

Tạo tài khoản, sao chép khóa, thay đổi base URL. Đó là toàn bộ thiết lập.

Lấy khóa API