| # Topcoder Challenge Steward Agent โ Module 2 Architecture |
|
|
| This module describes the split architecture for the Topcoder Challenge Steward Agent, separating the user interface and backend agent logic. |
|
|
| --- |
|
|
| ## 1. User Interface (Frontend) |
|
|
| - **Framework:** [NestJS](https://nestjs.com/) (API/backend) + [Material UI](https://mui.com/) (React-based UI) |
| - **Purpose:** |
| - Allow users to provide their challenge preferences (free text, tags, etc.) |
| - Allow users to start/stop the agent for themselves |
| - Simple, clean interface for managing notification settings |
| - **Key Features:** |
| - User authentication (optional, depending on deployment) |
| - Form for entering/editing preferences |
| - Button(s) to start/stop the agent |
| - Status display (agent running, last run, etc.) |
| - Communicates with the backend via REST API |
|
|
| --- |
|
|
| ## 2. Backend (Agent & API) |
|
|
| - **Framework:** [FastAPI](https://fastapi.tiangolo.com/) (Python) |
| - **Purpose:** |
| - Store user preferences and email addresses in a database |
| - Expose REST API endpoints for the frontend (CRUD for preferences, agent control) |
| - Run the agent on a schedule (e.g., daily per user) |
| - Poll the database for active agents and execute them |
| - For each active agent: |
| - Retrieve user preferences |
| - Combine with system prompt |
| - Run the agent logic (implemented in Python, with MCP integration) |
| - Send notifications via Email MCP if suitable challenges are found |
| - **Key Features:** |
| - User management (basic, for mapping preferences to emails) |
| - Preference storage (database: e.g., SQLite, PostgreSQL, etc.) |
| - Scheduler (e.g., Celery, APScheduler, or FastAPI background tasks) |
| - Integration with Topcoder MCP (fetch challenges, skills, etc.) |
| - Integration with Email MCP (send notifications) |
|
|
| --- |
|
|
| ## System Flow Diagram |
|
|
| ```mermaid |
| graph TD |
| A[User] -- Preferences/Control --> B[Frontend (NestJS + Material UI)] |
| B -- REST API --> C[Backend (FastAPI)] |
| C -- Store/Retrieve --> D[(Database)] |
| C -- Schedule/Run --> E[Agent Logic] |
| E -- Fetch Challenges --> F[Topcoder MCP] |
| E -- Send Email --> G[Email MCP] |
| ``` |
|
|
| --- |
|
|
| ## Development Notes |
| - The frontend and backend are decoupled and communicate via HTTP REST APIs. |
| - The backend is responsible for all agent execution and persistence. |
| - The agent logic is implemented in Python for easy integration with AI/ML libraries and MCP services. |
| - The system is designed for extensibility (e.g., adding more notification channels, richer preference models). |
|
|
| --- |
|
|
| ## Deploying to Hugging Face Spaces as a Single Docker Container |
|
|
| I can deploy this full-stack (NestJS + Material UI frontend, FastAPI backend) app as a single Docker container on Hugging Face Spaces. Below are the recommended steps and best practices: |
|
|
| ### 1. Project Structure |
| - I will place all code (frontend and backend) in the repository. |
| - I will include a `Dockerfile` and `README.md` (with Hugging Face metadata). |
| - I will add `requirements.txt` for Python dependencies and `package.json`/`yarn.lock` for Node dependencies if building the frontend in Docker. |
|
|
| ### 2. Dockerfile Example (Multi-Stage Build) |
|
|
| ```dockerfile |
| # Stage 1: Build frontend |
| FROM node:18 AS frontend-build |
| WORKDIR /app/frontend |
| COPY frontend/ . |
| RUN npm install && npm run build |
| |
| # Stage 2: Build backend |
| FROM python:3.9 AS backend |
| RUN useradd -m -u 1000 user |
| WORKDIR /app |
| |
| # Install Python dependencies |
| COPY --chown=user requirements.txt . |
| RUN pip install --no-cache-dir --upgrade -r requirements.txt |
| |
| # Copy backend code |
| COPY --chown=user backend/ /app/backend |
| |
| # Copy built frontend to backend's static directory |
| COPY --from=frontend-build /app/frontend/build /app/backend/static |
| |
| # Set permissions |
| USER user |
| ENV HOME=/home/user PATH=/home/user/.local/bin:$PATH |
| |
| # Expose the port expected by Hugging Face Spaces |
| EXPOSE 7860 |
| |
| # Start FastAPI (serving both API and static frontend) |
| CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "7860"] |
| ``` |
|
|
| - I will adjust paths as needed for my project layout. |
| - If I want to use Nginx or another server for static files, I will add a third stage. |
|
|
| ### 3. Hugging Face README Metadata Block |
| I will add this YAML block at the top of my `README.md`: |
|
|
| ```yaml |
| --- |
| title: Topcoder Challenge Steward Agent |
| emoji: ๐๏ธ |
| colorFrom: blue |
| colorTo: green |
| sdk: docker |
| app_port: 7860 |
| --- |
| ``` |
| |
| ### 4. Data Persistence |
| - By default, data is not persisted between restarts. |
| - For persistent storage, I will use the `supabase` free tier https://supabase.com/pricing directory or an external database. |
| |
| ### 5. Environment Variables & Secrets |
| - I will set secrets and environment variables in the Hugging Face Space settings. |
| - I will access them in my code via `os.environ` (Python) or `process.env` (Node.js). |
| |
| ### 6. Build & Push |
| - I will push my code to my Hugging Face Space repository. |
| - The Space will build and run my Dockerfile automatically. |
| |
| #### References |
| - [Hugging Face: Your First Docker Space](https://huggingface.co/docs/hub/spaces-sdks-docker-first-demo) |
| - [Hugging Face: Docker Spaces Documentation](https://huggingface.co/docs/hub/spaces-sdks-docker) |
| - [Permissions & User Setup](https://huggingface.co/docs/hub/spaces-sdks-docker#permissions) |
| - [Persistent Storage](https://huggingface.co/docs/hub/spaces-sdks-docker#data-persistence) |