
Мой личный джуниор. Бонус: аутентификация в Gradio и пользователи в Langfuse
GoldenGekko 13 минут назад Мой личный джуниор. Бонус: аутентификация в Gradio и пользователи в Langfuse Средний 7 мин 368 Python * Искусственный интеллект Туториал Привет, Хабр! Меня зовут Владимир, и это внеплановое...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: GoldenGekko 13 минут назад Мой личный джуниор. Бонус: аутентификация в Gradio и пользователи в Langfuse Средний 7 мин 368 Python * Искусственный интеллект Туториал Привет, Хабр! Меня зовут Владимир, и это внеплановое продолжение цикла про локального MCP-агента.
В первых частях мы собрали агента, научили его работать через LangGraph, добавили Gradio-интерфейс, чекпоинты и трассировку. Но как только агентом пришлось поделиться с коллегами, всплыл следующий бытовой вопрос: как понять, кто именно им пользуется, и как разнести историю, чекпоинты и трейсы по пользователям. Вычислять по IP не вышло (может не разобрался, но контейнер с приложением в Docker Desktop из-за связки Windows-WSL-Docker всегда показывал мой IP-адрес), и я решил прикрутить к Gradio аутентификацию.
Технические детали
В этой статье я покажу как добавить аутентификацию в Gradio-интерфейс и как использовать её для упорядочивания трейсов в Langfuse и чекпоинтов в LangGraph. Окно входа в GUIНачнём с паролей. В нормальной взрослой системе пользователь при регистрации вводит пароль, но сам пароль в базу не складывается.
Вместо него хранится хеш: пароль пропускают через специальную функцию, обычно ещё с “солью”, а иногда и с отдельным секретным ключом. При следующем входе введённый пароль хешируется тем же способом, и приложение сравнивает уже не пароли, а получившиеся хеши. Так даже при утечке базы вражина не получает готовый список паролей в открытом виде.
Но у нас тут не серьёзный фронтенд, а миленький Gradio-интерфейс для пары коллег. У Gradio нет полноценного встроенного окна регистрации: пользователей надо заводить самому, либо подключать внешнюю аутентификацию и отдельную логику управления аккаунтами. Переделывать GUI ради регистрации мне не хотелось, поэтому для начала я выбрал самый простой вариант: хранить выданные логины и пароли в текстовом файле.
Отраслевые последствия
# Формат: логин:пароль (по одному на строку) admin:adminТеперь файл надо распарсить и передать результат аутентификации в Gradio. Вообще Gradio предполагает использование не только функции, но и реализует возможность просто передать кортеж (логин, пароль). Не знаю почему, но прямая передача паролей немного противоречит моему чувству прекрасного, поэтому сделаем функцию.
Если в будущем возникнет желание заменить текстовый файл на что-то с хешем паролей, то менять GUI не придётся (хотя формально там одна строчка кода):import secrets from pathlib import Path from core import settings def get_gradio_auth(): if not settings. auth_enabled: return None path = Path(settings. auth_users_file) if not path.
is_file(): raise RuntimeError(f'Файл учётных записей не найден: {path} credentials = {} for line in path. read_text(encoding='utf-8 . splitlines(): if not line or line.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




