2.4 KiB
2.4 KiB
Research: Plugin Architecture & Svelte Web UI
Decisions
1. Web Framework: FastAPI
- Decision: Use FastAPI for the Python backend.
- Rationale:
- Native support for Pydantic models (crucial for plugin schema validation).
- Async support (essential for handling long-running tasks and log streaming via WebSockets/SSE).
- Automatic OpenAPI documentation generation (simplifies frontend integration).
- High performance and modern ecosystem.
- Alternatives Considered:
- Flask: Mature but requires extensions for validation (Marshmallow) and async support is less native. Slower for high-concurrency API calls.
- Django: Too heavy for this use case; brings unnecessary ORM and template engine overhead.
2. Plugin System: importlib + Abstract Base Classes (ABC)
- Decision: Use Python's built-in
importlibfor dynamic loading andabcfor defining the plugin interface. - Rationale:
importlibprovides a standard, secure way to load modules from a path.- ABCs ensure plugins implement required methods (
execute,get_schema) at load time. - Lightweight, no external dependencies required.
- Alternatives Considered:
- Pluggy: Used by pytest, powerful but adds complexity and dependency overhead.
- Stevedore: OpenStack's plugin loader, too complex for this scope.
3. Authentication: authlib + ADFS (OIDC/SAML)
- Decision: Use
authlibto handle ADFS authentication via OpenID Connect (OIDC) or SAML. - Rationale:
authlibis the modern standard for OAuth/OIDC in Python.- Supports integration with FastAPI via middleware.
- ADFS is the required identity provider (IdP).
- Alternatives Considered:
- python-social-auth: Older, harder to integrate with FastAPI.
- Manual JWT implementation: Risky and reinvents the wheel; ADFS handles the token issuance.
4. Frontend: Svelte + Vite
- Decision: Use Svelte for the UI framework and Vite as the build tool.
- Rationale:
- Svelte's compiler-based approach results in small bundles and high performance.
- Reactive model maps well to real-time log updates.
- Vite provides a fast development experience and easy integration with backend proxies.
Unknowns Resolved
- Deployment Context: Hosted multi-user service with ADFS.
- Plugin Interface: Will use Pydantic models to define input schemas, allowing the frontend to generate forms dynamically.