请求和响应都要有 schema
只校验前端输入还不够,provider 返回也可能缺字段或改变可选结构。把 normalized decision 单独定义类型,UI 和业务代码就不用到处判断 provider 细节。
Fallback 也应该是合法类型
不要用 undefined 同时表示超时、低置信度和没有答案。返回明确的 fallback variant,调用方才能决定显示人工复核、重试还是保守默认值。
浏览器不需要知道 API key
鉴权、模型 ID、限流、重试和 usage 统计都放在服务端。浏览器只接收允许公开的 decision 和解释字段,既方便换 provider,也减少凭证泄露风险。
TypeScript / server route
const response = await fetch("/api/jev/evaluate", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ state, questions }),
})
if (!response.ok) return { status: "fallback" as const }
const decision = await response.json()