API tương thích OpenAI
Cập nhật lần cuối: 11 thg 11 2026
Đây là gì
API tương thích OpenAI cho phép công cụ hỗ trợ định dạng chat completions của OpenAI dùng các mô hình trò chuyện của ToRun, được thanh toán từ tài khoản ToRun của bạn. Một tác nhân lập trình như opencode có thể dùng ToRun làm nhà cung cấp mô hình, bên cạnh các công cụ MCP của ToRun.
Địa chỉ và đăng nhập
| URL gốc | https://mcp.torun.ai/v1 |
| Đăng nhập | Authorization: Bearer <your developer key> |
Dùng cùng khóa nhà phát triển như cho máy chủ MCP: xem Khóa nhà phát triển. Khóa được tạo trước khi API tương thích OpenAI được thêm vào sẽ nhận phản hồi 403 insufficient_scope. Quyền của khóa không bao giờ thay đổi, vì vậy hãy tạo khóa mới.
API có hai điểm cuối, GET /v1/models và POST /v1/chat/completions. Mọi đường dẫn khác trong /v1 đều trả về 404 not_found.
Mô hình
GET /v1/models liệt kê torun/auto trước, rồi đến mọi mô hình văn bản mà gói của bạn có thể dùng, theo mã mô hình. Mỗi mô hình cho biết:
- lượng văn bản nó có thể đọc (
context_length) và độ dài câu trả lời nó có thể viết (max_completion_tokens), - nó có thể gọi công cụ (
supports_tools) và đọc hình ảnh (supports_vision) hay không, - giá của nó bằng Runs cho mỗi triệu token (
pricing:inputvàoutput).
torun/auto để ToRun chọn mô hình cho từng yêu cầu: một mô hình đọc được hình ảnh khi yêu cầu có hình ảnh, và một mô hình gọi được công cụ khi yêu cầu gửi tools.
Chat completions
POST /v1/chat/completions chấp nhận:
messages, với các vai tròsystem,developer(được xử lý nhưsystem),user,assistantvàtool,toolsvàtool_choice(auto,none,requiredhoặc một hàm được đặt tên): các công cụ riêng của công cụ bạn dùng sẽ được trả lại cho nó dưới dạng lệnh gọi công cụ, và ToRun không bao giờ chạy chúng,response_formatvớijson_object.json_schemađược chấp nhận và câu trả lời là JSON, nhưng bản thân schema không được áp đặt,temperature(0 đến 2),top_p(0 đến 1),max_completion_tokenshoặcmax_tokens,stop(tối đa 4 chuỗi),seedvàreasoning_effort,streamvàstream_options.include_usage.
n lớn hơn 1, logprobs, top_logprobs, âm thanh và mọi đầu ra không phải văn bản đều bị từ chối với 400 unsupported_parameter thay vì bị bỏ qua.
Hình ảnh
Gửi hình ảnh dạng nhúng, dưới dạng data:image/...;base64,... trong phần image_url, tối đa 20 MB mỗi yêu cầu. Hình ảnh gửi dưới dạng liên kết bị từ chối với 400 image_url_not_supported: ToRun không tải hình đó về. Hình ảnh được kiểm tra an toàn, giống như trong ứng dụng.
Truyền phát
Với "stream": true, câu trả lời đến dưới dạng server-sent events theo dạng chat.completion.chunk:
- Đoạn đầu tiên mang vai trò
assistant, và lệnh gọi công cụ được truyền phát kèmindexcủa chúng. - Khi không có gì để gửi, cứ 15 giây lại có một dòng chú thích
: keepalive; trình phân tích SSE sẽ bỏ qua dòng này. data: [DONE]kết thúc một luồng thành công.- Với
stream_options.include_usage, đoạn cuối cùng cóchoicesrỗng và mangusage. - Lỗi xảy ra sau khi luồng đã bắt đầu sẽ đến dưới dạng một sự kiện
data: {"error": ...}, không có[DONE].
Lệnh gọi không truyền phát sẽ bị dừng sau 110 giây với 504 timeout. Hãy gửi các yêu cầu dài với "stream": true.
Mức sử dụng
usage chứa prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens và completion_tokens_details.reasoning_tokens, cùng với torun_credits: chi phí của lệnh gọi, tính bằng Runs.
Dùng trong opencode
Cấu hình opencode trên trang Nhà phát triển thêm ToRun làm nhà cung cấp mô hình bên cạnh máy chủ MCP:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"torun": {
"npm": "@ai-sdk/openai-compatible",
"name": "ToRun",
"options": { "baseURL": "https://mcp.torun.ai/v1", "apiKey": "{env:TORUN_API_KEY}" },
"models": { "torun/auto": { "name": "ToRun Auto" } }
}
}
}
Mọi công cụ khác hỗ trợ API trò chuyện của OpenAI đều hoạt động theo cách tương tự. Thẻ OpenAI API của trang này hiển thị lệnh gọi sau:
curl https://mcp.torun.ai/v1/chat/completions \
-H "Authorization: Bearer $TORUN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "torun/auto", "messages": [{"role": "user", "content": "Hello"}]}'
Các lệnh gọi được thanh toán thế nào
Lệnh gọi API tốn số Runs bằng với cùng mức sử dụng trong ứng dụng. Chỉ tiền trả phí mới thanh toán cho chúng: trước tiên là hạn mức gói trả phí của bạn, sau đó là ví nếu bạn đã cho phép điều đó trên khóa. Hạn mức miễn phí không bao giờ trả cho lệnh gọi API. Giới hạn hằng tháng và hằng ngày của khóa được áp dụng, và câu trả lời được kiểm tra an toàn như câu trả lời trong trò chuyện.
Giới hạn
Mỗi khóa có thể gửi 60 yêu cầu mỗi phút tới API này và chạy 4 completions cùng lúc. Vượt quá mức đó, API trả về 429 rate_limit_exceeded kèm tiêu đề Retry-After.
Lỗi
Mọi lỗi đều có dạng {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. message được viết bằng ngôn ngữ mà tiêu đề Accept-Language của yêu cầu chỉ định.
| Trạng thái | Mã | Ý nghĩa |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
Yêu cầu sai định dạng, hoặc dùng một tham số mà ToRun không hỗ trợ. |
| 400 | image_url_not_supported |
Hình ảnh được gửi dưới dạng liên kết; hãy gửi dạng nhúng. |
| 400 | content_blocked |
Bước kiểm tra an toàn đã chặn nội dung. |
| 400 | upstream_rejected |
Nhà cung cấp mô hình đã từ chối yêu cầu; thông báo cho biết lý do. |
| 401 | invalid_api_key |
Khóa bị thiếu, nhập sai hoặc đã bị thu hồi. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
Tài khoản hoặc khóa không thể thanh toán cho lệnh gọi. |
| 403 | insufficient_scope |
Khóa được tạo trước khi API này được thêm vào; hãy tạo khóa mới. |
| 403 | model_not_available |
Mô hình không có trong gói của bạn. |
| 403 | account_suspended, no_developer_access |
Tài khoản bị tạm ngưng, hoặc không có quyền truy cập dành cho nhà phát triển. |
| 404 | model_not_found |
Mã mô hình không nằm trong danh sách của GET /v1/models. |
| 404 | not_found |
Không có đường dẫn như vậy trong /v1. |
| 429 | rate_limit_exceeded |
Quá nhiều lệnh gọi; hãy chờ khoảng thời gian trong Retry-After. |
| 500 | internal_error |
Đã xảy ra lỗi phía ToRun. |
| 502 | upstream_error, empty_reply |
Nhà cung cấp mô hình gặp lỗi, hoặc gửi về câu trả lời trống. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Một dịch vụ mà lệnh gọi cần tạm thời không khả dụng; hãy thử lại. |
| 504 | timeout |
Lệnh gọi không truyền phát đã chạy quá 110 giây. |
Yêu cầu không thể thanh toán sẽ nhận 402 chứ không phải 429, để máy khách không liên tục thử lại.