Jev Recipe / 数据驻留与合规
Jev 数据驻留:把每一次决策固定在正确的辖区里
把「这条数据能否跨境」做成类型化决策:一次 Jev evaluate 调用同时返回合法处理路径、传输风险与越区覆盖标记——在任何包含个人数据的 state 出境之前。
按辖区固定决策的 6 个步骤
{
"processing_route": {
"type": "choice",
"instructions": "这条 state 依哪条合法路径处理?",
"criteria": {
"eu_in_region": "评估可留在主体所在区域内(EEA、日本、巴西本地)",
"third_country_adequacy": "目的地国家对这些数据类别有充分性认定覆盖",
"sccs_with_tia": "适用标准合同条款,且 TIA 引用已归档",
"needs_dpa_review": "无覆盖路径——传输前先由法务决定"
}
},
"transfer_risk": {
"type": "score",
"instructions": "如果这条 state 违规跨境,代价多大?1(聚合、非身份可识别)到 4(特殊类别或监管敏感)"
},
"regional_override": {
"type": "noul",
"instructions": "该请求是否要求比所在辖区默认路径更严格的处理?"
}
}六条请求,一道区域闸门
下面每条请求都已经跑过区域闸门。拖动两条轴——自动固定的路径置信度阈值与自动传输的风险上限——看车道实时重算。0.96 的路径置信度本身不够:EEA 健康数据请求仍会离开自动路径,因为传输风险是第二条轴。
| 请求 | 路径与置信度 | 传输风险 | 车道 |
|---|---|---|---|
点击流路由 · EEA 用户 #2214 欧洲经济区(EEA) · 行为数据 · 聚合 · 94ms | 区域内处理0.97 | 风险 1/4 | 自动固定区域 |
症状分诊 · EEA 用户 #4457 欧洲经济区(EEA) · 特殊类别 · 健康 · 101ms | 区域内处理0.96 | 风险 4/4 | 最小化后固定 |
流水分类 · 日本用户 #7741 日本 · 财务记录 · 88ms | SCC + TIA0.91 | 风险 2/4 | 自动固定区域 |
内容个性化 · 美国用户 #2298 美国 · 行为数据 · 身份标识 · 96ms | 充分性认定0.74 | 风险 1/4 | 最小化后固定 |
信贷初审 · 巴西用户 #5190 巴西 · 财务记录 · 92ms | 待法务复核0.68 | 风险 3/4 | 法务复核 |
门禁判定 · EEA 员工 #3306 欧洲经济区(EEA) · 特殊类别 · 生物识别 · 99ms | 区域内处理0.95 | 风险 3/4override | 法务复核 |
仅演示数据——六条模拟请求。车道按与文案相同的双轴规则实时重算。
驻留执行方式:类型化区域闸门 vs 提示词规则 vs 默认 API 路由(不执行)
代码对比:各自漂移的应用层辖区判断 vs 类型化区域闸门
def pick_endpoint(user: dict) -> str:
# 传输地图散落成几段 if 判断。没有任何东西记录用的是哪条
# 路径,没有风险轴,没有复核车道:EEA 用户的健康数据请求
# 和一条美国聚合指标走同一个默认端点。充分性名单一变,
# 每个服务各自打补丁——或者忘掉。
if user.get("region") in ("DE", "FR", "NL"):
return "https://eu.api.typesafe.ai/v1/jev/evaluate"
return "https://api.typesafe.ai/v1/jev/evaluate"import requests
GATE_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate"
AUTO_ROUTE_CONFIDENCE = 0.85
AUTO_MAX_RISK = 2 # risk <= 2 且 confidence >= 闸门 -> 自动固定
ZONE_ENDPOINTS = {
"eu_in_region": "https://eu.api.typesafe.ai/v1/jev/evaluate",
"third_country_adequacy": "https://api.typesafe.ai/v1/jev/evaluate",
"sccs_with_tia": "https://api.typesafe.ai/v1/jev/evaluate",
}
QUESTIONS = {
"processing_route": {
"type": "choice",
"instructions": "这条 state 依哪条合法路径处理?",
"criteria": {
"eu_in_region": "评估可留在主体所在区域内",
"third_country_adequacy": "目的地有充分性认定覆盖",
"sccs_with_tia": "适用 SCC 且 TIA 引用已归档",
"needs_dpa_review": "无覆盖路径——先过法务",
},
},
"transfer_risk": {
"type": "score",
"instructions": "违规跨境代价多大?1 聚合 - 4 特殊类别",
},
"regional_override": {
"type": "noul",
"instructions": "该请求是否要求比所在辖区默认更严格的处理?",
},
}
def gate_transfer(state: dict) -> dict:
resp = requests.post(
GATE_ENDPOINT,
json={"state": state, "questions": QUESTIONS},
timeout=5,
)
resp.raise_for_status()
data = resp.json()
route = data["processing_route"]
risk = data["transfer_risk"]["answer"]
if route["answer"] == "needs_dpa_review" or data["regional_override"]["answer"]:
lane = "legal_review" # 自动路径彻底封死
elif route["confidence"] >= AUTO_ROUTE_CONFIDENCE and risk <= AUTO_MAX_RISK:
lane = "auto_pinned"
else:
lane = "minimize_then_pin" # 令牌化/剥离后评估裁剪 state
return {
"lane": lane,
"endpoint": ZONE_ENDPOINTS.get(route["answer"]),
"residency_record": {
"subject_region": state.get("region"),
"data_classes": state.get("data_classes"),
"route": route["answer"],
"route_confidence": route["confidence"],
"transfer_risk": risk,
"zone_map_version": "zone-map@2026.10",
"tia_ref": state.get("tia_ref")
if route["answer"] == "sccs_with_tia"
else None,
},
}// 传输地图被压缩成一个环境变量。每个服务读同一个值,
// 没有任何一个能回答「为什么」。日本用户的财务记录和美国
// 聚合指标走同一条默认路径,审计问题「这次传输依哪条合法
// 路径」在系统里没有答案。
const EVALUATION_ENDPOINT =
process.env.REGION === "eu"
? "https://eu.api.typesafe.ai/v1/jev/evaluate"
: "https://api.typesafe.ai/v1/jev/evaluate";
export const pickEndpoint = () => EVALUATION_ENDPOINT;const GATE_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate";
const AUTO_ROUTE_CONFIDENCE = 0.85;
const AUTO_MAX_RISK = 2;
type Lane = "auto_pinned" | "minimize_then_pin" | "legal_review";
const QUESTIONS = {
processing_route: {
type: "choice",
instructions: "这条 state 依哪条合法路径处理?",
criteria: {
eu_in_region: "评估可留在主体所在区域内",
third_country_adequacy: "目的地有充分性认定覆盖",
sccs_with_tia: "适用 SCC 且 TIA 引用已归档",
needs_dpa_review: "无覆盖路径——先过法务",
},
},
transfer_risk: {
type: "score",
instructions: "违规跨境代价多大?1 聚合 - 4 特殊类别",
},
regional_override: {
type: "noul",
instructions: "该请求是否要求比所在辖区默认更严格的处理?",
},
} as const;
export async function gateTransfer(state: {
region: string;
data_classes: string[];
tia_ref?: string;
}) {
const resp = await fetch(GATE_ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ state, questions: QUESTIONS }),
});
if (!resp.ok) throw new Error("Jev evaluate failed");
const data = await resp.json();
const route = data.processing_route as {
answer: string;
confidence: number;
};
const risk = data.transfer_risk.answer as number;
const lane: Lane =
route.answer === "needs_dpa_review" || data.regional_override.answer
? "legal_review"
: route.confidence >= AUTO_ROUTE_CONFIDENCE && risk <= AUTO_MAX_RISK
? "auto_pinned"
: "minimize_then_pin";
// 驻留记录 = 审计追踪决策记录的兄弟记录。用下一版区域地图
// 对日志 state 重放,即可找出新地图会拦下的所有历史传输。
return {
lane,
residency_record: {
subject_region: state.region,
data_classes: state.data_classes,
route: route.answer,
route_confidence: route.confidence,
transfer_risk: risk,
zone_map_version: "zone-map@2026.10",
tia_ref: route.answer === "sccs_with_tia" ? state.tia_ref : null,
},
};
}Jev 数据驻留 FAQ
什么是数据驻留?它为什么对 AI 决策格外重要?
数据驻留要求数据在特定司法辖区内处理或存储。它对 AI 决策的卡点非常具体:发给评估端点的 state 往往携带个人数据,所以每一次 evaluate 调用都可能构成一次跨境传输。如果路由服务在没有任何合法传输路径的情况下,把 EEA 用户的健康问卷送到另一个辖区的端点评估,违规的不是存储,而是这次分类本身。这份配方把「这条数据可以在哪处理」变成显式的、有闸门的、留痕的决策,而不是默认端点的副作用。
GDPR 要求欧盟数据必须留在欧盟境内吗?
不是——GDPR 限制向 EEA 之外的传输,但并不禁止。第五章(第 44–49 条)允许在充分性认定(第 45 条)、适当保障措施如标准合同条款(第 46 条)或有限例外(第 49 条)下传输。「数据留在欧盟」是一些团队选择的简化,因为它把整个分析坍缩成一条路径;这份配方支持一般情形:把路径本身(区域内 / 充分性 / SCC / 法务复核)做成类型化决策,而不是把简化硬编码进去。
Jev 提供欧盟(或日本)区域端点吗?
这是需要核实的厂商事实,不是这份配方能替你回答的——与我们对待兼容性声明是同一条诚实规则:端点区域、子处理者位置和 DPA 承诺都会变化,钉生产流量之前先查厂商当前文档。配方保证的是边界中你这一侧:无论存在哪些端点,决定「哪条 state 可以去哪」的闸门是显式的、版本化的、留痕的——而且某区域没有区域内端点时,车道降级为最小化(令牌化后评估裁剪 state),而不是静默传输。
什么是传输影响评估(TIA)?
在 SCC 体系下(Schrems II 之后),TIA 记录目的地国家法律是否削弱合同保护——政府调取、再传输、救济渠道——以及哪些补充措施(加密、拆分、透明度承诺)能补上缺口。它是你们团队维护的法律文件,这份配方不产出它。配方做的是运营化:sccs_with_tia 路径只有在 TIA 引用已归档时才放行,而且这个引用随驻留记录落账——「这次传输由哪份 TIA 覆盖」从此是一条查询,而不是一次考古。
它和决策审计追踪怎么配合?
两种记录是兄弟关系。审计追踪记录回答「决策了什么、置信度多少、依哪些 schema 版本」;驻留记录回答「这条 state 被允许在哪处理、依哪条合法路径与哪版地图」。两者都是从同一次 evaluate 响应派生的定长行,而且都可重放:区域地图变化时——充分性认定被撤销、厂商更换托管——用新地图重放日志 state 并 diff 车道,与 schema 升级完全同构。一个例外因此可以端到端证明:这里是决策,这里是合法承载它的路径。
这些路径多久变一次?我该怎么办?
频到值得制度化:充分性认定会被修订甚至撤销、SCC 模板条款会更新、厂商会开设和退役区域端点、产品进入新市场会带来新规则(日本 APPI 的越境移転规制与巴西 LGPD 各有自己的传输逻辑)。配方的答案是版本化区域地图:每条记录注明决策时依哪版地图、每季度用地图版本对驻留日志做 diff 找出受影响传输、改地图是发布一次配置——而不是重写散落在各服务里的辖区判断。