Batch API في Claude: قلّل تكلفة الطلبات الجماعية 50% بدون تعديل كود
مستوى المقال: محترف — يفترض إنك بنيت تطبيق فعلي على Claude API وعندك حجم طلبات يومي ≥ 1000 طلب، وعارف ازاي تتعامل مع async jobs.
لو بتعالج آلاف الطلبات اليومية على Claude (تلخيص مستندات، classification، توليد embeddings، تنظيف بيانات) وفاتورتك بتقترب من الـ 1000 دولار شهريًا، Batch API بينزّل التكلفة 50% بدون ما تغيّر سطر واحد في الـ business logic. الشرط الوحيد: قابل تستنى الردود لحد 24 ساعة.
المشكلة باختصار
الـ Messages API العادي بيتعامل مع كل طلب على حدة، بيرجّع الرد في ثوانٍ، ودي خدمة real-time. لكن مش كل workload محتاج رد فوري. لو عندك nightly job بيلخّص 5000 مستند، أو script بيولّد metadata لـ 50000 منتج كل أسبوع، إنت بتدفع تسعير real-time على شغل أساسه offline. ده تبذير حقيقي مش تحسين هامشي.
اللي بيحصل فعلاً في معظم تطبيقات الـ AI الناضجة: 60% من الطلبات بتيجي من background jobs، و40% بس من user-facing flows. ومع ذلك الفريق بيدفع نفس السعر على الاتنين.
تخيّل المشهد ده — مثال للي مش متعود على API pricing
تخيّل إنك صاحب مطعم. عندك زبون بيطلب delivery دلوقتي (عايزه ساخن خلال 30 دقيقة)، وزبون تاني بيحجز catering لمؤتمر بكرة الصبح (المهم النتيجة، مش الوقت). لو أنت ذكي، هتخصم 50% للزبون التاني، لإنك تقدر تحضّر طلبه بالليل ساعة المطبخ ما بيكونش مزحوم.
ده بالظبط الفرق بين Messages API و Batch API. الأول delivery فوري، التاني catering مجدول. شغل أساسه نتيجة، مش وقت رد.
التعريف العلمي الدقيق
Batch API هو endpoint منفصل (/v1/messages/batches) بيستقبل لحد 100,000 طلب في batch واحد، وبيرجّع كل النتائج خلال نافذة قصوى 24 ساعة (في الواقع غالبًا أقل من ساعة). كل طلب جوّه الـ batch بيتحاسب بسعر 0.5x من سعر الـ standard tier على نفس الموديل، input و output الاتنين. السقف الأقصى لحجم الـ batch المنفرد: 256 MB.
الافتراض المهم: الـ batch مش بيدّيك ضمان زمني أقل من الـ 24 ساعة. لو وصلتك النتيجة في 12 دقيقة، خد بالك إن ده صدفة وليس SLA.
إزاي تشغّله — كود Python شغّال على Anthropic SDK
import anthropic
import time
client = anthropic.Anthropic()
# 1. ابني الطلبات
documents = [...] # 1000 مستند
requests = [
{
"custom_id": f"doc-{i}",
"params": {
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": f"لخّص المستند ده في 3 نقاط: {doc}"}
]
}
}
for i, doc in enumerate(documents)
]
# 2. ابعت الـ batch
batch = client.messages.batches.create(requests=requests)
print(f"Batch ID: {batch.id}, status: {batch.processing_status}")
# 3. polling كل دقيقة
while True:
status = client.messages.batches.retrieve(batch.id)
if status.processing_status == "ended":
break
time.sleep(60)
# 4. استخرج النتائج
for result in client.messages.batches.results(batch.id):
if result.result.type == "succeeded":
text = result.result.message.content[0].text
save_summary(result.custom_id, text)
elif result.result.type == "errored":
log_error(result.custom_id, result.result.error)