import {z} from 'zod' export type DatasetAnalysisRequest = {task_type: 'ner' | 'classification' | 'generative', task_description?: (string | null) | undefined, dataset?: (Array<{[key: string]: unknown}> | null) | undefined, dataset_name?: (string | null) | undefined, dataset_version?: (string | null) | undefined, analyses: Array<'distribution' | 'duplicates' | 'outliers' | 'correlation' | 'splits' | 'errors' | 'diversity'>, query?: (string | null) | undefined, predictions?: (Array<{[key: string]: unknown}> | null) | undefined, options?: ({[key: string]: unknown} | null) | undefined}; export type CreateApiV1DatasetAnalyzeArgs = {body: DatasetAnalysisRequest}; export type CreateApiV1DatasetAnalyzeOptions = {baseUrl: string, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const distributionStats = z.object({min: z.number(), max: z.number(), mean: z.number(), median: z.number(), std: z.number()}); export const histogramBucket = z.object({range: z.string(), count: z.number().int()}); export const entityCount = z.object({label: z.string(), count: z.number().int(), percentage: z.number()}); export const spanFrequency = z.object({text: z.string(), count: z.number().int()}); export const classBalance = z.object({label: z.string(), count: z.number().int()}); export const labelCorrelation = z.object({labels: z.array(z.string()), matrix: z.array(z.array(z.number().int()))}); export const distributionAnalysis = z.object({text_length_stats: distributionStats.nullable().optional(), token_count_stats: distributionStats.nullable().optional(), token_count_histogram: z.array(histogramBucket).nullable().optional(), entity_counts: z.array(entityCount).nullable().optional(), span_length_stats: distributionStats.nullable().optional(), span_length_by_type: z.record(z.string(), distributionStats).nullable().optional(), most_frequent_spans: z.array(spanFrequency).nullable().optional(), class_balance: z.array(classBalance).nullable().optional(), label_correlation: labelCorrelation.nullable().optional(), prompt_length_stats: distributionStats.nullable().optional(), completion_length_stats: distributionStats.nullable().optional()}); export const duplicateSample = z.object({original_index: z.number().int(), duplicate_index: z.number().int(), preview: z.string()}); export const duplicatesAnalysis = z.object({duplicate_count: z.number().int(), duplication_rate: z.number(), samples: z.array(duplicateSample)}); export const outlierThresholds = z.object({mean_length: z.number().nullable().optional(), upper_bound_length: z.number().nullable().optional(), lower_bound_length: z.number().nullable().optional()}); export const outlierSample = z.object({index: z.number().int(), value: z.number(), z_score: z.number(), type: z.string(), sample: z.record(z.string(), z.unknown()), fingerprint: z.string().nullable().optional()}); export const outliersAnalysis = z.object({outlier_count: z.number().int(), thresholds: outlierThresholds, samples: z.array(outlierSample)}); export const labelDistribution = z.object({label: z.string(), count: z.number().int(), percentage: z.number()}); export const splitRatio = z.object({train: z.number(), val: z.number()}); export const splitsAnalysis = z.object({train_count: z.number().int(), val_count: z.number().int(), train_distribution: z.array(labelDistribution), val_distribution: z.array(labelDistribution), split_ratio_actual: splitRatio}); export const diversityPoint = z.object({x: z.number().nullable().optional(), y: z.number().nullable().optional(), z: z.number().nullable().optional(), w: z.number().nullable().optional(), coordinates: z.array(z.number()), text: z.string().nullable().optional(), token_count: z.number().int().nullable().optional(), labels: z.array(z.string()).nullable().optional(), metadata: z.record(z.string(), z.unknown()).nullable().optional(), sample_index: z.number().int().nullable().optional(), similarity_to_centroid: z.number().nullable().optional(), embedding: z.array(z.number()).nullable().optional()}); export const diversityVisualization = z.object({method: z.enum(["pca", "tsne"]), dimensions: z.number().int(), points: z.array(diversityPoint), tsne_perplexity: z.number().nullable().optional(), similarity_range: z.record(z.string(), z.number()).nullable().optional(), token_count_range: z.record(z.string(), z.number().int()).nullable().optional()}); export const diversityLLMAnalysis = z.object({reasoning_trace: z.string(), summary: z.string(), diversity_rating: z.enum(["low", "moderate", "high", "excellent"]), key_observations: z.array(z.string()).optional(), recommendations: z.array(z.string()).optional(), model_used: z.string()}); export const diversityAnalysis = z.object({vendi_score: z.number(), sample_size: z.number().int(), interpretation: z.string().nullable().optional(), visualization: diversityVisualization.nullable().optional(), llm_analysis: diversityLLMAnalysis.nullable().optional()}); export const datasetAnalysisResponse = z.object({summary: z.record(z.string(), z.unknown()), distribution: distributionAnalysis.nullable().optional(), duplicates: duplicatesAnalysis.nullable().optional(), outliers: outliersAnalysis.nullable().optional(), correlations: z.record(z.string(), z.unknown()).nullable().optional(), splits: splitsAnalysis.nullable().optional(), errors: z.record(z.string(), z.unknown()).nullable().optional(), diversity: diversityAnalysis.nullable().optional(), natural_language_response: z.string().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 }; /** * Analyze Dataset * * POST /v1/dataset/analyze * * Also accepts auth: BearerAuth */ export const createApiV1DatasetAnalyze = async (args: CreateApiV1DatasetAnalyzeArgs, options: CreateApiV1DatasetAnalyzeOptions) => { const {baseUrl, fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (ApiKeyAuth !== undefined) headers.set("X-API-Key", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/v1/dataset/analyze${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(datasetAnalysisResponse, await res.json()) };