Перейти к содержанию

Админка

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

python manage.py runserver

Затем откройте http://127.0.0.1:8000/admin/.

Обзор: счётчики по семействам, последние раны, трейсы агентов, версии

Все скриншоты на этой странице — демо-проект, который создаёт mlango startproject, без единой настройки.

Что показывает каждая страница

Окружение, параметры, метрики, артефакты и результаты по каждому случаю оценки. Графики метрик — встроенный SVG, для их отрисовки ничего не загружается.

Страница рана

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

Страница датасета

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

Страница трейса

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

Сравнение ранов

Всё появляется само

В отличие от Django, mlango не требует ручной регистрации. Первый вопрос в проекте всегда «какие у меня датасеты и раны?», и отвечать на него не должно требовать сначала написать admin.py.

Регистрируйте только чтобы изменить вид:

reviews/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 и — для оценок — каждый кейс.

Сравнение — вставьте два и более идентификатора ранов, чтобы выстроить параметры и метрики рядом:

/admin/compare?ids=7c8f1020,c089b7e6

Трейсы — каждый вызов агента. Страница трейса показывает диалог и таймлайн упорядоченных спанов, каждый разворачивается во вход, выход, расход токенов и ошибку.

Версии — все версии моделей и датасетов с управлением промоутом.

Аутентификация

Админка по умолчанию без аутентификации, что правильно для ноутбука и неправильно для чего-либо ещё.

ADMIN_USERNAME = "admin"
ADMIN_PASSWORD = "…"        # включает HTTP Basic auth

manage.py check предупреждает, когда админка открыта, а DEBUG выключен. Для настоящего развёртывания ставьте её за своим провайдером идентичности — SSO-прокси знает про вашу организацию, а это никогда не будет знать.

Отключить полностью — ADMIN_ENABLED = False, или отдавать только API:

python manage.py runserver --no-admin

Оформление

Админка автоматически следует светлой или тёмной теме читателя. Чтобы переоформить её, весь внешний вид — это один блок <style> в mlango/admin/templates/base.html: переопределите шаблон, положив свой раньше в пути поиска шаблонов, или предложите улучшение апстримом.

Несколько сайтов

from mlango.admin import AdminSite

internal = AdminSite(name="internal")
internal.register(Reviews, ReviewsAdmin)
from mlango.admin.app import build_admin_app

app.mount("/internal", build_admin_app(internal))

Почему одна админка покрывает четыре семейства

Каждая страница написана против _meta, а не против Dataset или Model. Шаблон спрашивает у декларации, какие у неё поля, какие цели и какого она вида — поэтому пятое семейство не означало бы пятую админку. См. Концепции.