Документация

Kev-4B

Сводка по модели

Kev-4B — это модель принятия решений. Она читает один документ (состояние) и набор типизированных вопросов о нём и возвращает калиброванное распределение вероятностей по вариантам, приложенным к каждому вопросу, за один прямой проход и без генерации текста. Она предназначена для разработчиков, которые классифицируют, маршрутизируют, сортируют или проверяют документы и которым нужны вероятности, пригодные для порогов, — например, чтобы отправлять неуверенные случаи на проверку человеком. Она реализует публичный API System One от TypeSafe (POST /v1/systemone), поэтому TypeSafe SDK работает с ней без изменений. Это LoRA-адаптер и указательная голова на Qwen3.5-4B-Base, достаточно малые для одной GPU на 24 ГБ или 32 ГБ Apple Silicon Mac. Эта карточка описывает чекпойнт в составе Kev 1.0, впервые опубликованный 2026-09-24.

Детали модели

Разработчик Jared Palmer (github.com/jaredpalmer/kev)
Тип модели Модель принятия решений: бэкбон каузальной языковой модели, работающий только на prefill, с указательной головой по вариантам
Бэкбон Qwen/Qwen3.5-4B-Base (ревизия 1001bb4d): 32 слоя, 24 Gated DeltaNet (линейное внимание) и 8 полного внимания, размер скрытого слоя 2 560; заморожен
Адаптер LoRA, ранг 16, α 32, на проекциях внимания, MLP и DeltaNet (33.8M параметров)
Голова Указательная голова: две проекции оценивают закрывающий токен каждого варианта против финального токена вопроса; softmax даёт вероятности
Точность вычислений Обучение с bf16-автокастом поверх весов fp32; обслуживание в bf16 (адаптер сливается с базой при загрузке); оценка в fp32
Контекст Обслуживаются состояния до 65 536 токенов, плюс как минимум 8 192 токена на вопрос. Обучающие состояния были не длиннее 7 552 токенов.
Проверенная длина контекста 8 192 токена (см. «Длинные документы»)
Калибровка Одна температура, T = 2.41, хранится в head.pt и применяется при загрузке
Языки Английский
Лицензия Apache-2.0 (адаптер и голова); базовая модель — Apache-2.0
Версия Kev 1.0: main из jaredpalmer/kev-4b, ревизия 139fdd94 (опубликована 2026-09-24)
Предыдущие версии Теги Hub r8-documents-release (только стадия документов), night2-du-release, v7-base и qwen3 (поколение Qwen3-4B)

Вход. Состояние (текст либо объект или массив JSON, отрендеренный как размеченный текст) и любое число именованных вопросов, каждый из которых одного из трёх типов:

Тип Варианты Выход
choice 1–255 именованных вариантов, каждый с необязательным описанием вероятность на вариант, наиболее вероятный вариант и уверенность
score 1–255 упорядоченных уровней вероятность на уровень и ожидаемый индекс уровня
noul да / нет, с необязательными описаниями вероятность «да»

Каждый вопрос отвечается как отдельная строка, продолжающая общее состояние, поэтому вопросы не могут влиять друг на друга; состояние вычисляется один раз и кэшируется.

Назначение

  • Типизированные решения по документам в несколько тысяч токенов: классификация, маршрутизация, сортировка, выбор при извлечении, проверки политик и права на участие, а также оценка предложенного ответа по изложенным критериям.
  • Рабочие процессы, которые действуют по уверенности: автоматизировать уверенные случаи и ставить в очередь остальные, с порогами, зафиксированными на размеченной выборке собственной нагрузки пользователя.
  • Самостоятельно размещённая замена эндпоинта System One без изменений кода на скромной аппаратуре и отправная точка для дообучения на собственных метках пользователя (kev.train --init_from jaredpalmer/kev-4b).

Использование вне охвата

  • Генерация текста, чат, суммаризация или ответы на открытые вопросы. Модель только оценивает предложенные ей варианты.
  • Полностью автоматические решения с юридическими, медицинскими, финансовыми, кадровыми или подобными последствиями для людей, без проверки человеком.
  • Вопросы, ответ на которые зависит от фактов, которых нет ни в состоянии, ни в общих знаниях, и экзамены, требующие больших знаний (см. «Ограничения»).
  • Арифметика дат с точностью до дня без препроцессора KEV_DATE_FACTS=1, состояния длиннее 65 536 токенов и языки, кроме английского.

Как использовать

Запустите её из репозитория Kev. На CUDA она работает в bf16 со слитыми ядрами DeltaNet и CUDA-графами (одна L40S, H100 или любая GPU с примерно 16 ГБ свободной памяти); на Apple Silicon та же команда обслуживает её через MLX, что выбирается автоматически.

git clone https://github.com/jaredpalmer/kev.git && cd kev && uv sync --extra serve
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-4b --port 8008           # Kev 1.0 (this card)
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-4b@v1.0 --port 8008      # the same weights, pinned
from typesafe_sdk import Choice, Noul, TypeSafeClient

client = TypeSafeClient(api_key="local", base_url="http://127.0.0.1:8008", model="kev-latest")
response = client.system_one(
    state="I was charged twice for order 1182. Please refund one of the charges.",
    questions={
        "team": Choice(instructions="Which team should handle this?",
                       criteria={"billing": "Charges and refunds", "shipping": "Deliveries", "returns": "Exchanges"}),
        "urgent": Noul(instructions="Does this need a reply today?"),
    },
)
print(response.choices["team"].choice, response.nouls["urgent"].noul)

Калиброванная температура применяется по умолчанию; KEV_TEMPERATURE=1.0 возвращает сырые вероятности. KEV_DTYPE=fp32 выбирает точный путь, используемый для оценки. KEV_DATE_FACTS=1 дописывает число дней между каждой парой дат, найденных в состоянии, — модель обучена это использовать. Состояние свыше 65 536 токенов отклоняется с 422, где указано число его токенов.

Обучающие данные

Этап Записи Содержание и метки
Базовый рецепт (decision-v7) 12 576 10 000 записей из десяти публичных наборов данных для классификации (по 1 000, перечислены в метаданных этой карточки) с их родными метками; 896 сгенерированных минимальных пар политик по девяти семействам шаблонов; 1 680 записей из 60 случайно сгенерированных структур правил в четырёх рендерингах; метки вычислены кодом
Даты и отсутствующие доказательства 1 425 Сгенерировано: 900 кейсов политик с датами (обычные, с предложением-счётчиком дней или с полем date_facts); 255 кейсов с удалённым решающим предложением и равномерной целью, плюс 270 нетронутых контролей
Реальные документы (documents-v1 train) 5 219 Повествования о потребительских финансовых жалобах США (CFPB, до ~7k токенов) с 7 488 вопросами (продукт, основная проблема); метки сохранялись там, где два открытых учителя согласились с собственной подачей потребителя
Навыки (hard-v1 train) 6 000 Программно размеченные записи в семи семействах: длинные документы политик с исключениями и подлимитами, компромиссы при заданных приоритетах, вероятность и ожидаемое значение, многошаговые рассуждения, даты и арифметика, оценка предложенного ответа и воздержание при недостающем факте; шаблоны генератора 0–3
Инструменты разработчика (devtools-v1 train) 5 320 CodeReviewer (комментировал ли рецензент фрагмент), CommitPackFT (тип коммита), FlakeFlagger (нестабильные тесты) и Aegis (безопасность контента), каждый с собственными метками своего датасета

Каждая стадия дообучения после первой проигрывает заново записи из decision-v7 (2 000, 2 000 и 4 000). Ни один выход Jev (хостируемой модели принятия решений от TypeSafe) не использовался. CodeReviewer и FlakeFlagger взяты из Zenodo; повествования CFPB — это произведения правительства США; лицензии и ревизии по каждому источнику зафиксированы в манифестах наборов. Наборы только для оценки ниже (breadth-v1, tasksource-heldout-v1, transfer-v4, longdoc-v1, а также источники When2Call и prompt-инъекций из devtools-v1) в обучение не входят.

Процедура обучения

  1. Базовый рецепт. Две эпохи на decision-v7 от базы: LoRA ранга 16, α 32; скорость обучения 5e-5, расписание one-cycle; эффективный батч 8 (4 × накопление 2); bf16-автокаст, gradient checkpointing; seed 2. Лосс — кросс-энтропия по вариантам каждого вопроса. Порядок вариантов перемешивается, варианты «none of the above» и дистракторы вставляются случайно, а четверть записей choice дополнительно даёт минимальную пару (вопрос с вариантом «none of the above», один раз с присутствующим верным вариантом и один раз с удалённым).
  2. Даты и отсутствующие доказательства. Одна эпоха от стадии 1 при скорости обучения 2e-5 с 2 000 проигранных заново записей.
  3. Реальные документы. Одна эпоха от стадии 2 на documents-v1 train при скорости обучения 2e-5 с 2 000 проигранных заново записей; батч 2 × накопление 4; состояния не длиннее 7 552 токенов.
  4. Навыки. Одна эпоха от стадии 3 на hard-v1 и devtools-v1 train вместе при скорости обучения 2e-5 с 4 000 проигранных заново записей; батч 2 × накопление 4; состояния не длиннее 7 552 токенов; seed 1; 1 915 шагов оптимизатора.
  5. Калибровка. Одна температура, T = 2.41, минимизирующая отрицательное логарифмическое правдоподобие на девелоперских строках decision-v7 прогона стадии 4 (1 264 вопроса). Это отложенные элементы обучающего корпуса. Перенастройка на отложенных наборах данных была оценена и не принята (см. «Калибровка»).

Оценка

Методология. Каждое число — это путь оценки fp32 при поставляемой температуре, если не сказано иное. Девелоперские партиции использовались для отбора; тестовые партиции читались один раз для этого чекпойнта; тест transfer-v4 закрыт (читается один раз на кандидата) и оценивался по заранее зафиксированной планке. Парные интервалы — это 95 % бутстрэпы с пересэмплированием целых записей (2 000 пересэмплов), поэтому вопросы, делящие одно состояние, движутся вместе. Различия даны в процентных пунктах (п.п.). Jev (хостируемая модель TypeSafe, запрашиваемая через Vercel AI Gateway) показан там, где он читался на тех же элементах. Наборы:

  • breadth-v1: 14 отложенных публичных наборов данных в пяти областях (знания, язык, поиск, инструменты, искусство), обучение на них не велось.
  • tasksource-heldout-v1: 24 целых семейства задач из публичной многоцелевой коллекции, обучение на них не велось (имена семейств закрыты).
  • transfer-v4: решения вне домена из шести никогда не обучавшихся публичных источников (QNLI, SciQ, TweetEval-offensive, PAWS, MMLU, Emotion) плюс отложенные структуры политик и правил.
  • hard-v1: семейства навыков выше; тестовый сплит удерживает шаблоны тренированных генераторов.
  • devtools-v1: решения по инструментам разработчика из шести источников с проверенной лицензией (четыре обучались, два только для оценки).
  • documents-v1 / documents-v2: повествования о жалобах CFPB; v2 — закрытый отложенный тестовый набор.
  • longdoc-v1: коммерческие контракты CUAD и сгенерированные пакеты соглашений с состояниями от 4k до 64k токенов.

Ключевые панели, помеченные «audited», исключают элементы, которые аудит меток признал несостоятельными¹; каждое исключение убирает одни и те же строки с обеих сторон сравнения.

Отложенные данные (обучение не велось).

Панель (вопросы) Kev-4B Jev
Отложенные публичные наборы данных, development breadth-v1, audited, 10 наборов (2 475) 0.768 –
development breadth-v1, все 14 наборов (3 075) 0.696 0.757
тест breadth-v1, все 14 наборов (3 089) 0.690 0.757
тест breadth-v1, индекс со случайной поправкой² [95 % CI] 38.0 [35.5, 41.3] 54.0 [51.2, 57.0]
Отложенные семейства задач, development tasksource-heldout-v1, audited, 17 семейств (1 993) 0.677 –
development tasksource-heldout-v1, все 24 семейства (2 788) 0.632 –
Вне домена, development transfer-v4 (656): точность / Brier 0.817 / 0.243 0.857 / 0.211
Вне домена, закрытый тест transfer-v4 (656): точность / Brier 0.838 / 0.224 –
закрытый тест transfer-v4: ECE / уверенные ошибки (p ≥ 0.9 и неверно) / покрытие при ошибке ≤ 5 % 0.017 / 1.5% / 0.701 –
MMLU-Pro, 10 вариантов (transfer-v9 development) 0.565 0.840
Неотвечаемые элементы, на которые дан ответ с p ≥ 0.9 (меньше — лучше) 0.00 0.09

Тренированные семейства (отложенные элементы и шаблоны).

Панель (вопросы) Kev-4B Jev
development hard-v1 (1 083) / тест (1 088) 0.786 / 0.803 0.777 / –
development devtools-v1, audited-источники (772) 0.780 –
development devtools-v1 (1 072) / тест (1 071), все источники 0.739 / 0.756 0.713 / –
development documents-v1 (920) / тест (936) 0.891 / 0.903 0.868 / –
development decision-v7 (1 264) / закрытый тест (1 200) 0.873 / 0.865 0.845 / –
Отложенные домены сгенерированных решений, ood-v2 (4 988) 0.864 –

Показатель Jev по devtools-v1 — по всем 1 074 девелоперским вопросам; строки Kev отбрасывают один id CodeReviewer, который сборщик набора переиспользовал для двух записей (2 вопроса).

Против предыдущей версии (чекпойнт стадии документов, тег r8-documents-release, при его собственной температуре 2.96; зарегистрированные критерии, каждый тест прочитан один раз):

Панель Δ [95 % CI]
тест hard-v1 +26.3 [+23.3, +29.5]
тест devtools-v1 +13.4 [+10.1, +16.1]
тест hard-v1 + devtools-v1, объединённо +19.9 [+17.8, +21.8]
development documents-v1 −0.3 [−1.5, +0.9]
закрытый тест transfer-v4 +0.3 [−1.8, +2.3]

Длинные документы.

  • Проверенная длина контекста: 8 192 токена, обученная длина. Бин 16k выходит за допуск: его нижняя граница −3.4 п.п., ниже −3 п.п., поэтому более длинные длины не проверены.
  • Правило, зафиксированное до чтения: проверенная длина — это номинальный размер наибольшего бина от 16 384 токенов и выше, такого что он и каждый бин между ним и 8 192 остаются в допуске. В допуске значит, что разница точности на CUAD относительно бина 8k (состояния в 6 553–7 618 токенов, обученная длина), спаренная по одному и тому же контракту, повторам и вопросу, имеет 95 % нижнюю границу не ниже −3 п.п., и на каждую запись был дан ответ. Если бин 16k провален, проверенная длина — 8 192 токена.

Точность CUAD, ECE и парная разница относительно бина 8k по номинальной длине состояния (longdoc-v1 development):

Номинальная длина состояния Вопросы CUAD Точность ECE Δ относительно 8k, п.п. [95 % CI]
4k 443 0.847 0.047 –
8k 453 0.837 0.048 эталон
16k 452 0.823 0.057 −1.1 [−3.4, +1.2]
32k 454 0.788 0.022 −5.8 [−9.0, −2.8]
64k 452 0.781 0.035 −5.2 [−8.2, −2.0]

ECE при поставляемой T = 2.41. Δ спарена по 445–447 вопросам, заданным об одних и тех же контрактах на обеих длинах. Бин 4k содержит другие контракты и не является эталоном для правила. Источник: runs/r28-readout/context.json (зарегистрированное чтение раунда 28, runs/r28-4b-r10-longdoc).

Калибровка (expected calibration error, ECE, при поставляемой T = 2.41; меньше — лучше):

Панель ECE
development breadth-v1, audited / все 14 наборов 0.021 / 0.028
тест breadth-v1, все 14 наборов 0.029
development tasksource-heldout-v1, audited 0.042
development transfer-v4 / закрытый тест 0.042 / 0.017
development hard-v1 / тест 0.095 / 0.084
development devtools-v1, audited 0.072
development documents-v1 / тест 0.093 / 0.101
development decision-v7 (строки подгонки) 0.013
ood-v2 0.084

Поставляемая температура была подогнана на отложенных элементах обучающего корпуса, что правила проекта больше не разрешают для нового релиза. Зарегистрированная перенастройка на 648 вопросах из отложенных наборов данных (калибровочный сплит transfer-r3, восемь источников, и 200 вопросов MMLU-Pro) даёт T = 2.30 (90 % бутстрэп-интервал [2.05, 2.52]). На 4 468 девелоперских вопросах audited breadth-v1 и tasksource-heldout-v1 она не улучшает поставляемое значение: Brier 0.368 в обоих, разница −0.0001 [−0.0005, +0.0003], и ECE 0.025 против 0.024. Правило требовало интервал Brier ниже нуля и меньший ECE, поэтому T = 2.41 остаётся. Ответы от T не зависят.

Прочие результаты.

Набор Kev-4B Jev
Арифметика дат, политика deadline (transfer-v9 development) 0.65 0.95
MMLU, 4 варианта (transfer-v9 development) 0.725 0.90
When2Call / prompt-инъекции (development devtools-v1, источники только для оценки) 0.660 / 0.753 – / 0.893
SemIf (144 авторских решения; близко к насыщению, приводится только для сведения) 0.889 0.965
Публичные элементы JevBench, все 231 / сложный уровень 111 (ECE) 0.758 / 0.541 (0.112) –

Обслуживание. CUDA, bf16 со слитыми ядрами и CUDA-графами; время модели на запрос (медиана из 20) для нового / повторного состояния:

GPU 6 вопросов, короткое состояние 5 вопросов, состояние в 2 200 токенов Запросов/с, 64 клиента
L40S 41.5 / 27.7 мс 145.2 / 43.0 мс 51.4
H100 18.1 / 12.9 мс 89.4 / 22.5 мс 100.8

Резидентная память GPU — 14.3 ГБ. Обслуживаемые вероятности держатся в пределах 0.017 от пути оценки fp32 на 280 вопросах, без изменённых ответов. На пути оценки fp32 (H100) состояния в 16k / 32k / 64k токенов занимают 3.0 / 6.8 / 17.2 с и 4.3 / 8.6 / 17.2 ГиБ сверх весов.

Apple Silicon (MLX, bf16, M5 с 32 ГБ; три вопроса, один — о факте, помещённом на глубину 60 %; состояние префиллится кусками по 1 024 токена):

Токенов состояния Новое состояние Кэшированное состояние Пик MLX (8.4 ГБ весов) Объём процесса Помещённый факт (p)
8 192 6.6 с 354 мс 10.2 ГБ 11.9 ГБ верно (0.97)
16 384 14.0 с 427 мс 11.0 ГБ 12.8 ГБ верно (0.95)
32 768 30.5 с 533 мс 11.9 ГБ 13.7 ГБ верно (0.96)
65 000 84.5 с 716 мс 13.0 ГБ 14.1 ГБ верно (0.94)

На 60 вопросах о коротком состоянии путь MLX держится в пределах 0.018 от пути оценки fp32, без изменённых ответов.

¹ Исключены из панелей audited: четыре набора данных breadth-v1 (routerbench, чьим состояниям не хватает запрашиваемой информации; cfcolor и humicroedit, на уровне случайного для любой системы; chessbench, на нижней границе для любой системы); семь семейств tasksource-heldout-v1 с недействительными или невосстановимыми метками (имена закрыты); две задачи devtools-v1, чьи метки состояние не определяет (flakeflagger, тип изменения коммита).

² Индекс со случайной поправкой из community Decision Index 0.2: по каждому набору (score − chance) / (1 − chance), усреднённый внутри каждой области, затем 100 × среднее по пяти областям. Индекс Jev — из отдельного чтения тех же тестовых элементов.

Ограничения и компромиссы

  • Её наибольшие приросты — в распределении. Обучающие сплиты hard-v1, devtools-v1 и documents-v1 входят в её обучающие данные, а тестовый элемент hard-v1 — это новый шаблон тренированного генератора. На отложенных наборах данных она отстаёт от Jev на 16 пунктов по индексу breadth-v1, а на публичном сложном уровне JevBench, проверке вне распределения, стадия навыков дала примерно треть того, что дала на hard-v1 (+9.0 п.п. [+2.7, +15.3] на 111 элементах).
  • Некоторые метки devtools-v1 — это прокси. До обучения каждая оценённая модель, включая Jev, была около случайного уровня на CodeReviewer и FlakeFlagger; после обучения на этих источниках она достигает 0.633 и 0.693 на development, что может быть заучиванием эвристики разметки, а не самого решения.
  • Знания задаются базой. MMLU-Pro — 0.565 против 0.840 у Jev.
  • Арифметика дат — её самое слабое семейство: 0.65 на вопросах политики deadline против 0.95 у Jev. Препроцессор KEV_DATE_FACTS=1 помогает (на более раннем чекпойнте, от которого этот происходит, 0.60 → 0.85); на этом чекпойнте он не перемерялся.
  • Калибровка — одна температура в распределении. Она хорошо калибрована на отложенных наборах данных (тест breadth-v1 ECE 0.029), хуже — на тренированных семействах навыков и документов (ECE 0.084–0.101), и одна температура не может переупорядочить уверенности: покрытие при ошибке ≤ 5 % вне домена составляет 0.620 на development против 0.70 у Jev.
  • Необученные длины. Обучающие состояния были не длиннее 7 552 токенов. Более длинные состояния обслуживаются до 65 536 токенов; насколько сохраняется точность — это проверенная длина контекста выше.
  • Порядок вариантов может изменить ответ; изоляция вопросов этого не предотвращает.

Смещения, риски и этические соображения

  • Калиброванные вероятности могут создавать неоправданное доверие. Температура была подогнана на девелоперских строках обучающего распределения и не переносится на любой рабочий процесс; измерьте точность и калибровку на размеченной выборке собственных данных и перенастройте там температуру (python -m kev.calibrate), прежде чем задавать пороги.
  • Точность и калибровка сдвигаются при смене домена. Следите за частотой ошибок в проде, а не полагайтесь на числа выше.
  • Не используйте её для значимых автоматических решений о людях без проверки человеком. Смещения базовой модели и обучающих данных (включая метки, произведённые другими моделями) не измерены.
  • Состояния могут содержать личные или конфиденциальные данные. Самостоятельный хостинг держит входные данные на вашей аппаратуре; сервер открыт, если не задан KEV_API_KEY, поэтому применяйте собственный контроль доступа и политику обращения с данными.

Вычисления

  • Базовый рецепт: около 56 минут на одной NVIDIA H100 (пик 24.6 ГБ). Стадия дат: 9 минут на одной H100.
  • Стадия документов: 43 минуты на одной NVIDIA H200. Стадия навыков: 1.4 часа на одной H200 (пик 47.7 ГБ).
  • Проверки оценки и обслуживания: по одной GPU H100 / H200 / L40S на Modal; измерения MLX на Apple M5.

Происхождение и воспроизводимость

  • Код, наборы и отчёты об оценке: github.com/jaredpalmer/kev. Номера релиза: runs/release/kev-4b-r10.json (scripts/release_numbers.py --release kev-4b-r10), закрытое чтение runs/locked/kev-4b-r10-ungated/, чтения семейства от 2026-09-30 runs/fam-4b-breadth/, runs/fam-4b-breadthtest/, runs/fam-4b-docs1test/ и runs/fam-breadth-test-report/, перенастройка калибровки runs/r28-readout/round28.json, обслуживание runs/serve-4b-l40s/, runs/grouping-4b-h100/, runs/long-state-4b-h100/, runs/mlx-long-states/, runs/mlx-full-4b/.
  • Стадии: базовый прогон q35-4b-s23/00-trial-0 (тег v7-base); даты night2-4b-du/00-trial-0 (тег night2-du-release); документы, раунд 8 r8-small/00-trial-0 (тег r8-documents-release); навыки, раунд 10 r10-skills/00-trial-0 (experiments/round10/skills.json, правило experiments/rounds/r10.json). Перенастройка калибровки: ветвь 4b-r10 раунда 28 (experiments/rounds/r28.json).
  • Выпущенные веса: ревизия Hub 139fdd94; sha256 адаптера 90e81735…, sha256 head.pt dd633435… (T = 2.4061).
  • История релиза: опубликован 2026-09-24 как подтверждённый кандидат раунда 10; включён без изменений в Kev 1.0. Запись о том, как он отбирался, включая наборы, с тех пор отозванные как несостоятельные (scienthoon, WANLI-v2, TypeSafe), — это README на ревизии Hub 139fdd94 и PLAN.md по git-тегу research-archive-2026-09-24.

Цитирование

@misc{palmer2026kev4b,
  title        = {Kev-4B: a calibrated decision model on Qwen3.5-4B},
  author       = {Palmer, Jared},
  year         = {2026},
  howpublished = {\url{https://huggingface.co/jaredpalmer/kev-4b}},
  note         = {Kev 1.0}
}

Контакты

Вопросы и проблемы: github.com/jaredpalmer/kev/issues.