Add admin docs and Android admin scaffold

This commit is contained in:
kdusek
2026-01-27 02:34:21 +01:00
parent c716699a66
commit a36707c8aa
21 changed files with 664 additions and 5 deletions

94
docs/ADMIN.md Normal file
View File

@@ -0,0 +1,94 @@
# Admin
There are two admin surfaces:
1) Browser admin UI: `/admin`
2) Admin APIs: `/api/logs` and `/api/stats/*`
Admin is intended for local-network use.
## Browser admin UI
1. Start the server (serves both chat UI and admin UI):
```bash
export FIRMWARE_API_KEY=...
./run.sh build
./run.sh server
```
2. Open the admin UI:
- `http://<HOST>:<PORT>/admin` (example: `http://192.168.88.2:8787/admin`)
3. Login:
- Enter `ADMIN_TOKEN` once.
- The server sets an `admin_token` httpOnly cookie.
- The UI then calls admin APIs without needing custom headers.
Logout clears the cookie.
## Admin APIs
Admin APIs are read-only and require authentication.
Auth methods:
- Header: `x-admin-token: $ADMIN_TOKEN`
- Cookie session: `admin_token` (set by `POST /api/admin/session`)
### List/search logs
`GET /api/logs`
Query params:
- `q`: full-text search across prompt+answer (SQLite FTS5)
- `status`: `ok|error|aborted|started`
- `model`: model id
- `from`, `to`: timestamps (ms epoch)
- `limit` (1..200), `offset`
Example:
```bash
curl -H "x-admin-token: $ADMIN_TOKEN" \
"http://192.168.88.2:8787/api/logs?q=xin%20chao&limit=50"
```
### Log detail
`GET /api/logs/:request_id`
Returns full record including:
- `messages_json` (full conversation context)
- `assistant_text` (final/partial answer)
- timestamps and status
### Stats
- `GET /api/stats/summary`
- `GET /api/stats/models`
- `GET /api/stats/timeseries?bucket=hour|day`
Example:
```bash
curl -H "x-admin-token: $ADMIN_TOKEN" \
"http://192.168.88.2:8787/api/stats/summary"
```
## Data logging
SQLite file (default): `./data/chatlog.sqlite`
Each `/api/chat` request inserts a log row at start and updates it when finished.
Stored fields include:
- timestamps: `ts_request`, `ts_first_token`, `ts_done`
- full context: `messages_json`
- quick fields: `user_text`, `assistant_text`
- `model`, `status`, optional `usage` tokens