Loading
Loading
Lambda خدمة Serverless تُشغّل الكود بدون إدارة خوادم — تدفع فقط عند التنفيذ.
أول استدعاء يستغرق وقتاً أطول لتهيئة الـ Container. الحل: Provisioned Concurrency للتطبيقات الحساسة للزمن.
مليون استدعاء/شهر مجاناً — كافٍ لجميع مشاريع التعلم.
import json
import time
# ─── محاكاة Lambda Context ─────────────────────────────────
class LambdaContext:
function_name = "ai-chat-lambda"
memory_limit_mb = 512
timeout_ms = 30_000
aws_request_id = "req-abc123-def456"
log_group = "/aws/lambda/ai-chat-lambda"
# ─── Bedrock Client (محاكاة) ──────────────────────────────
class BedrockClient:
def invoke(self, message: str) -> str:
return f"[Claude على Bedrock] رد على: {message[:55]}..."
# ─── Lambda Handler ────────────────────────────────────────
def lambda_handler(event: dict, context: LambdaContext) -> dict:
"""
Lambda Function للـ AI Chatbot
يُستدعى من API Gateway (HTTP POST /chat)
"""
print(f"📥 RequestId: {context.aws_request_id}")
start = time.time()
# ── تحليل الطلب ──
try:
raw_body = event.get("body", "{}")
body = json.loads(raw_body) if isinstance(raw_body, str) else raw_body
message = body.get("message", "").strip()
lang = body.get("lang", "ar")
if not message:
return _resp(400, {"error": "حقل 'message' مطلوب"})
if len(message) > 2000:
return _resp(400, {"error": "الرسالة طويلة جداً (الحد 2000 حرف)"})
except (json.JSONDecodeError, AttributeError) as e:
return _resp(400, {"error": f"JSON غير صالح: {e}"})
# ── استدعاء Bedrock ──
bedrock = BedrockClient()
answer = bedrock.invoke(message)
duration = round((time.time() - start) * 1000, 1)
remaining = context.timeout_ms - duration
print(f"⚡ وقت المعالجة: {duration}ms | المتبقي: {remaining}ms")
return _resp(200, {
"answer": answer,
"lang": lang,
"duration_ms": duration,
"model": "claude-3-haiku",
"request_id": context.aws_request_id,
})
def _resp(status: int, data: dict) -> dict:
return {
"statusCode": status,
"headers": {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
"body": json.dumps(data, ensure_ascii=False),
}
# ─── اختبار محلي ───────────────────────────────────────────
ctx = LambdaContext()
print("🧪 اختبار Lambda Function محلياً:")
print("=" * 55)
tests = [
{"message": "اشرح AWS Lambda باختصار", "lang": "ar"},
{"message": "What is serverless computing?", "lang": "en"},
]
for body in tests:
event = {"body": json.dumps(body, ensure_ascii=False)}
res = lambda_handler(event, ctx)
data = json.loads(res["body"])
print(f"\n📨 {body['message']}")
print(f"🔢 Status : {res['statusCode']}")
print(f"💬 Answer : {data['answer']}")
print(f"⏱️ Time : {data['duration_ms']}ms")
# طلب خاطئ
print(f"\n\n🔴 اختبار حالة خطأ (رسالة فارغة):")
err_ev = {"body": json.dumps({"message": ""})}
err_res = lambda_handler(err_ev, ctx)
err_data = json.loads(err_res["body"])
print(f"Status: {err_res['statusCode']} — {err_data['error']}")
# معلومات الدالة
print(f"\n\n📊 معلومات Lambda Function:")
mem_str = str(ctx.memory_limit_mb) + " MB"
print(f" الاسم : {ctx.function_name}")
print(f" الذاكرة : {mem_str}")
print(f" Timeout : {ctx.timeout_ms} ms")
print(f" Log Group : {ctx.log_group}")