كنت أتنقل بين عدة نوافذ في المتصفح؛ نافذة أستخدم فيها Claude لتبادل الأفكار حول هيكلية برمجية معقدة لنظام خلفي Backend، ونافذة أخرى أعتمد فيها على Gemini من أجل مراجعة أجزاء سريعة من الكود وتوليد دوال يومية. الأمر كان فوضوياً، ومشتتاً للتركيز، ويستهلك الكثير من وقتي في نسخ ولصق الأكواد بين المحرر والمتصفح. الأسوأ من ذلك، هو صعوبة توحيد كل هذه النماذج داخل بيئة تطوير واحدة دون الاعتماد على إضافات مدفوعة تقيدك بخياراتها.
قررت أن آخذ خطوة للوراء وأبني مساعد الكود الشخصي الخاص بي، بيئة موحدة Model Agnostic لا تعتمد على مزود واحد، وتعمل مباشرة من داخل محررات الأكواد التي أفضلها مثل OpenCode و VS Code. الأهم من ذلك؟ أن تعمل هذه البيئة بخفة متناهية وبدون استهلاك موارد جهازي المحدودة، بعيداً عن تعقيدات الحاويات الثقيلة.
بيئة العمل والمتطلبات التقنية
ملاحظة هامة: لن نستخدم Docker هنا أبداً. الحاويات تستهلك جزءاً كبيراً من الذاكرة العشوائية (RAM) وتؤدي إلى بطء ملحوظ في الأجهزة الاقتصادية، لذا سنعتمد كلياً على بيئة Python الافتراضية (Virtual Environment) النظيفة.
لماذا نحتاج إلى خادم محلي موحد؟
في عالم مليء بنماذج الذكاء الاصطناعي، يمتلك كل نموذج نقطة قوة فريدة. على سبيل المثال، أعتمد بشكل يومي وروتيني على نموذج Gemini 3.5 Flash لأنه سريع جداً، ذكي في استيعاب سياق الملفات الكبيرة، ومثالي لمهام البرمجة اليومية السريعة والتحليل. في المقابل، عندما أحتاج إلى بناء هياكل معمارية معقدة (Complex Architectures) أو كتابة تصميم لنظام قواعد بيانات متداخل، أتوجه فوراً إلى Claude.
المشكلة التقنية هنا تكمن في "التجزئة" (Fragmentation). كل شركة (Google, Anthropic, OpenAI) تستخدم هيكلية بيانات مختلفة (JSON Payload) لنقطة النهاية (Endpoint) الخاصة بها. إذا أردت دمج هذه النماذج في بيئة التطوير (IDE) الخاصة بك، ستضطر إلى كتابة طبقة توافقية (Adapter Layer) لكل نموذج. هنا يأتي دور LiteLLM. هذه الأداة الرائعة تعمل كخادم وسيط (Proxy Server) محلي، تستقبل الطلبات بصيغة OpenAI القياسية – والتي تدعمها معظم إضافات محررات الأكواد – ثم تقوم بترجمتها وتوجيهها (Routing) إلى النموذج المطلوب بسلاسة تامة.
التحديات التقنية في بناء المساعد
تشريح الشفرة: بناء وتكوين الخادم الوسيط
# إنشاء بيئة افتراضية جديدة للحفاظ على نظافة النظام
python -m venv aiproxy_env
# تفعيل البيئة (لأنظمة ويندوز استخدم: aiproxy_env\Scripts\activate)
source aiproxy_env/bin/activate
# تثبيت أداة الخادم الوسيط
pip install litellm[proxy]
في السطور السابقة، ركزنا على عزل بيئة العمل باستخدام venv. هذه الخطوة حيوية في عالم Python خصوصاً عند العمل على أنظمة ويندوز لضمان عدم تعارض مكتبات الخادم مع أي مشاريع خلفية (Backend) أخرى تعمل عليها، مثل مشاريع Django أو Flask. بعد تفعيل البيئة، قمنا بتثبيت litellm مع إضافة [proxy] والتي تجلب الحزم اللازمة لتشغيل الخادم المحلي المستند إلى FastAPI تحت الغطاء.
model_list:
# النموذج الأول: للمهام اليومية السريعة والتحليل (السرعة والكفاءة)
- model_name: daily-coder
litellm_params:
model: gemini/gemini-3.1-flash
api_key: os.environ/GEMINI_API_KEY
# النموذج الثاني: للمهام المعمارية المعقدة والتحليل العميق
- model_name: senior-architect
litellm_params:
model: anthropic/claude-3-opus-20240229
api_key: os.environ/ANTHROPIC_API_KEY
litellm_settings:
drop_params: true
export GEMINI_API_KEY="your_gemini_key_here"
export ANTHROPIC_API_KEY="your_claude_key_here"
# تشغيل الخادم المحلي على المنفذ 4000
litellm --config config.yaml --port 4000
عند تنفيذ الأمر الأخير، سيقوم تطبيقنا بإطلاق خادم ويب محلي خفيف الوزن يعمل على http://localhost:4000. ما حدث هنا هو أننا استبدلنا الاعتماد على حاويات Docker التي تستهلك جيجابايت من الذاكرة، بخادم مبني على ASGI يستهلك بضع عشرات من الميجابايتات فقط، وهو أمر ممتاز للحفاظ على سرعة حواسيبنا الشخصية وترك مساحة الذاكرة (RAM) لمتصفح الويب ومحرر الأكواد.
دمج ببيئة التطوير (OpenCode و VS Code)
بعد تشغيل الخادم، سيبدو محرر الأكواد الخاص بك وكأنه يتحدث مع واجهة OpenAI الأصلية. داخل إضافة الذكاء الاصطناعي في محرر VS Code أو OpenCode (مثل أداة Continue.dev أو Cline)، قم بضبط إعدادات النماذج لتشير إلى خادمك المحلي.
{
"models": [
{
"title": "Gemini 3.1 Flash (Daily)",
"provider": "openai",
"model": "daily-coder",
"apiBase": "http://localhost:4000",
"apiKey": "sk-local-dummy-key"
},
{
"title": "Claude 3 (Architect)",
"provider": "openai",
"model": "senior-architect",
"apiBase": "http://localhost:4000",
"apiKey": "sk-local-dummy-key"
}
]
}
كيف تعمل هذه الهيكلية؟
في إعدادات المحرر (IDE)، نخبر الأداة أن تتعامل مع النماذج على أنها من نوع openai (كمزود). نقطة السحر الحقيقية تكمن في توجيه الـ apiBase إلى الخادم المحلي الخاص بنا http://localhost:4000. وضعنا apiKey وهمي لأن الخادم المحلي الخاص بنا لا يطلب مصادقة محلية (المصادقة الحقيقية تحدث في الخلفية داخل config.yaml قبل الإرسال إلى Google أو Anthropic). لقد حققنا الآن دمجاً مثالياً: نستطيع تظليل أي كود في المحرر، وطلب تحليله سريعاً عبر Gemini 3.1 Flash، أو طلب بناء نظام معقد عبر Claude، كل ذلك من واجهة واحدة!
حالات فشل الإتصال
ماذا لو انقطع الاتصال أو تم استنفاد الرصيد المتاح (Rate Limit) لنموذج Claude أثناء جلسة برمجة مكثفة؟
يجب أن نضع احتمالات الفشل في الحسبان. LiteLLM يسمح لنا بإنشاء "توجيه احتياطي" (Fallback Routing). إذا تعذر الوصول لنموذج، يقوم تلقائياً بإعادة توجيه الطلب (Payload) إلى نموذج آخر دون أن تشعر بتوقف المحرر عن العمل، مما يضمن استمرارية سير العمل.
لماذا الـ Model Agnostic هو المستقبل؟
الاعتماد الكلي على منصة واحدة يعرضك لما يُعرف بـ (Vendor Lock-in). اليوم، قد يكون Gemini 3.1 Flash هو الأسرع لمهامك، وغداً قد تطلق شركة مثل DeepSeek أو Qwen نماذج مفتوحة المصدر تتفوق في البرمجة. من خلال بناء هذا الخادم الوسيط، قمت بتجريد (Abstracting) طبقة الذكاء الاصطناعي عن بيئة التطوير الخاصة بك. يمكنك استبدال، إضافة، أو إزالة أي نموذج مستقبلاً عبر تعديل بسيط في ملف config.yaml دون لمس إعدادات محرر الأكواد الخاص بك. هذا هو النهج الأفضل الذي تتبناه الشركات الكبرى لتقليل التكاليف وزيادة المرونة.
تطوير الكود
تلميحة الحل والأكواد المقترحة
ستحتاج إلى إضافة مفتاح fallbacks على مستوى إعدادات النموذج في ملف YAML وتحديد قائمة بأسماء النماذج البديلة التي سيحاول الاتصال بها بالترتيب.
الخاتمة
لقد قمنا بتصميم وبناء مساعد كود شخصي مرن للغاية. لم نكتفِ فقط بحل مشكلة التشتت بين المتصفحات، بل بنينا طبقة وسطى قوية تمنحنا تحكماً مطلقاً في تدفق البيانات والنماذج التي نستخدمها. استخدمنا بيئة Python افتراضية بدلاً من حاويات Docker للحفاظ على خفة ومرونة الأداء وتوفير موارد حاسوبنا لتشغيل المحرر براحة تامة. الاعتماد على Gemini 3.1 Flash للمهام اليومية و Claude للهياكل المعقدة عبر واجهة موحدة، رفع من إنتاجيتي في كتابة الأكواد بشكل لا يصدق.
كيف تدير بيئة الذكاء الاصطناعي داخل محرر الأكواد الخاص بك؟ هل جربت دمج نماذج أخرى مثل DeepSeek أو Qwen؟ شاركني رأيك وهيكليتك المفضلة في التعليقات.
هل واجهتك مشكلة أثناء تطبيق هذا المشروع؟
لا تبرمج بمفردك! شارك لقطة شاشة للخطأ (Screenshot) في مجتمعنا لنحلها معاً.
انضم لمجتمع الشفرة والحلول