Обновить
512K+

Python *

Высокоуровневый язык программирования

347,9
Рейтинг
Сначала показывать
Порог рейтинга

Запись пред-ивента «Почему агенты не работают — и с чего начать» — уже на видео:

🔗 https://youtu.be/yYYH0P4gmXc

Час живого разбора: где агенты ломаются на практике — уверенно выдумывают, теряют контекст на длинной задаче, делают не то, о чём просили.

А где ломается у вас? Напишите в комментариях.

Эти места разбираем и лечим на курсе «AI-агенты, которые работают»: старт 21.10, занятие 1 из 7, среды 19:00–21:00 МСК.

Доступ — по подписке «Мастер»: https://boosty.to/polnyistek/purchase/3939761

Теги:
-1
Комментарии0

Последний пинг: tower defense про защиту дата-центров

Сделал браузерную игру, в которой нужно защищать дата-центры от дронов, ракет и тяжёлых машин. В обороне участвуют роверы и условные зенитные установки. Всё аркадное: никаких реальных характеристик вооружения.

Главный ресурс — энергия. Нужно балансировать между обороной, ремонтом и развитием. Серии перехватов заряжают способности, после волн можно выбирать улучшения, а следующую волну — вызвать досрочно ради бонуса. Если уверен в своей расстановке.

Сейчас доступны четыре карты. На Севере приходится распределять обогрев, в Порту — перевозить батареи между секторами, на Крышах — защищать сразу три дата-центра. Есть три сложности и боссы с несколькими фазами.

Разработку вёл с AI-агентами: отдельно реализация, отдельно ревью и проверки. Игровая логика покрыта 79 тестами, включая прохождение всех сочетаний карты и сложности. Проверки в браузере дополняют тесты, но не заменяют живых игроков: интересный баланс одними зелёными галочками не доказать.

Поиграть без установки и регистрации: td.kosarevsky.dev

Интересно, какую тактику вы найдёте и на какой волне игра впервые заставит её пересмотреть.

tg

Теги:
+1
Комментарии2

decision-cascade: открытый движок машинных решений против проприетарных System One-моделей

На GitHub появился decision-cascade — локальный движок принятия решений, который возвращает типизированные, калиброванные ответы вместо генерации текста. Автор позиционирует его как открытую альтернативу проприетарным System One-моделям вроде Jev от TypeSafe AI, но с полным контролем над данными и инфраструктурой.

Что это. Вместо авторегрессионной генерации движок превращает состояние (строку-описание ситуации) в признаки через энкодер, а головы решений возвращают строго типизированные вероятностные ответы трёх типов: Noul (да/нет с вероятностью), Choice (выбор из опций) и Score (оценка на шкале). Каждый ответ — датакласс с полем confidence, валидируемым распределением и версией схемы. В режиме cascade локальные головы отвечают сами, а внешняя модель подключается только при уверенности ниже порога (по умолчанию 0.6).

Индивидуальность. Рынок System One-моделей оживился: Cloudflare Clef, Perplexity pplx-decider, ConvAI Laya. decision-cascade отличается тремя вещами. Во-первых, это полный цикл в одном репозитории: обучение голов через SFT, RLCD-калибровка с гейтом «не навреди», метрики ECE/Brier, latency-профилирование и деплой через systemd. Во-вторых, совместимость с протоколом SystemOne (POST /v1/systemone) без облачной зависимости и умение проксировать запросы к Jev/Clef/Laya через DECISION_BACKEND=http — свои данные можно обрабатывать локально, а сложные случаи эскалировать. В-третьих, честная мультимодальность: сервис объявляет поддерживаемые модальности и отклоняет остальные типизированной ошибкой, а не тихо деградирует.

Плюсы. Приватность: данные не покидают машину. Калибруемость: вероятности измеряются на ECE и Brier — на AG News заявлен рост accuracy с 0.425 до 0.884 и снижение ECE с 0.725 до 0.151. Детерминированная задержка: на 8 vCPU без GPU первый запрос ~9 секунд, повторные — миллисекунды за счёт кэша. Гибкость: от hash-энкодера офлайн до gemma на GPU. Экономия: в бенчмарке каскад обратился к внешнему сервису лишь за 1.25% решений (0.913 против 0.915 у local).

Минусы. Нужна своя разметка — головы «из коробки» случайны. Нет SaaS с UI — это открытая beta для контроля, а не «кнопка под ключ». Порог входа: нужно понимать обучение голов и метрики калибровки. Ограниченная мультимодальность: видео требует отдельного декодирования, изображения по умолчанию выключены.

Где использовать. Триаж обращений в поддержку (шесть вопросов одним запросом, пример в examples/quickstart/http_client.py). Маршрутизация в агентных системах через api/sdk/agent.py. Модерация контента: Noul для бинарных проверок, Choice для категоризации, Score для серьёзности. Guardrails перед дорогой LLM: 99% запросов закрываются локально. Оценка рисков в реальном времени.

Проект под Apache-2.0. Готовые паки весов в релизе v0.2.0: шесть наборов с честными метриками. Запуск: scripts/bootstrap-user.sh, затем uvicorn — hash-энкодер работает офлайн.

Теги:
+1
Комментарии0

155 000 вакансий: полный анализ IT‑рынка России. Как описание вакансии влияет на зарплату

Как описание вакансии влияет на зарплату
Как описание вакансии влияет на зарплату

Каждая вакансия - это маленькое письмо от работодателя. В нём есть «дружная семья», «стрессоустойчивость», «опыт от 3 лет», ДМС, печеньки и иногда даже зарплата. Мы читаем такие письма каждый день, листаем, вздыхаем и жмём «Откликнуться». А что, если прочитать их все сразу, и тысячами…, сконвертировать стоимость каждой фразы в рубль? Сколько работодатель готов платить, если он пишет, что мы «дружная семья». Чего рынок ждёт от джуна. За что сегодня доплачивают, а что стало просто гигиеной. Где торговаться, а где бесполезно. И когда вообще лучше откликаться, чтобы тебя хотя бы заметили. Об этом у меня вышла большая статья.

Более 15 графиков, показывающих то куда двигается Российский IT-рынок и что при этом всём делать.

Так что если кто-то ещё не успел прочитать, очень рекомендую...

Теги:
+3
Комментарии0

Открытый проект DigUp помогает искать файлы на macOS по смыслу — поисковику достаточно описать нужный файл:

  • можно написать:

    • «собака на пляже» — получить все такие фото;

    • «где обсуждают сон» — выдаст нужный момент подкаста;

    • «пункт про животных в договоре» сразу страницу PDF;

    • функцию в коде можно найти по описанию её работы.

Под капотом проекта ИИ‑модель EmbeddingGemma 2 от Google. При этом всё работает локально, без подписок и аккаунтов.

Теги:
0
Комментарии0

Пять уровней форматирования - и aiogram перестаёт отвечать

Наткнулся на issue #1925 в aiogram: после получения сообщения с rich_message бот перестал отвечать. Внутри JSON была цепочка форматирования:

spoiler → subscript → bold → italic → underline

На aiogram 3.31.0 вызов Update.model_validate(...) загружал одно ядро на 100% и блокировал event loop. Автор issue пишет, что бот простоял так около часа.

Захотелось разобраться, как несколько уровней форматирования вообще могли положить обработку обновлений.

Что происходило при валидации

За вложенный текст отвечает RichTextUnion - рекурсивный union из строк, списков и 26 моделей форматирования. У каждой модели есть поле text, которое снова может содержать RichTextUnion.

RichTextUnion = (    str    | list["RichTextUnion"]    | RichTextBold    | RichTextItalic    # ... ещё 24 модели
)

Поле type у моделей было, но для выбора ветки union оно не использовалось. Поэтому Pydantic пробовал разные варианты. При проверке неподходящей модели он мог снова перейти к вложенному text, а там - очередной union с теми же вариантами.

То есть проблема не в огромном размере JSON. Валидатор многократно проходил по вложенной структуре, и с каждым новым уровнем количество проверок быстро росло.

Что исправили

В PR #1934 добавили callable discriminator. Он выбирает ветку сразу: строку по "str", список по "list", модель - по её полю type.

Обычного Field(discriminator="type") здесь недостаточно: строки и списки поля type не имеют.

По замерам автора PR, валидация проблемного обновления сократилась с 5,4 секунды до 0,3 мс. Исправление влили 11 октября.

Проверил отдельно от aiogram

Собрал небольшой стенд: 26 упрощённых рекурсивных моделей, два варианта union — обычный и с дискриминатором.

На Python 3.14.8 и Pydantic 2.12.5 для глубины 4 получил:

  • Обычный union - 195,061 мс

  • С дискриминатором - 0,004 мс

Разница почти в 49 тысяч раз. Для варианта с дискриминатором проверил и глубину 100: 0,073 мс. Медленный вариант ограничил глубиной 4 - дальше выполнение становилось слишком долгим.

Бенчмарк использует прогрев и медиану пяти запусков. Есть четыре теста на вложенность и выбор моделей; в CI они запускаются на Python 3.10–3.13.

git clone https://github.com/sairex53/aiogram-rich-text-validation-lab
cd aiogram-rich-text-validation-lab
python -m pip install -r requirements.txt
python -m unittest -v
python benchmark.py

Это не воспроизведение исходного update: стенд не импортирует aiogram и не использует JSON из issue. Я сравнивал именно поведение Pydantic на похожей структуре типов.

Похожую проблему с RichBlockUnion в aiogram уже исправляли в PR #1845. А рекурсивный RichTextUnion тогда остался без дискриминатора.

Теги:
0
Комментарии0

Представлен открытый проект Doory (бесплатная альтернатива Canva). Это полноценный графический редактор, работающий прямо в браузере.

«Создавайте плакаты, публикации для соцсетей, сторис, слайды, приглашения, резюме, миниатюры и визитки: начинайте с шаблона или чистого листа, редактируйте любые элементы и экспортируйте результат в форматах PNG, JPG, SVG, PDF, MP4 или GIF. Все функции бесплатны, для начала работы не требуется регистрация, а сам сервис можно развернуть на собственном сервере.

Doory против Canva: Canva — отличный продукт. Doory создан для тех, кому нужен аналогичный инструмент, но бесплатный, с открытым исходным кодом и возможностью полного контроля над ним», — пояснили в команде проекта.

Теги:
+3
Комментарии0

Оказывается у callback_data надо считать байты, а не символы

В Telegram ограничение для callback_data - 1–64 байта. В Python len() считает символы. Для ASCII разницы нет, но для emoji и других многобайтных символов она быстро становится заметной:

prefix = "🐍" * 10
len(prefix)                 # 10
len(prefix.encode("utf-8")) # 40

В aiogram-tool 1.2.3 я нашёл расчёт длины служебного идентификатора для LongCallbackData. Он вычитал len(prefix) из лимита 64, то есть при emoji оставлял себе лишнее место. Дальше библиотека генерировала ID, который уже вместе с префиксами не помещался в лимит aiogram.

Минимальное воспроизведение — класс с prefix="🐍" * 10. В регрессионном тесте _UniqueIDCallbackData.build(Data).pack() на исходном коде падает с ValueError: Resulted callback data is too long. То есть длинный payload библиотека умеет убирать в storage, но даже короткая ссылка на него может не поместиться, если пользовательский prefix не ASCII.

Исправление — считать UTF-8 байты для каждого поля, участвующего в расчёте:

separators_len = len(cls.__separator__.encode("utf-8")) * len(cls.model_fields)
unique_id_len = (    64    - len(UNIQUE_PREFIX.encode("utf-8"))    - len(callback_data.__prefix__.encode("utf-8"))    - separators_len
) // 2

Проверка не ограничивается сравнением длины: тест строит длинный callback, проверяет, что результат укладывается в 64 байта, а затем прогоняет его через LongCallbackQueryFilter и проверяет восстановленные данные.

На исходной версии новый тест падает на сборке служебного ID. После патча два теста файла test_unique_id.py проходят (2 passed). Тест, патч и инструкция по воспроизведению лежат в репозитории: тест, патч, инструкция. PR в upstream пока не открывал.

Проверял на Linux, Python 3.12, aiogram 3.29.1. Это unit-тесты упаковки и распаковки; реальный callback в Telegram не отправлял.

Теги:
+3
Комментарии0

Ошибка в on_error может остановить очередь сообщений бота

В очереди исходящих сообщений ошибка Telegram API - обычная ситуация: пользователь заблокировал бота, запрос оборвался, Telegram вернул временную ошибку. А что будет, если обработчик этой ошибки тоже выбросит исключение?

Я проверил этот сценарий в aiogram-dialog-yaml.

В очередь кладутся два сообщения. Первое падает при отправке. MessageQueue вызывает on_error, а тот, например, пишет в базу и сам падает из-за недоступной базы. Исключение выходит из worker-корутины. Второе сообщение остаётся в очереди, а queue.join() ждёт его бесконечно: рабочего, который мог бы его забрать, уже нет.

Это воспроизводится без токена и запросов к Telegram. Тест подменяет бота объектом, у которого отправка первого сообщения выбрасывает RuntimeError, и проверяет оба варианта on_error: обычную и async-функцию. На исходном коммите оба теста завершились TimeoutError на queue.join().

Исправление небольшое: ошибку самого callback логируем и продолжаем цикл очереди

try:    result = self._on_error(task, exc)    if inspect.isawaitable(result):        await result
except Exception:    log.exception(        "on_error callback failed for %s(chat_id=%s)",        task.method,        task.chat_id,    )

Здесь важно ловить Exception, а не BaseException: отмена worker-задачи через asyncio.CancelledError должна по-прежнему доходить до asyncio. И это не retry: неудачное сообщение не отправляется повторно. Изменение только не даёт сбою в обработчике ошибок уронить единственного worker’а и оставить остальные сообщения без обработки.

После патча регрессионный тест проходит, полный набор тестов проекта на Python 3.12 — 21 passed. Тест, патч и инструкция по воспроизведению лежат в репозитории: тест, патч, инструкция. Pull request автору проекта пока не отправлял.

Проверить можно на том же коммите: добавить test_error_handler_failure.py в tests/, применить queue.patch и запустить PYTHONPATH=src python -m pytest -q.

Это локальная проверка очереди с fake bot, не интеграционный тест Telegram API. Для production retry, backoff и dead-letter очередь всё равно надо проектировать отдельно.

Теги:
0
Комментарии0

Где у новостного бота заканчивается дубль и начинается новая информация?

Хочу обсудить такую задачу: Python-бот собирает посты из 30 Telegram-каналов и делает дайджест. Повторов много, но пропустить уточнение хуже, чем оставить лишний абзац. Исходники и ссылки хранятся отдельно.

Синтетический пример:

  • А: «Сервис N выпустит версию 5.0 14 октября. Бесплатный лимит — 200 запросов».

  • Б: тот же анонс другими словами и без цифры про лимит.

  • В: «Выход версии 5.0 перенесли на 21 октября».

  • Г: автор поста А исправил 200 на 20, не создавая новую публикацию.

Б можно свернуть в ссылку на дополнительный источник. В нужно оставить как изменение события. Г требует пересмотреть уже сохранённый факт. При этом все четыре текста могут оказаться очень близкими по смыслу.

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

Для эксперимента задам ограничения: до 2000 постов в сутки, VPS с 2 vCPU и 4 ГБ RAM, не больше 20 обращений и 200 тысяч входных токенов внешней LLM в день. Можно обрабатывать пачками. В дайджесте у каждого факта должна остаться ссылка на конкретный пост и версия текста, из которой он взят.

Рассматриваю два варианта: дешёвая группировка по тексту с последующей проверкой изменений через LLM или извлечение фактов из всей пачки до удаления повторов. У первого риск потерять важное ещё на предварительном фильтре. У второго — потратить бюджет и получить ошибку уже при извлечении.

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

Теги:
-1
Комментарии0

В какой момент Telegram-бот имеет право сказать «задача отменена»?

Хочу разобрать мысленный эксперимент с Python + aiogram, PostgreSQL и несколькими воркерами. Бот собирает PDF. Пользователь может отменить работу и сразу запустить новую. Генерация долгая, сам файл отправляется через Telegram.

Неприятная гонка:

  1. Воркер закончил PDF, проверил в базе: задача активна, версия диалога совпадает.

  2. Начал отправлять документ. Сетевой запрос завис.

  3. Пользователь нажал «Отменить». Бот записал отмену и ответил «Отменено».

  4. Старый запрос завершился, PDF появился в чате уже после этого ответа.

Номер версии отсекает устаревшую работу до отправки, но между проверкой и внешним действием остаётся окно. Держать блокировку диалога на всё время загрузки тоже не хочется: тогда отмена сама ждёт сеть. Отмена Python-задачи ещё требует понять, успел ли удалённый сервис принять файл.

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

Первое проще честно описать. Для второго пока не понимаю, где провести границу между состоянием в базе и доставкой сообщения. Удаление уже пришедшего документа тоже не убирает момент, когда пользователь его увидел.

Какой контракт вы бы выбрали для такого бота и как реализовали бы его при нескольких воркерах? Интересует конкретный порядок действий при отмене, отправке и перезапуске процесса. И тест, который воспроизводит именно эту гонку, а не просто проверяет флаг cancelled.

Теги:
-1
Комментарии1

Xiaomi выкатила tabular foundation модель. Убийца CatBoost от создателей пылесосов? 📱⚡️

Xiaomi выкатила в открытый доступ Xiaomi-TabLDM — табличную foundation-модель, которая якобы затыкает за пояс CatBoost, LightGBM и предыдущие попытки в табличный deep learning (TabPFN, TabFM). Модель действительно мощная и берет призовые места на бенчмарках TabArena и OpenML-CTR23. Но если залезть под капот репозитория, выясняется занятная вещь: перед нами не просто «одна большая умная нейросеть», а ядреный соревновательный AutoML-пайплайн, завернутый в обертку инференса трансформера с MoE.

Что накрутили в архитектуре 🏗

Для тех, кто пропустил эволюцию табличных сеток: TabLDM работает по принципу контекстного обучения (ICL).
Вы вызываете стандартный для scikit-learn метод clf.fit(X_train, y_train), но модель не обучает веса. Она просто готовит входные данные. На инференсе и обучающая выборка, и тестовые объекты скармливаются в трансформер за один проход: y_pred = model(X_train, y_train, X_test). Весь опыт модель получила заранее на претрейне — причем Xiaomi учила ее исключительно на синтетических данных, сгенерированных структурными каузальными моделями (SCM).

Регрессия, кстати, предсказывает не одно число, а сразу 999 квантилей, которые потом сглаживаются сплайнами и обобщенным распределением Парето (GPD) через оценщик Пикандса для моделирования тяжелых хвостов. По хардкору, крч.


Грязный секрет бенчмарков: возвращение на Kaggle 🕵️‍♂️

А теперь смотрим на то, за счет чего модель на самом деле выбивает высокие скоры на бенчмарках.

В коде есть флаг enhance_candidates=True (включен по умолчанию). Когда вы вызываете fit(), библиотека втихую запускает внутри себя:
— Стратифицированный K-Fold кросс-валидацию;
— Генерацию пачки представлений датасета: перемешивание признаков через латинские квадраты, квантильные трансформации, Gaussian Rank нормализацию;
— Автоматическое вычисление SVD-компонент и генерацию попарных произведений числовых признаков;
— Сбор out-of-fold предсказаний по всем этим группам кандидатов;
— И вишенка на торте: решение задачи неотрицательных наименьших квадратов (scipy.optimize.nnls) для подбора оптимальных весов ансамбля!

То есть модель буквально берет классические приемы с Kaggle десятилетней давности, автоматизирует их и выдает взвешенный ансамбль. Плохо ли это? Нет, это чертовски эффективно с точки зрения метрик. Но называть это «чистым предиктом одной нейросети» — лукавство. Это полноценный ансамблевый комбайн на этапе инференса.


💼 Катить ли это в прод?

Если у вас табличка на 1 000 – 3 000 строк, где лень крутить Optuna и подбирать пайплайн нормализации — TabLDM выдаст околосотовое качество из коробки прямо в один predict().

Но если у вас в проде крутятся 200 000+ строк, никакой кластер H100 с FlashAttention вас не спасет от чудовищных накладных расходов. Пока трансформер будет задыхаться от сложности контекста и роутинга экспертов, CatBoost или LightGBM на обычном CPU досчитают за две секунды и займут свои пару мегабайт памяти.

Хорошая игрушка для быстрых бейзлайнов и датасетов скромного размера. Но градиентный бустинг на пенсию пока не собирается.

Теги:
+3
Комментарии1

Разработчик Радиум Ванг запустил Doom на камере Hasselblad X2D стоимостью $8000 в рамках открытого проекта с прошивкой Hasselblad X-System CIM Firmware Research & Feature Extensions.

Камера Hasselblad X2D оснащается 3,6-дюймовым экраном, позволяющим бегать по уровням и целиться во врагов. Экран устройства сенсорный, а для игровых действий можно использовать экранные элементы управления, а также физические кнопки (например, можно стрелять, нажимая на кнопку затвора камеры).

Теги:
+1
Комментарии0

Ближайшие события

Как относитесь к разрабам, которые постоянно пилят что-то своё (это я)?

Пугает ли вас данный факт, несет ли угрозу вашему бизнесу?

Теги:
+1
Комментарии2
Зависит ли зарплата от того, сколько технологий перечислено в вакансии?
Зависит ли зарплата от того, сколько технологий перечислено в вакансии?

"Вакансии с 15+ технологиями платят в 2,9 раза больше, чем вакансии без стека (250К против 85К). Каждая новая «ступенька» стека прибавляет к медиане"

В понедельник (12.10.26) выйдет Новая. Большая. Разрывная. Статья по аналитике где я разобрал, как описание вакансий влияет на зарплату. И даже собрал ML модель которая всё это подтверждает... Будет интересно... Кстати теперь под анализ попало 155 000 вакансий.

А пока советую изучить (для тех кто ещё не читал) - первые две статьи (раз, два).


P.S. А в @it_v_polyah можно увидеть массу других графиков...

Теги:
-2
Комментарии0

Солнечная система с перемоткой времени

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

Можно перематывать время вперёд и назад, приближать планеты, рассматривать спутники и переходить в полноэкранный режим. Размеры и расстояния адаптированы для наглядности: в едином масштабе планеты просто потерялись бы на экране.

tg

Теги:
+4
Комментарии3

Математика для ИИ на русском: от школьной базы до трансформеров и диффузии

Бесплатный курс-шпаргалка на GitHub, который связывает формулы с их применением в ML: интуиция → формула → иллюстрация → код на NumPy → задачи.

Внутри:

• Линейная алгебра, производные, вероятности и статистика.

• Backpropagation, оптимизаторы, функции потерь и attention.

• Генеративные модели, обучение с подкреплением, RAG и рекомендации.

Для практики: 26 Jupyter-ноутбуков с запуском в Colab, 60 задач с решениями и 160 вопросов с собеседований. Есть карточки Anki и глоссарий RU ↔ EN.

Если математика забылась, предусмотрен отдельный справочник с нуля: от дробей и процентов до интегралов и матриц.

https://github.com/justxor/math-for-ai-2026

Теги:
+3
Комментарии0

В продолжение недавнего «навайбкодил мини-приложение»

Создал свое мини-приложение для просмотра прямых эфиров Rutube: список каналов с группами и поиском, программа передач и воспроизведение через mpv в одном окне - без браузера.

проект https://github.com/zloi-user/rutube-efir

Теги:
+2
Комментарии0

Новый релиз django-modern-rest@0.16.0

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

Скорость

  • PydanticFastSerializer.deserialize в x2.2 быстрее

  • PydanticFastSerializer.serialize в x1.33 быстрее

  • Новый BodyMsgspec компонент в x1.6 быстрее чем Body

  • Новый способ сериализации объектов через MsgspecSerializer и msgspec.Struct, gc=False в x2 раза быстрее

  • Content negotiation в x1.2 быстрее для точных заголовков

  • Content negotiation в x65 быстрее для сложных Accept заголовков

Дефолтные значения для компонентов

Теперь можно указывать дефолты для всех компонентов. Мы корректно отобразим их в OpenAPI спецификации:

class ProductController(Controller[MsgspecSerializer]):
    def post(
        self,
        parsed_body: Body[ProductFilters | None] = None,
        parsed_query: Query[Pagination] = DEFAULT_PAGINATION,
    ) -> dict[str, str | int]: ...

Значения по-умолчанию

Готовые вьюхи для аутентификации

Например, чтобы получить Opaque Token по логину и паролю, достаточно всего лишь:

from dmr.security.token import concrete_views

path(
    'auth/',
    concrete_views.ObtainTokenSyncController.as_view(
        serializer=PydanticFastSerializer,
    ),
)

Пагинация через курсор

Теперь мы поддерживаем два типа пагинации: LIMIT + OFFSET и cursor:

paginator = CursorPaginator(
    Entry.objects.order_by('rank', 'name'),
    per_page=parsed_query.limit,
)
page = paginator.page(parsed_query.cursor)  # or: await paginator.apage(...)
return CursorPaginated(next_cursor=page.next_cursor, per_page=..., page=[...])

Cursor pagination

Extras

Создавайте свои контроллеры со своими настройками, мы добавили типизированное поле extras в @modify и @validate:

modify: Final = ModifyEndpoint(SmartResponse)

class APIController(Controller[PydanticFastSerializer]):
    extras = SmartResponse()

    @modify(extras=SmartResponse(response_text='from endpoint'))
    def post(self) -> str:
        return SmartResponse.of(self)

Extras

OpenAPI теперь умеет добавлять любые x- значения

Поддерживаем любые кастомные значения:

class UserController(Controller[MsgspecSerializer]):
    x_extensions: ClassVar = {'x-owner': 'users-team'}  # on the path item

    @modify(x_extensions={'x-rate-limit': 100})  # on the operation
    def post(self, parsed_body: Body[UserModel]) -> UserModel: ...

OpenAPI

Поддержка library-skills

Установите наши скиллы одной командой:

uvx library-skills --claude   # -> .agents/skills/dmr, .claude/skills/...

Делаем разработку с ИИ-агентами - проще!

Буду рад обратной связи в комментах! Какая фича ваша любимая? Чего вам не хватает для следующих релизов?

Теги:
Всего голосов 12: ↑12 и ↓0+15
Комментарии2

Представлен открытый проект proxy-scraper для выявления в сети открытых сервисов прокси, которые работают штатно и более менее безопасно.

«Большинство списков бесплатных прокси на 95% состоят из нерабочих адресов, а значительная часть оставшихся — это либо „ловушки“ (honeypots), либо прокси, внедряющие скрипты в загружаемые вами страницы. Инструмент proxy‑scraper собирает публичные прокси (HTTP, SOCKS4 и SOCKS5) из более чем 700 источников и сохраняет только те, что успешно проходят все проверки. При каждом запуске программа анализирует эффективность источников, а полученный результат может преобразовать в единый ротируемый прокси‑адрес. В цифрах: за одни сутки было проверено 3,6 миллиона бесплатных прокси — работоспособными оказались 1,1%, причём более половины из тех, что ответили на первый запрос, не прошли проверку повторным запросом», — пояснил создатель проекта.

Теги:
Всего голосов 3: ↑3 и ↓0+7
Комментарии0