Loading
Loading
AWS Bedrock خدمة مُدارة تتيح الوصول إلى نماذج AI كبيرة من شركات متعددة عبر API موحّد.
مدفوع بالاستخدام (pay-per-token):
import json
# ─── محاكاة Bedrock Runtime ────────────────────────────────
class BedrockRuntime:
"""محاكاة boto3 bedrock-runtime client"""
MODELS = {
"anthropic.claude-3-haiku-20240307-v1:0": {
"name": "Claude 3 Haiku", "provider": "Anthropic",
"in_price": 0.00025, "out_price": 0.00125,
},
"anthropic.claude-3-sonnet-20240229-v1:0": {
"name": "Claude 3 Sonnet", "provider": "Anthropic",
"in_price": 0.003, "out_price": 0.015,
},
"amazon.titan-text-express-v1": {
"name": "Titan Text Express", "provider": "Amazon",
"in_price": 0.0002, "out_price": 0.0006,
},
}
def list_foundation_models(self) -> list:
return [
{"modelId": mid, "modelName": m["name"], "providerName": m["provider"]}
for mid, m in self.MODELS.items()
]
def invoke_model(self, modelId: str, body: dict) -> dict:
if modelId not in self.MODELS:
raise ValueError(f"النموذج {modelId} غير متاح")
m = self.MODELS[modelId]
prompt = (body.get("messages") or [{"content": ""}])[-1].get("content", "")
in_tok = max(10, int(len(prompt.split()) * 1.3))
out_tok = 80
cost = (in_tok / 1000) * m["in_price"] + (out_tok / 1000) * m["out_price"]
return {
"content": [{"text": f"[{m['name']}] ردّي على: {prompt[:50]}..."}],
"usage": {"input_tokens": in_tok, "output_tokens": out_tok},
"cost_usd": round(cost, 7),
}
# ─── Claude Wrapper ────────────────────────────────────────
class ClaudeOnBedrock:
def __init__(self, model: str = "anthropic.claude-3-haiku-20240307-v1:0"):
self._rt = BedrockRuntime()
self.model = model
self.total_cost = 0.0
self.total_calls = 0
def chat(self, message: str, system: str = "") -> str:
body = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"system": system,
"messages": [{"role": "user", "content": message}],
}
resp = self._rt.invoke_model(self.model, body)
self.total_cost += resp["cost_usd"]
self.total_calls += 1
cost_str = "$" + f"{resp['cost_usd']:.7f}"
print(f" tokens: {resp['usage']['input_tokens']}in + {resp['usage']['output_tokens']}out | cost: {cost_str}")
return resp["content"][0]["text"]
def summary(self):
total_str = "$" + f"{self.total_cost:.6f}"
print(f"\n📊 ملخص الاستخدام:")
print(f" المكالمات : {self.total_calls}")
print(f" إجمالي التكلفة : {total_str}")
# ─── عرض النماذج ───────────────────────────────────────────
runtime = BedrockRuntime()
print("🤖 النماذج المتاحة على AWS Bedrock:")
for m in runtime.list_foundation_models():
print(f" [{m['providerName']:<12}] {m['modelName']}")
print(f" ID: {m['modelId']}")
print()
# ─── اختبار Claude 3 Haiku ─────────────────────────────────
print("=" * 55)
print("💬 اختبار Claude 3 Haiku عبر Bedrock:")
print("=" * 55)
claude = ClaudeOnBedrock()
questions = [
("ما هو AWS Bedrock؟", "أجب بجملتين فقط بالعربية"),
("متى أستخدم Haiku بدلاً من Sonnet؟", "جملة واحدة فقط"),
("ما هي مزايا Bedrock على Claude API؟", ""),
]
for q, sys_prompt in questions:
print(f"\n❓ {q}")
answer = claude.chat(q, system=sys_prompt)
print(f"💡 {answer}")
claude.summary()
print("\n✅ تم اختبار AWS Bedrock بنجاح!")