ব্লগে ফিরে যান

শুরু করাগাইড

requests সহ Python-এ CheapTokens-এ প্রথম অনুরোধ, কোনও SDK ছাড়াই

শুধুমাত্র requests সহ একটি 20-লাইনের Python স্ক্রিপ্ট: একটি চ্যাট সম্পূর্ণতা, একটি টাইমআউট, HTTP ত্রুটি পরিচালনা, এবং উত্তর, finish_reason এবং usage প্রিন্ট করা।

CheapTokens Team দ্বারাপ্রকাশিত হয়েছে 7 মিনিট পড়ার সময়

requests দিয়ে CheapTokens চ্যাট সম্পূর্ণতা এন্ডপয়েন্ট কল করা Python স্ক্রিপ্ট
এই পৃষ্ঠায়
  1. সম্পূর্ণ স্ক্রিপ্ট
  2. প্রতিটি লাইন কী করছে
  3. উত্তর পড়ুন
  4. যখন এটি কাজ করে না
  5. একটি কলের খরচ
  6. এখান থেকে কোথায় যাবেন

OpenAI-সামঞ্জস্যপূর্ণ API-এর সাথে কথা বলতে আপনার openai প্যাকেজের প্রয়োজন নেই। একটি requests.post কল, একটি Bearer কী এবং একটি JSON বডিই যথেষ্ট, এবং আপনি ঠিক কী তারের উপর দিয়ে যাচ্ছে তা দেখতে পাবেন। এই গাইডটি CheapTokens (https://api.cheaptokens.dev/v1/chat/completions)-এর জন্য সেই স্ক্রিপ্টটি তৈরি করে এবং শেষে এটি উত্তর, finish_reason এবং টোকেন ব্যবহার প্রিন্ট করে।

এটি আপনার জন্য উপযুক্ত যদি আপনি একটি লকড-ডাউন মেশিনে থাকেন যেখানে শুধুমাত্র requests ইনস্টল করা আছে, যদি একটি ছোট ক্রন জব একটি SDK টেনে আনতে না চায়, অথবা যদি আপনি কেবল বুঝতে চান যে SDK আপনার জন্য কী করে। প্রথম-অনুরোধ গাইড SDK, curl এবং Node রুটগুলি কভার করে; এটি সাধারণ-পাইথন সংস্করণ।

সম্পূর্ণ স্ক্রিপ্ট#

প্রথমে আপনার কী একটি পরিবেশ ভেরিয়েবলে রাখুন (কীভাবে একটি API কী নিরাপদে সংরক্ষণ করবেন দেখুন), তারপর এটি 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 চালান। মডেল আইডি হল সম্পূর্ণ গেটওয়ে আইডি, deepseek-ai/DeepSeek-V4-Flash-0731; যদি আপনি নিশ্চিত না হন যে সেখানে কী রাখবেন, GET /v1/models দিয়ে মডেলগুলি তালিকাভুক্ত করুন। অন্য একটি মডেল চেষ্টা করতে, zai-org/GLM-5.3-Flash প্রতিস্থাপন করুন এবং আর কিছু পরিবর্তন করবেন না: একটি ব্যালেন্স সমস্ত মডেল কভার করে।

একটি অনুরোধের পথ: কী, POST, raise_for_status, choices, usage
আপনার স্ক্রিপ্ট থেকে প্রিন্ট করা উত্তর পর্যন্ত একটি অনুরোধ

প্রতিটি লাইন কী করছে#

এখানে পাঁচটি ধারণা রয়েছে যার উপর স্ক্রিপ্টটি নির্ভর করে। requests Quickstart (লিভিং ডকস, 2 নভেম্বর 2026-এ যাচাই করা) তাদের বেশিরভাগ ব্যাখ্যা করে, এবং OpenAI-এর Chat Completions রেফারেন্স উত্তরটির ক্ষেত্রগুলি সংজ্ঞায়িত করে।

ফ্ল্যাশকার্ড

স্ক্রিপ্টে পাঁচটি জিনিস

তৃতীয় বুলেটটি হল যা মানুষ এড়িয়ে যায়। একটি ক্রন জবে চিরকালের জন্য হ্যাং করা একটি স্ক্রিপ্ট 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 404URL পথ বা মডেল আইডি ভুল
  • requests.exceptions.Timeoutটাইমআউটের মধ্যে কোনও বাইট আসেনি
  • KeyError: 'CHEAPTOKENS_API_KEY'এই টার্মিনালে পরিবেশ ভেরিয়েবল সেট করা নেই

প্রকৃত ত্রুটি বডি এবং কী, বেস URL এবং মডেল আইডির ধাপে ধাপে চেকের জন্য, API 401 বা 404 ত্রুটি: ভুল কী, বেস URL বা মডেল আইডি ব্যবহার করুন। দুটি ছোট গচা: যদি আপনি KeyError: 'choices' দেখেন, আপনি একটি ত্রুটি বডিকে সফলতা হিসেবে পার্স করেছেন, যার মানে raise_for_status() এড়িয়ে গেছে। এবং যদি আপনার মেশিনে একটি ~/.netrc ফাইল থাকে, requests আপনার সেট করা Authorization হেডারের পরিবর্তে এর ক্রেডেনশিয়াল ব্যবহার করতে পারে।

একটি কলের খরচ#

উপরের উত্তর থেকে প্লেসহোল্ডার সংখ্যাগুলি (প্রায় 18 টোকেন ইন, 52 আউট) সহ, DeepSeek-V4-Flash-এ একটি কলের খরচ $0.0000055। এটি এমন একটি সংখ্যা যা আপনি অনুভব করতে পারবেন না, তাই এটি বড় করুন। ধরুন আপনার স্ক্রিপ্ট প্রতিদিন 1,000টি সাপোর্ট টিকিট সংক্ষিপ্ত করে, প্রতিটিতে প্রায় 800 টোকেন ইন এবং 300 আউট:

মডেল প্রতি অনুরোধে ১,০০০টি অনুরোধ OpenRouter, ১,০০০টি অনুরোধ
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

প্রতি অনুরোধে ৮০০ ইনপুট এবং ৩০০ আউটপুট টোকেন। প্রতি 1M টোকেনের দাম বর্তমান এবং আমাদের ট্যারিফের সাথে পরিবর্তিত হয়; OpenRouter কলামটি একই ওয়ার্কলোডের জন্য রেফারেন্স মূল্য দেখায়।

দাম প্রতি মডেলের জন্য নির্ধারিত, কোনও পিক আওয়ার নেই, তাই একই স্ক্রিপ্টের খরচ রাত 3টায় এবং দুপুরে একই। বর্তমান প্রতি-মডেল দাম মূল্য পৃষ্ঠা-এ রয়েছে, এবং ডকস এন্ডপয়েন্টগুলি তালিকাভুক্ত করে।

এখান থেকে কোথায় যাবেন#

এটি কাজ করার পরে, সাধারণ পরবর্তী পদক্ষেপগুলি হল অনেক ইনপুটের উপর একটি লুপ, 429-এ একটি পুনরায় চেষ্টা (429 Too Many Requests: ব্যাকঅফ সহ পুনরায় চেষ্টা দেখুন), অথবা স্ট্রিমিং সহ একই কল। যদি আপনি নিজে HTTP পরিচালনা করতে না চান, SDK রুটটি এক base_url পরিবর্তন দূরে।