/chat/completions; различается только значение поля model — значит, A/B-прогон делается одним скриптом.openai, API-ключ, файл prompts.txt с 20 реальными задачами. Всё, чего нет в наших постах (цены, размер контекста, лимиты), — сверьте с документацией провайдера, эти цифры я не подставляю.| Что сравниваем | GPT-5.5 Instant | GPT-6.1 Sol | Где взять значение |
|---|---|---|---|
| Позиционирование | режим с акцентом на скорость отклика (следует из названия) | старшая модель ветки 6.x (следует из названия) | документация провайдера |
| Идентификатор в API | `<id из /v1/models>` | `<id из /v1/models>` | ответ `GET /v1/models` |
| Цена за 1M входных / выходных токенов | сверьте с документацией | сверьте с документацией | прайс-лист |
| Размер контекста | сверьте с документацией | сверьте с документацией | документация |
| Лимиты RPM/TPM | сверьте с документацией | сверьте с документацией | панель аккаунта |
| Среднее время ответа на ваших промптах | заполняется в Шаге 2 | заполняется в Шаге 2 | ваш `report.csv` |
| Стоимость 1000 запросов | заполняется в Шаге 3 | заполняется в Шаге 3 | ваш `report.csv` |
Важно: в постах канала характеристики этих двух моделей не публиковались, поэтому все «железные» параметры выше вы получаете из документации и прайса, а не из этой статьи. Сравнение GPT-6.1 Sol с предыдущим поколением — в отдельном гайде GPT-6.1 Sol или GPT-4o: сравнение моделей и что выбрать.

Поток данных простой: prompts.txt → bench.py → API по адресу BASE_URL → report.csv. Ничего, кроме одного скрипта и одного файла с задачами, не нужно.
Что сделать: поставить пакет, задать переменные окружения, получить точные идентификаторы моделей.
Зачем: идентификаторы, цены и лимиты у каждого аккаунта свои; если вписать «на глаз», скрипт упадёт с 404 или посчитает стоимость нулём.
Как проверить: команда ниже печатает список доступных вам моделей — в нём должны найтись обе.
python3 --version # нужно 3.10+
pip install --upgrade openai
export OPENAI_API_KEY="sk-..."
export BASE_URL="https://api.openai.com/v1" # замените, если у вас другой провайдер/агрегатор
curl -s "$BASE_URL/models" -H "Authorization: Bearer $OPENAI_API_KEY" \
| python3 -c "import sys,json; [print(m['id']) for m in json.load(sys.stdin)['data']]"
Ожидаемый вывод — список строк вида gpt-..., по одной на модель. Найдите в нём два идентификатора и сохраните их:
export MODEL_A="<id GPT-5.5 Instant из списка>"
export MODEL_B="<id GPT-6.1 Sol из списка>"
export PRICE_IN_A=0 PRICE_OUT_A=0 PRICE_IN_B=0 PRICE_OUT_B=0 # цены за 1M токенов из прайса
Нули в ценах — временная заглушка: скрипт выполнится, но колонка стоимости будет нулевой. Подставьте цены из прайса (сверьте с документацией), иначе Шаг 3 не даст ответа про деньги. Почему это работает: GET /v1/models возвращает ровно те модели, к которым у ключа есть доступ, — это дешёвая проверка прав до вызова платных запросов.

Что сделать: положить 20 своих типовых задач в prompts.txt (одна строка — одна задача, кодировка UTF-8) и запустить скрипт.
Зачем: одинаковая нагрузка на обе модели даёт сравнимые цифры. Пример содержимого файла — реальные задачи, а не абстракции:
Сократи этот текст до 3 пунктов: <текст>
Напиши письмо клиенту об отмене заказа №1234
Найди ошибку в этом SQL: SELECT * FORM orders
Как проверить: скрипт печатает таблицу и создаёт report.csv.
# bench.py
import csv, os, time
from openai import OpenAI
client = OpenAI(base_url=os.environ["BASE_URL"], api_key=os.environ["OPENAI_API_KEY"])
models = {"MODEL_A": os.environ["MODEL_A"], "MODEL_B": os.environ["MODEL_B"]}
price_in = {"MODEL_A": float(os.environ["PRICE_IN_A"]), "MODEL_B": float(os.environ["PRICE_IN_B"])}
price_out = {"MODEL_A": float(os.environ["PRICE_OUT_A"]), "MODEL_B": float(os.environ["PRICE_OUT_B"])}
prompts = [l.strip() for l in open("prompts.txt", encoding="utf-8") if l.strip()]
rows = []
for name, model_id in models.items():
lat, cost, out_tok = [], 0.0, 0
for p in prompts:
t0 = time.perf_counter()
r = client.chat.completions.create(model=model_id,
messages=[{"role": "user", "content": p}])
lat.append(time.perf_counter() - t0)
u = r.usage
cost += u.prompt_tokens / 1e6 * price_in[name] + u.completion_tokens / 1e6 * price_out[name]
out_tok += u.completion_tokens
time.sleep(0.5) # чтобы не ловить 429 на маленьких лимитах
lat.sort()
rows.append({"model": name, "id": model_id,
"avg_latency_s": round(sum(lat) / len(lat), 2),
"p95_latency_s": round(lat[int(len(lat) * 0.95) - 1], 2),
"avg_out_tokens": round(out_tok / len(prompts)),
"cost_per_1k_usd": round(cost / len(prompts) * 1000, 2)})
with open("report.csv", "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
w.writeheader(); w.writerows(rows)
print(open("report.csv", encoding="utf-8").read())
python3 bench.py
На экране появятся две строки CSV с колонками model,id,avg_latency_s,p95_latency_s,avg_out_tokens,cost_per_1k_usd. Цифры будут ваши — здесь я их не привожу, чтобы не выдавать чужие замеры за ваши.
Пример: cost_per_1k_usd считается по формуле (входные_токены/1e6 × цена_входа + выходные_токены/1e6 × цена_выхода) × 1000. Поэтому цена в переменных PRICE_* должна быть именно за 1 миллион токенов — если в прайсе она за 1K, умножьте на 1000, иначе получите ошибку в тысячу раз.
Почему это работает: usage в ответе API — это фактические токены, списанные с баланса, а не оценка по символам, поэтому стоимость считается точно.

Что сделать: прочитать report.csv, посчитать разницу и заполнить чек-лист решения.
Зачем: выбор «на глаз» по одному удачному ответу почти всегда оказывается неверным на потоке задач.
Как проверить: команда выводит обе строки рядом — этого достаточно для решения.
python3 - <<'EOF'
import csv
rows = list(csv.DictReader(open("report.csv", encoding="utf-8")))
a, b = rows[0], rows[1]
print(f"латентность: {a['avg_latency_s']}s vs {b['avg_latency_s']}s")
print(f"p95: {a['p95_latency_s']}s vs {b['p95_latency_s']}s")
print(f"1000 запросов: ${a['cost_per_1k_usd']} vs ${b['cost_per_1k_usd']}")
EOF
Ожидаемый вывод — три строки с вашими числами. Если cost_per_1k_usd равен 0.0 у обеих моделей, значит цены не подставлены: вернитесь в Шаг 1 и заполните PRICE_*.
Чек-лист перед решением:
prompts.txt не меньше 20 задач, и они похожи на реальную нагрузкуavg_latency_s у обеих моделей не пустойcost_per_1k_usd больше нуля (цены подставлены)Чат и повседневные задачи (письма, суммаризация, перевод, черновики). Критерий — время ответа и стоимость, потому что запросов много, а каждый дешёвый. Пример: 200 сообщений в день в поддержке — разница в 0,5 с на ответ заметна оператору, разница в цене за 1000 запросов видна в счёте. Если на вашем прогоне Instant укладывается в приемлемое качество — берите его и не усложняйте.
API и продакшн. Критерий — p95-латентность, а не среднее, и стоимость на 1000 запросов, а не на один. Смотрите на p95_latency_s: если он вдвое выше среднего, часть пользователей будет ждать заметно дольше. Сравнение с офисными ассистентами и Copilot — в гайде ChatGPT Office или Microsoft 365 с Copilot: что выбрать.
Сложные задачи и агенты (разбор договоров, ревью кода, многошаговые сценарии с инструментами). Здесь платят за качество: если Sol на ваших промптах заметно точнее, дешевле отдать ему только тяжёлые запросы. Про построение таких сценариев — ИИ-агенты для автоматизации задач: гид по инструментам.
Гибридная схема — самый частый рабочий вариант: роутинг по типу задачи, оба идентификатора в одном конфиге.
HEAVY = ("анализ договора", "ревью кода", "план проекта")
def pick_model(task: str) -> str:
return os.environ["MODEL_B"] if any(k in task.lower() for k in HEAVY) else os.environ["MODEL_A"]
Проверка: print(pick_model("ревью кода в PR #42")) печатает идентификатор Sol, print(pick_model("переведи письмо")) — идентификатор Instant.
Проблема. Скрипт падает на первом же запросе, модель «не существует».
Error code: 404 - {'error': {'message': 'The model \<id>\ does not exist or you do not have access to it.', 'type': 'invalid_request_error', 'code': 'model_not_found'}}MODEL_A/MODEL_B попал идентификатор из статьи или из чужого аккаунта, а не из вашего списка моделей.curl -s "$BASE_URL/models" -H "Authorization: Bearer $OPENAI_API_KEY", скопируйте id дословно и переэкспортируйте переменные; затем echo $MODEL_A — должно совпасть посимвольно.Проблема. Прогон обрывается на длинном промпте.
Error code: 400 - {'error': {'message': "This model's maximum context length is <N> tokens. However, your messages resulted in <M> tokens.", 'type': 'invalid_request_error', 'code': 'context_length_exceeded'}}python3 -c "print(len(open('prompts.txt',encoding='utf-8').read()))" покажет объём файла в символах — если он в разы больше контекста модели, дело в этом.Проблема. На 10-м запросе прогон встаёт с лимитом.
Error code: 429 - {'error': {'message': 'Rate limit reached for requests', 'type': 'requests', 'code': 'rate_limit_exceeded'}}time.sleep(0.5) на time.sleep(2.0) и запустите снова; при повторной ошибке запускайте по одной модели за раз, закомментировав вторую в словаре models.Выбор делается по вашему report.csv: сначала отсеките модель, которая не проходит по качеству, затем сравните p95_latency_s и cost_per_1k_usd у оставшихся. Дальше перенесите победивший идентификатор в продовый конфиг, а второй оставьте в переменных окружения для гибридного роутинга тяжёлых задач.
GPT-5.5 Instant — это быстрая, но менее точная модель?
Такой вывод нельзя делать из названия. В постах канала характеристики не публиковались, поэтому точность проверяется только вашим прогоном на 20 реальных промптах из Шага 2.
Можно ли держать обе модели в одном приложении?
Да. Модель — это параметр запроса model, а не отдельный клиент: один OpenAI(...) и функция pick_model() из раздела «Как выбрать» переключают модели по типу задачи.
Что дешевле — GPT-5.5 Instant или GPT-6.1 Sol?
Цены в постах не приводились, сверьте с прайсом. Считайте не за один запрос, а за 1000: колонка cost_per_1k_usd в report.csv даёт эту цифру на вашей нагрузке.
Нужно ли переписывать код при переходе с одной модели на другую?
Нет, эндпоинт и формат сообщений те же — меняется значение model. Но набор поддерживаемых параметров (например, инструменты и режимы рассуждений) у моделей различается: сверьтесь с документацией перед включением.