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

เริ่มต้นใช้งานคู่มือ

คำขอแรกไปยัง CheapTokens ใน Python ด้วย requests โดยไม่ใช้ SDK

สคริปต์ Python 20 บรรทัดที่ใช้แค่ requests: chat completion หนึ่งครั้ง timeout การจัดการข้อผิดพลาด HTTP และพิมพ์คำตอบ finish_reason และ usage

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

สคริปต์ Python เรียก endpoint chat completions ของ CheapTokens ด้วย requests
ในหน้านี้
  1. สคริปต์ทั้งหมด
  2. แต่ละบรรทัดทำอะไร
  3. อ่านคำตอบ
  4. เมื่อมันไม่ทำงาน
  5. การเรียกหนึ่งครั้งมีค่าใช้จ่ายเท่าไร
  6. ไปต่อจากตรงนี้

คุณไม่จำเป็นต้องใช้แพ็กเกจ openai เพื่อคุยกับ API ที่เข้ากันได้กับ OpenAI แค่การเรียก requests.post ครั้งเดียว คีย์ Bearer และ JSON body ก็เพียงพอ และคุณจะเห็นได้ชัดว่ามีอะไรส่งผ่านเครือข่ายไปบ้าง คู่มือนี้สร้างสคริปต์นั้นสำหรับ CheapTokens (https://api.cheaptokens.dev/v1/chat/completions) และจบลงด้วยการพิมพ์คำตอบ finish_reason และการใช้โทเค็น

เหมาะอย่างยิ่งหากคุณอยู่บนเครื่องที่ถูกล็อกดาวน์ซึ่งติดตั้งไว้แค่ requests หาก cron job เล็กๆ ไม่ควรดึง SDK เข้ามา หรือหากคุณแค่อยากเข้าใจว่า SDK ทำให้คุณอย่างไร คู่มือคำขอแรก ครอบคลุมเส้นทาง SDK, curl และ Node; ส่วนนี่คือเส้นทางแบบ Python ล้วน

สคริปต์ทั้งหมด#

ใส่คีย์ของคุณในตัวแปรสภาพแวดล้อมก่อน (ดู วิธีเก็บ API key อย่างปลอดภัย) จากนั้นบันทึกเป็น ask.py:

python
import os
import requests

url = "https://api.cheaptokens.dev/v1/chat/completions"
headers = {"Authorization": f"Bearer {os.environ['CHEAPTOKENS_API_KEY']}"}
payload = {
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "messages": [
        {"role": "user", "content": "Explain what a token is in two sentences."}
    ],
    "max_tokens": 200,
}

try:
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    r.raise_for_status()
except requests.exceptions.Timeout:
    raise SystemExit("No reply within 30 seconds - try again or raise the timeout")
except requests.exceptions.HTTPError as e:
    raise SystemExit(f"HTTP {e.response.status_code}: {e.response.text}")

data = r.json()
choice = data["choices"][0]
print(choice["message"]["content"])
print("finish_reason:", choice["finish_reason"])
print("usage:", data["usage"])

รัน python ask.py model id คือ gateway id แบบเต็ม deepseek-ai/DeepSeek-V4-Flash-0731; หากไม่แน่ใจว่าจะใส่อะไร ให้ แสดงรายการโมเดลด้วย GET /v1/models หากต้องการลองโมเดลอื่น ให้สลับเป็น zai-org/GLM-5.3-Flash และไม่ต้องแก้อะไรอีก: ยอดคงเหลือเดียวครอบคลุมทุกโมเดล

เส้นทางของคำขอหนึ่งครั้ง: key, POST, raise_for_status, choices, usage
คำขอหนึ่งครั้งจากสคริปต์ของคุณไปยังคำตอบที่พิมพ์ออกมา

แต่ละบรรทัดทำอะไร#

นี่คือห้าแนวคิดที่สคริปต์พึ่งพา Quickstart ของ requests (เอกสารสด ตรวจสอบเมื่อ 2 พฤศจิกายน 2026) อธิบายส่วนใหญ่ไว้ และเอกสารอ้างอิง Chat Completions จาก OpenAI กำหนดฟิลด์ในคำตอบ

แฟลชการ์ด

ห้าสิ่งในสคริปต์

ข้อที่สามคือข้อที่คนมักข้าม สคริปต์ที่ค้างตลอดไปใน cron job แย่กว่าสคริปต์ที่ล้มเหลวอย่างชัดเจนหลัง 30 วินาทีมาก

อ่านคำตอบ#

การตอบกลับที่สำเร็จเป็น JSON ส่วนที่คุณสนใจ ตามเอกสารอ้างอิง Chat Completions:

  • choices[0].message.content คือข้อความ มันอาจเป็น null ดังนั้นอย่าเรียกเมธอดสตริงกับมันแบบไม่ตรวจสอบ
  • choices[0].finish_reason บอกเหตุผลที่โมเดลหยุด: stop (จบแล้ว), length (ถูกจำกัดด้วยขีดจำกัด max_tokens), tool_calls, content_filter
  • usage.prompt_tokens, usage.completion_tokens และ usage.total_tokens คือสิ่งที่คุณถูกเรียกเก็บเงิน: อินพุต เอาต์พุต และผลรวม

คำตอบมีรูปแบบนี้ (ตัวเลขเป็นค่าตัวอย่าง):

json
{
  "choices": [
    {
      "message": {"role": "assistant", "content": "A token is a small piece of text..."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 18, "completion_tokens": 52, "total_tokens": 70}
}
ลองด้วยตัวเองลองดู: ตั้ง max_tokens เป็น 5 แล้วรันสคริปต์อีกครั้ง finish_reason บอกว่าอะไร?แสดงคำตอบ

มันบอกว่า length: โมเดลถูกหยุดด้วยขีดจำกัด max_tokens ของคุณ คำตอบจึงจบกลางประโยค เพิ่มขีดจำกัดแล้วคุณจะได้ stop อีกครั้ง เรื่องเต็มอยู่ใน คำตอบ AI ถูกตัด? แก้ finish_reason "length"

เมื่อมันไม่ทำงาน#

สคริปต์เปลี่ยนความล้มเหลวส่วนใหญ่เป็นเอาต์พุตหนึ่งบรรทัด นี่คือสิ่งที่แต่ละอันมักหมายถึง:

จับคู่

จับคู่แต่ละข้อความกับสาเหตุปกติ

  • HTTP 401คีย์หาย พิมพ์ผิด หรือไม่ใช่คีย์ที่คุณตั้งใจจะส่ง
  • HTTP 404พาธ URL หรือ model id ผิด
  • requests.exceptions.Timeoutไม่มีไบต์มาถึงภายใน timeout
  • KeyError: 'CHEAPTOKENS_API_KEY'ตัวแปรสภาพแวดล้อมไม่ได้ตั้งค่าในเทอร์มินัลนี้

สำหรับ error body จริงและการตรวจสอบคีย์ base URL และ model id ทีละขั้นตอน ให้ใช้ ข้อผิดพลาด API 401 หรือ 404: คีย์, base URL หรือ model id ผิด กับดักเล็กๆ สองข้อ: หากคุณเห็น KeyError: 'choices' แสดงว่าคุณแยกวิเคราะห์ error body เป็นความสำเร็จ ซึ่งหมายความว่า raise_for_status() ถูกข้ามไป และหากเครื่องของคุณมีไฟล์ ~/.netrc requests อาจใช้ข้อมูลรับรองของไฟล์นั้นแทน header Authorization ที่คุณตั้งไว้

การเรียกหนึ่งครั้งมีค่าใช้จ่ายเท่าไร#

ด้วยตัวเลขตัวอย่างจากคำตอบข้างต้น (ประมาณ 18 โทเค็นอินพุต 52 เอาต์พุต) การเรียก DeepSeek-V4-Flash หนึ่งครั้งมีค่าใช้จ่าย $0.0000055 นั่นเป็นตัวเลขที่คุณรู้สึกไม่ได้ ดังนั้นให้ขยายดู สมมติว่าสคริปต์ของคุณสรุปตั๋วสนับสนุน 1,000 ใบต่อวัน ประมาณ 800 โทเค็นอินพุตและ 300 เอาต์พุตต่อใบ:

โมเดล ต่อคำขอ 1,000 คำขอ OpenRouter, 1,000 คำขอ
GLM-5.3-Flash $0.000028 $0.028 $0.0517
DeepSeek-V4-Flash $0.000042 $0.042 $0.098
MiniMax-M2.7 $0.000085 $0.085 $1.02

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

ราคาคงที่ต่อโมเดล ไม่มีช่วงเวลาเร่งด่วน สคริปต์เดียวกันจึงมีค่าใช้จ่ายเท่ากันตอนตี 3 และตอนเที่ยง ราคาต่อโมเดลปัจจุบันอยู่ในหน้าราคา และเอกสารแสดงรายการ endpoint

ไปต่อจากตรงนี้#

เมื่อสิ่งนี้ทำงานได้ ขั้นตอนถัดไปปกติคือลูปผ่านอินพุตจำนวนมาก การลองใหม่เมื่อ 429 (ดู 429 Too Many Requests: ลองใหม่ด้วย backoff) หรือการเรียกแบบเดียวกันด้วย streaming หากคุณไม่อยากจัดการ HTTP เอง เส้นทาง SDK อยู่ห่างแค่การเปลี่ยน base_url ครั้งเดียว