กลับไปที่บล็อก

API และ SDKคู่มือ

คำขอแรกใน Ruby ด้วย gem openai: base_url, คีย์, usage

สคริปต์ Ruby สั้น ๆ: gem openai อย่างเป็นทางการ, base_url ที่กำหนดเอง และคีย์จาก env พิมพ์ข้อความตอบกลับและ token usage

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 5 นาที

สคริปต์ Ruby ที่มี OpenAI::Client.new และ base_url ที่กำหนดเองชี้ไปที่ CheapTokens
ในหน้านี้
  1. สิ่งที่ต้องมีก่อนเริ่ม
  2. สคริปต์
  3. การอ่านสิ่งที่ส่งกลับมา
  4. การเรียกแบบนี้มีค่าใช้จ่ายเท่าไร
  5. หากมันไม่ทำงาน
  6. ไปต่อที่ไหน

ใช่แล้ว gem อย่างเป็นทางการของ openai ใช้งานได้กับ CheapTokens: ส่ง base_url: "https://api.cheaptokens.dev/v1" และคีย์ของคุณไปที่ OpenAI::Client.new เรียก client.chat.completions.create แล้วอ่านข้อความจาก choices.first.message.content ส่วนที่เหลือของหน้านี้คือสคริปต์เต็ม วิธีอ่านสิ่งที่ส่งกลับมา และสิ่งที่ต้องตรวจสอบเมื่อมันไม่ทำงาน

สมมติว่าคุณมี rake task ที่ติดป้ายกำกับตั๋วสนับสนุน หรือ background job ที่สรุปโน้ตก่อนบันทึก คุณต้องการ SDK อย่างเป็นทางการ ไม่ใช่ HTTP ที่เขียนเอง และคุณต้องการเห็นว่าแต่ละครั้งใช้ไปกี่โทเคน นั่นคือสิ่งที่สคริปต์นี้ทำ

สิ่งที่ต้องมีก่อนเริ่ม#

หน้า gem บน RubyGems (ตรวจสอบเมื่อ 8 พฤศจิกายน 2026) ระบุ openai 0.120.0 เผยแพร่เมื่อ 5 พฤศจิกายน 2026 ภายใต้ Apache-2.0 ต้องใช้ Ruby 3.3.0 ขึ้นไป หากคุณยังติดอยู่กับ Ruby 3.2 บันทึกของ gem เองชี้ไปที่สาย 0.75.x แพ็กเกจยังเป็น 0.x และเปลี่ยนแปลงเร็ว ดังนั้นควรปักหมุดเวอร์ชัน

ใน Gemfile ของคุณ:

ruby
gem "openai", "~> 0.120.0"

จากนั้น bundle install หากไม่ใช้ Bundler gem install openai -v 0.120.0 ให้ผลเหมือนกัน

คุณยังต้องมี API key จากบัญชี CheapTokens ของคุณ เก็บไว้ให้พ้นจากโค้ด: ใส่ไว้ใน environment variable และหากคำว่า .gitignore เป็นเรื่องใหม่สำหรับคุณ คู่มือการเก็บคีย์ให้ปลอดภัยนี้ ใช้เวลาอ่านห้านาที

bash
export CHEAPTOKENS_API_KEY="sk-your-key"

สคริปต์#

สร้าง ask.rb:

ruby
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.usage

รันด้วย ruby ask.rb มีสามจุดที่ควรดูให้ดี

ENV.fetch แทน ENV[...] หากตัวแปรหายไป fetch จะหยุดทันทีด้วย KeyError ที่ระบุชื่อตัวแปรนั้น ENV[...] ส่ง nil ผ่านไปเงียบ ๆ แล้วคุณจะเจอข้อผิดพลาดการยืนยันตัวตนที่สับสนในอีกไม่กี่บรรทัดถัดมา

base_url: เป็นบรรทัดเดียวที่ต่างจากตัวอย่าง OpenAI ใน README ของ gem ที่เหลือเป็นโค้ดเดียวกัน ซึ่งเป็นจุดสำคัญทั้งหมดของ API ที่เข้ากันได้กับ OpenAI หากแนวคิดนี้เป็นเรื่องใหม่ base_url คืออะไรและวิธีสลับ อธิบายด้วยการเปรียบเทียบร้านอาหาร

model id ต้องเป็นแบบเต็ม deepseek-ai/DeepSeek-V4-Flash-0731 ชื่อย่อจากตารางราคาจะไม่ถูกยอมรับโดย API; ใช้ id จาก เอกสาร CheapTokens หรือจาก GET /v1/models

เทอร์มินัลที่มีบรรทัด Gemfile คีย์ที่ export และ ruby ask.rb
สามคำสั่ง: ปักหมุด gem, export คีย์, รันสคริปต์

การอ่านสิ่งที่ส่งกลับมา#

คำตอบเป็นออบเจกต์ ไม่ใช่ hash ดังนั้นคุณจึงเรียกเมธอดบนมัน ข้อความอยู่ที่ completion.choices.first.message.content; นั่นคือเส้นทางที่ README ของ gem ใช้เช่นกัน

อีกสองบรรทัดที่ควรพิมพ์ตั้งแต่วันแรก:

  • finish_reason บอกคุณว่าโมเดลหยุดเพราะอะไร stop คือการจบปกติ length หมายความว่าขีดจำกัดความยาวตัดคำตอบ หากคุณเจอสิ่งนั้น ทำไมคำตอบจึงถูกตัดและวิธีแก้ไข
  • usage เก็บโทเคนที่การเรียกถูกเรียกเก็บเงิน: สิ่งที่คุณส่งไปและสิ่งที่โมเดลเขียน สคริปต์พิมพ์ออบเจกต์ทั้งหมดด้วย puts completion.usage ดังนั้นคุณจึงเห็นทั้งสองตัวเลขตามที่ API ส่งกลับมา

ทำไมต้องบันทึก? เพราะโทเคนคือค่าใช้จ่าย คำถามหนึ่งประโยคพร้อมคำตอบหนึ่งประโยคนั้นเล็กมาก แต่ job ที่รันพันครั้งต่อวันไม่ใช่ โทเคนอินพุตเทียบเอาต์พุต อธิบายว่าทำไมตัวเลขที่สองมักมีราคาต่อโทเคนสูงกว่า

การเรียกแบบนี้มีค่าใช้จ่ายเท่าไร#

DeepSeek-V4-Flash บน CheapTokens ราคา $0.015 ต่อ 1M โทเคนอินพุต และ $0.10 ต่อ 1M โทเคนเอาต์พุต โดยราคาเดียวกันทุกชั่วโมงของวัน ลองใช้ job ติดป้ายกำกับตั๋ว: ประมาณ 300 โทเคนเข้า 150 โทเคนออกต่อตั๋ว หนึ่งตั๋วมีค่าใช้จ่าย $0.00002 หนึ่งพันตั๋วมีลักษณะดังนี้ โดยมีราคาอ้างอิงของ OpenRouter ในคอลัมน์ถัดไป:

โมเดล ต่อคำขอ 1,000 คำขอ OpenRouter, 1,000 คำขอ
GLM-5.3-Flash $0.000012 $0.012 $0.0225
DeepSeek-V4-Flash $0.00002 $0.0195 $0.042
MiniMax-M2.7 $0.000038 $0.0375 $0.45

300 โทเค็นอินพุตและ 150 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

โมเดลรองรับบริบทสูงสุด 380K โทเคนและสูงสุด 32,768 โทเคนในหนึ่งคำตอบ ดังนั้น job สรุปจึงแทบไม่ชนขีดจำกัด หากคุณอยากลองโมเดลที่สองด้วยสคริปต์เดียวกัน เปลี่ยนเพียงสตริง model: เป็น zai-org/GLM-5.3-Flash (บริบท 390K เอาต์พุตสูงสุด 8,192 โทเคน)

หากมันไม่ทำงาน#

ความล้มเหลวในการรันครั้งแรกส่วนใหญ่เป็นหนึ่งในห้าสิ่ง เลือกอันที่ตรงกับหน้าจอของคุณ

เลือกกรณีของคุณ

คุณเห็นอะไร?

KeyError: key not found: "CHEAPTOKENS_API_KEY"

ตัวแปรไม่ได้ตั้งค่าในเทอร์มินัลนี้ รันบรรทัด export อีกครั้ง หรือเปิดเชลล์ใหม่และตรวจสอบด้วย echo $CHEAPTOKENS_API_KEY

401 Unauthorized

คีย์มีอยู่แต่ผิด: มีช่องว่างหรือเครื่องหมายคำพูดเกินมา การวางถูกตัด หรือคีย์เก่า คัดลอกอีกครั้งจากบัญชีของคุณ

404 Not Found

ตรวจสอบ base_url ก่อน: มันลงท้ายด้วย /v1 และไม่มีเส้นทางเพิ่มเติมต่อท้าย จากนั้นตรวจสอบ model id: ต้องเป็น id เต็มที่มีคำนำหน้า deepseek-ai/

cannot load such file -- openai

gem ไม่ได้ติดตั้งสำหรับ Ruby นี้ รัน bundle install และเริ่มสคริปต์ด้วย bundle exec ruby ask.rb

Bundler can't find a version that works

ตรวจสอบ ruby -v สาย 0.120.x ต้องใช้ Ruby 3.3.0 ขึ้นไป; บน 3.2 ให้ปักหมุดสาย 0.75.x แทน

กรณี 401 และ 404 เกิดขึ้นกับทุก SDK ไม่ใช่แค่ Ruby; API 401 หรือ 404: คีย์, base URL หรือ model id ผิด อธิบายตามลำดับ

เช็กด่วน

finish_reason "length" บอกอะไรคุณ?

แสดงคำตอบ

คำตอบ: คำตอบถูกตัดโดยขีดจำกัดความยาว

stop คือการจบปกติ; length หมายความว่าคำตอบชนขีดจำกัดก่อนที่โมเดลจะเสร็จ

ไปต่อที่ไหน#

ตอนนี้คุณมีลูปที่มีประโยชน์เล็กที่สุดแล้ว: ส่ง อ่านข้อความ บันทึกโทเคน จากตรงนี้ ห่อการเรียกในเมธอด และเพิ่มตัวเลข usage ลงใน logger ของคุณ รูปแบบเดียวกันมีในภาษาอื่นหากสแต็กของคุณผสมกัน: Go, Java และ C# รายการโมเดลและราคาทั้งหมดอยู่ที่ หน้ารุ่น และเอกสารอ้างอิง API อยู่ใน เอกสาร