Claude API للمطورين — الدليل العربي الشامل من الصفر للإنتاج

كلود API هو بوابتك لدمج أقوى نموذج لغوي في أي تطبيق تبنيه — موقع ويب، تطبيق موبايل، خدمة ويب، أداة أتمتة، أو نظام مؤسسي. الوثائق الرسمية ممتازة لكنها بالإنجليزية، وهذا الدليل يُقدّم كل ما تحتاجه بالعربية مع أمثلة عملية حقيقية قابلة للنسخ والتطبيق الفوري.
من إنشاء مفتاح API أول مرة، إلى التعامل مع الـ Streaming وTool Use والصور والـ Batch Processing — كل شيء في مكان واحد، بترتيب منطقي يُناسب المطور العملي الذي يريد البناء لا القراءة.
الخطوة الأولى: إعداد مفتاح API
ANTHROPIC_API_KEY=sk-ant-xxx... وأضف .env لملف .gitignore.تثبيت SDK Python
pip install anthropic python-dotenv # ملف .env ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
import anthropic
from dotenv import load_dotenv
import os
load_dotenv()
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
# أول استدعاء
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[
{"role": "user", "content": "مرحباً كلود، ما هو الذكاء الاصطناعي؟"}
]
)
print(message.content[0].text)تثبيت SDK Node.js / TypeScript
npm install @anthropic-ai/sdk dotenv
import Anthropic from '@anthropic-ai/sdk';
import * as dotenv from 'dotenv';
dotenv.config();
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY
});
async function askClaude(question: string): Promise {
const message = await client.messages.create({
model: 'claude-sonnet-4-5',
max_tokens: 1024,
messages: [
{ role: 'user', content: question }
]
});
return (message.content[0] as { type: string; text: string }).text;
}
// تشغيل
askClaude("ما هي أبرز قدرات كلود AI؟").then(console.log); اختيار النموذج المناسب
| النموذج | السرعة | الجودة | التكلفة نسبياً | الاستخدام الأمثل |
|---|---|---|---|---|
| claude-haiku-4-5 | سريع جداً | جيد | منخفضة جداً | التصنيف، الاستخراج، الردود البسيطة |
| claude-sonnet-4-5 | سريع | ممتاز | متوسطة | معظم تطبيقات الإنتاج |
| claude-opus-4-5 | أبطأ | استثنائي | مرتفعة | المهام المعقدة والإبداعية |
System Prompt — تشكيل شخصية كلود
System Prompt هو التعليمات الثابتة التي تُحدد دور كلود وأسلوبه وقيوده في تطبيقك. يُرسل مرة واحدة ويُطبّق على كل المحادثة:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2000,
system="""أنت مساعد قانوني متخصص في القانون التجاري السعودي.
دورك: مساعدة رواد الأعمال في فهم المتطلبات القانونية.
القواعد الصارمة:
- لا تُقدّم استشارة قانونية ملزمة — أنت مساعد معلوماتي فقط
- انصح دائماً بمراجعة محامٍ معتمد للقرارات الحاسمة
- استند للأنظمة السعودية ذات الصلة (نظام الشركات، نظام العمل...)
- اللغة: عربية فصحى سلسة
- الطول: إجابات مفيدة ومباشرة""",
messages=[
{"role": "user", "content": "ما متطلبات تأسيس شركة ذات مسؤولية محدودة في السعودية؟"}
]
)Streaming — الاستجابة الفورية حرفاً بحرف
Streaming يُرسل الإجابة تدريجياً بدلاً من انتظار الإجابة كاملة، مما يُحسّن تجربة المستخدم بشكل جذري:
# Python Streaming
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=2000,
messages=[{"role": "user", "content": "اشرح الذكاء الاصطناعي في 500 كلمة"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True) # طباعة حرفاً بحرف
print() # سطر جديد في النهاية// Node.js Streaming مع Express لـ Server-Sent Events
app.get('/stream', async (req, res) => {
const question = req.query.q as string;
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
const stream = await client.messages.stream({
model: 'claude-sonnet-4-5',
max_tokens: 2000,
messages: [{ role: 'user', content: question }]
});
for await (const chunk of stream) {
if (chunk.type === 'content_block_delta' &&
chunk.delta.type === 'text_delta') {
res.write(`data: ${JSON.stringify({text: chunk.delta.text})}\n\n`);
}
}
res.write('data: [DONE]\n\n');
res.end();
});Tool Use (Function Calling) — كلود يستدعي الأدوات
Tool Use يُمكّن كلود من استدعاء دوال في كودك — جلب بيانات، تنفيذ عمليات، استدعاء APIs خارجية:
tools = [
{
"name": "get_weather",
"description": "جلب الطقس الحالي لأي مدينة",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "اسم المدينة بالعربية أو الإنجليزية"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "وحدة الحرارة"
}
},
"required": ["city"]
}
},
{
"name": "search_database",
"description": "البحث في قاعدة بيانات المنتجات",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "مصطلح البحث"},
"max_results": {"type": "integer", "description": "عدد النتائج الأقصى"}
},
"required": ["query"]
}
}
]
# الاستدعاء الأول — كلود يقرر استخدام أداة
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "ما طقس الرياض الآن؟"}]
)
# معالجة طلب الأداة
if response.stop_reason == "tool_use":
tool_use = next(b for b in response.content if b.type == "tool_use")
tool_name = tool_use.name
tool_input = tool_use.input
# تنفيذ الدالة الفعلية
if tool_name == "get_weather":
result = fetch_weather(tool_input["city"])
# إرسال النتيجة لكلود
final_response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "ما طقس الرياض الآن؟"},
{"role": "assistant", "content": response.content},
{
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": str(result)
}]
}
]
)
print(final_response.content[0].text)Vision — تحليل الصور
كلود يرى الصور ويفهم محتواها — تحليل مخططات، قراءة فواتير، وصف صور المنتجات:
import base64
from pathlib import Path
def analyze_image(image_path: str, question: str) -> str:
"""تحليل صورة محلية بكلود"""
# تحويل الصورة لـ Base64
image_data = base64.standard_b64encode(
Path(image_path).read_bytes()
).decode("utf-8")
# تحديد نوع الصورة
ext = Path(image_path).suffix.lower()
media_types = {".jpg": "image/jpeg", ".png": "image/png", ".webp": "image/webp"}
media_type = media_types.get(ext, "image/jpeg")
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": media_type,
"data": image_data
}
},
{
"type": "text",
"text": question
}
]
}]
)
return message.content[0].text
# استخدام: تحليل فاتورة
result = analyze_image(
"invoice.jpg",
"استخرج: رقم الفاتورة، التاريخ، المبلغ الإجمالي، اسم المورد. أجب بـ JSON."
)
print(result)Batch Processing — معالجة آلاف الطلبات بتكلفة 50% أقل
Message Batches API مثالي لمعالجة كميات كبيرة من الطلبات غير العاجلة بنصف السعر:
import anthropic
# إنشاء Batch من 1000 طلب
batch_requests = []
for i, text in enumerate(texts_to_classify[:1000]):
batch_requests.append({
"custom_id": f"request_{i}",
"params": {
"model": "claude-haiku-4-5",
"max_tokens": 100,
"messages": [{
"role": "user",
"content": f"صنّف هذا النص: {text}\nأجب بكلمة واحدة: إيجابي/سلبي/محايد"
}]
}
})
# إرسال الـ Batch
batch = client.beta.messages.batches.create(requests=batch_requests)
print(f"Batch ID: {batch.id}")
# التحقق من الحالة (قد يستغرق دقائق لساعات)
import time
while True:
batch_status = client.beta.messages.batches.retrieve(batch.id)
if batch_status.processing_status == "ended":
break
print(f"قيد المعالجة... {batch_status.request_counts}")
time.sleep(30)
# قراءة النتائج
for result in client.beta.messages.batches.results(batch.id):
print(f"{result.custom_id}: {result.result.message.content[0].text}")Prompt Caching — تخفيض التكلفة 90% للسياقات الطويلة
حين تُرسل نفس الوثائق أو System Prompt الطويل مع كل استدعاء، Caching يُخزّنه ويُكلّف 10% فقط في الاستدعاءات التالية:
# لوثيقة طويلة تُستخدم مراراً كسياق
long_document = open("company_manual.txt").read() # 50,000 كلمة مثلاً
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "أنت مساعد الشركة. استند لدليل الشركة للإجابة.",
},
{
"type": "text",
"text": long_document,
"cache_control": {"type": "ephemeral"} # تفعيل التخزين المؤقت
}
],
messages=[{"role": "user", "content": "ما سياسة الإجازات؟"}]
)
# الاستدعاء الثاني يستخدم النسخة المُخزّنة بـ 10% من السعر
print(response.usage) # cache_read_input_tokens سيكون مرتفعاًمعالجة الأخطاء الشاملة للإنتاج
import anthropic
import time
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def robust_api_call(prompt: str, max_retries: int = 3) -> str:
"""استدعاء API مع معالجة أخطاء كاملة وإعادة المحاولة"""
client = anthropic.Anthropic()
for attempt in range(max_retries):
try:
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2000,
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
except anthropic.RateLimitError as e:
# تجاوز حد الطلبات — انتظر وأعد المحاولة
wait_time = 2 ** attempt # 1, 2, 4 ثوانٍ
logger.warning(f"Rate limit. انتظار {wait_time} ثانية...")
time.sleep(wait_time)
except anthropic.APIConnectionError as e:
# مشكلة شبكة
logger.error(f"خطأ اتصال: {e}")
if attempt == max_retries - 1:
raise
except anthropic.AuthenticationError as e:
# مفتاح API غير صالح
logger.error("مفتاح API غير صالح. تحقق من ANTHROPIC_API_KEY")
raise # لا فائدة من إعادة المحاولة
except anthropic.BadRequestError as e:
# طلب غير صالح (برومبت كبير جداً أو محتوى محظور)
logger.error(f"طلب غير صالح: {e}")
raise
except anthropic.APIError as e:
# خطأ عام في API
logger.error(f"خطأ API: {e.status_code} - {e.message}")
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt)
raise Exception("فشلت جميع المحاولات")بناء Wrapper خدمة API جاهز للإنتاج
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import HTTPBearer
from pydantic import BaseModel
import anthropic
import os
app = FastAPI(title="Claude API Wrapper", version="1.0")
security = HTTPBearer()
class ChatRequest(BaseModel):
message: str
system_prompt: str = "أنت مساعد مفيد."
model: str = "claude-sonnet-4-5"
max_tokens: int = 1000
class ChatResponse(BaseModel):
response: str
input_tokens: int
output_tokens: int
model_used: str
@app.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest, token: str = Depends(security)):
# التحقق من مفتاح التطبيق الخاص بك
if token.credentials != os.environ["APP_SECRET_KEY"]:
raise HTTPException(status_code=401, detail="غير مصرّح")
client = anthropic.Anthropic()
try:
message = client.messages.create(
model=request.model,
max_tokens=request.max_tokens,
system=request.system_prompt,
messages=[{"role": "user", "content": request.message}]
)
return ChatResponse(
response=message.content[0].text,
input_tokens=message.usage.input_tokens,
output_tokens=message.usage.output_tokens,
model_used=request.model
)
except anthropic.APIError as e:
raise HTTPException(status_code=500, detail=str(e))نصائح تحسين الأداء والتكلفة
التصنيف، الاستخراج، الترجمة البسيطة — Haiku يُنجزها بنفس جودة Sonnet وبـ 5% من التكلفة تقريباً. طبّق هذا القرار منهجياً في كل مهمة.
لا تضبط max_tokens على 4096 دائماً. للردود القصيرة المتوقعة، 300-500 token يكفي. أنت تدفع لكل token مُولَّد فعلاً، لكن التحديد الخاطئ قد يقطع الإجابة.
أي system prompt طويل أو وثائق مرجعية ثابتة تُضيف cache_control: ephemeral. في التطبيقات الكثيفة، يُوفّر هذا 70-90% من تكلفة الـ input tokens.
لأي مهمة معالجة دُفعية (تحليل مئات المستندات، توليد محتوى بالجملة)، Batches API يُخفّض التكلفة 50% تلقائياً.
كل استجابة تحتوي usage بعدد input وoutput tokens. سجّلها في قاعدة بيانات لتتبع التكلفة، اكتشاف الطلبات الشاذة، وتحسين الـ prompts.
أنشئ مجموعة اختبار من 20-50 حالة مع الإجابات المتوقعة. شغّل الاختبار تلقائياً بعد كل تغيير في الـ System Prompt لضمان عدم الانحدار.
حين تحتاج بيانات منظمة، اطلب JSON صريحاً واستخدم Pydantic للتحقق. أجهز دائماً معالجة للحالات التي لا يُنتج فيها كلود JSON صالحاً.
قيّس وقت الاستجابة لكل نوع طلب. Haiku أسرع بمرات من Opus. للتطبيقات التفاعلية، الـ Streaming يُحسّن الإحساس بالسرعة حتى لو كان الوقت الكلي مشابهاً.
الجواهر الخمسة — تطبيقات Claude API المتقدمة
API wrapper يستقبل محتوى بأي لغة، يترجمه لعربية سلسة بكلود، يُكيّفه ثقافياً للسوق السعودي أو الإماراتي أو المصري، وينشره تلقائياً — خدمة قابلة لبيعها لوكالات المحتوى.
تطبيق يستقبل مراجعات العملاء بأي لغة، يُحللها بكلود، يُصنّفها ويُلخّصها، ويُولّد تقرير اتجاهات أسبوعي — API يُباع كخدمة SaaS لعلامات التجزئة.
يُحلّل الكود المصدري بكلود ويُولّد توثيقاً كاملاً: README، API Reference، أمثلة الاستخدام — يُوفّر ساعات على كل مشروع ويُحسّن جودة التوثيق.
API يستقبل ملف عقد، يُرسله لكلود للتحليل القانوني، يُحدد البنود الإشكالية والمفقودة، ويُولّد ملخصاً تنفيذياً — يُباع للشركات كخدمة مراجعة أولية قبل المحامي.
يستقبل أي محتوى تعليمي ويُولّد اختبارات متنوعة (MCQ، صح وخطأ، مقالي) بمستويات صعوبة مختلفة ومع نماذج إجابة — مثالي للمنصات التعليمية والجامعات.
الأسئلة الشائعة
🧭 اكتشف المزيد
مواضيع مرتبطة من أقسام أخرى تُكمّل ما تعلمته