Админка¶
Админка генерируется из ваших деклараций. Никакой сборки, никакого CDN и никакого
JavaScript-фреймворка — это серверный Jinja2 с встроенными SVG-графиками, поэтому
она работает сразу после pip install и офлайн.
Затем откройте http://127.0.0.1:8000/admin/.

Все скриншоты на этой странице — демо-проект, который создаёт mlango
startproject, без единой настройки.
Что показывает каждая страница¶
Окружение, параметры, метрики, артефакты и результаты по каждому случаю оценки. Графики метрик — встроенный SVG, для их отрисовки ничего не загружается.

Живой предпросмотр объявленного источника с фильтрами и поиском, выведенными из типов полей, рядом со схемой и материализованными версиями.

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

Два и более рана рядом, с параметрами и метриками, которые различаются.

Всё появляется само¶
В отличие от Django, mlango не требует ручной регистрации. Первый вопрос в
проекте всегда «какие у меня датасеты и раны?», и отвечать на него не должно
требовать сначала написать admin.py.
Регистрируйте только чтобы изменить вид:
from mlango import admin
from reviews.datasets import Reviews
@admin.register(Reviews)
class ReviewsAdmin(admin.ObjectAdmin):
list_display = ("id", "text", "label")
list_filter = ("label",)
search_fields = ("text",)
list_per_page = 50
Опции ObjectAdmin¶
| Опция | По умолчанию | Эффект |
|---|---|---|
list_display |
первые шесть полей | Колонки предпросмотра |
list_filter |
поля с ограниченным набором значений | Фильтры-выпадашки |
search_fields |
текстовые поля | Поиск по подстроке без учёта регистра |
ordering |
порядок источника | Сортировка по умолчанию |
list_per_page |
25 | Строк на страницу |
preview_limit |
5000 | Сколько строк может просканировать фильтр |
help_text |
"" |
Свободный текст в начале страницы |
Указание несуществующего поля ловится командой manage.py check, а не при
рендеринге.
Свои колонки¶
Добавьте метод render_<колонка>:
@admin.register(Reviews)
class ReviewsAdmin(admin.ObjectAdmin):
list_display = ("id", "text", "label", "length")
def render_length(self, record) -> str:
return f"{len(record.text)} симв."
Что показывают страницы¶
Обзор — счётчики по семействам, недавние раны, недавние трейсы, последние версии моделей и датасетов.
Объявленный объект — его полную декларацию (поля, типы, обязательность, детали по полю), разрешённую конфигурацию, и затем что-то специфичное для семейства:
| Семейство | Дополнительно показывает |
|---|---|
| Датасет | Предпросмотр с фильтрами, поиском и пагинацией, плюс материализованные версии |
| Модель | Зарегистрированные версии с метриками и промоутом в один клик, её раны и диаграмма важности признаков |
| Агент | Недавние трейсы с шагами, токенами и статусом |
| Оценка | Недавние раны с долей пройденных кейсов |
Раны — фильтруются по виду, статусу и цели. Страница рана показывает полную запись воспроизводимости (сид, устройство, хост, версия Python, git-коммит и был ли рабочий каталог грязным, отпечаток данных), все параметры, все метрики, встроенные графики для метрик с более чем одной точкой, артефакты с их SHA-256 и — для оценок — каждый кейс.
Сравнение — вставьте два и более идентификатора ранов, чтобы выстроить параметры и метрики рядом:
Трейсы — каждый вызов агента. Страница трейса показывает диалог и таймлайн упорядоченных спанов, каждый разворачивается во вход, выход, расход токенов и ошибку.
Версии — все версии моделей и датасетов с управлением промоутом.
Аутентификация¶
Админка по умолчанию без аутентификации, что правильно для ноутбука и неправильно для чего-либо ещё.
manage.py check предупреждает, когда админка открыта, а DEBUG выключен. Для
настоящего развёртывания ставьте её за своим провайдером идентичности — SSO-прокси
знает про вашу организацию, а это никогда не будет знать.
Отключить полностью — ADMIN_ENABLED = False, или отдавать только API:
Оформление¶
Админка автоматически следует светлой или тёмной теме читателя. Чтобы переоформить
её, весь внешний вид — это один блок <style> в
mlango/admin/templates/base.html: переопределите шаблон, положив свой раньше в
пути поиска шаблонов, или предложите улучшение апстримом.
Несколько сайтов¶
from mlango.admin import AdminSite
internal = AdminSite(name="internal")
internal.register(Reviews, ReviewsAdmin)
Почему одна админка покрывает четыре семейства¶
Каждая страница написана против _meta, а не против Dataset или Model. Шаблон
спрашивает у декларации, какие у неё поля, какие цели и какого она вида — поэтому
пятое семейство не означало бы пятую админку. См. Концепции.