import {z} from 'zod' export type FileInput = {source_url: string, file_name?: (string | null) | undefined}; export type JsonValue = unknown; export type ExtractJobRequest = {file: FileInput, schema: {[key: string]: JsonValue}, markdown_url?: (string | null) | undefined, idempotency_key?: (string | null) | undefined}; export type CreateApiApiV1ExtractArgs = {timeout_seconds?: number | undefined, body: ExtractJobRequest}; export type CreateApiApiV1ExtractOptions = {baseUrl: string, APIKeyHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const parsedFile = z.object({item_type: z.literal("file").optional(), markdown_url: z.string(), page_count: z.number().int().optional(), char_count: z.number().int().optional(), extraction_duration_ms: z.number().int().optional(), audio_duration_seconds: z.number().optional()}); export const parsedSheet = z.object({sheet_name: z.string(), markdown_url: z.string(), max_row: z.number().int().optional(), max_col: z.number().int().optional(), char_count: z.number().int().optional(), non_empty_cell_count: z.number().int().optional()}); export const parsedTable = z.object({item_type: z.literal("table").optional(), sheets: z.array(parsedSheet).optional()}); export const ndiServiceAppSchemasPublicParseResult = z.object({result_type: z.literal("parse").optional(), status: z.enum(["success", "failed"]).optional(), error: z.string().nullable().optional(), item: z.union([parsedFile, parsedTable]).nullable().optional()}); export const visualRegionMatch = z.object({match_type: z.literal("visual_region").optional(), page: z.number().int(), x: z.number(), y: z.number(), w: z.number(), h: z.number(), confidence: z.number().optional(), matched_text: z.string().nullable().optional(), cropped_image_url: z.string().nullable().optional()}); export const audioRangeMatch = z.object({match_type: z.literal("audio_range").optional(), start_ms: z.number().int(), end_ms: z.number().int(), confidence: z.number().optional(), matched_text: z.string().nullable().optional()}); export const spreadsheetRangeMatch = z.object({match_type: z.literal("spreadsheet_range").optional(), sheet_name: z.string().nullable().optional(), cell_range: z.string(), confidence: z.number().optional(), matched_text: z.string().nullable().optional()}); export const textRangeMatch = z.object({match_type: z.literal("text_range").optional(), start_char: z.number().int(), end_char: z.number().int(), confidence: z.number().optional(), matched_text: z.string().nullable().optional()}); export const jsonlRecordMatch = z.object({match_type: z.literal("jsonl_record").optional(), line_index: z.number().int(), keys: z.array(z.string()), confidence: z.number().optional(), matched_text: z.string().nullable().optional()}); export const rowRangeMatch = z.object({match_type: z.literal("row_range").optional(), start_row: z.number().int(), end_row: z.number().int(), column: z.string().nullable().optional(), confidence: z.number().optional(), matched_text: z.string().nullable().optional()}); export const jsonPointerMatch = z.object({match_type: z.literal("json_pointer").optional(), pointer: z.string(), confidence: z.number().optional(), matched_text: z.string().nullable().optional()}); export const groundItemResult = z.object({item_id: z.string(), found: z.boolean().optional(), matches: z.array(z.discriminatedUnion("match_type", [visualRegionMatch, audioRangeMatch, spreadsheetRangeMatch, textRangeMatch, jsonlRecordMatch, rowRangeMatch, jsonPointerMatch])).optional(), error: z.string().nullable().optional()}); export const ndiServiceAppSchemasPublicGroundResult = z.object({result_type: z.literal("ground").optional(), results: z.array(groundItemResult).optional(), total_items_found: z.number().int().optional(), total_items_requested: z.number().int().optional(), duration_ms: z.number().int().optional(), transcript_url: z.string().nullable().optional()}); export const categorizedSegment = z.object({kind: z.literal("document_segment").optional(), file_name: z.string(), page_start: z.number().int(), page_end: z.number().int(), category: z.string(), subcategory: z.string(), is_freeform_subcategory: z.boolean().optional(), summary: z.string(), keywords: z.array(z.string()).optional(), markdown_url: z.string().nullable().optional()}); export const categorizedCategory = z.object({category: z.string(), subcategory: z.string(), is_freeform_subcategory: z.boolean().optional()}); export const categorizedSheet = z.object({kind: z.literal("sheet").optional(), file_name: z.string(), sheet_name: z.string(), categories: z.array(categorizedCategory), has_freeform_subcategories: z.boolean().optional(), summary: z.string(), keywords: z.array(z.string()).optional(), markdown_url: z.string().nullable().optional()}); export const ndiServiceAppSchemasPublicCategorizeResult = z.object({result_type: z.literal("categorize").optional(), status: z.enum(["success", "failed"]).optional(), error: z.string().nullable().optional(), items: z.array(z.discriminatedUnion("kind", [categorizedSegment, categorizedSheet])).optional()}); export const jsonValue = z.unknown(); export const ndiServiceAppSchemasPublicExtractResult = z.object({result_type: z.literal("extract").optional(), status: z.enum(["success", "failed"]).optional(), error: z.string().nullable().optional(), data: z.record(z.string(), jsonValue).nullable().optional(), json_url: z.string().nullable().optional(), page_count: z.number().int().optional(), sheet_count: z.number().int().optional()}); export const jobError = z.object({code: z.string(), message: z.string()}); export const ndiServiceAppSchemasPublicJobStatus = z.object({job_id: z.string(), action: z.string(), status: z.string(), result: z.union([ndiServiceAppSchemasPublicParseResult, ndiServiceAppSchemasPublicGroundResult, ndiServiceAppSchemasPublicCategorizeResult, ndiServiceAppSchemasPublicExtractResult]).nullable().optional(), error: jobError.nullable().optional(), is_example: z.boolean().optional(), created_at: z.string(), started_at: z.string().nullable().optional(), completed_at: z.string().nullable().optional(), credits_used: z.number().int().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Extract Sync * * POST /api/v1/extract */ export const createApiApiV1Extract = async (args: CreateApiApiV1ExtractArgs, options: CreateApiApiV1ExtractOptions) => { const {baseUrl, fetch: fetchFn = fetch, APIKeyHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.timeout_seconds != null) query.append("timeout_seconds", String(args.timeout_seconds)) if (APIKeyHeader !== undefined) headers.set("X-API-Key", APIKeyHeader) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/extract${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(ndiServiceAppSchemasPublicJobStatus, await res.json()) };