import {z} from 'zod' export type GetApiV1CollectionsFeaturesExtractorsFeatureExtractorIdArgs = {feature_extractor_id: string}; export type GetApiV1CollectionsFeaturesExtractorsFeatureExtractorIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const extractorSource = z.enum(["builtin", "custom", "community"]); export const costUnit = z.enum(["minute", "image", "1k_tokens", "page", "face", "extraction"]); export const costRate = z.object({unit: costUnit, credits_per_unit: z.number().gt(0), description: z.string().nullable().optional()}); export const costsInfo = z.object({tier: z.number().int().gte(1).lte(4), tier_label: z.string(), rates: z.array(costRate)}); export const vectorType = z.enum(["dense", "sparse", "multi_dense"]); export const vectorDataType = z.enum(["float32", "uint8"]); export const bucketSchemaFieldType = z.enum(["string", "number", "integer", "float", "boolean", "object", "array", "date", "datetime", "text", "image", "audio", "video", "pdf", "excel"]); export const vectorPurpose = z.enum(["text", "code", "image", "multimodal", "video", "audio", "sparse"]); export const vectorIndex = z.object({name: z.string().nullable().optional(), description: z.string().min(10), dimensions: z.number().int().gte(1).nullable().optional(), type: vectorType, distance: z.string().nullable().optional(), datatype: vectorDataType.nullable().optional(), on_disk: z.boolean().nullable().optional(), supported_inputs: z.array(bucketSchemaFieldType).nullable().optional(), inference_name: z.string().nullable().optional(), inference_service_id: z.string().nullable().optional(), purpose: vectorPurpose.nullable().optional(), vector_name_override: z.string().nullable().optional(), supports_multi_query: z.boolean().optional()}); export const multiVectorIndex = z.object({name: z.string().min(1), description: z.string().min(10), vectors: z.record(z.string(), vectorIndex)}); export const vectorIndexDefinition = z.object({feature_uri: z.string().nullable().optional(), display_name: z.string().nullable().optional(), name: z.string().min(1), description: z.string().min(10), type: z.enum(["single", "multi"]), index: z.union([vectorIndex, multiVectorIndex])}); export const payloadSchemaType = z.enum(["keyword", "integer", "float", "bool", "geo", "datetime", "text", "uuid"]); export const tokenizerType = z.enum(["word", "whitespace", "prefix", "multilingual"]); export const textIndexParams = z.object({type: z.string().optional(), tokenizer: tokenizerType.optional(), min_token_len: z.number().int().optional(), max_token_len: z.number().int().optional(), lowercase: z.boolean().optional(), analyzer: z.enum(["default", "english"]).nullable().optional()}); export const integerIndexParams = z.object({type: z.string().optional(), lookup: z.boolean().optional(), range: z.boolean().optional()}); export const keywordIndexParams = z.object({type: z.string().optional(), is_tenant: z.boolean().optional()}); export const floatIndexParams = z.object({type: z.string().optional()}); export const geoIndexParams = z.object({type: z.string().optional()}); export const datetimeIndexParams = z.object({type: z.string().optional()}); export const uuidIndexParams = z.object({type: z.string().optional(), is_tenant: z.boolean().optional()}); export const boolIndexParams = z.object({type: z.string().optional()}); export const payloadIndexConfigOutput = z.object({field_name: z.string().min(1).max(255), type: payloadSchemaType, field_schema: z.union([textIndexParams, integerIndexParams, keywordIndexParams, floatIndexParams, geoIndexParams, datetimeIndexParams, uuidIndexParams, boolIndexParams]).nullable().optional(), is_protected: z.boolean().optional()}); export const serveAppStatus = z.object({name: z.string(), status: z.string()}); export const featureExtractorResponseModel = z.object({feature_extractor_name: z.string(), version: z.string(), feature_extractor_id: z.string(), description: z.string(), icon: z.string(), category: z.string().optional(), source: extractorSource.optional(), type_mode: z.string().nullable().optional(), expected_input_types: z.record(z.string(), z.string()).nullable().optional(), inference_type: z.string().nullable().optional(), input_schema: z.record(z.string(), z.unknown()), output_schema: z.record(z.string(), z.unknown()), parameter_schema: z.record(z.string(), z.unknown()).nullable(), supported_input_types: z.array(z.string()), max_inputs: z.record(z.string(), z.number().int()), default_parameters: z.record(z.string(), z.unknown()), costs: costsInfo.nullable().optional(), required_vector_indexes: z.array(vectorIndexDefinition).nullable(), required_payload_indexes: z.array(payloadIndexConfigOutput).nullable(), position_fields: z.array(z.string()).optional(), capabilities: z.array(z.string()).optional(), example_usage: z.record(z.string(), z.unknown()).nullable().optional(), realtime_available: z.boolean().nullable().optional(), serve_apps: z.array(serveAppStatus).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 }; /** * Get Feature Extractor by Name * * GET /v1/collections/features/extractors/{feature_extractor_id} */ export const getApiV1CollectionsFeaturesExtractorsFeatureExtractorId = async (args: GetApiV1CollectionsFeaturesExtractorsFeatureExtractorIdArgs, options?: GetApiV1CollectionsFeaturesExtractorsFeatureExtractorIdOptions) => { const {baseUrl = "https://api.mixpeek.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/v1/collections/features/extractors/${encodeURIComponent(String(args.feature_extractor_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(featureExtractorResponseModel, await res.json()) };