// 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)}`); }, // LLM Profile API profiles() { return API.get("/api/llm-profiles"); }, createProfile(body) { return API.post("/api/llm-profiles", body); }, updateProfile(id, body) { return fetch(`/api/llm-profiles/${encodeURIComponent(id)}`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }).then(async r => { if (!r.ok) { const d = await API._extractError(r); throw new Error(d); } return r.json(); }); }, deleteProfile(id) { return fetch(`/api/llm-profiles/${encodeURIComponent(id)}`, { method: "DELETE" }) .then(async r => { if (!r.ok) { const d = await API._extractError(r); throw new Error(d); } return r.json(); }); }, applyProfiles(body) { return API.post("/api/llm-profiles/apply", body); }, // 测试已保存 profile 的连通性 testProfile(id) { return fetch(`/api/llm-profiles/${encodeURIComponent(id)}/test`, { method: "POST" }) .then(async r => { if (!r.ok) { const d = await API._extractError(r); throw new Error(d); } return r.json(); }); }, // 测试表单中填写的内联参数(保存前即可测试) probeConnectivity(body) { return API.post("/api/llm-profiles/probe", body); }, };