File size: 2,676 Bytes
659579b
 
35b58a2
 
 
 
 
 
9febd9f
35b58a2
9febd9f
35b58a2
9febd9f
35b58a2
9febd9f
 
ce9852a
9febd9f
 
35b58a2
9febd9f
35b58a2
 
 
 
 
 
 
 
 
9febd9f
35b58a2
 
 
9febd9f
 
 
 
 
35b58a2
9febd9f
35b58a2
9febd9f
35b58a2
9febd9f
 
 
 
 
35b58a2
9febd9f
35b58a2
9febd9f
 
 
 
 
 
 
 
35b58a2
 
9febd9f
35b58a2
9febd9f
 
 
35b58a2
 
 
 
9febd9f
 
 
 
 
 
 
 
 
 
 
 
 
35b58a2
9febd9f
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
---
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 建表(只做一次)

```sql
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

```bash
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 分钟内。

## 五、请求示例

写入(支持批量):

```json
POST /write
{
  "statements": [
    { "sql": "INSERT INTO driving_events (user_id, scene, action) VALUES (?, ?, ?)",
      "args": [123, "red_light", "brake"] }
  ]
}
```

查询(默认缓存,要实时就加 “cache”: false):

```json
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 到公开仓库。