0) الفكرة باختصار — لماذا ظهرت المشاكل؟
Codex يعمل بنمطي مصادقة مختلفين، وكل نمط يشغّل موديلات مختلفة:
| نمط الدخول | الموديلات التي تعمل | الفوترة |
|---|---|---|
| حساب ChatGPT | موديلات GPT فقط | عبر الاشتراك |
| مفتاح API | DeepSeek والمزودون الخارجيون | عبر رصيد DeepSeek |
سكربت DeepSeek الرسمي بدّل الكتالوج كاملاً إلى DeepSeek فقط، فاختفت موديلات GPT. وتطبيق الديسكتوب المسجّل بحساب ChatGPT يرفض أي موديل خارجي. الحل الكامل بالأسفل يعالج الاثنين.
1) التثبيت الرسمي من DeepSeek
- ثبّت Codex وشغّله مرة واحدة (ليُنشأ مجلد
~/.codex)، وتأكد أن النسخة 0.144.0 أو أحدث:codex --version - احصل على مفتاح API من
platform.deepseek.com/api_keys(يبدأ بـsk-) - شغّل سكربت الإعداد الرسمي:
bash <(curl -fsSL https://cdn.deepseek.com/api-docs/codex-deepseek-setup-en.sh) - اختر الموديل من القائمة وأدخل المفتاح. السكربت يعمل نسخة احتياطية في
~/.codex/backup-deepseek/ويكتب~/.codex/models.json.
deepseek-flash (و deepseek-v4-pro). الطريقة القديمة wire_api = "chat" لم تعد تعمل.2) إرجاع موديلات GPT — دمج الكتالوجين
بعد السكربت، ملف models.json يحتوي DeepSeek فقط فيخفي موديلات GPT. الدمج:
python3 -c "
import json
cache = json.load(open('/Users/turki/.codex/models_cache.json'))['models']
ds = json.load(open('/Users/turki/.codex/models.json'))['models']
slugs = {m['slug'] for m in cache}
merged = list(cache) + [m for m in ds if m['slug'] not in slugs]
json.dump({'models': merged}, open('/Users/turki/.codex/models.json','w'), ensure_ascii=False, indent=2)
print('Merged total:', len(merged))
"
النتيجة: 9 موديلات — gpt-6-astra، gpt-reserve، gpt-5.6-sol/terra/luna، gpt-5.5، codex-auto-review، deepseek-flash، deepseek-v4-pro.
ثم احذف سطري الإجبار من أعلى ~/.codex/config.toml (هما اللذان يحجبان موديلات ChatGPT):
# preferred_auth_method = "apikey" ← احذف
# forced_login_method = "api" ← احذف
وأضف profiles للتبديل السريع في التيرمنال:
[profiles.gpt]
model = "gpt-6-astra"
model_provider = "openai"
[profiles.deepseek-flash]
model = "deepseek-flash"
model_provider = "deepseek"
[profiles.deepseek-pro]
model = "deepseek-v4-pro"
model_provider = "deepseek"
codex --profile gpt
codex --profile deepseek-flash
codex --profile deepseek-pro
3) رسالة الخطأ الشهيرة — ماذا تعني؟
تعني: أنت مسجّل بحساب ChatGPT (اشتراك) وهذا الحساب يدفع لموديلات GPT فقط، بينما deepseek-flash تابع لشركة DeepSeek ويُحاسَب على مفتاح DeepSeek. في التيرمنال التبديل يعمل (مصادقة مفتاح)، أما تطبيق الديسكتوب الرسمي فيرفض الموديلات الخارجية مع تسجيل ChatGPT — وهذا قيد من التطبيق نفسه، وحلّه في الخطوة 4.
4) التبديل داخل الديسكتوب عبر CC Switch
- التثبيت:
brew install --cask cc-switch(الموقع الرسمي:ccswitch.io— مفتوح المصدر). - في لوحة Codex اختر OpenAI Official أولاً لحفظ تسجيل ChatGPT الحالي.
- فعّل: Settings → General → Codex App Enhancements → Keep official login (يبقي الهوية الرسمية أثناء استخدام مزود خارجي).
- اضغط زر + وأضف المزود بالحقول التالية:
| الحقل | القيمة |
|---|---|
| Provider Name | deepseek |
| API Key | مفتاح DeepSeek (sk-...) |
| API Request URL | https://api.deepseek.com |
| Upstream Format | Responses (native) |
| Default Model | deepseek-flash ⚠️ وليس موديل GPT |
| Full URL | مطفأ (رمادي) — وإلا سيطلب تفعيل routing |
| Model Mapping | Add Model ← deepseek-flash و deepseek-v4-pro |
base_url = "sk-..." في المعاينة)، أو ترك Default Model على موديل GPT فيُرفض من API.- اضغط بطاقة deepseek لتفعيلها.
- اقفل Codex (ديسكتوب + CLI) تماماً وأعد فتحه — ستظهر موديلات DeepSeek في المنتقي والحساب الرسمي باقٍ ظاهراً.
5) التحقق السريع
python3 -c "
import json, tomllib
d = json.load(open('/Users/turki/.codex/models.json'))
print('catalog:', [m['slug'] for m in d['models']])
c = tomllib.load(open('/Users/turki/.codex/config.toml','rb'))
print('model:', c.get('model'), '| provider:', c.get('model_provider'))
print('profiles:', list(c.get('profiles', {}).keys()))
"
codex --version
6) استكشاف الأخطاء
| العَرَض | السبب | الحل |
|---|---|---|
| اختفت موديلات ChatGPT | models.json فيه DeepSeek فقط + سطرا الإجبار | الدمج (خطوة 2) |
| not supported with a ChatGPT account | الديسكتوب مسجّل بحساب ChatGPT | CC Switch (خطوة 4) أو CLI فقط |
| الموديل الافتراضي لا يعمل بعد الدمج | موديل GPT مع مزود deepseek (أو العكس) | GPT ← openai، وDeepSeek ← deepseek |
base_url = "sk-..." | المفتاح أُدخل في خانة الرابط | الرابط https://api.deepseek.com والمفتاح في خانة API Key |
7) التراجع والنسخ الاحتياطية
~/.codex/backup-deepseek/— نسخة السكربت الرسمي (الإعداد الأصلي قبل DeepSeek).~/.codex/config.toml.pre-merge.bakوmodels.json.pre-merge.bak— نسخ ما قبل الدمج.- سكربت DeepSeek نفسه يعيد الإعداد الافتراضي من قائمته (خيار الاسترجاع).
sk-... ظهر مكشوفاً في لقطة شاشة سابقة — لا تشارك اللقطات التي تُظهره، ويفضل تدوير المفتاح من لوحة DeepSeek إذا انتشر.