devaanand's picture
feat: LLM-generated construct items (design note ITEM_GENERATION.md)
1a28176
Raw
History Blame Contribute Delete
2.49 kB
// Thin API client. Same-origin in production (FastAPI serves the build);
// the Vite dev server proxies /api to :8000.
async function request(path, options = {}) {
const resp = await fetch(path, options);
if (!resp.ok) {
let detail = resp.statusText;
try {
const body = await resp.json();
detail = body.detail || detail;
} catch {
/* non-JSON error body */
}
throw new Error(detail);
}
return resp.json();
}
const json = (method, body) => ({
method,
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
export const api = {
health: () => request("/api/health"),
models: () => request("/api/models"),
languages: () => request("/api/languages"),
listProjects: () => request("/api/projects"),
createProject: (body) => request("/api/projects", json("POST", body)),
patchProject: (projectId, body) => request(`/api/projects/${projectId}`, json("PATCH", body)),
deleteProject: (projectId) => fetch(`/api/projects/${projectId}`, { method: "DELETE" }),
authMe: () => request("/api/auth/me"),
register: (body) => request("/api/auth/register", json("POST", body)),
login: (body) => request("/api/auth/login", json("POST", body)),
logout: () => request("/api/auth/logout", { method: "POST" }),
listCorpora: (projectId) => request(`/api/projects/${projectId}/corpora`),
uploadCorpus: (projectId, file) => {
const form = new FormData();
form.append("file", file);
return request(`/api/projects/${projectId}/corpora`, { method: "POST", body: form });
},
listConstructs: () => request("/api/constructs"),
createConstruct: (body) => request("/api/constructs", json("POST", body)),
generateConstructItems: (body) =>
request("/api/constructs/generate-items", json("POST", body)),
parseConstructFile: (file) => {
const form = new FormData();
form.append("file", file);
return request("/api/constructs/parse-file", { method: "POST", body: form });
},
createJob: (body) => request("/api/jobs", json("POST", body)),
listJobs: (projectId) => request(`/api/jobs?project_id=${projectId}`),
getJob: (jobId) => request(`/api/jobs/${jobId}`),
jobResults: (jobId) => request(`/api/jobs/${jobId}/results`),
exportUrl: (jobId) => `/api/jobs/${jobId}/export`,
metadataUrl: (jobId) => `/api/jobs/${jobId}/metadata`,
scriptUrl: (jobId) => `/api/jobs/${jobId}/script`,
scriptRequirementsUrl: (jobId) => `/api/jobs/${jobId}/script-requirements`,
};