Frontend test functionality was implemented but never committed to git.
Re-adds:
- profiles.js: testCard(), testForm(), _showTestResult(), test btn in renderCard
- api.js: testProfile(id) and probeConnectivity(body) methods
- index.html: 测试连通性 button + result div in profile form
- app.css: .btn-test and .profile-test-result styles
Backend /probe and /{id}/test endpoints were already present in llm_profiles.py.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
81 lines
2.6 KiB
JavaScript
81 lines
2.6 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)}`); },
|
||
|
||
// 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); },
|
||
};
|