فهرست مدل‌هایی که کدکس می‌بیند را می‌شود بدون کلید API و بدون یک درخواست شبکه دید. فرمان codex debug models روی نسخه‌ی 0.158.0 در این سنجش ۱۰ مدل برگرداند: هفت مدل در انتخابگر /model دیده می‌شوند و سه مدل با visibility برابر hide از آن پنهان‌اند. یکی از همان پنهان‌ها codex-auto-review است که با یک سوییچ خط فرمان صریح قابل صدا زدن است. اندازه گرفتم که هر دستور فارسی روی انکودر o200k_base حدود ۱٫۸۳ برابر هزینه‌ی معادل انگلیسی‌اش دارد، در حالی که کاتالوگ انگلیسی اسکیل‌ها روی این ماشین ۲٬۰۱۸ توکن ثابت اشغال می‌کند. یعنی مالیات فارسی روی لایه‌ای می‌افتد که خودتان نوشته‌اید، نه روی لایه‌ای که ابزار تحمیل کرده است.

کاتالوگ چه اطلاعاتی به شما می‌دهد

مستندات رسمی می‌گویند codex debug models فهرست خام مدل‌هایی را که کدکس می‌بیند به صورت JSON چاپ می‌کند، و سوییچ --bundled فقط کاتالوگ همراه باینری فعلی را می‌دهد [1][8]. این فرمان به شبکه درخواست نمی‌فرستد و روی ماشینی که هیچ اعتبارنامه‌ای ندارد هم کامل جواب می‌دهد. نصب از همان بسته‌ی npm رسمی است [3].

# نصب همان نسخه‌ای که همه‌ی اعداد این نوشته از آن آمده‌اند
npm install -g @openai/codex

# چند مدل در کاتالوگ هست
$ codex debug models | jq '.models | length'
10

# کدام‌ها در انتخابگر /model به شما نشان داده می‌شوند
$ codex debug models | jq -r '.models[] | select(.visibility=="list") | .slug'
gpt-6-astra
gpt-6-sol
gpt-6-luna
gpt-5.6-sol
gpt-5.6-terra
gpt-5.6-luna
gpt-5.5

هفت مدل دیده می‌شوند و سه مدل نه. فیلد visibility دقیقا همین تفکیک را مکانیکی می‌کند، پس لازم نیست حدس بزنید چه چیزی از شما پنهان شده است. آن را همراه نسخه‌ی کدکس ذخیره کنید، چون بدون نسخه این فهرست در آینده قابل مقایسه نیست.

نردبان تلاش استدلال هر مدل

هر مدل فهرست خودش از سطوح تلاش استدلال را اعلام می‌کند و این فهرست‌ها یکسان نیستند. برای دیدن یک‌جای همه‌ی آن‌ها، کاتالوگ را ذخیره کنید و یک اسکریپت کوچک بنویسید.

# -*- coding: utf-8 -*-
"""نردبان تلاش استدلال هر مدل را کنار وضعیت دیده‌شدنش چاپ کن."""
import json

for m in json.load(open("catalog.json"))["models"]:
    ladder = ",".join(x["effort"] for x in m["supported_reasoning_levels"])
    # مدل پنهان در انتخابگر دیده نمی‌شود ولی در کاتالوگ هست
    tag = "" if m["visibility"] == "list" else "   # پنهان از /model"
    print(f"{m['slug']:<28} {ladder}{tag}")

خروجی واقعی همین اجراست. ترجمه‌ی جدول به شکل فشرده‌تر:

مدلاولویتپیش‌فرضسطوح تلاشتعداد
gpt-6-astra1lowlow تا ultra۶
gpt-6-sol2mediumlow تا ultra۶
gpt-6-luna3mediumlow تا max۵
gpt-5.6-sol4lowlow تا ultra۶
gpt-5.512mediumlow تا xhigh۴
codex-auto-review43mediumlow تا max۵

دو نکته از همین جدول بیرون می‌آید. اول اینکه سطح ultra برای gpt-5.5 وجود ندارد، پس اگر کارتان به واگذاری خودکار زیرکار وابسته است و مدل ۵٫۵ را انتخاب کنید، به آن سطح دسترسی ندارید. دوم اینکه پیش‌فرض مدل‌ها یکسان نیست: gpt-6-astra با low شروع می‌کند و بیشتر مدل‌های دیگر با medium. یعنی اگر چیزی تنظیم نکرده‌اید، بسته به مدلی که انتخاب کرده‌اید روی دو سطح متفاوت نشسته‌اید.

در پست تنظیم تلاش استدلال کدکس از زاویه‌ی اعتبارسنجی مقدار به همین نردبان نگاه شده بود، و آنجا هم نکته‌ی ultra مطرح شد. آنچه اینجا اضافه می‌شود این است که نردبان متعلق به خود مدل است و بین مدل‌ها فرق می‌کند.

سه مدل در خروجی اسکریپت بالا با برچسب پنهان مشخص شدند و در انتخابگر ظاهر نمی‌شوند. یکی codex-auto-review است و دو مدل دیگر با نام gpt-daybreak-blue-latest و gpt-daybreak-red-latest. پنهان بودن در رابط کاربری به معنی غیرقابل فراخوانی نیست.

# یک مدل پنهان را مستقیم روی خط فرمان نام ببر
$ codex debug prompt-input -c model="codex-auto-review" | jq -c 'map(.role)'
["developer","user"]

# دو مدلی که اصلا لایه‌ی سرویس ندارند
$ codex debug models | jq -r '.models[] | select(.service_tiers|length==0) | .slug'
gpt-daybreak-blue-latest
gpt-daybreak-red-latest

آن دو مدل daybreak تنها مدل‌هایی هستند که service_tiers خالی دارند، یعنی روی این مسیر فهرست سرویس‌دهی ندارند. اگر روی مدل‌ها بودجه‌بندی می‌کنید، همین فیلد را پیش از انتخاب مدل ببینید.

انتخاب مدل، ساختار پرامپت را هم عوض می‌کند

فرمان دوم کاتالوگ را کنار می‌گذارد و خود پرامپتی را نشان می‌دهد که مدل می‌بیند. مستندات رسمی آن را برای اشکال‌زدایی کشف دستور، زمینه‌ی نشست و ساخت پرامپت معرفی کرده است [1]. در اجرای پیش‌فرض چهار آیتم برمی‌گردد: سه پیام توسعه‌دهنده و یک پیام کاربر که محیط را توصیف می‌کند.

# تعداد آیتم‌ها و نقش هر کدام
$ codex debug prompt-input | jq -c 'map(.role)'
["developer","developer","developer","user"]

# اندازه‌ی هر بلوک بر حسب کاراکتر
$ codex debug prompt-input | jq -r '.[] | .role + " " + ((.content|map(.text)|join("")|length)|tostring)'
developer 9296
developer 2429
developer 271
user 913

بلوک نخست ۹٬۲۹۶ کاراکتر است و خودش ۲٬۰۱۸ توکن می‌شود. این بلوک همان فهرست اسکیل‌هاست و روی این ماشین ده اسکیل را معرفی می‌کند. یعنی پیش از آنکه یک کلمه از شما بخواند، ۷۰٫۵ درصد کل پرامپت را تشکیل می‌دهد. اندازه‌گیری لایه‌ی ثابت از سمت فایل پروژه در پست هزینه‌ی توکن AGENTS.md انجام شده بود؛ اینجا همان اندازه‌گیری از سمت خود ابزار است.

نکته‌ی دقیق‌تر این است که این ساختار بین مدل‌ها ثابت نیست. برای هر مدل جداگانه اجرا کردم و تعداد آیتم‌ها از دو تا چهار تغییر می‌کند.

# ساختار پرامپت بسته به مدل فرق می‌کند
$ codex debug prompt-input -c model="gpt-6-astra" | jq -c 'map(.role)'
["developer","developer","developer","user"]
$ codex debug prompt-input -c model="gpt-5.6-sol" | jq -c 'map(.role)'
["developer","developer","developer","user"]
$ codex debug prompt-input -c model="gpt-5.5" | jq -c 'map(.role)'
["developer","user"]

بلوک اضافه همان multi_agent_role است و ۵۳۵ توکن می‌شود. در اندازه‌گیری من فقط روی سه مدل خانواده‌ی ۶ حاضر بود و روی هیچ مدل ۵٫۵ یا codex-auto-review نیامد. اندازه‌ی کل پرامپت هم با همین تفاوت تغییر می‌کند: حدود ۲٬۸۶۵ توکن برای gpt-6-astra در برابر ۲٬۸۶۰ برای gpt-5.5 و ۲٬۰۴۵ برای codex-auto-review. بلوک توسعه‌دهنده در دوازده اجرای پیاپی دقیقا ۲٬۶۰۵ توکن بود و بلوک اسکیل بایت‌به‌بایت یکسان ماند؛ آنچه نوسان دارد فقط بلوک محیط است که تاریخ روز را در خود دارد. یعنی انتخاب مدل فقط روی کیفیت پاسخ اثر نمی‌گذارد، روی آنچه به مدل تزریق می‌شود هم اثر می‌گذارد.

هزینه‌ی واقعی یک دستور فارسی

بخش بزرگی از پرامپت انگلیسی است، چون کاتالوگ اسکیل‌ها و بلوک‌های دستور از این زبان می‌آیند. متن شما فارسی است. هر دو روی یک انکودر سنجیده شدند.

$ python3 -c "
import tiktoken
enc = tiktoken.get_encoding('o200k_base')
pairs = [('refactor this function','این تابع را بازنویسی کن'),
         ('write a unit test for the parser','برای تجزیه‌گر یک تست واحد بنویس'),
         ('find every call site of sendMessage','همه‌ی محل‌های فراخوانی sendMessage را پیدا کن')]
en = sum(len(enc.encode(a)) for a,_ in pairs)
fa = sum(len(enc.encode(b)) for _,b in pairs)
print(f'en={en} fa={fa} ratio={fa/en:.2f}')
"
en=18 fa=33 ratio=1.83

جدول همین سه جمله:

جملهانگلیسیفارسینسبت
بازنویسی یک تابع۴۸۲٫۰۰
نوشتن تست واحد۷۱۲۱٫۷۱
یافتن محل‌های فراخوانی۷۱۳۱٫۸۶
جمع۱۸۳۳۱٫۸۳

نسبت ۱٫۸۳ یعنی به ازای هر ۱۰ توکن انگلیسی نزدیک ۱۸ توکن فارسی می‌پردازید. کاتالوگ انگلیسی اسکیل‌ها با ۲٬۰۱۸ توکن ثابت و کوتاه‌نشدنی، بار اول را به دوش نمی‌کشد. پس مالیات زبان روی بخشی می‌افتد که خودتان نوشته‌اید. اگر دستورهای شما تکرارشونده است و نشست‌ها بلند، نوشتن دستور به انگلیسی و ترجمه‌ی خروجی در عمل صرفه دارد.

یک نکته که باید صریح گفته شود: بلوک persistent_instructions در کاتالوگ هست و برای سه مدل خانواده‌ی ۶ مقدار ۱٬۰۷۷ توکنی دارد، اما در رندر ورودی مدل پیدا نشد. آن را در متن پرامپت جست‌وجو کردم و نبود، پس نباید آن را جزو هزینه‌ی هر نوبت حساب کنید.

سه کنترل که عددها را قابل اعتماد می‌کند

هر عدد این نوشته از یک اجرای واقعی روی همین ماشین آمده، نه از مستندات. سه کنترل اجرا شد تا معلوم شود این اعداد قابل تکرارند و به چیزی بیرون از باینری وابسته نیستند.

# کنترل یک: دو اجرا باید یکسان باشند
$ codex debug models | sha256sum | cut -c1-16
4f1aeccf869197d0
$ codex debug models | sha256sum | cut -c1-16
4f1aeccf869197d0

# کنترل دو: با شبکه‌ی بسته هم همان فهرست می‌آید
$ HTTPS_PROXY=http://127.0.0.1:9 codex debug models | jq '.models|length'
10
$ HTTPS_PROXY=http://127.0.0.1:9 codex debug models --bundled | jq '.models|length'
10

# کنترل سه: کاتالوگ با پیکربندی شخصی فیلتر نمی‌شود
$ CODEX_HOME=./h codex debug models | jq '.models|length'
10

کنترل دو یک نتیجه‌ی روشن دارد: چون خروجی پیش‌فرض و خروجی --bundled بایت‌به‌بایت یکی بود، کاتالوگ از شبکه نیامده و همراه باینری است. پس نسخه‌ی کدکس شما تعیین می‌کند چه مدل‌هایی می‌بینید [4]. همین فهرست در ۲٫۱۵۳٫۴ اصلاح شد، جایی که دیده‌شدن Astra در انتخابگر مدل همراه درست شد [2][5]. متن لایه‌ی سرعت Astra هم در ۲٫۱۵۳٫۲ از ۱٫۵ به ۲ برابر اصلاح شد، که فقط متن نمایشی بود [6].

کنترل سه برخلاف انتظارم بود: نوشتن model در پیکربندی، فهرست کاتالوگ را کم نمی‌کند. این فرمان آنچه در دسترس است را نشان می‌دهد، نه آنچه فعال است. برای مدل فعال باید داخل نشست سراغ /status بروید [9].

نسخه‌ی نصب‌شده و وضعیت اعتبار را هم ثبت کنید، چون بدون نسخه هیچ‌کدام از این عددها با نصب بعدی قابل مقایسه نیستند.

$ codex --version
codex-cli 0.158.0

$ codex doctor 2>&1 | head -5
Codex Doctor v0.158.0 · linux-x86_64

Notes
   ↑ updates      0.160.0 available (current 0.158.0)
   ✗ auth         no Codex credentials were found - Run codex login or provide an API key through a supported auth env var.

خط auth در خروجی دکتر همان چیزی است که این سنجش را ممکن کرد. روی این ماشین هیچ اعتبارنامه‌ای نصب نبود و با این حال هر دو فرمان کامل جواب دادند. برای دیدن کاتالوگ و پرامپت، نه کلید API می‌خواهید و نه هزینه‌ای می‌پردازید. مسیر ورود با کلید API جداگانه توضیح داده شده است [7] و خود فرمان‌ها در مرجع خط فرمان مستند شده‌اند [1][8].

جمع‌بندی: چهار کاری که همین حالا بکنید

  1. نسخه را ثبت کنید و کاتالوگ را ذخیره کنید: codex --version و codex debug models > catalog.json.
  2. مدل فعال را جداگانه چک کنید. کاتالوگ با پیکربندی شما فیلتر نمی‌شود، پس فایل ذخیره‌شده به شما نمی‌گوید الان روی کدام مدل هستید.
  3. نردبان استدلال مدلی را که انتخاب می‌کنید با اسکریپت بالا ببینید، نه از حافظه. وجود یا نبود سطح ultra در چند مدل متفاوت است.
  4. اگر کارتان تکرارشونده و بلند است، دستورهای ثابت را انگلیسی بنویسید و خروجی را ترجمه کنید. نسبت ۱٫۸۳ روی بخشی می‌افتد که مال شماست.

کاتالوگ یعنی چه چیزی در دسترس است، نه چه چیزی فعال است. همین تفکیک کوچک، بیشتر چیزی است که در انتخابگر /model پنهان می‌ماند.

منابع

  1. مرجع خط فرمان کدکس — تعریف رسمی codex debug models و codex debug prompt-input و سوییچ --bundled، خوانده‌شده در ۲ اکتبر ۲۰۲۶
  2. یادداشت تغییرات کدکس — نسخه‌های ۲۰۲۶، از جمله اصلاح دیده‌شدن Astra در ۲٫۱۵۳٫۴
  3. بسته‌ی @openai/codex در npm — خط نصب رسمی و روش‌های نصب
  4. صفحه‌ی انتشارهای کدکس در گیت هاب — شماره‌ی نسخه‌ها و برچسب‌های انتشار
  5. ادغام ۴۲۸۷۴ در کدکس — اصلاح دیده‌شدن Astra در انتخابگر مدل همراه
  6. ادغام ۴۲۶۳۲ در کدکس — اصلاح متن لایه‌ی سرعت Astra، فقط متن نمایشی و نه رفتار درخواست
  7. مستند احراز هویت کدکس — مسیر ورود با کلید API در کنار ورود با حساب
  8. نسخه‌ی متنی همان مرجع خط فرمان — متن دقیق دو فرمان، خوانده‌شده در ۲ اکتبر ۲۰۲۶
  9. مرجع دستورهای اسلش کدکس — جایگاه /model و /status در رابط کاربری