| # Detailed Documentation: main.py (The Entry Point) |
|
|
| This file is the **central hub** of the application. It manages the server lifecycle, global security, and integrates the modular feature sets. |
|
|
| --- |
|
|
| ## 1. Environment and Security Initialization |
| At the very top of the file, we handle environment variables. This is critical because the subsequent imports of `core_features` and `agent_features` immediately initialize LLM objects that require an API key. |
|
|
| ```python |
| import os |
| from dotenv import load_dotenv |
| |
| # Load environment variables BEFORE importing local modules |
| load_dotenv() |
| ``` |
| - **Line 5:** `load_dotenv()` reads the `.env` file. We do this *before* importing our routers (Lines 13-14) so that those modules find the `GROQ_API_KEY` in the environment the moment they are loaded. |
|
|
| --- |
|
|
| ## 2. FastAPI Application Instance |
| We define the app and its metadata, which powers the auto-generated documentation. |
|
|
| ```python |
| app = FastAPI( |
| title="ToneForgeAI", |
| description=( |
| "AI-powered email assistant: formalize, translate, reply, " |
| "negotiate, and parse legal emails." |
| ), |
| ) |
| ``` |
| - **`app`:** The global instance that registers all routes and middleware. |
| - **Swagger UI:** By visiting `http://localhost:8000/docs`, you can see this description and test every endpoint interactively. |
|
|
| --- |
|
|
| ## 3. Global Middleware (CORS) |
| Security logic to allow frontend-backend communication. |
|
|
| ```python |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
| ``` |
| - **CORS:** Cross-Origin Resource Sharing. |
| - **Line 26:** `allow_origins=["*"]` allows any frontend (regardless of port or domain) to send requests. Without this, browsers block API calls for security. |
|
|
| --- |
|
|
| ## 4. Static Files and Main UI |
| The backend also serves as the web server for the frontend. |
|
|
| ```python |
| # Mount static files |
| app.mount("/static", StaticFiles(directory="static"), name="static") |
| |
| @app.get("/", response_class=HTMLResponse) |
| async def get_index(): |
| with open("index.html", "r", encoding="utf-8") as f: |
| return f.read() |
| ``` |
| - **Line 33:** `app.mount` maps the local `static/` folder to the `/static` URL path. This is how the browser loads `app.js` and `styles.css`. |
| - **Line 36:** The root route (`/`) simply reads and returns your `index.html` file as the homepage. |
|
|
| --- |
|
|
| ## 5. Module Integration (The Routers) |
| This is the core of the modular architecture designed to prevent merge conflicts. |
|
|
| ```python |
| # Include the routers from our split files |
| app.include_router(core_router) |
| app.include_router(agent_router) |
| ``` |
| - **Lines 43-44:** Instead of writing logic here, we "mount" the routers from the other two files. This allows Developer 1 and Developer 2 to build independently in their own files without touching `main.py`. |
|
|