import {z} from 'zod' export type CreateApiOcrPhotoRecognizeFormAdvancedArgs = {bucketID?: string | undefined, bucketSecretKey?: string | undefined, recognitionMode?: string | undefined, preprocessing?: string | undefined, diagnostics?: string | undefined, body: BodyInit}; export type CreateApiOcrPhotoRecognizeFormAdvancedOptions = {baseUrl?: string | undefined, Apikey?: string | undefined, fetch?: typeof fetch | undefined}; export const formFieldDefinition = z.object({FieldID: z.string().optional(), LeftAnchor: z.string().optional(), TopAnchor: z.string().optional(), BottomAnchor: z.string().optional(), AlternateAnchor: z.string().optional(), AnchorMode: z.string().optional(), DataType: z.string().optional(), TargetDigitCount: z.number().int().optional(), MinimumCharacterCount: z.number().int().optional(), AllowNumericDigits: z.boolean().optional(), VerticalAlignmentType: z.string().optional(), HorizontalAlignmentType: z.string().optional(), TargetFieldWidth_Relative: z.number().optional(), TargetFieldHeight_Relative: z.number().optional(), TargetFieldHorizontalAdjustment: z.number().optional(), TargetFieldVerticalAdjustment: z.number().optional(), Ignore: z.array(z.string()).optional(), Options: z.string().optional()}); export const point = z.object({X: z.number().int().optional(), Y: z.number().int().optional()}); export const ocrPhotoTextElement = z.object({Text: z.string().optional(), XLeft: z.number().int().optional(), YTop: z.number().int().optional(), Width: z.number().int().optional(), Height: z.number().int().optional(), BoundingPoints: z.array(point).optional(), ConfidenceLevel: z.number().optional()}); export const fieldResult = z.object({TargetField: formFieldDefinition.optional(), FieldValues: z.array(ocrPhotoTextElement).optional()}); export const formTableColumnDefinition = z.object({ColumnID: z.string().optional(), TopAnchor: z.string().optional(), AnchorMode: z.string().optional(), DataType: z.string().optional(), MinimumCharacterCount: z.number().int().optional(), AllowNumericDigits: z.boolean().optional()}); export const formTableDefinition = z.object({TableID: z.string().optional(), ColumnDefinitions: z.array(formTableColumnDefinition).optional(), TargetTableHeight_Relative: z.number().optional(), TargetRowHeight_Relative: z.number().optional()}); export const tableCellResult = z.object({ColumnID: z.string().optional(), CellValues: z.array(ocrPhotoTextElement).optional()}); export const tableRowResult = z.object({TableRowCellsResult: z.array(tableCellResult).optional()}); export const tableResult = z.object({TableDefinition: formTableDefinition.optional(), TableRowsResult: z.array(tableRowResult).optional()}); export const formRecognitionResult = z.object({Successful: z.boolean().optional(), FieldValueExtractionResult: z.array(fieldResult).optional(), TableValueExtractionResults: z.array(tableResult).optional(), Diagnostics: z.array(z.string()).optional(), BestMatchFormSettingName: z.string().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 }; /** * Recognize a photo of a form, extract key fields using stored templates * * POST /ocr/photo/recognize/form/advanced */ export const createApiOcrPhotoRecognizeFormAdvanced = async (args: CreateApiOcrPhotoRecognizeFormAdvancedArgs, options?: CreateApiOcrPhotoRecognizeFormAdvancedOptions) => { const {baseUrl = "http://localhost", fetch: fetchFn = fetch, Apikey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.bucketID != null) headers.set("bucketID", String(args.bucketID)) if (args.bucketSecretKey != null) headers.set("bucketSecretKey", String(args.bucketSecretKey)) if (args.recognitionMode != null) headers.set("recognitionMode", String(args.recognitionMode)) if (args.preprocessing != null) headers.set("preprocessing", String(args.preprocessing)) if (args.diagnostics != null) headers.set("diagnostics", String(args.diagnostics)) if (Apikey !== undefined) headers.set("Apikey", Apikey) const url = `${baseUrl.replace(/\/+$/, '')}/ocr/photo/recognize/form/advanced${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: args.body}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(formRecognitionResult, await res.json()) };