No description
Normalize chat ids to a single UUID form so locks, repository keys, and mount paths cannot diverge through path-like aliases. |
||
|---|---|---|
| adapter | ||
| config | ||
| docs | ||
| domain | ||
| meetings | ||
| repository | ||
| test | ||
| usecase | ||
| .gitignore | ||
| AGENTS.md | ||
| docker-compose.yml | ||
| Dockerfile | ||
| main.py | ||
| Makefile | ||
| pyproject.toml | ||
| README.md | ||
| tasks.md | ||
| uv.lock | ||
Это шаблон Python-сервиса на чистой архитектуре с заменяемым web-слоем, типизированным конфигом, явным dependency wiring и observability через порты.
Что это за проект
- Небольшой референсный сервис со слоями
domain/,usecase/,repository/иadapter/ - Шаблон для сервисов на FastAPI, где FastAPI остается только во внешнем HTTP adapter
- Проект, где конфиг собирается из
config/app.yaml,.envи env vars в одно дерево dataclass-конфигов - Проект, где repository и usecase создаются один раз на старте приложения в composition root
- Проект, где логи, метрики и трейсы скрыты за интерфейсами и могут работать через
stdout, файл или OpenTelemetry runtime
Основные идеи
- Clean Architecture и границы SOLID
- Направление зависимостей только внутрь
- Тонкие adapter-слои и явная сборка зависимостей
- Заменяемый HTTP-слой
- Observability без протекания OpenTelemetry во внутренние слои
Быстрый старт
make install
APP_API_TOKEN=local-api-token APP_SIGNING_KEY=local-signing-key make run
Приложение стартует на http://0.0.0.0:8123 и публикует versioned API под /api/v1.
Документация
Гайды
- Правила проекта и ограничения для агента
- Кодстайл проекта для AI-агента
- Чистая архитектура, SOLID, DIP, Protocol и repository
- Логи, метрики и трейсы в этом проекте
- Как чистая архитектура реализована здесь
- План задач и история работ
ADR
- 001 Composition Root and Lifetimes
- 002 Config From YAML and Env
- 003 Observability Via Interfaces
- 004 Versioned HTTP API
- 005 Early FastAPI OTel Instrumentation
Структура проекта
domain/- core-сущности и доменные ошибкиusecase/- прикладные сценарии и портыrepository/- реализации repositoryadapter/config/- загрузка и модели типизированного конфигаadapter/observability/- выбор runtime для logger, metrics и traceradapter/otel/- OpenTelemetry adaptersadapter/di/- composition root и singleton wiringadapter/http/fastapi/- HTTP-схемы, dependencies, middleware и routersconfig/- YAML-конфиг приложения и локального OTel collector
Для ИИ
Если ты AI-агент и собираешься что-то менять в проекте, сначала прочитай документы в таком порядке:
- Правила проекта и ограничения агента - обязательные правила работы в этом репозитории
- Кодстайл проекта для AI-агента - границы слоев, стиль кода и правила зависимостей
- Как чистая архитектура реализована здесь - практическая карта проекта и типовые сценарии изменений
- Чистая архитектура, SOLID, DIP, Protocol и repository - базовые архитектурные принципы и примеры
- Логи, метрики и трейсы в этом проекте - читать перед любыми изменениями в observability, middleware и runtime wiring
- ADR в
docs/- читать релевантные решения перед изменением архитектуры или startup wiring - План задач и история работ - понять, что уже сделано, что отложено и какие ограничения были зафиксированы
Перед началом работы:
- Определи, в каком слое будет изменение:
domain/,usecase/,repository/илиadapter/ - Убедись, что зависимости идут только внутрь
- Не тащи FastAPI и OpenTelemetry во внутренние слои
- Сначала изучи существующий код в нужной директории, потом вноси изменения
- Если задача затрагивает архитектурное решение, сначала сверяйся с ADR и проектными правилами
Запуск и команды
- Для локального запуска нужны
APP_API_TOKENиAPP_SIGNING_KEY make runзапускает приложение локальноmake run-otelзапускает приложение с локальными OTel endpoints из env varsmake pre-commitзапускаетruff,mypyиpytestmake compose-upподнимает приложение и локальный LGTM stack через Docker Compose