المستوى المطلوب: متوسط
Batch API في Claude: ادفع 50% أقل لمعالجة آلاف الأسئلة غير العاجلة
لو فاتورة Claude API بقت $300 يوميًا في معالجة 10,000 طلب لتصنيف مقالات أو ترجمة منتجات أو تلخيص تذاكر دعم، Batch API بيقطع الفاتورة دي للنص — $150 — على نفس الموديل وبنفس جودة الإجابة بالظبط. الثمن الوحيد إنك بتنتظر النتائج لحد 24 ساعة بدل ثواني.
المشكلة باختصار
أكتر من 60% من الـ workloads اللي بتشتغل على LLMs مش بتحتاج رد فوري فعلاً. تصنيف 50,000 إيميل دعم، توليد metadata لمكتبة 12,000 منتج، تقييم 8,000 محادثة شات بوت — كل ده بيشتغل في الخلفية ومحدش بيستنى الرد على الشاشة. لكن أغلب الفرق بتبعت الطلبات دي على الـ real-time endpoint وبتدفع السعر الكامل. ده هدر مباشر في الفاتورة بدون أي مكسب في تجربة المستخدم.
إيه هو Batch API بمثال للمبتدئ
تخيّل عندك مكتب بريد. لما تبعت رسالة Express delivery بتدفع 50 جنيه وبتوصل في ساعة. لو الرسالة مش مستعجلة (فاتورة كهرباء مثلًا)، بتبعتها بريد عادي بـ 5 جنيه وبتوصل خلال يومين. الفرق مش في جودة الرسالة ولا اللي مكتوب فيها، الفرق في الأولوية والثمن. الموظفين والشاحنات نفسهم بيشتغلوا، بس بأولوية أقل ومن غير ضغط زمني.
Batch API هو نفس الفكرة بالظبط: بتاخد آلاف الطلبات، بتحطها في حزمة واحدة، بتبعتها لـ Anthropic، وبيرجّعلك النتائج كلها مرة واحدة خلال نافذة زمنية أقصاها 24 ساعة، بنصف السعر.
التعريف التقني الدقيق
Batch API هو endpoint غير متزامن (asynchronous) بيستقبل لحد 100,000 طلب في batch واحد، بحجم إجمالي يصل لـ 256 ميجابايت. كل batch بيمر بحالات بسيطة: in_progress ثم ended. النتائج بترجع في ملف JSONL يبقى متاح للتنزيل لمدة 29 يوم. الـ pricing موحّد على كل موديلات Claude: 50% خصم على input tokens و 50% خصم على output tokens، مع الحفاظ على نفس دقة الموديل بدون أي تغيير.
الخصم ده مش "أحيانًا". هو موثّق في صفحة الأسعار الرسمية لـ Anthropic، وبيتطبّق على كل request جوّا الـ batch بدون استثناء. الفكرة إنك بتدي Anthropic مرونة في توقيت التنفيذ، فبيقدروا يستغلّوا الـ idle capacity في ساعات قليلة الضغط، وبيمرّروا الوفر دا ليك.
كود Python شغّال على Anthropic SDK
خليني أوريك إزاي ترفع 1000 طلب تصنيف تذاكر دعم دفعة واحدة. الكود ده شغّال على مكتبة anthropic الإصدار 0.40 وأعلى:
import anthropic
from anthropic.types.messages.batch_create_params import Request
client = anthropic.Anthropic()
# 1) جهز الطلبات (هنا 1000 تذكرة دعم للتصنيف)
tickets = load_tickets_from_db(limit=1000) # دالتك الخاصة
requests = [
Request(
custom_id=f"ticket-{ticket.id}",
params={
"model": "claude-haiku-4-5-20251001",
"max_tokens": 64,
"messages": [{
"role": "user",
"content": f"صنف التذكرة دي: bug, feature, billing, other.\n\n{ticket.text}"
}]
}
)
for ticket in tickets
]
# 2) ابعت الـ batch
batch = client.messages.batches.create(requests=requests)
print(f"Batch ID: {batch.id} - State: {batch.processing_status}")
# 3) استنى لحد ما يخلص (in_progress -> ended)
import time
while True:
batch = client.messages.batches.retrieve(batch.id)
if batch.processing_status == "ended":
break
print(f"Still in_progress... {batch.request_counts}")
time.sleep(60) # افحص كل دقيقة، مش كل ثانية
# 4) نزل النتائج JSONL
for result in client.messages.batches.results(batch.id):
if result.result.type == "succeeded":
ticket_id = result.custom_id
classification = result.result.message.content[0].text
save_classification(ticket_id, classification)