📊 مستوى المقال: متوسط — يحتاج معرفة أساسية بـ Anthropic SDK والتعامل مع REST APIs بـ Python.
Files API في Claude: ارفع PDF كامل وخلّيه يجاوب بدون ما تبني RAG
لو عندك PDF فيه 180 صفحة من سياسات الموارد البشرية، وعايز موظفينك يسألوه أسئلة بالعربي، الطريقة المنتشرة بتقولك: ابنِ RAG. قسّم الملف لـ chunks، ولّد embeddings، خزّنها في pgvector، اعمل retrieval، وبعدين ابعت السياق لـ Claude. ده بياخد أسبوع بناء، وصيانة دائمة، وفاتورة infra. Files API من Anthropic بيعمل نفس الفكرة في 4 سطور كود.
المشكلة باختصار
أول مشروع AI بيقابل المطوّر العربي بنفس السيناريو: المستخدم بيرفع PDF كبير، وعايز إجابات منه. لو رميت الملف كله في كل طلب على Claude، هتدفع 200 ألف توكن إدخال لكل سؤال. لو عملت RAG، عندك stack جديد كامل: vector DB، embedding model، chunking، reranking، monitoring. Files API بيقدّم خيار وسط نسيه أغلب الشروحات بالعربي.
الفكرة باختصار: ارفع الملف مرة واحدة، خزّن الـ file_id، وابعتله في كل request بدل ما تبعت الـ PDF نفسه. الـ prompt caching على مستوى Anthropic بيخفّض التكلفة لمّا نفس النص يتكرّر، ومش محتاج إنفراستركتشر إضافي خالص.
تخيّل كاميرا فحص الحقائب في المطار
لمّا تعدّي حقيبتك في فحص المطار، الكاميرا بتاخدلها صورة وبتحفظها مع رقم تعريف. الموظف لو جه يسأل بعد ساعة "إيه اللي في الحقيبة دي؟" مش بيعيد الفحص من الصفر؛ بيكتب رقم الحقيبة وبيشوف النتيجة المخزّنة فوراً. Files API بيشتغل بنفس المنطق: الـ PDF بيتفحص ويتعالج مرة واحدة عند الرفع، Anthropic بيرجّعلك file_id، وكل سؤال بعد كده بيشير للرقم ده بدل ما يعيد إرسال الملف كله.
التعريف العلمي الدقيق
Files API هو endpoint من Anthropic بيقبل ملفات (PDFs، صور PNG/JPG، نصوص) حتى 32MB لكل ملف. بيخزّنها في object storage مدار، وبيرجّع معرّف فريد. الـ messages.create بياخد content block من نوع document فيه source.type=file و source.file_id. النموذج بيقرأ الـ PDF بـ vision على مستوى pixel — يعني بيشوف الجداول والصور والنصوص العربية المُسحوبة من Word مش بيعتمد على OCR خارجي. ده مهم للـ PDFs العربية لأن أغلب OCR engines بتاخد دقة 70-80% مع الخط العربي، Claude vision بيوصل لـ 96%+ على نفس النوع من الملفات.
الكود الفعلي — 4 سطور بدل أسبوع
import anthropic
client = anthropic.Anthropic()
# الخطوة 1: ارفع الـ PDF مرة واحدة
file = client.beta.files.upload(
file=("hr_policy_2026.pdf", open("hr_policy_2026.pdf", "rb"), "application/pdf"),
)
# الخطوة 2: استخدم الـ file_id في كل سؤال جديد
response = client.beta.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
betas=["files-api-2025-04-14"],
messages=[{
"role": "user",
"content": [
{"type": "document", "source": {"type": "file", "file_id": file.id}},
{"type": "text", "text": "كم يوم إجازة سنوية للموظف بعد 5 سنين خدمة؟"},
],
}],
)
print(response.content[0].text)