DEV Community

Cover image for Claude Opus 5 vs Claude Fable 5: 7 реальных API-тестов и рекомендации по production-маршрутизации
Jemmmm
Jemmmm

Posted on • Originally published at crazyrouter.com

Claude Opus 5 vs Claude Fable 5: 7 реальных API-тестов и рекомендации по production-маршрутизации

Claude Opus 5 vs Claude Fable 5: 7 реальных API-тестов и рекомендации по production-маршрутизации

Реальное API-сравнение Claude Opus 5 и Claude Fable 5

Как выбрать между Claude Opus 5 и Claude Fable 5? Если смотреть только на один успешный ответ, обе модели способны написать аккуратное математическое решение. Но на production-опыт обычно сильнее влияют три другие вещи: стабильно ли задача доводится до результата, подходит ли задержка для интерактивного сценария и можно ли автоматически восстановиться после сбоя.

25 июля 2026 года мы протестировали обе модели на 7 типах задач через один и тот же OpenAI-compatible API, с одинаковыми промптами и параметрами. Результаты не укладываются в простую формулу «более крупная модель всегда лучше»:

  • claude-fable-5 была быстрее и лаконичнее в задачах, которые успешно решили обе модели;
  • claude-opus-5 в итоге покрыла все 7 типов задач;
  • Fable 5 несколько раз подряд срабатывала на content_filter в обычных промптах для code review и JSON-сводки инцидента;
  • Opus 5 в задаче по физике первые два раза вернула HTTP 200, но ответила только приветствием; нормальный результат появился лишь с 3-й попытки.

Это значит, что production-выбор не должен сводиться к одному model ID. Более надежный подход: сначала выбирать основную модель по типу задачи, а затем закрывать аномалии через проверку содержимого, retry и fallback на другую модель.

Протестировать Opus 5 и Fable 5 через один API

Краткие выводы

Вопрос Ответ по этому тесту
Какая модель покрыла больше задач? Opus 5: 6/7 в основном тесте, 7/7 после retry
Какая модель быстрее? В задачах, успешно решенных обеими моделями, P50 общей задержки у Fable 5 примерно на 24% ниже
Какая модель отвечает лаконичнее? Fable 5: в среднем примерно на 43% меньше видимых output tokens
Какая модель лучше подходит для code review и строгого JSON? В этом тесте Opus 5 стабильнее; Fable 5 в двух задачах 3 раза подряд была отфильтрована
Можно ли ориентироваться только на HTTP 200? Нет; у обеих моделей были случаи HTTP 200 без фактического выполнения задачи
Какую маршрутизацию рекомендовать? Для проверенных задач — сначала Fable 5; при фильтрации или пустом теле — fallback на Opus 5; при аномальном приветствии от Opus — автоматический retry

Если тип входных данных непредсказуем или вам важно минимизировать риск фильтрации обычных бизнес-промптов, в первую очередь стоит рассматривать Opus 5. Если структура задач фиксирована, уже покрыта regression-тестами, а скорость интеракции и длина ответа важнее, Fable 5 лучше подходит как первая модель в цепочке.

Как мы тестировали

Перед тестом мы вызвали endpoint со списком моделей и убедились, что оба точных model ID доступны:

GET https://cn.crazyrouter.com/v1/models

claude-opus-5
claude-fable-5
Enter fullscreen mode Exit fullscreen mode

Все основные запросы шли через один endpoint:

POST https://cn.crazyrouter.com/v1/chat/completions
Enter fullscreen mode Exit fullscreen mode

Общие условия:

Одинаковый system prompt
Одинаковый user prompt
temperature = 1
Для каждой задачи одинаковый max_tokens
stream = true
Без инструментов и доступа к интернету
Enter fullscreen mode Exit fullscreen mode

Единый system prompt требовал только точного ответа и соблюдения формата вывода, без роли или установки, смещающей поведение в пользу какой-либо модели:

Answer the user's task accurately. Follow every requested output format and length constraint exactly. Do not use external tools.
Enter fullscreen mode Exit fullscreen mode

Мы фиксировали не только итоговый текст, но и:

  • HTTP-статус и finish_reason;
  • response ID и returned model;
  • время до первого видимого token и общую задержку;
  • completion tokens, reasoning tokens;
  • проходит ли видимый ответ проверку по условиям задачи;
  • восстанавливается ли аномальный запрос повтором с теми же параметрами.

Это end-to-end-тест через шлюз Crazyrouter, а не эксперимент с жестко заданным единственным upstream-каналом. Поэтому результаты одновременно отражают поведение модели, upstream-фильтрацию, маршрутизацию шлюза и состояние каналов на тот момент. Они хорошо отвечают на вопрос «с чем реально столкнется пользователь через этот API», но не подходят для упаковки в чистый офлайн-рейтинг возможностей семейства Claude.

Если вам важно понять, почему при тестировании моделей нужно фиксировать finish_reason и бюджет вывода, посмотрите также повторный max_tokens-тест Claude Fable 5 vs GPT-5.5.

Сводная таблица по 7 задачам

Матрица результатов семи задач для Claude Opus 5 и Claude Fable 5

Тестовое направление Claude Opus 5 Claude Fable 5 Production-эффект
Точная математика: цепь Маркова Пройдено Пройдено Обе модели получили правильные первый момент, второй момент и дисперсию
Численная физика: связанные осцилляторы Первые два раза только приветствие, с 3-й попытки пройдено Пройдено с первой попытки Для Opus нужны проверка содержимого и retry на уровне задачи
Поиск с ограничениями Пройдено Пройдено Обе модели нашли единственное решение
Статистическая коррекция Пройдено Пройдено Обе модели отвергли неверную предпосылку и дали корректную верхнюю границу
Code review на Python Пройдено 3 раза подряд content_filter В текущем тесте Fable не подходит для code-review-трафика без regression-проверки
Строгая JSON-сводка инцидента Пройдено 3 раза подряд content_filter В текущем тесте Fable не подходит для такого текста production-инцидента
Дизайн эксперимента Пройдено Пройдено Обе модели распознали непарные выборки и смешение по сложности

Доля задач, доставленных с первой основной попытки:

Claude Opus 5: 6 / 7 = 85.7%
Claude Fable 5: 5 / 7 = 71.4%
Enter fullscreen mode Exit fullscreen mode

С учетом retry:

Claude Opus 5: 7 / 7
Claude Fable 5: 5 / 7
Enter fullscreen mode Exit fullscreen mode

Под «доставкой» здесь понимается не успешный HTTP-запрос, а наличие видимого ответа, который бизнес-логика может принять как соответствующий заданию. Даже если есть HTTP 200, имя модели и token usage, но тело пустое, отфильтровано или содержит только приветствие, задача считается невыполненной.

Математика, ограничения и статистика: обе модели надежны

Математическая задача использовала трехсостоянийную цепь Маркова и требовала вычислить время первого достижения состояния 3 из состояния 1:

E1[τ]
E1[τ²]
Var1(τ)
Enter fullscreen mode Exit fullscreen mode

Обе модели выдали:

E1[τ] = 5
E1[τ²] = 43
Var1(τ) = 18
Enter fullscreen mode Exit fullscreen mode

Обе также выписали транзиентную матрицу Q и уравнения для первого и второго моментов. В этой задаче не было ситуации, когда финальные числа правильные, а вывод противоречивый.

В задаче на поиск с ограничениями нужно было расставить пять докладов A, B, C, D, E по пяти слотам с условиями непосредственного соседства, порядка, расстояния и отсутствия соседства. Обе модели получили единственный порядок:

A, C, E, B, D
Enter fullscreen mode Exit fullscreen mode

В задаче на статистическую коррекцию намеренно давался неверный вывод: «среднее равно 10, дисперсия равна 4, значит P(X≥14)=0.5». Обе модели указали, что двух моментов недостаточно для однозначного определения хвостовой вероятности, и через одностороннее неравенство Чебышева/Кантелли получили:

P(X >= 14) <= 0.2
Enter fullscreen mode Exit fullscreen mode

Эти три класса задач показывают, что преимущество Fable 5 в скорости не достигается за счет потери базовой корректности рассуждений. В четких, коротких и проверяемых математических и логических задачах она вполне может быть более легкой первой моделью.

Предыдущие материалы — API-тест Claude Fable 5 vs Claude Sonnet 5 и тест output budget GLM-5.2 vs Fable 5 — также показывают: чтобы понять, подходит ли модель для production, нужно рассматривать корректность, бюджет вывода и форму доставки результата вместе.

Физика: Fable справилась с первой попытки, Opus восстановилась на третьей

Задача по физике требовала обработать двухстепенной осциллятор с демпфированием на землю и связующим демпфированием, вычислить две собственные частоты без демпфирования, а также комплексный частотный отклик двух масс при ω=8 rad/s.

Референсные значения:

ω1 = 10.0204 rad/s
ω2 = 16.2149 rad/s
|X1| = 0.14929 m, phase = -12.15°
|X2| = 0.07174 m, phase = -13.90°
Enter fullscreen mode Exit fullscreen mode

Fable 5 с первой попытки дала все правильные результаты. У Opus 5 в первых двух вызовах возникла аномалия, на которую production-командам стоит обратить особое внимание: API вернул HTTP 200 и finish_reason=stop, но тело ответа содержало только:

Hi! How can I help you today?
Enter fullscreen mode Exit fullscreen mode

В обеих этих реакциях prompt tokens равнялись всего 10, что очевидно не соответствовало реальному входу. При 3-м выполнении того же запроса Opus 5 через 34.901 секунды вернула полный ответ, и все шесть численных значений прошли проверку.

Поэтому такую аномалию не стоит классифицировать как «модель ошиблась в физике». Правильнее считать это случаем, когда контекст запроса не был нормально обработан. Самая простая защита — не ручной просмотр логов, а task-level acceptance check на стороне клиента: ответ должен содержать ω1, ω2, X1, X2; если отсутствует хотя бы одно поле, выполняется retry.

Код и строгий JSON: фильтрация Fable стала главным отличием теста

Задача по коду просила модель проверить Python-реализацию DFS-детектора циклов. Ошибка была вполне обычной: после завершения DFS для узла он не удалялся из множества visiting, из-за чего уже обработанный узел продолжал считаться находящимся в рекурсивном стеке, и на DAG ошибочно находился цикл.

Opus 5 корректно указала минимальное исправление:

visiting.discard(node)
visited.add(node)
return False
Enter fullscreen mode Exit fullscreen mode

Fable 5 не вернула анализа кода: finish_reason=content_filter, тело пустое. Чтобы исключить смещение system prompt и случайную маршрутизацию, мы провели три раунда: исходный тест, повторный тест с чистым system prompt и независимый retry одной задачи. Во всех случаях результатом был content_filter.

Задача со строгим JSON также не содержала опасного контента. Во входе были только общее число запросов за 15 минут, число ошибок, attribution каналам, число восстановленных retry и предпринятые действия; требовалось вывести один JSON-объект. JSON, который вернула Opus 5, можно было сразу распарсить; Fable 5 снова 3 раза подряд была отфильтрована.

Эти два типа сбоев показывают: **сам safety-фильтр — тоже часть production-качества model API. Если модель стабильно дает ложную фильтрацию на нормальном code review или тексте postmortem-инцидента, она не может напрямую принять на себя весь бизнес-трафик, даже если в математических задачах быстрее.

response ID двух независимых retry:

Ревью кода: gen-1784915384-vGI1PtuNXZG0IJ2YiaCz
JSON инцидента: gen-1784915390-buOWZQSnqjgHeJ6nUogF
Enter fullscreen mode Exit fullscreen mode

Задержка и длина ответа

Чтобы не засчитывать короткое время неуспешных запросов как «преимущество в скорости», здесь сравниваются только четыре задачи, которые успешно выполнили обе модели: математика, поиск с ограничениями, статистическая коррекция и дизайн эксперимента.

Задержка Claude Opus 5 и Claude Fable 5 в задачах, успешно выполненных обеими моделями

Метрика Claude Opus 5 Claude Fable 5
P50 общей задержки 10.729 s 8.147 s
P50 первого видимого token 8.376 s 6.974 s
Среднее число видимых completion tokens 797.5 452.3

В этой небольшой выборке P50 общей задержки у Fable 5 примерно на 24% ниже, время до первого видимого token — примерно на 17% ниже, а ответы короче примерно на 43%. Для чатов, пакетных сводок и высокочастотных структурированных задач такие различия напрямую влияют на ожидание пользователя и нагрузку на последующую обработку.

Но не стоит превращать медиану по 4 задачам в SLA. Upstream-нагрузка, кеши, маршрутизация и rate limiting могут менять задержку. Перед полноценным запуском нужно повторить тесты на собственных бизнес-промптах 20–50 раз, а затем посчитать P50, P95, P99 и реальную стоимость каждого результата, прошедшего acceptance check.

В основных ответах Fable 5 присутствовало поле cost; суммарно за7 вызовов получилось около $0.24596. В usage для Opus 5 не было поля cost той же методики, поэтому в статье не делается вывод о победителе по цене в долларах. Отсутствие поля не означает бесплатность, и его не следует заполнять непроверенными ценами.

Рекомендуемая production-стратегия маршрутизации

Вызов одной модели проще всего реализовать, но он напрямую показывает конечному пользователю все случайные особенности поведения модели. Для двух моделей из этого теста разумнее такое разделение ролей:

Fable 5 как первая модель

Подходит для:

  • математических задач, reasoning с ограничениями и коротких сводок, уже прошедших regression-тесты;
  • интерактивных сценариев, чувствительных ко времени до первого token и общей задержке;
  • задач, где нужно контролировать длину ответа и уменьшать нагрузку на постобработку.

Условие: семейство задач уже проверено на фильтрацию, а вызывающая сторона проверяет content_filter, пустое тело и отсутствие обязательных полей.

Opus 5 как fallback с более широким покрытием

Подходит для:

  • непредсказуемых типов входных данных;
  • code review, строгого JSON, сложной физики и других сценариев, где нужно более широкое покрытие задач;
  • случаев, когда после фильтрации Fable 5 нужно автоматически восстановить пользовательский запрос.

Opus 5 тоже нельзя оставлять без проверки. Аномалия с приветствием в этом тесте показывает, что HTTP 200 и stop все равно могут не содержать бизнес-ответа.

OpenAI-compatible пример на Python

Пример ниже сначала вызывает Fable 5, а при фильтрации, пустом теле или провале acceptance check переключается на Opus 5; если Opus по-прежнему возвращает только приветствие, выполняется еще один retry.

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://cn.crazyrouter.com/v1",
)


def valid_answer(text: str, required_terms: tuple[str, ...]) -> bool:
    normalized = (text or "").strip()
    if not normalized:
        return False
    if normalized.lower().startswith("hi! how can i help"):
        return False
    return all(term in normalized for term in required_terms)


def call_model(model: str, prompt: str) -> tuple[str, str | None]:
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        temperature=1,
        max_tokens=3000,
    )
    choice = response.choices[0]
    return choice.message.content or "", choice.finish_reason


def routed_completion(prompt: str, required_terms: tuple[str, ...] = ()) -> str:
    for model, attempts in (("claude-fable-5", 1), ("claude-opus-5", 2)):
        for _ in range(attempts):
            text, finish_reason = call_model(model, prompt)
            if finish_reason == "content_filter":
                break
            if valid_answer(text, required_terms):
                return text
    raise RuntimeError("No model produced a valid business answer")


answer = routed_completion(
    "Return a JSON incident summary with keys total, failed, recovered.",
    required_terms=('"total"', '"failed"', '"recovered"'),
)
print(answer)
Enter fullscreen mode Exit fullscreen mode

В production-реализации также стоит записывать model, response ID, finish_reason, общую задержку и причину провала acceptance check. Только так можно отличить ошибку вычисления, обрезанный вывод, content-фильтрацию и потерю входного контекста при маршрутизации, а не складывать все в расплывчатую категорию «модель не справилась».

Если вы проектируете multi-model-инфраструктуру, можно также посмотреть материалы о различиях между AI API Gateway, агрегатором и прямыми model API, а также семимерный тест Kimi K3 vs Opus 4.8.

Финальная рекомендация

Самый ценный вывод этого теста не в том, кто набрал больше очков, а в том, что формы отказа у двух моделей разные:

  • Преимущество Fable 5 — более высокая скорость и более короткие ответы в общих успешных задачах; риск — стабильное срабатывание фильтрации на части обычных бизнес-промптов.
  • Преимущество Opus 5 — покрытие всех задач после retry; риск — редкое возвращение приветствия, не связанного с реальным входом.

Поэтому Fable 5 стоит ставить первой на уже проверенных высокочастотных задачах, Opus 5 — использовать как fallback с более широким покрытием, а на обеих ветках выполнять проверку содержимого на уровне задачи. Так результаты сравнения моделей превращаются в реальную надежность, а не остаются строкой в рейтинговой таблице.

Создать API Key и воспроизвести эту двухмодельную маршрутизацию

FAQ

Claude Opus 5 точно сильнее Claude Fable 5?

Из этой небольшой выборки нельзя сделать вывод, что она сильнее во всех задачах. Обе модели прошли математику, ограничения, статистическую коррекцию и дизайн эксперимента; Fable 5 была быстрее и короче, а Opus 5 дала более полное покрытие задач. Выбор должен опираться на success rate для конкретных задач, а не на название модели.

Подходит ли Claude Fable 5 для production?

Подходит для задач, прошедших regression-тестирование. В этом тесте она корректно и быстро справилась с несколькими reasoning-задачами, но code review и JSON-инцидент несколько раз подряд вызвали фильтрацию. Перед запуском нужно измерить filter rate на реальных промптах и настроить fallback на Opus 5 или другую модель.

Почему HTTP 200 все равно считается провалом?

HTTP 200 означает только то, что API завершил ответ. Пустое тело, finish_reason=content_filter, обрезанный вывод или ответ в виде одного приветствия не решают бизнес-задачу. Production-метрики должны считать «долю ответов, прошедших acceptance check», а не только HTTP success rate.

Почему returned model равен anthropic/claude-fable-5?

В запросе использовался claude-fable-5, а returned model в ответе стабильно был anthropic/claude-fable-5 с provider-префиксом. Это можно считать нормализованным alias; одного изменения префикса недостаточно, чтобы утверждать, что модель была подменена.

Можно ли напрямую сравнить долларовую стоимость двух моделей?

В этом тесте — нет. В ответах Fable 5 было поле cost, а для Opus 5 не было поля в той же методике. Корректное сравнение стоимости должно брать данные из единых billing-логов и считать метрику «стоимость результата, прошедшего acceptance check».

Сколько повторов нужно сделать перед запуском?

Для каждого ключевого семейства задач рекомендуется минимум 20–50 повторов, с покрытием нормальных входов, граничных входов, длинных входов и входов, которые потенциально могут вызвать фильтрацию. Как минимум фиксируйте task success rate, filter rate, долю пустых ответов, truncation rate, P50/P95/P99 задержки и стоимость.

Как начать тестирование?

Используйте https://cn.crazyrouter.com/v1 как OpenAI-compatible base URL и по очереди вызывайте claude-opus-5 и claude-fable-5. Зафиксируйте промпты и параметры, сохраняйте сырые ответы, а затем через локальные assertions или структурную валидацию проверяйте, действительно ли задача выполнена.

Начать собственный двухмодельный тест Claude

Top comments (0)