Loading
Loading
Claude API يفتح لك الاحتمالات الكاملة لبناء تطبيقات AI حقيقية. في هذا الدرس ستتعلم من الـ authentication وحتى الـ streaming.
# Python
pip install anthropic
# Node.js / TypeScript
npm install @anthropic-ai/sdk
# أو Bun
bun add @anthropic-ai/sdk
Python:
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-xxx")
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{"role": "user", "content": "اشرح لي ما هو الذكاء الاصطناعي في 3 جمل"}
]
)
print(message.content[0].text)
TypeScript:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
const message = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [
{ role: "user", content: "اشرح لي ما هو الذكاء الاصطناعي في 3 جمل" }
],
});
console.log(message.content[0].text);
messages = [
{"role": "user", "content": "ما هو Python؟"},
{"role": "assistant", "content": "Python لغة برمجة..."}, # رد سابق
{"role": "user", "content": "ما هي أفضل مكتباتها؟"}, # سؤال جديد
]
هكذا تبني محادثة متعددة الأدوار.
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system="أنت مساعد تقني متخصص في Python. أجب دائماً بأمثلة كود.",
messages=[
{"role": "user", "content": "كيف أعكس قائمة؟"}
]
)
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "اكتب قصيدة عن البرمجة"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Streaming ضروري لتطبيقات الـ chat — يُظهر الرد فور توليده بدلاً من الانتظار.
import base64
with open("screenshot.png", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data,
},
},
{"type": "text", "text": "ما المشكلة في هذا الكود؟"}
],
}
],
)
Tool Use يسمح لـ Claude باستدعاء دوال في كودك:
tools = [
{
"name": "get_weather",
"description": "احصل على الطقس في مدينة معينة",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "اسم المدينة"}
},
"required": ["city"]
}
}
]
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "ما طقس الرياض اليوم؟"}]
)
# إذا أراد Claude استخدام الأداة:
if message.stop_reason == "tool_use":
tool_call = next(b for b in message.content if b.type == "tool_use")
city = tool_call.input["city"]
weather_result = fetch_weather_api(city) # دالتك الحقيقية
# ثم أرسل النتيجة لـ Claude ليكمل إجابته
from anthropic import APIStatusError, APIConnectionError, RateLimitError
try:
message = client.messages.create(...)
except RateLimitError:
# انتظر وأعد المحاولة
time.sleep(60)
except APIStatusError as e:
if e.status_code == 529: # Overloaded
print("API مزدحم — حاول لاحقاً")
except APIConnectionError:
print("تعذّر الاتصال — فحص الشبكة")
| النموذج | Input ($/1M token) | Output ($/1M token) | |---------|-------------------|-------------------| | Haiku 4.5 | $0.80 | $4 | | Sonnet 4.6 | $3 | $15 | | Opus 4.8 | $15 | $75 |
نصيحة: استخدم Haiku للمهام البسيطة المتكررة وOpus للتحليل المعقد.
# تطبيق Chat كامل مع Claude API
# يدعم: محادثة متعددة الأدوار + Streaming + حفظ السجل
import anthropic
import json
from pathlib import Path
from datetime import datetime
client = anthropic.Anthropic() # يقرأ ANTHROPIC_API_KEY من env تلقائياً
HISTORY_FILE = Path("chat_history.json")
def load_history() -> list[dict]:
"""تحميل سجل المحادثة"""
if HISTORY_FILE.exists():
return json.loads(HISTORY_FILE.read_text(encoding="utf-8"))
return []
def save_history(messages: list[dict]) -> None:
"""حفظ سجل المحادثة"""
HISTORY_FILE.write_text(
json.dumps(messages, ensure_ascii=False, indent=2),
encoding="utf-8"
)
def chat(
user_input: str,
history: list[dict],
system_prompt: str = "أنت مساعد ذكي تتحدث العربية. أجب بإيجاز ووضوح.",
model: str = "claude-opus-4-8",
stream: bool = True
) -> tuple[str, list[dict]]:
"""
إرسال رسالة والحصول على رد مع streaming اختياري.
يُرجع (الرد, السجل المحدَّث).
"""
# إضافة رسالة المستخدم
history.append({"role": "user", "content": user_input})
full_response = ""
if stream:
print("Claude: ", end="", flush=True)
with client.messages.stream(
model=model,
max_tokens=2048,
system=system_prompt,
messages=history
) as stream_ctx:
for text in stream_ctx.text_stream:
print(text, end="", flush=True)
full_response += text
print() # سطر جديد بعد الرد
else:
message = client.messages.create(
model=model,
max_tokens=2048,
system=system_prompt,
messages=history
)
full_response = message.content[0].text
print(f"Claude: {full_response}")
# إضافة رد Claude للسجل
history.append({"role": "assistant", "content": full_response})
return full_response, history
def main():
print("=" * 50)
print("🤖 Claude Chat — اكتب 'خروج' للإنهاء")
print("=" * 50)
# تحميل السجل السابق أو البدء من جديد
choice = input("
هل تريد استئناف المحادثة السابقة؟ (y/n): ").strip().lower()
history = load_history() if choice == "y" else []
if history:
print(f"✅ تم تحميل {len(history)} رسالة سابقة")
system_prompt = """أنت مساعد AI متخصص للطلاب في أكاديمية Darhous.
مهامك:
- شرح مفاهيم AI وBrainomvation بطريقة مبسطة
- مساعدة في الكود والأخطاء التقنية
- تقديم أمثلة عملية وواقعية
أسلوبك: ودود، واضح، موجز — بالعربية."""
session_messages: list[dict] = [] # رسائل الجلسة الحالية فقط
while True:
user_input = input("
أنت: ").strip()
if not user_input:
continue
if user_input in ["خروج", "exit", "quit"]:
# دمج رسائل الجلسة مع السجل وحفظه
full_history = history + session_messages
save_history(full_history)
print(f"
✅ تم حفظ {len(full_history)} رسالة في {HISTORY_FILE}")
break
_, session_messages = chat(
user_input=user_input,
history=history + session_messages, # السياق الكامل
system_prompt=system_prompt
)
# نبقي فقط رسائل الجلسة الحالية في session_messages
# لتجنب التكرار مع history
if len(session_messages) > 2:
session_messages = session_messages[-20:] # آخر 10 أزواج
if __name__ == "__main__":
main()