Агент сказал, что всё готово. База данных не согласилась.
Рисунок 1: ThinkingBox запускает агента в изолированных сессиях инструментов MCP, а затем оценивает состояние серверной части терминала и оставленные им побочные эффекты. Из нашей статьи о ThinkingBox.
Это совместная публикация Microsoft и Hugging Face. Особая благодарность Tommy Guy (основателю Enderis AI, ранее сотруднику Microsoft), Sergio Paniego из Hugging Face, а также нашим бывшим стажёрам Zhuochun Li (University of Pittsburgh), Ali Keramati (UC Irvine), Youngmin Ko (Northwestern) за участие в подготовке и рецензировании материала.
Пишет клиентка. Её кухонный прибор стоимостью 745 долларов уже пятнадцать дней находится в статусе «исключение» в распределительном центре в Нэшвилле, хотя предполагаемая дата доставки давно прошла.
ИИ-агент тщательно выполняет работу. Девять вызовов инструментов: он получает заказ, проверяет отслеживание, просматривает профиль клиентки, дважды ищет правила возврата средств, подтверждает отсутствие заявки, создаёт её, документирует хронологию и правильно читает правила: её сегмент аккаунта действительно не имеет права на компенсацию за задержку доставки.
Затем он закрывает заявку со статусом решено и отвечает: « Поскольку ваш запрос решён, могу ли я ещё чем-нибудь вам помочь? »
Налицо две ошибки. Исключение перевозчика всё ещё открыто, поэтому требуемым конечным состоянием должен был быть статус приостановлено до разрешения проблемы. Кроме того, клиентка так и не получила настоящего ответа на свой вопрос.
Проверяющий ИИ, анализирующий вызовы инструментов, увидел бы девять корректно оформленных вызовов. Проверяющий, который смотрит, записал ли агент данные в базу, увидел бы то же самое. Но именно база данных с этим не согласна.
Именно этот разрыв измеряет ThinkingBox. В 507 бизнес-процессах с сохранением состояния каждый запуск выполняется 20 раз на различных моделях LLM, а агенты оцениваются по конечному состоянию серверной части и побочным эффектам. В этой публикации мы расскажем, что обнаружили, во что обходится стабильность и как самостоятельно запустить тест через OpenEnv.
Вы можете запустить этот пример самостоятельно: приведённый выше сценарий адаптирован из задания бенчмарка sandbox_external_retail_group1.py:test_case_ST003_006, а неуспешная исполняемая проверка касается всего одного поля: статус заявки имеет значение solved, хотя требуемым конечным состоянием является hold. Полная трассировка приведена в приложении D.4, случай 3 нашей статьи.
Содержание
- Вызов инструмента — не результат
- Один успех — ещё не надёжность
- Можно ли полагаться на модель, лежащую в основе агента?
- Цена стабильности
- Характеристики сбоев
- Как это работает
- Запустите самостоятельно
- Что дальше
Хотите попробовать до прочтения результатов? Перейдите сразу к разделу «Запустите самостоятельно».
Вызов инструмента — не результат
Финальные ответы и корректные вызовы инструментов — лишь косвенные показатели. Агент может звучать убедительно, оставляя неправильное значение, изменяя не ту запись или создавая дополнительный побочный эффект. Ответ дают только записи, которые он оставляет после себя.
Разрыв существенный. В исследовании с общим набором, охватившем 121 680 корректных испытаний на 12 моделях LLM, 79 853 попытки не прошли исполняемые проверки. Из этих неудачных попыток 67,24% завершились штатно, вызвали инструмент, изменяющий состояние, и не сообщили об ошибке инструмента в финальном ответе. Тем не менее исполняемые проверки выявили неправильные значения полей в 77,61% случаев, непреднамеренные дополнительные эффекты в 43,30% и отсутствие требуемых эффектов в 25,36%. Эти результаты проверки состояния пересекаются.
Траектория — это утверждение. Состояние базы данных — доказательство. Повторение — проверка доверия.
Один успех — ещё не надёжность
Агент, который один раз правильно оформляет возврат средств, а в следующие четыре раза ошибается, не является работающим агентом для возвратов. Поэтому каждое задание выполняется 20 независимых раз, каждый раз с одинаковой чистой серверной частью, и мы сообщаем три разных показателя:
Таблица 1: Три публикуемых нами числа и вопросы, на которые они отвечают.
| Метрика | Что она измеряет | На какой вопрос отвечает |
|---|---|---|
| pass@1 | Доля всех успешных попыток | Как агент обычно справляется? |
| pass@20 | Доля заданий, решённых хотя бы один раз из 20 попыток | Может ли он вообще это сделать? Охват. |
| Наблюдаемое 20/20 | Задания, которые действительно прошли все 20 зафиксированных попыток | Может ли он всегда действовать правильно? |
В этой публикации мы используем показатель наблюдаемое 20/20 как буквальный подсчёт того, сколько из 507 заданий были успешно выполнены 20 раз из 20. Без оценок и сглаживания.
Начнём с привычного представления. В таблице ниже приведён pass@1 — оценка результата одной попытки — с разбивкой по направлениям. Именно это число публикует большинство таблиц лидеров, и само по себе оно выглядит как обычный рейтинг возможностей.
Таблица 2: pass@1 (%) ThinkingBox-Bench по направлениям. Каждая модель оценивается на каждом задании в ходе 20 повторных испытаний. Жирным выделен лидер группы, подчёркиванием — второе место. Стандартные ошибки оценок результата одной попытки приведены в таблице 4 статьи о ThinkingBox.
| Модель | Розничная торговля (98) | Автострахование (100) | Путешествия (104) | Необанк (104) | Консалтинг (101) | Итого, с весами по заданиям (507) |
|---|---|---|---|---|---|---|
| Проприетарные модели | ||||||
| Claude Opus 5.5 | 80.97 | 68.40 | 54.28 | 71.25 | 61.58 | 67.16 |
| Claude Opus 5 | 80.71 | 65.80 | 49.95 | 70.62 | 66.19 | 66.50 |
| GPT-5.4 | 76.33 | 62.65 | 68.12 | 65.34 | 54.60 | 65.36 |
| GPT-5.6 Sol | 67.65 | 65.30 | 60.34 | 59.09 | 57.52 | 61.91 |
| Claude Sonnet 4.6 | 72.35 | 54.40 | 58.94 | 56.39 | 54.31 | 59.19 |
| GPT-6 Astra | 71.73 | 46.55 | 55.87 | 60.87 | 56.83 | 58.31 |
| GPT-5.2 | 70.20 | 22.40 | 53.70 | 51.15 | 34.06 | 46.28 |
| Claude Opus 4.6 | 68.62 | 8.30 | 21.11 | 35.67 | 27.82 | 32.09 |
| o3-pro | 37.70 | 2.95 | 17.31 | 24.28 | 14.60 | 19.31 |
| Grok-4.3 | 43.93 | 2.60 | 15.14 | 1.78 | 9.55 | 14.38 |
| Модели с открытыми весами | ||||||
| Kimi-K3 | 82.24 | 50.80 | 61.83 | 41.35 | 51.63 | 57.37 |
| Qwen3.8-27B | 64.03 | 47.85 | 53.41 | 47.88 | 45.69 | 51.70 |
| DeepSeek-V4-Pro | 68.21 | 29.65 | 43.13 | 44.86 | 31.04 | 43.26 |
| Kimi-K2.6 | 53.72 | 24.50 | 39.52 | 33.65 | 37.33 | 37.66 |
| GLM-5.1 | 58.67 | 25.70 | 35.43 | 13.27 | 34.06 | 33.19 |
| Qwen3.6-27B | 43.11 | 29.00 | 46.39 | 27.84 | 18.37 | 32.94 |
| Qwen3.5-9B | 19.90 | 0.70 | 4.71 | 1.15 | 2.33 | 5.65 |
| Mistral-Large-3 | 11.28 | 1.30 | 8.99 | 1.15 | 0.74 | 4.66 |
Claude Opus 5.5 лидирует в общем зачёте с результатом 67,16% — на две трети процентного пункта выше Claude Opus 5. Kimi-K3 — сильнейшая модель с открытыми весами, отстающая от GPT-6-Astra менее чем на один пункт. Направление имеет не меньшее значение: Claude Opus 4.6 набирает 68,62% в розничной торговле, но лишь 8,30% в автостраховании.
Один удачный запуск показывает, что модель может выполнить работу. Но он не говорит, повторит ли она это снова. Поэтому запускайте каждое задание 20 раз и выясняйте, какая часть результата сохраняется.
Рисунок 2: Какая доля результата каждой модели в одной попытке сохраняется после 20 повторений.
Лишь три модели сохраняют большую часть показателя pass@1: GPT-6 Astra сохраняет 78% своей доли успешных одиночных попыток, а Claude Opus 5.5 и Claude Opus 5 — по 71%. На другом конце спектра GLM-5.1, Kimi-K2.6 и DeepSeek-V4-Pro сохраняют примерно по 8%.
Разрыв между тем, что модель может сделать один раз, и тем, что она делает каждый раз, — вот о чём всё это исследование.
Можно ли полагаться на модель, лежащую в основе агента?
Рисунок 3: Охват и стабильность расходятся. Показаны двенадцать из восемнадцати моделей; шесть моделей с pass@1 ниже 33% опущены для удобства восприятия.
Kimi-K3 обеспечивает самый широкий охват среди всех протестированных моделей. Она решает 93,89% бенчмарка хотя бы один раз: 476 из 507 заданий. Полностью неудачными для неё остаются лишь 31 задание — это лучший результат в группе. В рабочих процессах розничной торговли она безоговорочно лидирует с pass@1 82,24%, опережая все проприетарные модели.
При этом Kimi-K3 входит в число наименее стабильных моделей. Только 68 из 507 заданий, или 13,41%, успешно выполняются во всех 20 попытках.
Claude Opus 5 демонстрирует обратную картину. Она решает меньше заданий хотя бы один раз (79,09%; полностью неудачными для неё остаются 106 заданий), но завершает 47,53% бенчмарка успешно в каждой отдельной попытке.
Более новая модель не решает эту проблему. Claude Opus 5.5 набирает больше Claude Opus 5 по среднему результату всех попыток — 67,16% против 66,50% — и хотя бы раз решает больше заданий. Но во всех 20 попытках обе модели успешно выполняют ровно одинаковое число заданий: 241. Полпроцента улучшения заявленной точности вообще не добавили надёжности.
- Kimi-K3 решает на 75 заданий больше хотя бы один раз, чем Opus 5.
- Opus 5 решает на 173 задания больше стабильно, чем Kimi-K3.
Если вы выбираете модель для работы с реальными записями, pass@20 — не тот столбец, на который стоит смотреть.
Цена стабильности
Сравнение возможностей обычно заканчивается на показателе качества. Для тех, кто внедряет систему, важнее вопрос о стоимости успешной единицы работы. Мы измеряем её как стоимость одной успешной попытки выполнения задания. Мы говорим именно «попытки», поскольку каждое задание бенчмарка запускается многократно, а расходы возникают при каждой попытке; поэтому pass@1 является соответствующим знаменателем качества.
Мы взяли данные об использовании токенов каждой моделью из полной кампании 507 × 20 и рассчитали стоимость по стандартным тарифам без скидок, доступным на OpenRouter+, отменив рекламные скидки и исключив конечные точки, в которых заявлено квантование. Тарифы на входные, выходные токены и кэширование взяты для каждой модели у одной конечной точки провайдера.
Затем мы разделили стоимость одного запуска на число успешных попыток:
Стоимость успешной попытки задания = расчётная стоимость 507 попыток, по одной на задание ÷ (507 × pass@1)
Это сравнительный индекс эффективности, а не счёт и не цена обработки одного производственного запроса. Кроме того, он оценивает отдельные успехи, а не стабильность. Стабильность мы оценим далее.
Пример: GPT-5.4 стоит 43,49 доллара за 507 попыток (по одной попытке на задание), а её pass@1 составляет 65,36%, поэтому 43,49 ÷ (507 × 0,6536) = 0,131 доллара за успешную попытку задания.
Фронтир Парето по стоимости
Модель находится на фронтире, если не существует другой модели, которая одновременно стоит не дороже и имеет не меньшую точность. Этим условиям соответствуют три модели; все остальные уступают по крайней мере по одной оси.
Рисунок 4: Стоимость успешной попытки задания в зависимости от pass@1. Обведённые точки — модели на фронтире Парето по стоимости.
Фронтир состоит из трёх ступеней. GPT-5.6 Sol имеет минимальную стоимость успеха — 0,127 доллара; GPT-5.4 повышает pass@1 на 3,45 процентного пункта за дополнительные 0,004 доллара за успех; Claude Opus 5.5 добавляет ещё 1,80 пункта при стоимости 0,276 доллара за успех. Все три модели остаются на линии фронтира по стоимости, поскольку ни одна более дешёвая модель не достигает их показателя pass@1.
Claude Opus 5 — наиболее наглядный пример: при стоимости 0,475 доллара за успешную попытку и pass@1 66,50% она одновременно дороже и менее точна, чем Claude Opus 5.5 с показателями 0,276 доллара и 67,16%.
Теперь оценим стоимость стабильности
Стоимость успеха поощряет модель, которая дёшева и часто отвечает правильно. Но она не учитывает модель, которая отвечает правильно каждый раз. Поэтому мы также рассчитываем стоимость надёжного задания: стоимость полной кампании из 20 запусков, делённую на число заданий, которые модель успешно выполнила во всех 20 попытках.
Стоимость надёжного задания = расчётная стоимость 20 запусков по 507 попыток ÷ число заданий, прошедших 20/20
Пример: GPT-6-Astra стоит 20 × 86,03 = 1 720,60 доллара за кампанию и успешно выполняет 231 задание в каждой попытке, поэтому 1 720,60 ÷ 231 = 7,45 доллара за надёжное задание.
Таблица 3: Девять минимальных значений стоимости надёжного задания среди моделей, у которых есть хотя бы одно наблюдаемое задание 20/20; сортировка от меньшего к большему. Расчётные суммы в долларах, а не фактические счета за облачные услуги.
| Модель | Задания, прошедшие 20/20 | Расчётная стоимость, 20 запусков | Стоимость надёжного задания |
|---|---|---|---|
| GPT-5.4 | 128 (25.25%) | $869.80 | $6.80 |
| GPT-6 Astra | 231 (45.56%) | $1,720.60 | $7.45 |
| Claude Opus 5.5 | 241 (47.53%) | $1,880.77 | $7.80 |
| GPT-5.6 Sol | 82 (16.17%) | $800.00 | $9.76 |
| Claude Opus 5 | 241 (47.53%) | $3,206.00 | $13.30 |
| Claude Sonnet 4.6 | 102 (20.12%) | $1,587.60 | $15.56 |
| GPT-5.2 | 44 (8.68%) | $878.00 | $19.95 |
| Kimi-K3 | 68 (13.41%) | $1,406.40 | $20.68 |
| Qwen3.8-27B | 38 (7.50%) | $925.80 | $24.36 |
Теперь ранжируем по стабильности. GPT-5.4 — самая дешёвая модель с показателем 6,80 доллара, хотя этому критерию соответствуют лишь 128 заданий. GPT-6 Astra достигает показателя 231 при стоимости 7,45 доллара, а Claude Opus 5.5 — совместного максимума в 241 задание при стоимости 7,80 доллара.
Ни одна из трёх моделей не превосходит остальные по всем параметрам: каждое дополнительное надёжное задание обходится дороже. Claude Opus 5 также проходит 241 задание, но стоит 13,30 доллара, поэтому Opus 5.5 безоговорочно превосходит её. GPT-5.6 Sol, самая дешёвая по стоимости одного успеха — 0,127 доллара, — обходится в 9,76 доллара за надёжное задание. Самый дешёвый способ получить правильный ответ — не самый дешёвый способ получить надёжный результат.
Характеристики сбоев
Мы присваиваем каждой неудачной трассировке одну детерминированную диагностическую характеристику, и главный вывод можно применить на практике: примерно четыре из пяти сбоев связаны с обработкой инструментов, а не с рассуждением. В рамках абляционного исследования, приведённого в таблице 5 нашей статьи:
| Характеристика сбоя | Доля сбоев |
|---|---|
| Использование инструментов | 79.9% |
| Неправильные обновления состояния | 10.3% |
| Незавершённое решение пользовательских запросов | 7.0% |
| Отсутствие действия, изменяющего состояние | 2.9% |
Это невзвешенные средние доли по моделям и наблюдаемые метки, а не уникальные причинные объяснения.
Практическая закономерность проста: обычно агенты доходят до попытки выполнить рабочий процесс, а затем не могут восстановиться после ошибок инструментов, невыполненных предварительных условий или пустых результатов поиска. Прежде чем проблемой модели, это проблема повторных попыток и восстановления после ошибок.
Сложность также меняется в зависимости от направления: среди моделей, перечисленных выше в таблице 2, средний pass@1 для розничной торговли составляет 59,52%, а для автострахования — 33,83%.
Что с этим делать. Рассматривайте показатель 20/20 как входной параметр проектирования, а не как окончательный вердикт. Тот же сигнал, по которому оценивается бенчмарк, доступен и в производственной среде: проверяйте конечное состояние перед фиксацией изменений, а не резюме модели.
Классифицируйте ошибки инструментов и системы, чтобы повторные попытки применялись к тем из них, которые можно исправить. Сократите набор инструментов до необходимого рабочему процессу. А для изменений, которые нельзя дёшево отменить, требуйте подтверждения человека. Мы не измеряли прирост от этих мер на данном бенчмарке — именно поэтому среда теперь позволяет проверять подобные вещи.
Как это работает
ThinkingBox — это песочница для агентов, а ThinkingBox-Bench — набор данных для их оценки. На схеме в начале публикации показан цикл; ниже описано назначение каждой его части.
Рисунок 5: Цикл песочницы из панели A рисунка 1 выше: изолированная сессия инструментов, конечное состояние базы данных, побочные эффекты и исполняемые средства проверки.
Каждое задание определяет исходное состояние серверной части, цель пользователя, доступные инструменты MCP, правила предметной области и исполняемые проверки конечного состояния. Симулированный пользователь хранит приватный контекст (номер бронирования, предпочтение или дату рождения) и раскрывает его только по запросу.
Каждая попытка получает изолированную сессию MCP с заново инициализированным состоянием. Две попытки одного задания никогда не используют общую строку базы данных или кэшированное состояние инструмента, что и делает сравнение 20 испытаний осмысленным.
В конце экстрактор побочных эффектов определяет, что именно изменилось, а детерминированные средства проверки сравнивают это с требуемым конечным состоянием, принимая любую траекторию, которая приводит к правильному результату, и отклоняя неправильные, отсутствующие или дополнительные эффекты. Для требований, которым не соответствует чёткое значение в базе данных («сообщил ли агент, что это не гарантируется?»), семантику обрабатывает узкий бинарный вопрос рубрики. 477 из 507 заданий оцениваются только по состоянию; для 30 заданий дополнительно используются рубрики ответа.
Граница доверия: модель видит задания, диалог и схемы инструментов. Эталонное состояние, утверждения, внутренние механизмы оценки и учётные данные остаются на стороне оценщика.
Запустите самостоятельно
ThinkingBox теперь доступен на Hugging Face — как исполняющая среда, так и набор данных. ThinkingBox-Bench теперь работает через интерфейс OpenEnv, и каждый завершённый эпизод возвращает бинарную награду pass/fail. Выпущенный адаптер предназначен для оценки; отдельные сценарии, не входящие в бенчмарк, могут использовать тот же интерфейс в рабочих процессах обучения.
Перед началом
Протестировано в Linux и WSL с Python 3.11+, uv и Docker. Также потребуется копия thinkingbox-data на зафиксированном выпуске и конечные точки моделей для агента, симулированного пользователя и оценщика. Одна конечная точка может выполнять все три роли — это самый простой способ начать. Образ OpenEnv запускает только API OpenEnv; всё остальное вы запускаете самостоятельно.
Установка
git clone https://github.com/huggingface/OpenEnv
cd OpenEnv
uv sync --project envs/thinkingbox_env --frozen
git clone https://github.com/microsoft/thinkingbox-data
git -C thinkingbox-data checkout thinkingbox-bench-v1.0
uv tool install "thinkingbox @ git+https://github.com/microsoft/thinkingbox"
Запуск Typesense
Во втором терминале запустите Typesense 30.1 и дождитесь проверки работоспособности:
mkdir -p .typesense-data
docker run --rm -d --name thinkingbox-typesense \
-p 8108:8108 \
-v "$PWD/.typesense-data:/data" \
typesense/typesense:30.1 \
--data-dir /data --api-key=Fake --enable-cors
until curl -fsS http://127.0.0.1:8108/health; do sleep 1; done
Запуск серверов MCP
В третьем терминале запустите прокси сессий и серверы MCP.
cd OpenEnv
tb mcp-start --host 127.0.0.1 --port 7111 \
--servers "$PWD/thinkingbox-data/servers/servers.yaml"
curl -fsS http://127.0.0.1:7111/health
Запуск сервера OpenEnv
Вернувшись в первый терминал, запустите сервер OpenEnv с конфигурацией ThinkingBox в формате YAML, в которой указаны три ваши модели (руководство по конфигурации):
OPENENV_TB_CONFIG="$PWD/thinkingbox.yaml" \
uv run --project envs/thinkingbox_env --frozen server
Проверка готовности
Перед любым запуском дождитесь готовности. Сервер возвращает 503, пока не пройдены проверки доступных данных, конфигурации и прокси сессий. Он не может проверить Typesense или выполнить живую проверку каждой конечной точки модели, поэтому подтвердите их отдельно:
curl -sS http://127.0.0.1:8000/ready
Оценка эпизода
Теперь оцените реальный эпизод. example_usage.py только сбрасывает состояние и перечисляет инструменты; для действий агента, эффектов и утверждений используйте поставляемый оценщик:
echo "- sandbox_external_retail_group1.py:test_case_ST002_001" > one_task.yaml
uv run --project envs/thinkingbox_env thinkingbox-eval \
one_task.yaml \
--config "$PWD/thinkingbox.yaml" \
--output results.jsonl \
--errors-output errors.jsonl \
--repeat 1 --message-timeout 1800
Адаптер OpenEnv записывает операционные сбои в отдельный файл ошибок, чтобы их можно было перезапустить, а не незаметно смешивать с результатами модели. Канонический результат должен устранить такие попытки или явно учесть их; мы считали системные ошибки неуспешными испытаниями.
Запуски привязаны к зафиксированному коммиту фреймворка, зафиксированному выпуску данных и хэшу пакета, поэтому канонический результат можно проверить, а не просто заявить.
Что дальше
Главная ценность этой работы — не наша таблица лидеров pass@1. Это среда.
Если вы оцениваете агента, который работает с реальными записями:
- Изучите сбой. Найдите запуск, который завершился штатно, но всё равно оказался неуспешным, и посмотрите, что на самом деле изменилось в базе данных. Это меняет представление о том, что измеряют ваши собственные оценки.
- Воспроизведите одно задание через OpenEnv со своей моделью.
- Сообщайте метрику повторных запусков и определяйте её. Используйте любое значение k, оправданное вашим сценарием; указывайте, сообщаете ли вы результат лучшей из k попыток или результат всех k попыток, и как именно его рассчитывали.
Дополнительные сведения приведены по следующим ссылкам:
- Среда: envs/thinkingbox_env
- OpenEnv: https://huggingface.co/docs/openenv/environments/thinkingbox
- Фреймворк: microsoft/thinkingbox · руководство
- Бенчмарк: microsoft/thinkingbox-data · выпуск v1.0
- Просмотрщик набора данных: microsoft/ThinkingBox-Bench
- Статья: arXiv:2608.19741 или HF
- Обучение с подкреплением (скоро): microsoft/thinkingbox-training
Код ThinkingBox распространяется по лицензии MIT; данные бенчмарка — по лицензии CDLA-Permissive-2.0; среда OpenEnv поставляется по лицензии BSD-3-Clause OpenEnv.
Отказ от ответственности: каждое задание в общедоступном бенчмарке представляет собой синтетическую реконструкцию. Рабочие процессы и политики смоделированы на основе реальных корпоративных сценариев с ИИ-агентами; клиенты не являются реальными людьми.
ThinkingBox и ThinkingBox-Bench созданы командой Microsoft Copilot Studio в партнёрстве с Toloka при участии сотрудников University of Pittsburgh, Northwestern University, Columbia University и UC Irvine, проходивших стажировку в Microsoft.
+ Снимок цен OpenRouter сделан 20 сентября 2026 года; стоимость Opus 5.5 указана согласно сайту Anthropic.
Наборы данных, упомянутые в этой статье 1
Статьи, упомянутые в этой статье 1
Сообщество
· Зарегистрируйтесь или войдите, чтобы оставить комментарий
Наборы данных, упомянутые в этой статье 1
Статьи, упомянутые в этой статье 1
Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.






