cd ../back to blog
$Guide//June 4, 2026//6 min read

استدعاء Claude عبر الـ SDK الخاص بـ OpenAI — غيّر سطراً واحداً واحتفظ بشيفرتك

استدعِ Claude الأصلي (Opus 4.7 وSonnet 4.6 وHaiku 4.5) عبر الـ SDK الخاص بـ OpenAI دون تعديل، بتوجيه ندائك عبر Brievio. غيّر base_url فقط: نفس الـ streaming والأدوات والرؤية وصيغة JSON.

الـ SDK الخاص بـ Anthropic ممتاز، لكن منظومة الذكاء الاصطناعي بأكملها توحّدت على شكل عميل OpenAI — فكل مثال، وكل مُحوِّل إطار عمل، وكل درس «hello world» يفترض أن لديك نسخة جاهزة من OpenAI(...) في متناول يدك. ونقل شيفرتك لتستدعي الـ SDK الخاص بـ Anthropic مباشرة هو إعادة هيكلة ذات تكلفة لا يُستهان بها.

لكنه ليس حتمياً. يبيّن هذا المقال كيف تستدعي Claude Opus 4.7 وSonnet 4.6 وHaiku 4.5 عبر الـ SDK الخاص بـ OpenAI دون أي تعديل — وذلك بتوجيه ندائك عبر Brievio. الـ SDK نفسه، والأنواع نفسها، والـ streaming نفسه، واستخدام الأدوات نفسه، والنموذج الأصلي على الطرف الآخر. السطر الوحيد الذي يتغيّر هو base_url.

أدنى تغيير ممكن

مع وجود حزمة openai الخاصة بـ Python مثبّتة مسبقاً، يبدو الانتقال الكامل على هذا النحو.

main.py
from openai import OpenAI

client = OpenAI(
    api_key="sk-brievio-...",
    base_url="https://api.brievio.com/v1",   # السطر الوحيد الذي يتغيّر
)

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",              # معرّف Claude، وليس gpt-4o
    messages=[
        {"role": "system", "content": "You are a senior platform engineer."},
        {"role": "user",   "content": "Critique this SQL migration..."},
    ],
)
print(resp.choices[0].message.content)

يصبح api_key مفتاح Brievio الخاص بك (يُنشأ في /app/keys). ويشير base_url إلى الـ gateway الخاص بنا. ويتحول معرّف النموذج من gpt-4o إلى معرّف Claude — claude-opus-4-7 أو claude-sonnet-4-6 أو claude-haiku-4-5. أما جسم الطلب، وشكل الاستجابة، وكل دالة مساعدة في الـ SDK فتتصرّف تماماً كما تتصرّف مع OpenAI.

الـ Streaming

يعمل الـ streaming بشكل مطابق. يمرّر Brievio أجزاء SSE الخاصة بـ Anthropic في صيغة chat.completion.chunk الخاصة بـ OpenAI، بحيث يعمل نمط التكرار غير المتزامن القائم لديك دون أي تعديل.

stream.py
for chunk in client.chat.completions.create(
    model="claude-opus-4-7",
    messages=[{"role": "user", "content": "Explain Raft in 200 words."}],
    stream=True,
):
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

استخدام الأدوات / استدعاء الدوال

بروتوكول استخدام الأدوات لدى Anthropic مطابق دلالياً لاستدعاء الدوال لدى OpenAI — فهما لا يختلفان إلا على مستوى البروتوكول السلكي. يترجم Brievio مصفوفة tools، وحقل tool_calls في الاستجابة، ورسائل tool اللاحقة في الاتجاهين. استخدم tool_choice="auto" أو "none" أو أداة مسمّاة — وكلها تُترجم على ما يقابلها.

tools.py
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get current weather in a city",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["city"],
            },
        },
    }
]

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
    tools=tools,
    tool_choice="auto",
)
print(resp.choices[0].message.tool_calls)

الرؤية

صار Claude متعدد الوسائط منذ الإصدار 3.5؛ وتمرير صورة يجري بمصفوفة OpenAI القياسية content: [{ type: 'text' }, { type: 'image_url' }]. ويمكن أن تكون image_url.url رابط https أو مُعرّف موارد data: بترميز base64.

vision.py
resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "What's in this image?"},
            {"type": "image_url",
             "image_url": {"url": "https://example.com/cat.jpg"}},
        ],
    }],
)

عندما تريد فعلاً الـ SDK الأصلي لـ Anthropic

بعض الخصائص الحصرية لـ Anthropic يتعذّر التعبير عنها بشكل OpenAI — وأهمها توجيه cache_control الخاص بتخزين الـ prompt مؤقتاً، وتوكنات thinking الموسّعة. وإن احتجت إلى أيٍّ منهما، فبدّل الـ SDK مع الإبقاء على المفتاح نفسه: إذ يكشف Brievio أيضاً نقطة النهاية الأصلية /v1/messages، فيعمل الـ SDK الخاص بـ Anthropic هو الآخر بتغيير واحد فقط في base_url.

anthropic_native.py
from anthropic import Anthropic

client = Anthropic(
    api_key="sk-brievio-...",
    base_url="https://api.brievio.com",     # يلحق الـ SDK المسار /v1/messages
)

resp = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    system="You are a senior platform engineer.",
    messages=[{"role": "user", "content": "What is a hot standby?"}],
)
print(resp.content[0].text)

راجع وثائق Messages API الأصلية للاطلاع على القائمة الكاملة للمعاملات المُمرَّرة، و /docs/caching لمعرفة كيف يوفّر تخزين الـ prompt مؤقتاً ما يصل إلى 90% من تكلفة المدخلات على الـ prompts المتكرّرة.

ما الذي تتنازل عنه — وما الذي تكسبه

مسار شكل OpenAI ترجمة، لا بروتوكول أصلي. وثمة أمران صغيران لا يعبران الحدود:

  • cache_control الخاص بتخزين الـ prompt مؤقتاً — استخدم لذلك الـ SDK الأصلي الخاص بـ Messages، أو مرّره عبر مَنفذ التجاوز input.
  • توكنات thinking الموسّعة — متاحة في كائن الاستهلاك ضمن الاستجابة، لكن ليس كمعامل طلب مباشر؛ فانتقل إلى الـ SDK الأصلي إن احتجت إلى تحكّم دقيق.

أما ما تكسبه فجوهري: SDK واحد يغطي كاتالوج Claude وGemini وGPT-Image وVeo الأصلي؛ ونحو 15% دون سعر القائمة الرسمي على كل نموذج، محتسَباً على أعداد التوكنات الحقيقية؛ وفوترة أصلية عبر Stripe؛ وتوجيه شفّاف — إذ تعرض اللوحة دائماً أي مزوّد خلفي خدم كل نداء فعلاً.

دقيقتان للتأكّد

سجّل في brievio.com/app/signup — يغطّي الرصيد المجاني البالغ 2 دولار بضعة آلاف من نداءات Claude. ضع base_url الخاص بك، وبدّل معرّف نموذجك إلى معرّف Claude، وشغّل مجموعة اختباراتك القائمة ضده. وإن لم يعبر شيء ما بنظافة، فراسل contact@brievio.com — فنحن نقرأ كل رسالة.