TonyD365's picture
Update README.md
ce9852a verified
|
Raw
History Blame Contribute Delete
2.68 kB
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-Signaturesha256(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 到公开仓库。