Add interactive API docs at /docs endpoint

Swagger UI served via CDN for browsing OpenAPI spec.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-04 16:33:21 -06:00
parent 4262865520
commit 5e76ce9597
4 changed files with 33 additions and 2 deletions

View File

@@ -80,6 +80,7 @@ All detectors support: `AGGREGATOR_URL`, `CHECK_INTERVAL`, `THRESHOLD_WARNING`,
| `/wake` | POST | Exit sleep mode |
| `/status` | GET | Current state JSON |
| `/events` | GET | List active events |
| `/docs` | GET | Interactive API documentation (Swagger UI) |
### `/notify` Endpoint

View File

@@ -191,8 +191,9 @@ automation:
| `/notify` | POST | Simple notification `{"message": "", "duration": 5}` |
| `/sleep` | POST | Enter sleep mode |
| `/wake` | POST | Exit sleep mode |
| `/docs` | GET | Interactive API documentation (Swagger UI) |
Full API documentation available in [openapi.yaml](openapi.yaml) (OpenAPI 3.0 spec).
Full API documentation available at [/docs](http://localhost:5100/docs) or in [openapi.yaml](openapi.yaml).
## Personality

View File

@@ -326,6 +326,35 @@ def list_events():
return jsonify({"events": dict(active_events)}), 200
@app.route("/docs")
def docs():
"""Serve interactive API documentation via Swagger UI."""
return """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Kao API Documentation</title>
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
<style>
body { margin: 0; background: #fafafa; }
.swagger-ui .topbar { display: none; }
</style>
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
<script>
SwaggerUIBundle({
url: '/openapi.yaml',
dom_id: '#swagger-ui',
presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
layout: 'BaseLayout'
});
</script>
</body>
</html>"""
def main():
port = int(os.environ.get("PORT", 5100))

View File

@@ -217,7 +217,7 @@
const emoteEl = document.getElementById("emote");
const messageEl = document.getElementById("message");
const POLL_INTERVAL = 2000;
const VERSION = "v1.3.1";
const VERSION = "v1.3.2";
// Sound system
let audioCtx = null;