API & SDKHướng dẫn
Yêu cầu đầu tiên bằng Ruby với gem openai: base_url, key, usage
Một script Ruby ngắn: gem openai chính thức, base_url tùy chỉnh và key từ env. In văn bản phản hồi và lượng token đã dùng.

Trên trang này
Có, gem chính thức openai hoạt động với CheapTokens: truyền base_ và key của bạn vào OpenAI::Client., gọi client., và đọc văn bản từ choices.. Phần còn lại của trang này là toàn bộ script, cách đọc kết quả trả về, và những gì cần kiểm tra khi nó không chạy.
Giả sử bạn có một rake task gắn nhãn cho ticket hỗ trợ, hoặc một background job tóm tắt ghi chú trước khi lưu. Bạn muốn dùng SDK chính thức, không phải tự viết HTTP, và bạn muốn xem mỗi lần gọi dùng bao nhiêu token. Đó chính xác là script này.
Những gì bạn cần trước khi bắt đầu#
Trang gem trên RubyGems (kiểm tra ngày 8 tháng 11 năm 2026) liệt kê openai 0.120.0, phát hành ngày 5 tháng 11 năm 2026, Apache-2.0. Nó cần Ruby 3.3.0 trở lên; nếu bạn còn kẹt ở Ruby 3.2, ghi chú của chính gem chỉ sang dòng 0.75.x. Gói vẫn ở 0.x và thay đổi nhanh, nên hãy ghim phiên bản.
Trong Gemfile của bạn:
gem "openai", "~> 0.120.0"Sau đó bundle install. Không dùng Bundler thì gem install openai - làm điều tương tự.
Bạn cũng cần một API key từ tài khoản CheapTokens. Đừng để nó trong code: đặt nó vào một biến môi trường, và nếu từ .gitignore còn mới với bạn, hướng dẫn giữ key an toàn này chỉ mất năm phút đọc.
export CHEAPTOKENS_API_KEY="sk-your-key"Script#
Tạo ask.rb:
require "openai"
client = OpenAI::Client.new(
api_key: ENV.fetch("CHEAPTOKENS_API_KEY"),
base_url: "https://api.cheaptokens.dev/v1"
)
completion = client.chat.completions.create(
model: "deepseek-ai/DeepSeek-V4-Flash-0731",
messages: [
{ role: "user", content: "Explain in one sentence what a token is." }
]
)
choice = completion.choices.first
puts choice.message.content
puts "finish_reason: #{choice.finish_reason}"
puts completion.usageChạy nó bằng ruby ask.rb. Có ba điều đáng xem lại.
ENV.fetch thay vì ENV[...]. Nếu biến bị thiếu, fetch dừng ngay lập tức với một KeyError nêu tên nó. ENV[...] lặng lẽ truyền nil và bạn nhận được lỗi xác thực khó hiểu vài dòng sau đó.
base_url: là dòng duy nhất khác với các ví dụ OpenAI trong README của gem. Mọi thứ khác đều là cùng một đoạn code, đó chính là mục đích của một API tương thích OpenAI. Nếu khái niệm này còn mới, base_url là gì và cách chuyển đổi giải thích nó bằng một phép so sánh nhà hàng.
Model id là id đầy đủ, deepseek-. Tên ngắn từ bảng giá không được API chấp nhận; hãy lấy id từ tài liệu CheapTokens hoặc từ GET /v1/models.

Đọc kết quả trả về#
Phản hồi là một object, không phải hash, nên bạn gọi phương thức trên nó. Văn bản nằm ở completion.; đó cũng là đường dẫn mà README của gem dùng.
Hai dòng nữa đáng in ra ngay từ ngày đầu:
finish_reasoncho bạn biết vì sao model dừng.stoplà kết thúc bình thường.lengthnghĩa là một giới hạn độ dài đã cắt câu trả lời. Nếu bạn gặp trường hợp đó, vì sao câu trả lời bị cắt và cách khắc phục.usagechứa số token mà lần gọi được tính phí: những gì bạn gửi và những gì model viết. Script in toàn bộ object bằngputs completion., nên bạn thấy cả hai con số như API trả về.usage
Vì sao ghi log chúng? Vì token chính là hóa đơn. Một câu hỏi một câu với câu trả lời một câu thì rất nhỏ, nhưng một job chạy nghìn lần mỗi ngày thì không. Token đầu vào so với đầu ra giải thích vì sao con số thứ hai thường tốn hơn trên mỗi token.
Một lần gọi như thế này tốn bao nhiêu#
DeepSeek-V4-Flash trên CheapTokens là $0.015 mỗi 1M token đầu vào và $0.10 mỗi 1M token đầu ra, với cùng mức giá vào bất kỳ giờ nào trong ngày. Lấy một job gắn nhãn ticket: khoảng 300 token vào, 150 token ra mỗi ticket. Một ticket tốn $0.00002. Một nghìn ticket trông như thế này, với giá tham chiếu của OpenRouter ở cột bên cạnh:
| Mô hình | Đầu vào $/1M | Đầu ra $/1M | Mỗi yêu cầu | 1.000 yêu cầu | OpenRouter, 1.000 yêu cầu |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000012 | $0.012 | $0.0225 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00002 | $0.0195 | $0.042 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000038 | $0.0375 | $0.45 |
300 token đầu vào và 150 token đầu ra mỗi yêu cầu. Giá trên 1 triệu token là giá hiện hành và thay đổi cùng với biểu phí của chúng tôi; cột OpenRouter hiển thị giá tham chiếu cho cùng khối lượng công việc.
Model nhận tối đa 380K token ngữ cảnh và tối đa 32.768 token trong một câu trả lời, nên một job tóm tắt hiếm khi chạm giới hạn. Nếu bạn muốn thử model thứ hai với cùng script, chỉ cần đổi chuỗi model: thành zai- (390K ngữ cảnh, tối đa 8.192 token đầu ra).
Nếu nó không chạy#
Hầu hết lỗi lần chạy đầu là một trong năm trường hợp. Chọn trường hợp khớp với màn hình của bạn.
Chọn trường hợp của bạn
Bạn thấy gì?
Chọn một tùy chọn để xem đáp án
KeyError: key not found: "CHEAPTOKENS_API_KEY"
Biến chưa được đặt trong terminal này. Chạy lại dòng export, hoặc mở shell mới và kiểm tra bằng echo $CHEAPTOKENS_.
401 Unauthorized
Key có đó nhưng sai: một dấu cách hoặc dấu ngoặc thừa, một lần dán bị cắt, hoặc một key cũ. Sao chép lại từ tài khoản của bạn.
404 Not Found
Kiểm tra base_url trước: nó kết thúc bằng /v1 và không có đường dẫn thừa phía sau. Sau đó kiểm tra model id: đó là id đầy đủ với tiền tố deepseek-ai/.
cannot load such file -- openai
Gem chưa được cài cho Ruby này. Chạy bundle install và khởi động script bằng bundle exec ruby ask..
Bundler can't find a version that works
Kiểm tra ruby -v. Dòng 0.120.x cần Ruby 3.3.0 trở lên; trên 3.2 hãy ghim dòng 0.75.x thay thế.
Các trường hợp 401 và 404 xuất hiện với mọi SDK, không chỉ Ruby; API 401 hoặc 404: sai key, base URL hoặc model id đi qua chúng theo thứ tự.
Kiểm tra nhanh
finish_reason "length" cho bạn biết điều gì?
Hiện đáp án
Trả lời: Câu trả lời bị cắt bởi giới hạn độ dài
stop là kết thúc bình thường; length nghĩa là câu trả lời chạm giới hạn trước khi model hoàn thành.
Tiếp theo nên đi đâu#
Giờ bạn đã có vòng lặp hữu ích nhỏ nhất: gửi, đọc văn bản, ghi log token. Từ đây, hãy bọc lời gọi trong một phương thức, và thêm các con số usage vào logger của bạn. Cùng mẫu này có ở các ngôn ngữ khác nếu stack của bạn hỗn hợp: Go, Java và C#. Danh sách đầy đủ các model và giá nằm ở trang model, và tài liệu tham chiếu API ở trong tài liệu.



