47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
|
|
// api.js — 控制台后端 HTTP 接口的轻量封装。
|
|||
|
|
|
|||
|
|
const API = {
|
|||
|
|
// 通用 JSON GET,失败时抛出带状态码的错误。
|
|||
|
|
async get(path) {
|
|||
|
|
const resp = await fetch(path);
|
|||
|
|
if (!resp.ok) {
|
|||
|
|
const detail = await API._extractError(resp);
|
|||
|
|
throw new Error(detail);
|
|||
|
|
}
|
|||
|
|
return resp.json();
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 通用 JSON POST。
|
|||
|
|
async post(path, body) {
|
|||
|
|
const resp = await fetch(path, {
|
|||
|
|
method: "POST",
|
|||
|
|
headers: { "Content-Type": "application/json" },
|
|||
|
|
body: JSON.stringify(body || {}),
|
|||
|
|
});
|
|||
|
|
if (!resp.ok) {
|
|||
|
|
const detail = await API._extractError(resp);
|
|||
|
|
throw new Error(detail);
|
|||
|
|
}
|
|||
|
|
return resp.json();
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 从错误响应中尽量解析出 detail 文本。
|
|||
|
|
async _extractError(resp) {
|
|||
|
|
try {
|
|||
|
|
const data = await resp.json();
|
|||
|
|
return data.detail || `请求失败 (${resp.status})`;
|
|||
|
|
} catch (_e) {
|
|||
|
|
return `请求失败 (${resp.status})`;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
health() { return API.get("/api/health"); },
|
|||
|
|
runs() { return API.get("/api/runs"); },
|
|||
|
|
runDetail(runId) { return API.get(`/api/runs/${encodeURIComponent(runId)}`); },
|
|||
|
|
scenarios() { return API.get("/api/scenarios"); },
|
|||
|
|
triggerEvaluation(scenarioPath) {
|
|||
|
|
return API.post("/api/evaluations", { scenario_path: scenarioPath });
|
|||
|
|
},
|
|||
|
|
taskStatus(taskId) { return API.get(`/api/evaluations/${encodeURIComponent(taskId)}`); },
|
|||
|
|
};
|