client.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import type {
  2. ConfigFileResponse,
  3. ContentItemsResponse,
  4. DashboardResponse,
  5. QueryListResponse,
  6. RunListResponse,
  7. RuntimeFileResponse,
  8. RuntimeFilesResponse,
  9. TimelineResponse
  10. } from "./types";
  11. const DEFAULT_API_BASE_URL = "http://127.0.0.1:8000";
  12. export class ApiError extends Error {
  13. status: number;
  14. detail: unknown;
  15. constructor(message: string, status: number, detail: unknown) {
  16. super(message);
  17. this.name = "ApiError";
  18. this.status = status;
  19. this.detail = detail;
  20. }
  21. }
  22. export function apiBaseUrl() {
  23. return (
  24. process.env.NEXT_PUBLIC_CONTENTFIND_API_BASE_URL ||
  25. process.env.VITE_CONTENTFIND_API_BASE_URL ||
  26. DEFAULT_API_BASE_URL
  27. ).replace(/\/$/, "");
  28. }
  29. async function request<T>(path: string): Promise<T> {
  30. const response = await fetch(`${apiBaseUrl()}${path}`, {
  31. headers: { Accept: "application/json" },
  32. cache: "no-store"
  33. });
  34. if (!response.ok) {
  35. let detail: unknown = null;
  36. try {
  37. detail = await response.json();
  38. } catch {
  39. detail = await response.text();
  40. }
  41. throw new ApiError(`request failed: ${path}`, response.status, detail);
  42. }
  43. return response.json() as Promise<T>;
  44. }
  45. export function listRuns(params: URLSearchParams) {
  46. const query = params.toString();
  47. return request<RunListResponse>(`/runs${query ? `?${query}` : ""}`);
  48. }
  49. export function getDashboard(runId: string) {
  50. return request<DashboardResponse>(`/runs/${encodeURIComponent(runId)}/dashboard`);
  51. }
  52. export function getQueries(runId: string) {
  53. return request<QueryListResponse>(`/runs/${encodeURIComponent(runId)}/queries`);
  54. }
  55. export function getTimeline(runId: string) {
  56. return request<TimelineResponse>(`/runs/${encodeURIComponent(runId)}/timeline`);
  57. }
  58. export function getContentItems(runId: string) {
  59. return request<ContentItemsResponse>(`/runs/${encodeURIComponent(runId)}/content-items`);
  60. }
  61. export function getRuntimeFiles(runId: string) {
  62. return request<RuntimeFilesResponse>(`/runs/${encodeURIComponent(runId)}/runtime-files`);
  63. }
  64. export function getRuntimeFile(runId: string, filename: string, limit = 100) {
  65. const safeFilename = encodeURIComponent(filename);
  66. return request<RuntimeFileResponse>(
  67. `/runs/${encodeURIComponent(runId)}/runtime-files/${safeFilename}?limit=${limit}`
  68. );
  69. }
  70. export function getConfigRulePacks() {
  71. return request<ConfigFileResponse>("/config/rule-packs");
  72. }
  73. export function getConfigWalkStrategy() {
  74. return request<ConfigFileResponse>("/config/walk-strategy");
  75. }
  76. export function getConfigQueryPrompts() {
  77. return request<ConfigFileResponse>("/config/query-prompts");
  78. }