learning_ai_common_plat/dashboards/admin-web/src/lib/extraction-client.ts
saravanakumardb1 2d54795c30 feat(dashboards): migrate admin + tracker dashboards to common-plat as product-agnostic
- Copy admin-dashboard-web → dashboards/admin-web
- Copy tracker-dashboard-web → dashboards/tracker-web
- Update pnpm-workspace.yaml to include dashboards/*
- Replace file: refs with workspace:* for @bytelyst/* packages
- Replace all hardcoded LysnrAI/lysnn.com branding with generic platform refs
- Make telemetry use NEXT_PUBLIC_PRODUCT_ID / PRODUCT_ID env vars
- Update mock credentials, seed data, invitation codes, placeholders
- Update READMEs, e2e tests, unit tests for product-agnostic content
- Both dashboards pass tsc --noEmit clean
2026-02-28 02:17:35 -08:00

110 lines
3.2 KiB
TypeScript

/**
* Extraction Service API client for the admin dashboard.
* Uses @bytelyst/api-client shared package.
*
* Provides typed methods for transcript extraction, task management,
* and sidecar health checks.
*/
import { createApiClient } from '@bytelyst/api-client';
const extractionApi = createApiClient({
baseUrl: `${process.env.EXTRACTION_SERVICE_URL || 'http://localhost:4005'}/api`,
});
// ── Types ────────────────────────────────────────────────────────
export interface ExtractionEntity {
extraction_class: string;
extraction_text: string;
attributes?: Record<string, string>;
start_offset?: number;
end_offset?: number;
}
export interface ExtractResponse {
extractions: ExtractionEntity[];
metadata: {
modelId: string;
durationMs: number;
tokenCount?: number;
charCount: number;
};
requestId?: string;
}
export interface ExtractionTask {
id: string;
name: string;
description?: string;
prompt: string;
classes: string[];
builtIn: boolean;
productId: string;
}
// ── Extract ──────────────────────────────────────────────────────
export async function extractText(
text: string,
taskId?: string,
modelId?: string,
): Promise<ExtractResponse | null> {
try {
return await extractionApi.fetch<ExtractResponse>('/extract', {
method: 'POST',
body: JSON.stringify({ text, taskId, modelId }),
});
} catch {
return null;
}
}
export async function extractTranscript(text: string): Promise<ExtractResponse | null> {
return extractText(text, 'transcript-extraction');
}
export async function extractBatch(
inputs: Array<{ text: string; taskId?: string }>,
modelId?: string,
): Promise<ExtractResponse[] | null> {
try {
const result = await extractionApi.fetch<{ results: ExtractResponse[] }>('/extract/batch', {
method: 'POST',
body: JSON.stringify({ inputs, modelId }),
});
return result.results;
} catch {
return null;
}
}
// ── Tasks ────────────────────────────────────────────────────────
export async function listTasks(productId?: string): Promise<ExtractionTask[]> {
const qs = productId ? `?productId=${encodeURIComponent(productId)}` : '';
try {
return await extractionApi.fetch<ExtractionTask[]>(`/tasks${qs}`);
} catch {
return [];
}
}
export async function getTask(id: string): Promise<ExtractionTask | null> {
try {
return await extractionApi.fetch<ExtractionTask>(`/tasks/${encodeURIComponent(id)}`);
} catch {
return null;
}
}
// ── Health ───────────────────────────────────────────────────────
export async function getSidecarHealth(): Promise<{ status: string; sidecar?: unknown } | null> {
try {
return await extractionApi.fetch<{ status: string; sidecar?: unknown }>('/extract/sidecar-health');
} catch {
return null;
}
}