chore(privacy): 文档与截图改用合成示例数据,移除真实 Prompt 与统计口径
原截图里含有不该公开的内容: * docs/images/02-records.png —— 真实 Prompt 全文、请求 ID、真实模型名 * docs/images/05-logs.png —— 本机路径与 Windows 用户名 * docs/images/04-config.png —— Cookie 尾串 * 01/03/07/08 —— 真实用量分布与日期 做法:新增 tools/demo_data.py 生成完全合成的示例库(假模型名 demo-*、 通用 Prompt、偏斜的积分分布、RFC 5737 文档专用网段的审计 IP), 在容器里跑它并以 /app 路径截图,再按原规格(1400px + 调色板量化)替换。 同时把 docs/API.md 与 docs/DEPLOYMENT.md 示例响应里的真实模型名与真实 统计数字(1665 条 / 8513.36 积分等)换成示例口径。 顺带修正 .gitignore:只写 data/*.sqlite 会漏掉子目录,补 data/**/*.sqlite 等规则并忽略 data/demo/。
@@ -47,16 +47,16 @@
|
||||
"producer": "workbuddy-portal(Flask + SQLite)",
|
||||
"note": "...",
|
||||
"totals": {
|
||||
"records": 1665, "credits": 8513.36, "calls": 1086,
|
||||
"freeCalls": 579, "billableCalls": 507,
|
||||
"models": 12, "clients": 3,
|
||||
"first": "2026-08-10 00:00:00", "last": "2026-09-14 14:51:00",
|
||||
"topCredits": 319.5
|
||||
"records": 944, "credits": 4961.63, "calls": 944,
|
||||
"freeCalls": 328, "billableCalls": 616,
|
||||
"models": 7, "clients": 3,
|
||||
"first": "2026-08-16 09:12:00", "last": "2026-09-14 15:52:00",
|
||||
"topCredits": 412.8
|
||||
},
|
||||
"months": ["2026-08", "2026-09"],
|
||||
"sources": [{ "path": "usage.sqlite", "role": "primary", "count": 1665, "bytes": 1234567 }],
|
||||
"sources": [{ "path": "usage.sqlite", "role": "primary", "count": 944, "bytes": 434176 }],
|
||||
"focusDay": "2026-09-14",
|
||||
"health": { "cookie": true, "lastRunAt": "2026-09-14 14:51:28", "lastRunStatus": "ok" }
|
||||
"health": { "cookie": true, "lastRunAt": "2026-09-14 15:52:10", "lastRunStatus": "ok" }
|
||||
}
|
||||
```
|
||||
|
||||
@@ -73,14 +73,14 @@
|
||||
{
|
||||
"manifest": { ... 同上 ... },
|
||||
"daily": [
|
||||
{ "d": "2026-09-08", "c": 1423.5, "k": 88, "fc": 40, "bc": 48,
|
||||
"m": { "deepseek-v4-flash": 800.2, "glm-5.3-flash": 623.3 },
|
||||
{ "d": "2026-09-08", "c": 168.4, "k": 31, "fc": 12, "bc": 19,
|
||||
"m": { "demo-flash": 62.1, "demo-pro": 41.7 },
|
||||
"h": [0,0,0,0,0,0,0,0,0,12.5, ...] }
|
||||
],
|
||||
"dims": { "model": [...], "client": [...], "hour": [...] },
|
||||
"top": [ { "id": "...", "c": 319.5, "m": "kimi-k3-1", "cl": "VSCode", "t": "2026-09-12 15:04:00", "px": "摘要…" } ],
|
||||
"top": [ { "id": "...", "c": 412.8, "m": "demo-reason", "cl": "vscode", "t": "2026-09-12 15:04:00", "px": "摘要…" } ],
|
||||
"records": [ { "id": "...", "c": 5.78, "m": "...", "cl": "...", "t": "...", "px": "..." } ],
|
||||
"recordsTotal": 1665,
|
||||
"recordsTotal": 944,
|
||||
"recordsCap": 20000,
|
||||
"recordsTruncated": false,
|
||||
"totals": { ... },
|
||||
@@ -106,13 +106,13 @@ KPI + 环比。`from`/`to` 缺省时自动取全量区间。
|
||||
|
||||
```json
|
||||
{
|
||||
"records": 428, "credits": 2145.6, "calls": 300,
|
||||
"freeCalls": 120, "billableCalls": 180,
|
||||
"records": 226, "credits": 1180.4, "calls": 226,
|
||||
"freeCalls": 78, "billableCalls": 148,
|
||||
"firstDay": "2026-09-08", "lastDay": "2026-09-14", "days": 7,
|
||||
"models": 9, "clients": 2,
|
||||
"models": 7, "clients": 3,
|
||||
"first": "...", "last": "...",
|
||||
"window": { "from": "2026-09-08", "to": "2026-09-14", "days": 7 },
|
||||
"avgPerCall": 7.15,
|
||||
"avgPerCall": 5.22,
|
||||
"prev": { ... 上一段等长窗口的同样结构 ... },
|
||||
"delta": { "credits": 12.3, "calls": -4.1, "window": { "from": "...", "to": "..." } },
|
||||
"partial": { "date": "2026-09-14", "hhmm": "14:52" }
|
||||
@@ -132,7 +132,7 @@ KPI + 环比。`from`/`to` 缺省时自动取全量区间。
|
||||
| `from` / `to` | 筛选窗口 |
|
||||
|
||||
```json
|
||||
{ "days": [ { "d": "2026-09-08", "c": 1423.5, "k": 88, "fc": 40, "bc": 48,
|
||||
{ "days": [ { "d": "2026-09-08", "c": 168.4, "k": 31, "fc": 12, "bc": 19,
|
||||
"m": {...}, "h": [24 个元素] } ] }
|
||||
```
|
||||
|
||||
@@ -146,8 +146,8 @@ KPI + 环比。`from`/`to` 缺省时自动取全量区间。
|
||||
|
||||
```json
|
||||
{
|
||||
"model": [ { "name": "deepseek-v4-flash", "credits": 3784.86, "calls": 234, "avg": 16.17, "free": 0 } ],
|
||||
"client": [ { "name": "VSCode", ... } ],
|
||||
"model": [ { "name": "demo-flash", "credits": 1286.4, "calls": 252, "avg": 5.1, "free": 0 } ],
|
||||
"client": [ { "name": "vscode", ... } ],
|
||||
"hour": [ { "name": "14", ... } ]
|
||||
}
|
||||
```
|
||||
@@ -162,7 +162,7 @@ KPI + 环比。`from`/`to` 缺省时自动取全量区间。
|
||||
| `n` | 50 | 返回条数(1~1000) |
|
||||
|
||||
```json
|
||||
[ { "id": "…", "c": 319.5, "m": "kimi-k3-1", "cl": "VSCode",
|
||||
[ { "id": "…", "c": 412.8, "m": "demo-reason", "cl": "vscode",
|
||||
"t": "2026-09-12 15:04:00", "px": "截断后的 Prompt 摘要" } ]
|
||||
```
|
||||
|
||||
@@ -184,7 +184,7 @@ KPI + 环比。`from`/`to` 缺省时自动取全量区间。
|
||||
{
|
||||
"items": [ { "request_id": "…", "credits": 5.78, "model": "…",
|
||||
"client": "…", "ts": "2026-09-14 14:20:00", "prompt": "…" } ],
|
||||
"total": 1665, "page": 1, "size": 50, "pages": 34,
|
||||
"total": 944, "page": 1, "size": 50, "pages": 19,
|
||||
"window": { "from": "...", "to": "..." }
|
||||
}
|
||||
```
|
||||
@@ -292,7 +292,7 @@ KPI + 环比。`from`/`to` 缺省时自动取全量区间。
|
||||
|
||||
| 场景 | 响应 |
|
||||
|---|---|
|
||||
| 成功 | `200 {"ok": true, "result": {"message": "新增 11 条,重复 6 条,存档共 1665 条", ...}}` |
|
||||
| 成功 | `200 {"ok": true, "result": {"message": "新增 11 条,重复 6 条,存档共 944 条", ...}}` |
|
||||
| 已有采集在跑 | `409 {"ok": false, "error": "busy", "message": "..."}` |
|
||||
| Cookie 失效 | `401 {"ok": false, "error": "cookie_expired", "message": "..."}` |
|
||||
| 云端异常 | `502 {"ok": false, "error": "api", "message": "..."}` |
|
||||
|
||||
@@ -544,10 +544,10 @@ sqlite3.OperationalError: unable to open database file
|
||||
docker compose -f docker-compose.yml -f docker-compose.hostdir.yml up -d
|
||||
docker compose exec portal python -c \
|
||||
"import sqlite3;print(sqlite3.connect('/app/data/usage.sqlite').execute('select count(*) from usage_records').fetchone())"
|
||||
# -> (1665,) 容器侧正常
|
||||
# -> (944,) 容器侧正常
|
||||
|
||||
python manage.py stats # 宿主侧随手跑一次「纯读」的 CLI
|
||||
# -> 存档:1665 条 …
|
||||
# -> 存档:944 条 …
|
||||
|
||||
docker compose exec portal python -c \
|
||||
"import sqlite3;sqlite3.connect('/app/data/usage.sqlite')"
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
> 面向**使用者**(不是开发者)。读完这份就能独立完成日常操作:
|
||||
> 登录 → 看用量 → 配置采集 → 查明细 → 导数据 → 处理常见异常。
|
||||
|
||||
> **关于配图**:本文所有截图都用 `tools/demo_data.py` 生成的**合成示例数据**渲染
|
||||
> ——模型名统一是 `demo-*`,客户端为 `vscode`/`webconsole`/`sdk`,Prompt 是通用示例文本。
|
||||
> 所以你可以照着重现出几乎一样的界面,也不必担心文档里夹带真实账号信息。
|
||||
> 想自己搭一份这样的环境:`python tools/demo_data.py` 然后按输出的提示起服务即可。
|
||||
|
||||
**目录**
|
||||
|
||||
- [一、这个系统是做什么的](#一这个系统是做什么的)
|
||||
|
||||
|
之前 宽度: | 高度: | 大小: 170 KiB 之后 宽度: | 高度: | 大小: 169 KiB |
|
之前 宽度: | 高度: | 大小: 616 KiB 之后 宽度: | 高度: | 大小: 478 KiB |
|
之前 宽度: | 高度: | 大小: 164 KiB 之后 宽度: | 高度: | 大小: 269 KiB |
|
之前 宽度: | 高度: | 大小: 140 KiB 之后 宽度: | 高度: | 大小: 140 KiB |
|
之前 宽度: | 高度: | 大小: 218 KiB 之后 宽度: | 高度: | 大小: 271 KiB |
|
之前 宽度: | 高度: | 大小: 98 KiB 之后 宽度: | 高度: | 大小: 98 KiB |
|
之前 宽度: | 高度: | 大小: 397 KiB 之后 宽度: | 高度: | 大小: 386 KiB |
|
之前 宽度: | 高度: | 大小: 397 KiB 之后 宽度: | 高度: | 大小: 386 KiB |