آبل فتحت Foundation Models ببلاش: بدّل بين Claude وGemini من غير ما تلمس كود تطبيقك
المستوى: متوسط — المقال موجّه لمطوّر iOS عنده أساس في Swift وبيقرّر هل يدخّل الذكاء الاصطناعي في تطبيقه دلوقتي ولا يستنى. لو لسه بتبدأ في Swift، في فقرة «المفهوم» مثال مبسّط يقرّبلك الفكرة قبل التفاصيل.
لو كنت بتأجّل إضافة ميزة ذكاء اصطناعي لتطبيقك بسبب فاتورة الـ API، خبر WWDC 2026 بيشيل العائق ده. آبل بتدّي وصول مجاني لنماذجها على Private Cloud Compute لأي مطوّر تطبيقه أقل من مليونين تحميل أول مرة. وفوق كده، بقيت تقدر تبدّل المزوّد — نموذج آبل المحلي، أو Claude، أو Gemini — من غير ما تغيّر منطق تطبيقك.
الخبر باختصار
في 9 يونيو 2026، خلال Platforms State of the Union، آبل أعلنت تحديث إطار Foundation Models بتلات نقاط تهمّك كمطوّر:
- وصول مجاني لنماذج آبل على Private Cloud Compute لكل تطبيق تحت مليونين تحميل أول مرة.
- بروتوكول LanguageModel جديد: واجهة Swift موحّدة تنادي بيها نموذج آبل المحلي أو نماذج سحابية من طرف تالت بنفس الكود.
- دعم إدخال الصور وDynamic Profiles لبناء سير عمل متعدد الوكلاء (multi-agent).
Anthropic وGoogle الاتنين بينشروا حزم Swift رسمية تدّيك نماذجهم. والإطار نفسه آبل قالت هتفتح مصدره (open source) خلال الصيف.
المفهوم: يعني إيه بروتوكول LanguageModel؟
تخيّل مقبس الكهرباء في الحيط. الفيشة موحّدة، فتقدر تشيل شاحن اللابتوب وتحط مكانه شاحن الموبايل في نفس المقبس من غير ما يتغيّر سلوك الحيط. اللي بيتغيّر هو الجهاز ورا الفيشة، مش المقبس نفسه.
بروتوكول LanguageModel هو «المقبس» ده بالظبط. علميًا: هو واجهة (protocol) في Swift بتحدّد شكل التعامل مع أي نموذج — إنشاء جلسة، إرسال prompt، استقبال رد، نداء الأدوات (tool calls)، وإدارة السياق. أي مزوّد (آبل، Anthropic، Google) بيعمل implement للواجهة دي في حزمة Swift Package Manager خاصة بيه. كودك بيتكلم مع الواجهة، مش مع المزوّد مباشرة. النتيجة: تبديل النموذج بيبقى تغيير في الـ dependency، مش إعادة كتابة للتطبيق.
الكود: تبديل المزوّد بأقل تعديل ممكن
الفكرة إن منطق الجلسة ثابت. اللي بيتغيّر سطر تعريف الموديل بس. مثال مبسّط:
import FoundationModels
// import AnthropicFoundation // حزمة SPM من Anthropic
// import GoogleFoundation // حزمة SPM من Google
// 1) اختَر المزوّد في مكان واحد بس
let model: any LanguageModel = SystemLanguageModel.default // نموذج آبل المحلي
// let model: any LanguageModel = AnthropicModel.claude // بدّلها لـ Claude
// let model: any LanguageModel = GeminiModel.flash // أو لـ Gemini
// 2) باقي الكود ما بيتغيّرش مهما بدّلت فوق
let session = LanguageModelSession(model: model)
let reply = try await session.respond(
to: "لخّص المراجعة دي في جملة وحدّد التقييم من 5."
)
print(reply.content)