TGViewer
Channel Public Channel
Библиотека питониста | Python, Django, Flask

Библиотека питониста | Python, Django, Flask

@pyproglib

Все самое полезное для питониста в одном канале.

Учиться у нас: clc.to/6e5Csg

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @tproger_sales_bot
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
Subscribers
37.4K
Photos
3.3K
Videos
105
Links
5.1K

Showing posts older than #7807 · Back to latest

Older Posts 20 shown
Post #7806 2.32K
🔥 Не называйте любого продвинутого чат-бота «ИИ-агентом»!

Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru, наглядно разбирает уровни абстракции ИИ-продуктов и убирает путаницу в понятиях.

Что внутри видео:

- Почему ассистент и агент принципиально разные сущности;
- Как ассистент может быть просто «обёрткой» над LLM, а может скрывать под капотом сложнейшую мультиагентную систему;
- Как понимать архитектуру глубже, чтобы проектировать сильные решения.

Начните создавать агентные системы с нашего бесплатного демо-урока. Всего за 2 часа разберем внутреннее устройство агента, научим его чинить свой собственный код и сохранять контекст после перезапуска.

🔗 Забрать бесплатный демо-урок
Post #7805 2.26K
🤨 Как заставить AI-агента не ломать архитектуру, а нормально писать код?

Мы привыкли общаться с ИИ промптами, но для автономных систем это путь к бесконечным циклам и сливу бюджета. Чтобы убрать хаос, инженеры переходят на Spec-Driven Development (SDD).

Вот как этот подход меняет работу агента на практике:

🔹Контракт вместо текста. Сначала пишется строгая спецификация (JSON-схема/OpenAPI) и автотесты. Агент зажат в рамки интерфейсов, за которые физически не может выйти.
🔹Контроль на шагах. Внутри петли Think-Act-Observe агент сверяет действия со спецификацией.
🔹Саморефлексия. Если ИИ нарушил типы или «додумал» лишнее, тест падает. Агент получает ошибку в контекст и сам правит код, не выходя за рамки ТЗ.

Это лишь база того, как укротить ИИ-разработку. Если вы хотите глубоко внедрить эту методологию, научиться проектировать архитектурные контракты и собирать отказоустойчивые системы — оставляйте заявку на наш новый курс по Spec-Driven Development. Стартуем совсем скоро🙂
  • ❤ 1
Post #7804 2.66K
🔥 ИИ-выходные: Собери своего AI-агента за 2 дня

Хватит просто читать про ИИ, пора собирать автономные системы руками! 1–2 августа пройдет хардкорный онлайн-интенсив для junior-middle разработчиков.

Формат: теория ➡️ сразу практика. Вы будете управлять AI-инструментами.

🛠️ Как всё пройдет:

День 1 (Суббота): разбираем анатомию агента, подключаем инструменты (shell, GitHub, Postgres) и дебажим трейсы.
День 2 (Воскресенье): собираем собственного агента под вашу задачу, настраиваем Eval + Guardrails (чтобы бот не галлюцинировал) и проводим демо.


Для кого: Вы пишете на Python, работаете с Git и терминалом. (С нуля не подойдет, темп очень быстрый!)

Артефакт на выходе: Рабочий репозиторий с вашим агентом, который не стыдно показать команде.
👨‍💻 Спикер: Алексей Жиряков (Сбер, GenAI).

Места ограничены!

👉 Изучить программу и занять место
  • ❤ 3
Post #7803 2.29K
Какой тип данных для иммутабельных структур самый быстрый в Python

NamedTuple, dataclass, attrs, msgspec — все решают одну задачу, но с очень разной стоимостью при старте программы. Автор сделал детальный бенчмарк. Вот что получилось.


📊 Три уровня производительности (warm start)

Быстрые (~7-12 µs на тип):
— native slots — просто __slots__
— msgspec.Struct — сериализация + struct в одном
— record-type (C) — прототип C-расширения

Средние (~76-96 µs, в ~8 раз медленнее):
— NamedTuple — то что большинство использует по умолчанию
— record-type — декоратор от Brett Cannon

Медленные (~200-370 µs, в ~20-30 раз медленнее):
— dataclass, frozen dataclass
— attrs


🔍 Почему такая разница

Всё упирается в количество методов которые генерируются при создании типа:

— native slots и C-расширения: ничего не генерируют → быстро
— NamedTuple: генерирует один __new__ через eval → средне
— dataclass: генерирует __init__, __repr__, __eq__ за один раз, frozen добавляет ещё три → медленно


💾 Память на экземпляр


native slots → 64 байта
NamedTuple → 88 байт (tuple overhead)
msgspec → 64 байта
attrs → 80 байт
dataclass → 64 байта


frozen=True не меняет размер в памяти — это только флаг на уровне записи, не структуры.


Время создания экземпляра


msgspec → ~62 ns
native → ~87 ns
NamedTuple → ~138 ns
attrs → ~209 ns
frozen dc → ~224 ns


Если пишете CLI или инструменты где важен startup time — NamedTuple не такой «бесплатный» как кажется. msgspec быстрее после ~229 типов (warm) но тянет за собой 19ms импорта. Для большинства проектов NamedTuple всё ещё разумный выбор — но теперь вы знаете цену.

📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • 👍 5
  • ❤ 1
  • 👏 1
Post #7801 2.5K
WeakKeyDictionary: как хранить данные «рядом с объектом» без прямой записи в атрибуты

Классический паттерн: хочется прикрепить доп. данные к объекту — делаешь obj._cache = .... Но у этого три проблемы:

— не работает для built-in типов и slotted классов
— имена атрибутов могут конфликтовать с другим кодом
— атрибуты вылезают в vars() и других местах где не ждёшь


🔑 Решение — WeakKeyDictionary


from weakref import WeakKeyDictionary
import ast

used_names_cache: WeakKeyDictionary[ast.Module, set[str]] = WeakKeyDictionary()

def all_used_names(module: ast.Module) -> set[str]:
try:
return used_names_cache[module]
except KeyError:
pass

names = set()
# ... заполняем set
used_names_cache[module] = names
return names


Данные живут «здесь», а не на объекте. Производительность O(1) как у обычного атрибута.

Главное преимущество: как только объект перестаёт существовать в остальном коде — запись в словаре тоже удаляется автоматически. Нет утечек памяти.


⚠️ Почему не functools.cache?


@cache
def all_used_names(module): ...


functools.cache хранит сильные ссылки на аргументы. Даже если module больше нигде не используется — кэш держит его живым и не даёт GC освободить память.


📋 Два условия для объекта

Объект должен быть hashable — выполняется по умолчанию если не переопределён __eq__ без __hash__.

Объект должен поддерживать weak reference — большинство user-defined классов поддерживают. Для slotted классов нужно явно добавить:


class Train:
__slots__ = ("__weakref__", "wheels", "engine")


📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • ❤ 3
  • 👍 3
Post #7800 2.63K
🔥 Открытое занятие по AgentOps — курс стартовал!

Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!

👨‍💻 Спикер: Андрей Носов

Тема: Архитектура управления: state machine для AI-агентов

Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.

Что в программе:

● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.

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

👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
  • 🎉 1
Post #7799 2.97K
😯 FastAPI Cloud вышел в публичную бету

Деплой существующего FastAPI-приложения:

uv run fastapi deploy


Новое приложение:

uvx fastapi-new
uv run fastapi deploy


🚀 Что включено из коробки
— HTTPS по умолчанию — автоматические TLS-сертификаты
— Автоскейлинг — растёт с трафиком, scale to zero в разработке
— Zero-downtime деплои — новые версии раскатываются постепенно
— Авто-верификация — если что-то сломалось, остаётся последняя рабочая версия
— GitHub интеграция — push в main = автодеплой, без CI-конфигов
— БД из коробки — Neon (Postgres), Redis Cloud, Supabase в пару кликов
— Логи, метрики, переменные окружения, кастомные домены
— VS Code расширение


⚙️ GitHub Actions если нужно


fastapi cloud setup-ci


Команда сама создаёт deploy tokens, прописывает их как GitHub secrets и генерирует workflow файл.

🤖 Про агентов

CLI спроектирован так чтобы AI-агенты могли работать с ним из терминала — деплоить, читать логи, обновлять переменные, дебажить — без кастомных интеграций. Поддержка JSON-вывода, явные параметры.

Вместо стен YAML — одна команда fastapi deploy. Это и есть deployment surface для агентов.

Ссылка на сайт

📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • 👍 11
  • 🤩 1
Post #7798 2.68K
🎬 Как ИИ ускоряет разработку и где ломаются архитектуры

Мы провели открытый вебинар, где разобрали реальные боли проектирования автономных систем. Ольга Лукьянова на практическом кейсе показала, как использовать ИИ-ассистентов для реальных задач. Вы просили запись встречи — она уже в открытом доступе!

Что внутри:

— Как с помощью ИИ быстрее разбираться в незнакомом коде и готовить пулл-реквесты;
— Критерии выбора между одним агентом и мультиагентной системой;
— Разбор популярных архитектурных ошибок и ограничений современных ИИ;
— Практические рекомендации по проектированию и внедрению облачных агентов.

👉 Посмотреть полную запись можно тут:
VK
YouTube

🚀 Хотите пойти дальше открытого вебинара? Если вы готовы перейти от простых промптов к проектированию надежных, отказоустойчивых ИИ-систем, которые не сливают бюджет компании на API, приходите на курс AgentOps. Поток уже стартовал, но двери еще приоткрыты!

👉 Успеть на курс AgentOps
Post #7797 2.51K
📹 Что должен делать агент-оркестратор?

Посмотрите короткий отрывок из вебинара с Дмитрием Юдиным, внутри концентрат инсайтов о ии-агентах. А если хотите погрузиться в тему с головой, у нас доступна и полная запись этого эфира.

Готовы перейти от теории к практике и собрать свой первый продакшн-кейс?

Прямо сейчас действует мощная акция «3 курса по цене 1»:

🔥 При покупке VIP-тарифа нового потока «Разработка ИИ-агентов» вы получаете в подарок хардкорный курс «AgentOps» + ещё один любой курс Академии на ваш выбор!

Выгода в цифрах: два топовых курса по созданию и контролю агентов обойдутся вам всего в 134.000 ₽ вместо 263.000 ₽. Плюс третий курс бонусом (например, можно подтянуть математику для AI). Ваша чистая экономия — 129 000 ₽!

Сомневаетесь, подойдет ли вам формат? Оставьте заявку и пройдите бесплатный демо-урок, чтобы протестировать платформу перед покупкой.

👉 Пройти демо-урок и забрать 3 курса по цене 1
  • 😁 1
  • 😢 1
Post #7796 2.52K
ОПРОС: Ответьте на пару вопросов и получите промокод на все наши курсы! 🎁

Команда Prоglib.аcаdemy готовит к запуску новые продукты, и нам нужна ваша помощь. Мы хотим создавать обучение, которое будет решать ваши реальные карьерные задачи и бить точно в цель.

Поделитесь своим опытом и ожиданиями, чтобы мы сделали наши курсы еще полезнее именно для вас! Заполнение анкеты займет буквально 2–3 минуты, а с нас — скидка на любой наш курс!

👉 Пройти опрос в Яндекс Формах и забрать промокод
  • ❤ 1
Post #7795 2.46K
👍 classmethod, staticmethod или instance method: простое правило выбора

Смотрите что метод реально использует:
— нужен self → instance method
— нужен cls, но не конкретный экземпляр → @classmethod
— не нужно ни то ни другое → @staticmethod


🔵 Instance method — работа с состоянием объекта

Всё что читает или меняет атрибуты конкретного экземпляра. Стандарт по умолчанию.


🟢 @classmethod — альтернативные конструкторы

Python не поддерживает перегрузку init, поэтому когда нужно создать объект из разных источников — каждый способ становится classmethod:


# из стандартной библиотеки
date.today()
date.fromtimestamp(1718539200)
date.fromisoformat("2026-06-16")


Все возвращают date, но стартуют из разного сырья. Ещё один хороший кейс — реестры и кэши на уровне класса:


class Handler:
_registry: dict[str, type["Handler"]] = {}

@classmethod
def register(cls, name: str, handler: type["Handler"]) -> None:
cls._registry[name] = handler



🟡 @staticmethod — утилита без контекста

Чистая функция которая живёт в классе для удобства неймспейса. Не трогает ни self ни cls:


class Color:
@staticmethod
def hex2rgb(hex_value: str) -> tuple[int, int, int]:
return tuple(int(hex_value[i:i+2], 16) for i in (1, 3, 5))


Сигнал: если staticmethod можно вынести на уровень модуля и ничего не сломается — возможно, так и стоит сделать. Это не плохой паттерн, просто честный вопрос.

📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • 👍 3
  • ❤ 2
Post #7794 2.35K
⚠️ Уже завтра стартует курс AgentOps!

Мы собрали на потоке сборную из мастеров IT-рынка. Практики из BigTech научат вас контролировать и отлаживать ИИ-агентов, чтобы они работали предсказуемо и не сливали бюджет на API.

🔥 Заберите 3 курса по цене 1:
● При покупке VIP-тарифа (осталось 4 места) нового потока «Разработка ИИ-агентов» получаете в подарок курс «AgentOps» + ещё один любой курс Академии (например, «Математика для разработки AI», чтобы глубже освоить направление).

● Три курса обойдутся вам всего в 134.000 ₽ вместо 263.000 ₽.

● Доступна удобная беспроцентная рассрочка, платеж можно разбить на несколько комфортных частей.


Хотите прокачать свое портфолио продакшн-кейсом, но пока сомневаетесь? Пройдите наш бесплатный демо-урок, чтобы протестировать формат перед покупкой.

👉 Забрать 3 курса по цене 1 и получить демо-урок
Post #7793 2.47K
👍 ArchUnit для Python: архитектурные правила как юнит-тесты

Python не заботится о том как вы организуете код. Нет компилятора который закричит когда route handler импортирует напрямую из слоя базы данных. Нет ошибки при циклической зависимости между модулями.

Всё работало пока проект не вырос. А потом кто-то импортировал sqlalchemy прямо в Pydantic-схему — потому что так быстрее.

ArchUnitPython решает это: архитектурные правила живут рядом с обычными тестами и запускаются в pytest.


🚫 Запретить зависимости между слоями
from archunitpython import project_files, assert_passes

def test_presentation_should_not_depend_on_database():
rule = (
project_files("src/")
.in_folder("**/presentation/**")
.should_not()
.depend_on_files()
.in_folder("**/database/**")
)
assert_passes(rule)


🔄 Запретить циклические зависимости
def test_no_circular_dependencies():
rule = project_files("src/").should().have_no_cycles()
assert_passes(rule)

Когда правило нарушается — тест падает с понятным сообщением. Никаких отдельных конфигов и команд.


Что проверяет

— направление зависимостей между слоями
— циклические зависимости
— нарушения именования
— превышение размера файлов
— внешние модули в неположенных местах

pip install archunitpython


📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • 👍 5
  • ❤ 2
Post #7792 2.55K
🚀 Не уверены, стоит ли переходить на зрелую ИИ-инженерию? Начните с демо-урока!

Вот-вот стартует наш курс AgentOps. Если вы сомневаетесь в формате, просто оставьте заявку и получите бесплатный демо-урок «AI-инструменты в разработке: как писать код быстрее с помощью ассистентов».

Для тех, кто готов мощно прокачать портфолио, прямо сейчас действует предложение «3 любых курса по цене 1»:
— При покупке VIP-тарифа (осталось 4 места) нового потока «ИИ-агенты» вы получаете в подарок доступ к курсу «AgentOps» + ещё один любой курс Академии на выбор

— В деньгах это два топовых курса по автоматизации и контролю ИИ всего за 134.000 ₽ вместо 263.000 ₽ 🔥 А за счет третьего курса (например, можно выбрать «Математику») вы соберете мощный стек и освоите целое востребованное направление.

— Платеж можно разбить на несколько частей с помощью беспроцентной рассрочки.


👉 Получить демо-урок и зафиксировать спецпредложение 3 в 1
Post #7791 2.85K
Python 3.15.0 beta 3: что нас ждёт в октябре

Вышла третья бета Python 3.15. Финальный релиз запланирован на октябрь 2026. Самое интересное что добавят:

— Ленивые импорты (PEP 810) — модули загружаются только когда реально нужны. Стартап тяжёлых пакетов типа pandas/numpy станет заметно быстрее

— frozendict как встроенный тип (PEP 814) — неизменяемый словарь наконец в стандартной библиотеке

— Unpacking в comprehensions (PEP 798):

# теперь можно так
flat = [x for xs in nested for *x, _ in [xs]]


— UTF-8 по умолчанию (PEP 686) — больше никаких сюрпризов при чтении файлов на разных ОС

Производительность

JIT-компилятор значительно улучшен: +8-9% на x86-64 Linux и +12-13% на AArch64 macOS по сравнению с интерпретатором без JIT.

Инструменты

— Встроенный профайлер Tachyon (PEP 799) — высокочастотный статистический сэмплер прямо в стандартной библиотеке
— Frame pointers включены по умолчанию (PEP 831) — лучше работают внешние профайлеры типа py-spy и perf

Типизация

— TypedDict с типизированными дополнительными ключами (PEP 728)
— sentinel как встроенный тип (PEP 661)
— TypeForm для аннотации самих типов (PEP 747)

Следующая бета — 18 июля, первый RC — 4 августа.

🔗 Ссылка на новость

📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • ❤ 4
  • 🤩 2
  • ❤‍🔥 1
  • 🌚 1
Post #7790 2.63K
📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих»

Мы написали и собрали для вас в одну подборку все 25 глав и 230 практических заданий!

🐍 Часть 1: Особенности, сферы применения, установка, онлайн IDE
🐍 Часть 2: Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
🐍 Часть 3: Типы данных: преобразование и базовые операции
🐍 Часть 4: Методы работы со строками
🐍 Часть 5: Методы работы со списками и списковыми включениями
🐍 Часть 6: Методы работы со словарями и генераторами словарей
🐍 Часть 7: Методы работы с кортежами
🐍 Часть 8: Методы работы со множествами
🐍 Часть 9: Особенности цикла for
🐍 Часть 10: Условный цикл while
🐍 Часть 11: Функции с позиционными и именованными аргументами
🐍 Часть 12: Анонимные функции
🐍 Часть 13: Рекурсивные функции
🐍 Часть 14: Функции высшего порядка, замыкания и декораторы
🐍 Часть 15: Методы работы с файлами и файловой системой
🐍 Часть 16: Регулярные выражения
🐍 Часть 17: Основы скрапинга и парсинга
🐍 Часть 18: Основы ООП – инкапсуляция и наследование
🐍 Часть 19: Основы ООП – абстракция и полиморфизм
🐍 Часть 20: Графический интерфейс на Tkinter
🐍 Часть 21: Основы разработки игр на Pygame
🐍 Часть 22: Основы работы с SQLite
🐍 Часть 23: Основы веб-разработки на Flask
🐍 Часть 24: Основы работы с NumPy
🐍 Часть 25: Основы анализа данных с Pandas
  • 😍 1
Post #7789 2.42K
🎬 Где ломаются архитектуры ИИ-агентов и как этого избежать: запись урока от Proglib.Academy и cloud․ru

Proglib.аcademy вместе с cloud․ru провели вебинар, где разобрали реальные боли проектирования автономных систем. Вы просили запись встречи — она уже в открытом доступе!

Что внутри:

— критерии выбора между одним агентом и мультиагентной системой;
— разбор популярных архитектурных ошибок;
— реальные ограничения современных ИИ-агентов;
— практические рекомендации по проектированию агентных систем.

👉 Посмотреть запись можно тут:
VK
YouTube
  • ❤ 1
Post #7788 2.6K
🤖 Запускаем новый курс: «Spec-Driven Development»!

Всем надоело, что ИИ-агенты (Cursor, Claude) генерируют сотни строк хаотичного кода, который приходится переписывать. Дело не в нейросети, а в том, что вы заставляете её угадывать условия задачи.

На курсе вы освоите методологию SDD (Spec-Driven Development) — управление ИИ через спецификации (спеки) и тесты вместо «вайб-кодинга».

Как это работает?

До генерации кода вы фиксируете в спеке контракты, инварианты и граничные случаи. Документ четко определяет ЧТО делать, сводя лотерею в PR к нулю.

За 8 недель с экспертами из BigTech вы:

🔹 Встроите ИИ в личный или командный workflow.
🔹 Превратите генерацию кода в предсказуемый инженерный процесс.
🔹 Перестанете перепроверять за моделями каждую строчку.

📖 Полный разбор методологии с примерами и готовый промпт для генерации спеки — в нашей статье

👉 Освоить SDD и ускорить разработку
  • ❤ 1
Post #7787 2.32K
Hydra: конфигурация ML-экспериментов без боли

Типичная проблема: у вас ML-проект, конфиги размножились, и вы передаёте гиперпараметры через argparse или хардкодите в скриптах. Hydra решает это элегантно.

Главная идея: конфиги — это YAML-файлы которые можно составлять, наследовать и переопределять прямо из командной строки.

Запуск с разными параметрами без изменения кода:

python train.py model=resnet dataset=imagenet lr=0.001
python train.py model=vit dataset=cifar10 lr=0.0001


Multirun — запуск сетки экспериментов одной командой:

python train.py -m lr=0.001,0.0001 model=resnet,vit
# запустит 4 эксперимента автоматически


Конфиги можно композировать из отдельных файлов:

configs/
model/
resnet.yaml
vit.yaml
dataset/
imagenet.yaml
cifar10.yaml
train.yaml ← собирает всё вместе


Популярные связки с Hydra:

— lightning-hydra-template — готовый шаблон PyTorch Lightning + Hydra для быстрого старта
— hydra-zen — Pythonic API для динамической генерации конфигов
— hydra-torch — type-safe конфиги для PyTorch компонентов


pip install hydra-core --upgrade


Если вы ещё управляете экспериментами через argparse или захардкоженные словари — Hydra стоит попробовать.

➡️ Git-hub

📍 Навигация: ВакансииЗадачиСобесы

Библиотека питониста

#буст
  • ❤ 2
  • 👍 2
Post #7786 2.25K
🤖 Тут Ozon Tech запустил инженерный хакатон Робозон с призовым фондом 15 000 000 ₽

Участникам предлагают три задачи на основе реальных данных сортировочных центров:

🔸 имитационное моделирование,
🔸 конструкция автосортировщика товаров,
🔸 интеллектуальная роботизированная система сортировки.

Что выглядит интересным:

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

Участвовать можно самостоятельно или командой до 7 человек.

📅 Регистрация — до 11 июля.
🚀 Онлайн-этап — до 6 сентября.
🏆 Финал — 12–13 сентября онлайн или в Москве на E-CODE. Дорогу и проживание оплачивает Ozon Tech.

👉 Предлагают прокачаться на реальных инженерных задачах
  • ❤ 2
  • 👍 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →