static-hosting

This commit is contained in:
朱潮 2026-05-21 18:30:01 +08:00
parent 8cad98daa1
commit a1754feaf3
2 changed files with 37 additions and 62 deletions

View File

@ -5,75 +5,25 @@ description: Serve static HTML/CSS/JS/images from robot project directories via
# Static Hosting
Provide external access to static files (HTML, CSS, JS, images, fonts, etc.) stored under each robot's project directory.
Host static files (HTML, CSS, JS, images, fonts, etc.) under the bot's project directory and get public URLs.
## Use when
## Usage
- Generate HTML pages, reports, or dashboards for a bot and need a URL to access them
- Create interactive web content (with CSS/JS) that users can open in a browser
- Need to host images or other assets referenced by bot-generated HTML
Write files to `/app/projects/robot/{ASSISTANT_ID}/`, then run the script to get the public URL:
## How it works
FastAPI mounts `projects/robot/` at the `/robots` URL path with `html=True` enabled.
```
/app/projects/robot/{bot_id}/ --> {FASTAPI_URL}/robots/{bot_id}/
/app/projects/robot/{bot_id}/foo.html --> {FASTAPI_URL}/robots/{bot_id}/foo.html
```bash
python3 {SKILL_DIR}/scripts/get_url.py <absolute_path>
```
`FASTAPI_URL` : `https://engine.aitravelmaster.com`.
## URL rules
| Local path | External URL | Notes |
|---|---|---|
| `/app/projects/robot/{bot_id}/index.html` | `/robots/{bot_id}/` | `html=True` auto-resolves `index.html` |
| `/app/projects/robot/{bot_id}/page.html` | `/robots/{bot_id}/page.html` | Direct HTML access |
| `/app/projects/robot/{bot_id}/css/style.css` | `/robots/{bot_id}/css/style.css` | CSS files |
| `/app/projects/robot/{bot_id}/js/app.js` | `/robots/{bot_id}/js/app.js` | JavaScript files |
| `/app/projects/robot/{bot_id}/images/logo.png` | `/robots/{bot_id}/images/logo.png` | Images (png/jpg/svg/etc.) |
| `/app/projects/robot/{bot_id}/fonts/custom.woff2` | `/robots/{bot_id}/fonts/custom.woff2` | Font files |
## Recommended directory structure
Example:
```bash
python3 {SKILL_DIR}/scripts/get_url.py /app/projects/robot/{ASSISTANT_ID}/index.html
# => https://engine.aitravelmaster.com/robots/[bot-id]/index.html
```
/app/projects/robot/{bot_id}/
├── index.html # Entry page (auto-served at /robots/{bot_id}/)
├── css/
│ └── style.css
├── js/
│ └── app.js
├── images/
│ └── logo.png
└── fonts/
└── custom.woff2
```
## HTML referencing rules
Inside HTML files, use **relative paths** to reference local assets:
```html
<!-- In projects/robot/{bot_id}/index.html -->
<link rel="stylesheet" href="css/style.css">
<script src="js/app.js"></script>
<img src="images/logo.png" alt="logo">
```
Do NOT use absolute paths like `/css/style.css` — this would resolve to the server root, not the bot directory.
## Quick example
To generate and serve a simple page for bot `63069654-7750-409d-9a58-a0960d899a20`:
1. Write HTML to `/app/projects/robot/63069654-7750-409d-9a58-a0960d899a20/index.html`
2. Access at `{FASTAPI_URL}/robots/63069654-7750-409d-9a58-a0960d899a20/`
## Notes
- Content-Type is auto-detected from file extension
- CORS is already configured (allow all origins) so frontend JS can fetch APIs on the same server
- Subdirectories of any depth are supported
- No authentication — all files under `/robots/` are publicly accessible
- The mount is defined in `fastapi_app.py`
- Inside HTML, use **relative paths** to reference other assets (e.g. `href="css/style.css"`)
- `index.html` is auto-served at the directory URL
- All files under `/robots/` are publicly accessible, no authentication

View File

@ -0,0 +1,25 @@
import os
import sys
FASTAPI_URL = os.getenv("FASTAPI_URL", "https://engine.aitravelmaster.com")
ASSISTANT_ID = os.getenv("ASSISTANT_ID", "")
if not ASSISTANT_ID:
print("Error: ASSISTANT_ID environment variable is not set")
sys.exit(1)
if len(sys.argv) < 2:
print(f"Usage: python3 {sys.argv[0]} <file_path>")
print(f"Example: python3 {sys.argv[0]} /app/projects/robot/{ASSISTANT_ID}/index.html")
sys.exit(1)
file_path = os.path.abspath(sys.argv[1])
workspace_root = f"/app/projects/robot/{ASSISTANT_ID}"
if not file_path.startswith(workspace_root):
print(f"Error: path must be under {workspace_root}, got: {file_path}")
sys.exit(1)
relative_path = file_path[len(workspace_root):] # e.g. "/css/style.css"
base_url = f"{FASTAPI_URL.rstrip('/')}/robots/{ASSISTANT_ID}"
print(f"{base_url}{relative_path}")