অধ্যায় 5 · AI কাজের জন্য Python
requests দিয়ে ওয়েব API
- পৃষ্ঠা 16 / 20
- 3 মিনিট পড়া
API (Application Programming Interface) হলো একটা প্রোগ্রামের আরেকটা প্রোগ্রামের কাছে কিছু চাওয়ার উপায়। ওয়েব API এটা করে ইন্টারনেটে HTTP দিয়ে — আপনার ব্রাউজার যে প্রোটোকল ব্যবহার করে সেটাই। হোস্ট করা প্রতিটা AI মডেল — OpenAI, Anthropic, Google, Hugging Face — ওয়েব API দিয়েই ব্যবহার করা হয়। পরের পাতায় AI SDK ব্যবহারের আগে জনপ্রিয় requests লাইব্রেরি দিয়ে (python -m pip install requests) দেখে নেওয়া ভালো, ভেতরে আসলে কী ঘটে।
রিকোয়েস্ট আর রেসপন্স
আপনার প্রোগ্রাম পাঠায় একটা রিকোয়েস্ট: একটা মেথড, একটা URL, কিছু হেডার আর কখনো একটা বডি। সার্ভার ফেরত পাঠায় একটা রেসপন্স: একটা স্ট্যাটাস কোড, হেডার আর একটা বডি, সাধারণত JSON।
| মেথড | অর্থ | উদাহরণ |
|---|---|---|
GET | কিছু পড়া | ব্যবহারযোগ্য মডেলের তালিকা আনা |
POST | প্রক্রিয়া বা তৈরির জন্য কিছু পাঠানো | একটা প্রম্পট পাঠিয়ে উত্তর পাওয়া |
PUT / PATCH / DELETE | বদলে দেওয়া / পরিবর্তন / মুছে ফেলা | সংরক্ষিত ফাইল আপডেট বা মুছে ফেলা |
GET: ডেটা পড়া
উদাহরণগুলো ব্যবহার করে httpbin.org, একটা বিনামূল্যের সার্ভিস যা আপনার পাঠানো জিনিসই ফেরত দেয় — শেখার জন্য একদম উপযুক্ত:
import requests
response = requests.get(
"https://httpbin.org/get",
params={"q": "python for ai", "page": 1}, # হয়ে যায় ?q=python+for+ai&page=1
timeout=10, # সেকেন্ডে — সবসময় একটা দিন
)
print(response.status_code)
print(response.headers["Content-Type"])
data = response.json() # JSON লেখা → Python dict
print(data["args"])
print(data["url"])200
application/json
{'page': '1', 'q': 'python for ai'}
https://httpbin.org/get?q=python+for+ai&page=1POST: ডেটা পাঠানো
AI মডেলে প্রতিটা কলের আকার এটাই: JSON বডি আর আপনার API key বহনকারী Authorization হেডারসহ একটা POST:
import requests
payload = {"model": "demo-model", "input": "Translate 'good morning' into Bangla."}
response = requests.post(
"https://httpbin.org/post",
json=payload, # JSON পাঠায় আর Content-Type ঠিক করে
headers={"Authorization": "Bearer my-secret-key"},
timeout=10,
)
echo = response.json() # httpbin যা পেয়েছে তা-ই ফেরত পাঠায়
print(response.status_code)
print(echo["json"])
print(echo["headers"]["Content-Type"])
print(echo["headers"]["Authorization"])200
{'input': "Translate 'good morning' into Bangla.", 'model': 'demo-model'}
application/json
Bearer my-secret-keyjson=payload আপনার হয়ে ডিকশনারিকে JSON-এ বদলায় আর Content-Type: application/json হেডার বসিয়ে দেয়।
স্ট্যাটাস কোড
| কোড | অর্থ | কী করবেন |
|---|---|---|
| 200–299 | সফল | বডি পড়ুন |
| 400 | ভুল রিকোয়েস্ট — পাঠানো জিনিসে কিছু ভুল | কোড ঠিক করুন; আবার চেষ্টায় লাভ নেই |
| 401 / 403 | পরিচয় যাচাই হয়নি / অনুমতি নেই | API key আর অনুমতি দেখুন |
| 404 | পাওয়া যায়নি | URL বা রিসোর্সের নাম দেখুন |
| 429 | অনেক বেশি রিকোয়েস্ট (রেট লিমিট) | অপেক্ষা করে ব্যাকঅফসহ আবার চেষ্টা (পাতা ১১) |
| 500–599 | সার্ভারে সমস্যা | পরে ব্যাকঅফসহ আবার চেষ্টা |
ঠিকভাবে ব্যর্থতা সামলানো
নেটওয়ার্ক তিনভাবে ব্যর্থ হয়, আর মজবুত কোড প্রতিটা আলাদাভাবে সামলায়:
import requests
def fetch_json(url):
try:
response = requests.get(url, timeout=2)
response.raise_for_status() # 4xx/5xx-কে এক্সেপশনে বদলায়
return response.json()
except requests.Timeout:
print("Timed out:", url)
except requests.HTTPError as error:
print("HTTP error:", error.response.status_code, url)
except requests.ConnectionError:
print("Could not connect:", url)
return None
print(fetch_json("https://httpbin.org/json") is not None)
fetch_json("https://httpbin.org/status/404")
fetch_json("https://httpbin.org/status/503")
fetch_json("https://httpbin.org/delay/5")True
HTTP error: 404 https://httpbin.org/status/404
HTTP error: 503 https://httpbin.org/status/503
Timed out: https://httpbin.org/delay/5- সবসময়
timeoutদিন। না দিলে যে সার্ভার কখনো উত্তর দেয় না তার জন্যrequestsচিরকাল অপেক্ষা করতে পারে, আর আপনার প্রোগ্রাম আটকে যায়। raise_for_status()এরর স্ট্যাটাসকে এক্সেপশনে বদলায়। এটা না থাকলে 404 একটা "সফল" কল, যার বডি একটা এরর পাতা।- নির্দিষ্ট এক্সেপশনগুলো ধরুন: টাইমআউট আর 503 আবার চেষ্টার মতো; 404 নয়।
আসল API key কখনো কোডে রাখবেন না। ঠিক উপায়টা পরের পাতায়।
নিজে চেষ্টা করুন
https://httpbin.org/get-এ আপনার নাম প্যারামিটার হিসেবে দিয়ে একটা GET পাঠান আর রেসপন্স থেকে নামটা প্রিন্ট করুন।get_with_retries(url, attempts=3)লিখুন, যা শুধু টাইমআউট আর 5xx এররে আবার চেষ্টা করে, প্রতিবার আরও বেশি অপেক্ষা করে।https://httpbin.org/headersদিয়ে দেখুনrequestsডিফল্টভাবে কোন কোন হেডার পাঠায়।