# Technical & Modular Architecture (Atomic & Hexagonal) This document describes the software architecture of the **Double_scenario_Project** (Anime Archetype Engine). The project adopts an **Atomic & Hexagonal** (Clean Architecture) approach to guarantee a strict decoupling between the business logic (Domain) and the infrastructure layer (Adapters). --- ## 1. Overview of the Hexagon The architecture is divided into three distinct layers: ```mermaid graph TD subgraph Frameworks & Adapters (External) Django[Django Backend & Channels] ML_Adapters[Inference Adapters: LocalLlama, Diffusers, Transformers] Persistence_Adapters[Persistence Adapters: Vertex AI, pgvector, Neo4j, Django DB] end subgraph Ports (Interfaces) InferencePort[InferencePort - includes Reranking] PersistencePort[PersistencePort - UnifiedRepository] end subgraph Core Domain (Business Logic) Services[Domain Services: AgenticRAGService, PromptManager, Games] Models[Pydantic Models: DTOs, AI Schemas] end Django --> Services Services --> InferencePort Services --> PersistencePort ML_Adapters --> InferencePort Persistence_Adapters --> PersistencePort ``` --- ## 2. Source Code Structure The backend code is organized under `backend/`: - **`core/ports/`**: Abstractions (Abstract Base Classes) defining the business contracts. - `InferencePort`: Text/Image generation, voice cloning, reranking, and advanced computer vision. - `MlopsPort`: Handles telemetry, DPO logging, and AI feedback loops via Cloud Run Jobs / GCP Tasks. - `PersistencePort`: Unified data access definition (`UnifiedRepositoryAdapter`). - **`core/domain/services/`**: Pure business logic services, completely independent of infrastructure or frameworks. - **`adapters/`**: Concrete infrastructure implementations. - `adapters/persistence/`: Handles data multi-sources (Vertex AI, pgvector, Neo4j, Django DB). - `adapters/inference/`: Adapter implementations for Google GenAI, BrainAPI, Ollama (Unified), and local Transformers. - **`api/`**: Headless Django configuration. Dependencies are declared and injected via `containers/` (Dependency-Injector). --- ## 3. Storage & Persistence The project utilizes **Vertex AI Vector Search (Collections)** in production and **pgvector (PostgreSQL)** / **NumPy (SQLite)** as local fallbacks for semantic vector searches. Data access is unified under the `UnifiedRepositoryAdapter`. Additionally, **Neo4j** acts as the graph database mapping complex, topological creator-studio-character relations. --- ## 4. Lazy Imports Strategy To optimize startup performance and keep memory usage low, heavy AI libraries (`torch`, `transformers`, etc.) are imported lazily using an attribute-based wrapper (`lazy_import.py`). The actual module import is only triggered during the first attribute access, eliminating unnecessary loading overhead for non-AI tasks. --- ## 4bis. Async / Sync Strategy The codebase is **synchronous by default**, with `async` deliberately confined to two edges. This is the canonical Django + Channels model — keep it; do **not** "async-ify" the core. - **Core domain & DRF views are SYNC.** Domain services (`core/domain/services/`) expose synchronous public APIs (e.g. `ReasoningAgentService.solve_complex_query`, the RAG services, game logic). DRF request handling is sync. Inference adapters are sync. - **Async edge #1 — ASGI / Channels consumers** (`api/animetix/consumers/`): WebSocket consumers are `async` because they run on the ASGI event loop (real-time duel, codemanga, notifications, Gemini Live…). This is the *only* place async is the default. - **Async edge #2 — Multi-agent bus subsystem** (`multi_agent_bus`, `orchestrator_agent_service.execute_workflow`, `reasoning_agent_service._on_bus_message`): Redis pub/sub over `asyncio`. Its `async` methods run **only inside an async context** (the bus loop / a consumer). Note: this subsystem is currently *not wired to any HTTP/WS endpoint* (experimental) — its services expose sync entry points (`solve_complex_query`) for normal use, and the async methods are bus-internal. **Boundary rules (to keep it coherent):** 1. Never call an `async` method directly from sync request code. If a sync view ever needs the bus, wrap with `asgiref.sync.async_to_sync` — do not spin up `asyncio.run()` per request (it breaks the running loop under ASGI). *(Current count of boundary crossings: zero — the edges don't leak into the core.)* 2. Never perform blocking I/O (DB, sync HTTP) directly inside an async consumer; wrap with `asgiref.sync.sync_to_async`. 3. If the multi-agent bus is ever exposed to users, drive it from an **async consumer**, not a sync DRF view. For SSRF-safe HTTP, both sync (`safe_http_request`) and async (`safe_http_request_async`) helpers exist in `core/utils/security.py`; pick the one matching your context. --- ## 5. Extensibility & Port Implementation Adapters implement the abstract ports. Any method not implemented by a specific adapter raises an `InferenceNotImplementedError`. Extending the platform follows a strict pattern: 1. Extend the abstract **Port** definition. 2. Implement the concrete logic in the corresponding **Adapter**. 3. Register or bind the new implementation inside `containers.py`. --- ## 6. Deployment: Decoupled Single Page Application (SPA) Animetix is designed and deployed as a fully decoupled **Pure SPA** (Single Page Application). - **Frontend (Static)**: A modern React application built with **Vite** (`frontend/`). The production bundle (`dist/`) is built for high performance. In development mode, Vite runs on port `5173` and proxies `/api` and `/ws` requests to the Django backend. - **Backend (Headless API)**: Django operates strictly as a headless API. All legacy HTML templates and view controllers have been completely removed. - **Unified Client-Side Routing**: Django routes any non-API fallback paths (`re_path(r'^(?!api/|static/|admin/).*$', spa_view)`) directly to the SPA, allowing React Router DOM to manage application routing on the client side. --- ## 7. Inference Adapters Ecosystem (Local-First Priority) The project implements a resilient `FallbackInferenceAdapter` that prioritizes free local compute to minimize operational costs (maximizing margin). ```mermaid graph TD FallbackAdapter["FallbackInferenceAdapter"] subgraph Local_Compute [Tier 1: Free (Priority)] Ollama["UnifiedInferenceAdapter (Ollama - API)"] Transformers["LocalTextAdapter (Transformers - 4bit)"] end subgraph Managed_Inference [Tier 2: Managed (Fallback)] BrainAPI["BrainAPIAdapter (Custom Central API)"] end subgraph External_APIs [Tier 3: Pay-Per-Token (Last Resort)] Gemini["GoogleGenAIAdapter (Gemini 1.5)"] end FallbackAdapter --> Ollama FallbackAdapter --> Transformers FallbackAdapter --> BrainAPI FallbackAdapter --> Gemini ``` --- ## 8. Economy & Monetization: The Berrix Model Animetix operates on a **Rewarded Economy** where all advanced AI features are 100% free for users, financed by their engagement. ### 8.1. Tokens: The Berrix (Bx) - **Passive Mining**: Users earn +20 Bx every 3 minutes of gameplay (Blindtest, Akinetix, etc.). - **Active Injection**: Users can watch 30s sponsored videos ("Rewarded Ads") for +250 Bx. - **Micro-Transactions**: Direct purchase of Berrix packs via Stripe for power-users. ### 8.2. Token Consumption & Protection Business logic services (`InferencePort`, `Forge`) call the atomic `deduct_berrix` function. If the user's `wallet_balance` is insufficient, the API returns an **HTTP 402 Payment Required** error, which the frontend intercepts to redirect the user to the **Power Station**. --- ## 9. VisionTransformersAdapter Mixin Architecture To maintain high readability and avoid a monolithic file, the `VisionTransformersAdapter` is modularized into **four specialized mixins**: ```mermaid classDiagram class InferencePort { <> +generate() +health_check() } class DepthEstimationMixin { +estimate_depth() +generate_3d_scene() } class MangaOcrMixin { +process_manga_page() } class VideoAnalysisMixin { +get_video_temporal_embeddings() +localize_video_actions() +generate_video_description() } class ClipVisionMixin { +get_image_embedding() +classify_image() +calculate_visual_similarity() +visual_rerank() +get_multimodal_late_interaction() } class VisionTransformersAdapter { +detect_objects() +generate_image_description() +health_check() } InferencePort <|-- VisionTransformersAdapter DepthEstimationMixin <|-- VisionTransformersAdapter MangaOcrMixin <|-- VisionTransformersAdapter VideoAnalysisMixin <|-- VisionTransformersAdapter ClipVisionMixin <|-- VisionTransformersAdapter ``` --- ## 10. Error Hierarchy All custom application errors derive from `AnimetixBaseError`: ```mermaid classDiagram class AnimetixBaseError { +message: str +context: dict } class DomainError class InfrastructureError class InferenceError class InferenceTimeoutError class SpatialComputingError class MangaProcessingError class VideoProcessingError class ImageGenerationError class AdapterLoadError class ContentModerationError class KnowledgeGraphQueryError AnimetixBaseError <|-- InfrastructureError --|> AdapterLoadError AnimetixBaseError <|-- InfrastructureError --|> ContentModerationError AnimetixBaseError <|-- InfrastructureError --|> KnowledgeGraphQueryError ``` --- ## 11. Access & Deployment Environments ### A. Local Development Environment The frontend and backend run in isolation to support Hot Module Replacement (HMR). - **Backend (Django)**: - URL: `http://localhost:8000` - Command: `python backend/api/manage.py runserver` - **Frontend (Vite / React)**: - URL: `http://localhost:5173` - Command: `cd frontend && npm run dev` - *Note*: Vite automatically proxies `/api/*` and `/ws/*` calls to the Django instance. ### B. Dev / Staging Environment (Docker) Containers package the entire infrastructure stack, serving the pre-built React frontend directly from the Django static server. - **Standard Docker**: - URL: `http://localhost:8000` - Command: `docker-compose -f deploy/docker-compose.yml up` - **Staging Docker** (includes debugging & experimental feature flags): - URL: `http://localhost:8080` - Command: `docker-compose -f deploy/docker-compose.yml -f deploy/docker-compose.staging.yml up` ### C. Production Environment (Hugging Face) Animetix is optimized for container deployments on **Hugging Face Spaces**. - **URL**: `https://huggingface.co/spaces/MissawB/Animetix` - **Internal Port**: Container exposes port `7860`. - **Pipeline**: Automated deployments triggered via GitHub Actions (`deploy_to_hf.yml`).