metadata
title: Tesla FSD Sim Database Cache
emoji: 🚗
colorFrom: blue
colorTo: indigo
sdk: docker
app_port: 7860
pinned: false
FSD Simulator 通用 SQL 中间层
挡在 Roblox 和 Turso 之间。直接传 SQL 执行,两个接口对应两种权限:
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | / |
根请求目录 |
| POST | /write |
执行写类 SQL,支持一次多条,不缓存 |
| POST | /query |
执行一条 SELECT,默认缓存 12h |
一、Turso 建表(只做一次)
CREATE TABLE IF NOT EXISTS driving_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
scene TEXT NOT NULL,
action TEXT NOT NULL,
created_at INTEGER DEFAULT (unixepoch())
);
-- 关键索引!scene 被 WHERE / GROUP BY 用到,不建就全表扫描,狂烧读配额
CREATE INDEX IF NOT EXISTS idx_scene ON driving_events (scene);
二、生成 token
turso db tokens create tonys-tesla-fsd-sim-database
三、在 HF Space 填 3 个 Secret
Settings → Variables and secrets → New secret:
| 名称 | 值 |
|---|---|
TURSO_URL |
https://...turso.io/v2/pipeline(注意是 https + /v2/pipeline,不是 libsql://) |
TURSO_TOKEN |
上面生成的 token |
APP_SECRET |
自定口令,和 Roblox 端一致 |
四、签名(每个 /write /query 请求都要带)
X-Timestamp:当前 Unix 秒(Roblox 用os.time())X-Signature:sha256(APP_SECRET + 时间戳)的小写十六进制
服务端用同样的密钥和时间戳重算比对,并检查时间戳在 ±5 分钟内。
五、请求示例
写入(支持批量):
POST /write
{
"statements": [
{ "sql": "INSERT INTO driving_events (user_id, scene, action) VALUES (?, ?, ?)",
"args": [123, "red_light", "brake"] }
]
}
查询(默认缓存,要实时就加 “cache”: false):
POST /query
{
"sql": "SELECT action, COUNT(*) AS cnt FROM driving_events WHERE scene = ? GROUP BY action ORDER BY cnt DESC",
"args": ["red_light"]
}
返回:{ "rows": [ {"action":"brake","cnt":"120"}, ... ], "cached": false }
安全提醒
单 token 模式下 /query 也具备写权限。能调接口的人 = 持有 APP_SECRET 的人,
所以**务必保管好 APP_SECRET**,别 push 到公开仓库。