@albatrossai/albatross-sdk 1.1.43 → 1.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,23 +16,23 @@ npm install @albatrossai/albatross-sdk
16
16
  ## Quick Start
17
17
 
18
18
  ```typescript
19
- import { Client } from '@albatrossai/albatross-sdk';
19
+ import { Client } from "@albatrossai/albatross-sdk";
20
20
 
21
- const client = new Client('your-api-token', 'your-tenant-id');
21
+ const client = new Client("your-api-token", "your-tenant-id");
22
22
 
23
23
  // Search
24
- const results = await client.search('query', 'use-case', { limit: 10 });
24
+ const results = await client.search("query", "use-case", { limit: 10 });
25
25
 
26
26
  // Recommendations
27
- const recs = await client.getRecommendations('use-case', {
28
- user_id: 'user-123',
29
- limit: 10
27
+ const recs = await client.getRecommendations("use-case", {
28
+ user_id: "user-123",
29
+ limit: 10,
30
30
  });
31
31
 
32
32
  // Track events
33
33
  await client.putEvent({
34
- eventType: 'view',
35
- payload: { user_id: 'user-123', item_id: 'item-456' }
34
+ eventType: "view",
35
+ payload: { user_id: "user-123", item_id: "item-456" },
36
36
  });
37
37
  ```
38
38
 
package/dist/index.cjs CHANGED
@@ -19,10 +19,7 @@ var makeRequest = async ({
19
19
  let lastError = null;
20
20
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {
21
21
  const controller = new AbortController();
22
- const timeoutId = setTimeout(
23
- () => controller.abort(),
24
- REQUEST_TIMEOUT_MS
25
- );
22
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
26
23
  try {
27
24
  const response = await fetch(url, {
28
25
  method,
@@ -33,17 +30,13 @@ var makeRequest = async ({
33
30
  clearTimeout(timeoutId);
34
31
  if (!response.ok) {
35
32
  const errorText = await response.text();
36
- const error = new Error(
37
- `Request failed: ${response.status} ${response.statusText} ${errorText}`
38
- );
33
+ const error = new Error(`Request failed: ${response.status} ${response.statusText} ${errorText}`);
39
34
  if (!isRetryableError(response.status)) {
40
35
  throw error;
41
36
  }
42
37
  if (attempt < MAX_RETRIES) {
43
38
  lastError = error;
44
- await new Promise(
45
- (resolve) => setTimeout(resolve, getRetryDelay(attempt))
46
- );
39
+ await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));
47
40
  continue;
48
41
  }
49
42
  throw new Error(
@@ -61,28 +54,18 @@ var makeRequest = async ({
61
54
  if (error.name === "AbortError") {
62
55
  if (attempt < MAX_RETRIES) {
63
56
  lastError = error;
64
- await new Promise(
65
- (resolve) => setTimeout(resolve, getRetryDelay(attempt))
66
- );
57
+ await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));
67
58
  continue;
68
59
  }
69
- throw new Error(
70
- `Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`,
71
- { cause: error }
72
- );
60
+ throw new Error(`Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`, { cause: error });
73
61
  }
74
62
  if (error.message.includes("fetch") || error.message.includes("network") || error.message.includes("Failed to fetch")) {
75
63
  if (attempt < MAX_RETRIES) {
76
64
  lastError = error;
77
- await new Promise(
78
- (resolve) => setTimeout(resolve, getRetryDelay(attempt))
79
- );
65
+ await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));
80
66
  continue;
81
67
  }
82
- throw new Error(
83
- `Network error after ${MAX_RETRIES} retries: ${error.message}`,
84
- { cause: error }
85
- );
68
+ throw new Error(`Network error after ${MAX_RETRIES} retries: ${error.message}`, { cause: error });
86
69
  }
87
70
  }
88
71
  throw error;
@@ -303,10 +286,7 @@ var bodyToCSV = (data) => {
303
286
  throw new Error("data is empty");
304
287
  }
305
288
  const rowHeaders = Object.keys(flattenNested(row0));
306
- const csvData = [
307
- rowHeaders,
308
- ...data.map((row) => preFormatRow(rowHeaders, row))
309
- ];
289
+ const csvData = [rowHeaders, ...data.map((row) => preFormatRow(rowHeaders, row))];
310
290
  return sync.stringify(csvData, {
311
291
  delimiter: ",",
312
292
  quote: true,
@@ -395,9 +375,7 @@ var Client = class _Client {
395
375
  static validateImageSize(base64Image) {
396
376
  const MAX_SIZE = 52428800;
397
377
  if (base64Image.length > MAX_SIZE) {
398
- throw new Error(
399
- `image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`
400
- );
378
+ throw new Error(`image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`);
401
379
  }
402
380
  }
403
381
  /**
@@ -722,12 +700,7 @@ var Client = class _Client {
722
700
  * });
723
701
  * ```
724
702
  */
725
- catalogAdd = async ({
726
- entity,
727
- data,
728
- mainUnit,
729
- formatData
730
- }) => {
703
+ catalogAdd = async ({ entity, data, mainUnit, formatData }) => {
731
704
  CatalogAddPropsSchema.parse({ entity, data, mainUnit, formatData });
732
705
  const formattedData = formatData === void 0 || formatData === true ? data.map(flattenNested) : data;
733
706
  return this.makeRequest({
@@ -763,11 +736,7 @@ var Client = class _Client {
763
736
  * });
764
737
  * ```
765
738
  */
766
- catalogCSVAdd = async ({
767
- entity,
768
- data,
769
- mainUnit
770
- }) => {
739
+ catalogCSVAdd = async ({ entity, data, mainUnit }) => {
771
740
  const queryParams = {
772
741
  entity,
773
742
  mainUnit
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/request.ts","../src/schemas.ts","../src/utils.ts","../src/client.ts","../src/filters.ts"],"names":["z","stringify"],"mappings":"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","file":"index.cjs","sourcesContent":["/** maximum number of retry attempts for failed requests */\nconst MAX_RETRIES = 3;\n/** base delay in milliseconds for exponential backoff (1s) */\nconst BASE_DELAY_MS = 1000;\n/** request timeout in milliseconds (30s) */\nconst REQUEST_TIMEOUT_MS = 30_000;\n\n/**\n * check if http status code is retryable\n *\n * determines whether a request should be retried based on status code.\n * server errors (5xx) are retryable, client errors (4xx) are not.\n *\n * @param status - http status code\n * @returns true if status is 500-599 (server error), false otherwise\n */\nconst isRetryableError = (status: number): boolean =>\n status >= 500 && status <= 599; // 5xx server errors\n\n/**\n * calculate exponential backoff delay\n *\n * computes retry delay using exponential backoff strategy.\n * delays: attempt 0 = 1s, attempt 1 = 2s, attempt 2 = 4s\n *\n * @param attempt - current retry attempt number (0-indexed)\n * @returns delay in milliseconds (2^attempt * 1000)\n */\nconst getRetryDelay = (attempt: number): number =>\n 2 ** attempt * BASE_DELAY_MS;\n\n/**\n * make http request with automatic retry logic and timeout handling\n *\n * resilient http request function with built-in retry logic, exponential backoff,\n * and timeout protection. automatically retries transient failures (5xx errors,\n * network issues, timeouts) up to 3 times. does not retry client errors (4xx).\n *\n * **retry behavior:**\n * - max retries: 3 (4 total attempts)\n * - backoff delays: 1s, 2s, 4s\n * - timeout per attempt: 30s\n * - retries on: 500-599 status codes, network errors, timeouts\n * - no retry on: 400-499 status codes\n *\n * **error messages:**\n * - 4xx errors: `Request failed: {status} {statusText} {body}`\n * - 5xx after retries: `Request failed after 3 retries: {status} {statusText} {body}`\n * - timeout: `Request timeout after 30000ms (3 retries)`\n * - network: `Network error after 3 retries: {message}`\n *\n * @param inputs - request configuration object\n * @param inputs.url - full url to request\n * @param inputs.method - http method (default: \"GET\")\n * @param inputs.data - request body data (auto-serialized to json)\n * @param inputs.headers - http headers to send\n *\n * @returns promise resolving to parsed json response (type A)\n *\n * @throws {Error} immediately on 4xx client errors (no retry)\n * @throws {Error} after 3 retries on persistent 5xx errors\n * @throws {Error} after 3 retries on persistent network errors\n * @throws {Error} after 3 retries on persistent timeouts\n *\n * @example\n * ```typescript\n * const response = await makeRequest({\n * url: \"https://api.example.com/data\",\n * method: \"POST\",\n * data: { key: \"value\" },\n * headers: { \"Authorization\": \"Bearer token\" }\n * });\n * ```\n */\nexport const makeRequest = async <A, B extends Record<string, unknown>>({\n url,\n method = \"GET\",\n data,\n headers,\n}: MakeRequestInputs<B>): Promise<A> => {\n const body = data ? JSON.stringify(data) : undefined;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n REQUEST_TIMEOUT_MS\n );\n\n try {\n const response = await fetch(url, {\n method,\n body,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n const error = new Error(\n `Request failed: ${response.status} ${response.statusText} ${errorText}`\n );\n\n ///don't retry client errors (4xx)\n if (!isRetryableError(response.status)) {\n throw error;\n }\n\n ///retry server errors (5xx) if attempts remain\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelay(attempt))\n );\n continue; ///retry\n }\n\n ///final attempt failed\n throw new Error(\n `Request failed after ${MAX_RETRIES} retries: ${response.status} ${response.statusText} ${errorText}`,\n { cause: error }\n );\n }\n\n ///success\n return response.json() as Promise<A>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n ///re-throw non-retryable errors immediately\n if (error instanceof Error) {\n ///non-retryable errors from response handling\n if (error.message.startsWith(\"Request failed:\") &&\n !error.message.includes(\"retries\")) {\n throw error;\n }\n\n ///abort controller timeout\n if (error.name === \"AbortError\") {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelay(attempt))\n );\n continue; ///retry on timeout\n }\n throw new Error(\n `Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`,\n { cause: error }\n );\n }\n\n ///network errors (dns, connection refused, etc.)\n if (\n error.message.includes(\"fetch\") ||\n error.message.includes(\"network\") ||\n error.message.includes(\"Failed to fetch\")\n ) {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelay(attempt))\n );\n continue; ///retry on network error\n }\n throw new Error(\n `Network error after ${MAX_RETRIES} retries: ${error.message}`,\n { cause: error }\n );\n }\n }\n\n ///re-throw unknown errors\n throw error;\n }\n }\n\n ///should never reach here, but typescript needs it\n throw lastError || new Error(\"Unexpected error in makeRequest\");\n};\n\n/**\n * http request input parameters\n *\n * configuration object for makeRequest function. supports generic data type\n * for request body to maintain type safety.\n */\nexport type MakeRequestInputs<B extends Record<string, unknown>> = {\n /** full url to request */\n url: string;\n /** http method (GET, POST, PUT, DELETE, etc.) */\n method?: string;\n /** request body data (will be json-stringified) */\n data?: B;\n /** http headers object */\n headers: Record<string, string>;\n};\n","import { z } from \"zod\";\n\n/**\n * zod schema for event validation\n *\n * validates event structure before sending to api. ensures eventType is non-empty.\n * automatically validated when calling putEvent() or putEventBatch().\n */\nexport const EventSchema = z.object({\n eventType: z.string().min(1, \"event type required\"),\n payload: z.record(z.string(), z.any()).optional(),\n predictionIds: z.array(z.string()).optional(),\n predictionId: z.string().optional(),\n timestamp: z.string().optional(),\n sessionId: z.union([z.string(), z.number()]).optional(),\n units: z.record(z.string(), z.string()).optional(),\n value: z.string().optional(),\n});\n\n///prediction unit schema\nexport const PredictionUnitSchema = z.record(z.string(), z.string());\n\n/**\n * zod schema for prediction payload validation\n *\n * validates prediction request structure. ensures useCase uuid is non-empty and\n * actions array is provided. automatically validated when calling ranking().\n */\nexport const PredictionPayloadSchema = z.object({\n useCase: z.object({\n uuid: z.string().min(1, \"use case uuid required\"),\n }),\n context: PredictionUnitSchema,\n actions: z.array(PredictionUnitSchema),\n no_trace: z.boolean().optional(),\n});\n\n///catalog add schema\nexport const CatalogAddPropsSchema = z.object({\n entity: z.string().min(1, \"entity required\"),\n data: z.array(z.record(z.string(), z.any())),\n mainUnit: z.string().optional(),\n formatData: z.boolean().optional(),\n});\n\n///model option schema\nexport const ModelOptionSchema = z.object({\n id: z.string().min(1, \"model id required\"),\n instance_id: z.string().optional(),\n});\n\n///content selection options schema\nexport const ContentSelectionOptionsSchema = z.object({\n retriever_model: ModelOptionSchema.optional(),\n embedder_model: ModelOptionSchema.optional(),\n ranker_model: ModelOptionSchema.optional(),\n user_embedding: z.array(z.number()).optional(),\n action_sequence: z.array(z.string()).optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_vectors: z.boolean().optional(),\n with_payload: z.union([z.boolean(), z.array(z.string())]).optional(),\n use_faiss: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n item_id: z.string().optional(),\n image: z.string().optional(),\n});\n\n///filter condition schema\nexport const FilterConditionSchema = z.object({\n field: z.string().min(1, \"filter field required\"),\n condition: z.union([\n z.object({\n type: z.literal(\"Match\"),\n value: z.union([z.string(), z.number(), z.boolean()]),\n }),\n z.object({\n type: z.literal(\"Range\"),\n value: z.object({\n gte: z.number().optional(),\n lte: z.number().optional(),\n gt: z.number().optional(),\n lt: z.number().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"DatetimeRange\"),\n value: z.object({\n gte: z.string().optional(),\n lte: z.string().optional(),\n gt: z.string().optional(),\n lt: z.string().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"GeoRadius\"),\n value: z.object({\n lat: z.number(),\n lon: z.number(),\n radius: z.number().positive(),\n }),\n }),\n ]),\n});\n\n///content selection filter schema\nexport const ContentSelectionFilterSchema = z.object({\n must: z.array(FilterConditionSchema).optional(),\n should: z.array(FilterConditionSchema).optional(),\n must_not: z.array(FilterConditionSchema).optional(),\n});\n\n/**\n * zod schema for content selection request validation\n *\n * validates search request structure. ensures use_case is non-empty and limit\n * is within bounds (1-1000). automatically validated when calling contentSelection()\n * and all convenience methods.\n *\n * **validation rules:**\n * - use_case: must be non-empty string\n * - limit: must be positive integer, max 1000\n * - filters: must match ContentSelectionFilterSchema structure\n */\nexport const ContentSelectionRequestSchema = z.object({\n use_case: z.string().min(1, \"use case required\"),\n context: z.record(z.string(), z.string()).optional(),\n search: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n options: ContentSelectionOptionsSchema.optional(),\n debug: z.boolean().optional(),\n});\n\n///search method params schema\nexport const SearchParamsSchema = z.object({\n query: z.string(),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///recommendations params schema\nexport const RecommendationsParamsSchema = z.object({\n useCase: z.string().min(1, \"use case required\"),\n params: z.object({\n user_id: z.string().optional(),\n session_id: z.string().optional(),\n action_sequence: z.array(z.string()).optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n hnsw_ef: z.number().int().positive().optional(),\n debug: z.boolean().optional(),\n }),\n});\n\n///similar items params schema\nexport const SimilarItemsParamsSchema = z.object({\n itemId: z.string().min(1, \"item id required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n limit: z.number().int().positive().max(1000).optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///search by image params schema\nexport const SearchByImageParamsSchema = z.object({\n image: z.string().min(1, \"image required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n query: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///search by vector params schema\nexport const SearchByVectorParamsSchema = z.object({\n vector: z.array(z.number()).min(1, \"vector must have at least 1 dimension\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///put event params schema\nexport const PutEventParamsSchema = z.object({\n data: EventSchema,\n options: z.object({\n notrace: z.boolean().optional(),\n }).optional(),\n});\n\n/**\n * zod schema for batch event validation\n *\n * validates event batch requests. enforces max batch size of 500 events and\n * validates each individual event in the batch. automatically validated when\n * calling putEventBatch().\n *\n * **validation rules:**\n * - events: must be non-empty array, max 500 events\n * - each event: must pass EventSchema validation\n */\nexport const PutEventBatchParamsSchema = z.object({\n events: z.array(EventSchema).max(500, \"max 500 events per batch\"),\n options: z.object({\n notrace: z.boolean().optional(),\n }).optional(),\n});\n\n///feedback params schema\nexport const FeedbackParamsSchema = z.object({\n modelUuid: z.string().optional(),\n predictionUuid: z.string().min(1, \"prediction uuid required\"),\n value: z.record(z.string(), z.any()),\n});\n\n///infer types from schemas for runtime type checking\nexport type Event = z.infer<typeof EventSchema>;\nexport type PredictionUnit = z.infer<typeof PredictionUnitSchema>;\nexport type PredictionPayload = z.infer<typeof PredictionPayloadSchema>;\nexport type CatalogAddProps = z.infer<typeof CatalogAddPropsSchema>;\nexport type ModelOption = z.infer<typeof ModelOptionSchema>;\nexport type ContentSelectionOptions = z.infer<typeof ContentSelectionOptionsSchema>;\nexport type FilterCondition = z.infer<typeof FilterConditionSchema>;\nexport type ContentSelectionFilter = z.infer<typeof ContentSelectionFilterSchema>;\nexport type ContentSelectionRequest = z.infer<typeof ContentSelectionRequestSchema>;\n","import { stringify } from \"csv-stringify/sync\";\n\ntype NestedObject = Record<string, unknown>;\n\ntype FlattenedObject = Record<string, unknown>;\n\n/**\n * flatten nested object structure\n *\n * converts nested objects into flat structure with underscore-separated keys.\n * handles arrays by joining with commas. used by catalogAdd to prepare data\n * for api ingestion.\n *\n * @param obj - object to flatten (can contain nested objects and arrays)\n * @returns flattened object with underscore-separated keys\n *\n * @example\n * ```typescript\n * const nested = {\n * name: \"Product\",\n * meta: { color: \"red\", size: \"large\" },\n * tags: [\"new\", \"sale\"]\n * };\n * const flat = flattenNested(nested);\n * // Result: { name: \"Product\", meta_color: \"red\", meta_size: \"large\", tags: \"new,sale\" }\n * ```\n */\nexport const flattenNested = (obj: NestedObject): FlattenedObject => {\n const result: FlattenedObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n if (Array.isArray(nestedValue)) {\n result[`${key}_${nestedKey}`] = nestedValue.join(\",\");\n } else if (typeof nestedValue === \"object\" && nestedValue !== null) {\n for (const [subKey, subValue] of Object.entries(nestedValue)) {\n result[`${nestedKey}_${subKey}`] = subValue;\n }\n } else {\n result[`${key}_${nestedKey}`] = nestedValue;\n }\n }\n } else if (Array.isArray(value)) {\n result[key] = value.join(\",\");\n } else {\n result[key] = value;\n }\n }\n\n return result;\n};\n\n/**\n * format row data for csv conversion\n *\n * internal helper that prepares a single row for csv export by flattening\n * and converting values to strings based on header order.\n *\n * @param rowHeaders - array of column headers\n * @param row - data row to format\n * @returns array of string values in header order\n * @private\n */\nconst preFormatRow = (rowHeaders: string[], row: Record<string, unknown>) => {\n const flattenedRow = flattenNested(row);\n return rowHeaders.map((header) => {\n const value = flattenedRow[header];\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return \"\";\n }\n\n // Handle objects (including arrays)\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // Convert to string for other types\n return String(value);\n });\n};\n\n/**\n * convert array of objects to csv format\n *\n * transforms data array into csv string with headers. automatically flattens nested\n * objects, handles nulls/undefined, and properly quotes strings. used by catalogCSVAdd\n * for bulk catalog uploads.\n *\n * @param data - array of objects to convert to csv\n * @returns csv string with headers and properly formatted rows\n *\n * @throws {Error} if data array is empty\n *\n * @example\n * ```typescript\n * const csv = bodyToCSV([\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]);\n * // Result: CSV string with headers and 2 data rows\n * ```\n */\nexport const bodyToCSV = (data: Record<string, unknown>[]) => {\n if (data.length === 0) {\n throw new Error(\"data is empty\");\n }\n\n const [row0] = data;\n if (!row0) {\n throw new Error(\"data is empty\");\n }\n\n const rowHeaders: string[] = Object.keys(flattenNested(row0));\n // Prepare data for csv-parse\n const csvData = [\n rowHeaders,\n ...data.map((row) => preFormatRow(rowHeaders, row)),\n ];\n\n return stringify(csvData, {\n delimiter: \",\",\n quote: true,\n quoted_string: true,\n header: false,\n }).trim();\n};\n","import * as Request from \"./request\";\nimport {\n CatalogAddPropsSchema,\n ContentSelectionRequestSchema,\n FeedbackParamsSchema,\n PredictionPayloadSchema,\n PutEventBatchParamsSchema,\n PutEventParamsSchema,\n RecommendationsParamsSchema,\n SearchByImageParamsSchema,\n SearchByVectorParamsSchema,\n SearchParamsSchema,\n SimilarItemsParamsSchema,\n} from \"./schemas\";\nimport type {\n CatalogAddProps,\n ContentSelectionFilter,\n ContentSelectionRequest,\n ContentSelectionResponse,\n DataPoint,\n Event,\n PredictionPayload,\n} from \"./type\";\nimport { bodyToCSV, flattenNested } from \"./utils\";\n\nexport type { ContentSelectionFilter, ContentSelectionRequest, ContentSelectionResponse, DataPoint, Event, PredictionPayload };\n\nconst hostDefault = \"https://app.usealbatross.ai/api\";\n\n/**\n * albatross sdk client for content selection, predictions, events, and catalog management\n *\n * main entry point for interacting with albatross apis. provides methods for search,\n * recommendations, predictions, event tracking, and catalog operations. handles\n * authentication, retries, and validates all inputs automatically.\n */\nclass Client {\n public token: string;\n public tenantId: string;\n public baseUrl: string;\n makeRequest: <A, B extends Record<string, unknown>>(\n inputs: Request.MakeRequestInputs<B>\n ) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n\n /**\n * create new albatross sdk client instance\n *\n * initializes client with authentication credentials and optional custom configurations.\n *\n * @param token - api authentication bearer token\n * @param tenantId - tenant/instance identifier (same value used for both auth header types)\n * @param baseUrl - api base url (default: https://app.usealbatross.ai/api)\n * @param options - optional client configuration\n * @param options.makeRequest - custom http request handler\n * @param options.predictionPreProcessing - hook to transform prediction payloads before sending\n *\n * @example\n * ```typescript\n * const client = new Client(\n * \"your-api-token\",\n * \"tenant-uuid-123\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // with custom base url\n * const client = new Client(\n * \"token\",\n * \"tenant-id\",\n * \"https://custom.api.com\"\n * );\n * ```\n */\n constructor(\n token: string,\n tenantId: string,\n baseUrl: string = hostDefault,\n options: Partial<{\n makeRequest: <A, B extends Record<string, unknown>>(\n inputs: Request.MakeRequestInputs<B>\n ) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n }> = {}\n ) {\n this.token = token;\n this.tenantId = tenantId;\n this.baseUrl = baseUrl;\n this.makeRequest = options.makeRequest || Request.makeRequest;\n this.predictionPreProcessing =\n options.predictionPreProcessing || ((data) => data);\n }\n\n /**\n * generate http headers based on endpoint type\n *\n * implements dual authentication strategy by sending different headers\n * depending on which service is being called.\n *\n * @param endpointType - \"robin\" for prediction/content-selection, \"catalog\" for events/catalog\n * @returns headers object with authentication and content-type\n * @private\n */\n private getHeaders(endpointType: \"robin\" | \"catalog\"): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n };\n\n if (endpointType === \"robin\") {\n headers[\"X-Tenant-Id\"] = this.tenantId;\n } else {\n ///catalog includes both catalog and events endpoints\n headers[\"x-instance-id\"] = this.tenantId;\n }\n\n return headers;\n }\n\n /**\n * validate base64 image size\n *\n * enforces 50mb size limit on images to prevent memory issues and ensure\n * reasonable api request sizes. checks base64 string length (not decoded size).\n *\n * @param base64Image - base64-encoded image string (with or without data url prefix)\n * @throws {Error} if image exceeds 50mb (52428800 bytes)\n * @private\n */\n private static validateImageSize(base64Image: string): void {\n const MAX_SIZE = 52_428_800; // 50mb\n if (base64Image.length > MAX_SIZE) {\n throw new Error(\n `image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`\n );\n }\n }\n\n /**\n * perform content selection (core method)\n *\n * low-level content selection method that all convenience methods use internally.\n * supports all search modes: text, image, vector, item similarity, user recommendations.\n * use specific convenience methods (search, searchByImage, etc.) for common use cases.\n *\n * @param request - content selection request configuration\n * @param request.use_case - use case identifier\n * @param request.context - optional context (user_id, session_id)\n * @param request.search - text search query (optional)\n * @param request.limit - max results (1-1000, default: varies by method)\n * @param request.filters - filter conditions to apply\n * @param request.options - search options (models, embeddings, item_id, image, etc.)\n * @param request.debug - enable debug info in response\n *\n * @returns promise resolving to search results with items, metadata, and optional debug info\n *\n * @throws {ZodError} if request validation fails\n * @throws {Error} if image in options exceeds 50mb\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.contentSelection({\n * use_case: \"product-search\",\n * search: \"red shoes\",\n * limit: 20\n * });\n * ```\n */\n async contentSelection(\n request: ContentSelectionRequest\n ): Promise<ContentSelectionResponse> {\n ///validate request\n ContentSelectionRequestSchema.parse(request);\n\n ///validate image size if provided\n if (request.options?.image) {\n Client.validateImageSize(request.options.image);\n }\n\n const url = `${this.baseUrl}/prediction/content-selection`;\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data: request,\n headers: this.getHeaders(\"robin\"),\n });\n }\n\n /**\n * perform text-based content search\n *\n * searches content using semantic text matching. ideal for product search,\n * document retrieval, or any text-based similarity search. supports filtering,\n * pagination, and performance tuning.\n *\n * @param query - search query text\n * @param useCase - use case identifier for search\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: varies)\n * @param options.filters - filter conditions to apply (use FilterBuilder to create)\n * @param options.hnsw_ef - hnsw search parameter for speed/accuracy tradeoff (higher = more accurate but slower)\n * @param options.with_payload - include item metadata in results (default: false)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to search results with matching items and metadata\n *\n * @throws {ZodError} if query is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * limit: 20,\n * filters: new FilterBuilder().match(\"category\", \"footwear\").build()\n * });\n * ```\n */\n async search(\n query: string,\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n hnsw_ef?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchParamsSchema.parse({ query, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n search: query,\n limit: options?.limit,\n filters: options?.filters,\n options: {\n hnsw_ef: options?.hnsw_ef,\n with_payload: options?.with_payload,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get personalized recommendations for user\n *\n * retrieves content recommendations based on user behavior and action history.\n * can use user_id/session_id context or action sequence.\n *\n * @param useCase - use case identifier\n * @param params - recommendation parameters\n * @param params.user_id - user identifier (optional, pairs with session_id)\n * @param params.session_id - session identifier (optional, pairs with user_id)\n * @param params.action_sequence - array of item ids representing user actions (optional)\n * @param params.limit - max results to return (1-1000, default: 100)\n * @param params.filters - filter conditions to apply\n * @param params.with_payload - include item metadata in results (default: true)\n * @param params.with_vectors - include embedding vectors in results (default: true)\n * @param params.hnsw_ef - hnsw parameter (default: 256 when context provided, otherwise not set)\n * @param params.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to personalized recommendations\n *\n * @throws {ZodError} if useCase is empty or params are invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const recs = await client.getRecommendations(\"product-recs\", {\n * user_id: \"user-123\",\n * session_id: \"session-456\",\n * limit: 10\n * });\n * ```\n */\n async getRecommendations(\n useCase: string,\n params: {\n user_id?: string;\n session_id?: string;\n action_sequence?: string[];\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n hnsw_ef?: number;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n RecommendationsParamsSchema.parse({ useCase, params });\n\n const context =\n params.user_id && params.session_id\n ? { user_id: params.user_id, session_id: params.session_id }\n : undefined;\n\n return this.contentSelection({\n use_case: useCase,\n context,\n limit: params.limit || 100,\n filters: params.filters,\n options: {\n action_sequence: params.action_sequence,\n hnsw_ef: params.hnsw_ef || (context ? 256 : undefined),\n with_payload: params.with_payload ?? true,\n with_vectors: params.with_vectors ?? true,\n },\n debug: params.debug,\n });\n }\n\n /**\n * find similar items by item id\n *\n * retrieves items similar to a given item. ideal for \"similar products\",\n * \"you may also like\", or \"related items\" features.\n *\n * @param itemId - id of the reference item to find similarities for\n * @param useCase - use case identifier\n * @param options - optional configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to similar items\n *\n * @throws {ZodError} if itemId is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const similar = await client.getSimilarItems(\"product-123\", \"product-similarity\", {\n * limit: 5\n * });\n * ```\n */\n async getSimilarItems(\n itemId: string,\n useCase: string,\n options?: {\n limit?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SimilarItemsParamsSchema.parse({ itemId, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 10,\n options: {\n item_id: itemId,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by image (visual/multimodal search)\n *\n * searches content using image similarity or combined image+text (multimodal).\n * ideal for visual search, \"find similar products by photo\", or \"search by image\"\n * features. supports combining image with text query for multimodal search.\n *\n * @param image - base64-encoded image string (max 50mb)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.query - optional text query for multimodal search (image + text)\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.use_knn - use knn instead of hnsw for search (slower but potentially more accurate)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to visually similar items\n *\n * @throws {Error} if image exceeds 50mb\n * @throws {ZodError} if image is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.searchByImage(base64Image, \"visual-search\", {\n * limit: 10\n * });\n * ```\n */\n async searchByImage(\n image: string,\n useCase: string,\n options?: {\n query?: string;\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n use_knn?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByImageParamsSchema.parse({ image, useCase, options });\n\n Client.validateImageSize(image);\n\n return this.contentSelection({\n use_case: useCase,\n search: options?.query,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n image,\n with_payload: options?.with_payload ?? true,\n use_knn: options?.use_knn,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by embedding vector (direct vector similarity)\n *\n * searches content using a provided embedding vector. useful when you have\n * pre-computed embeddings or want direct control over the search vector.\n * bypasses text/image encoding and searches directly in vector space.\n *\n * @param vector - embedding vector (array of numbers, typically 64-1536 dimensions)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to items with similar embeddings\n *\n * @throws {ZodError} if vector is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3, ...]; // your pre-computed vector\n * const results = await client.searchByVector(embedding, \"vector-search\", {\n * limit: 15\n * });\n * ```\n */\n async searchByVector(\n vector: number[],\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByVectorParamsSchema.parse({ vector, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n user_embedding: vector,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get api version information\n *\n * retrieves current api version and build info. useful for debugging,\n * compatibility checking, or displaying version information.\n *\n * @returns promise resolving to version information object\n *\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const version = await client.getVersion();\n * console.log(`API version: ${version}`);\n * ```\n */\n async getVersion() {\n const url = `${this.baseUrl}/version`;\n return this.makeRequest({ url, headers: this.getHeaders(\"catalog\") });\n }\n\n /**\n * add items to catalog\n *\n * uploads items to the catalog for a specific entity type (e.g., products, articles).\n * automatically flattens nested objects unless formatData is set to false.\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to add to catalog\n * @param props.mainUnit - primary identifier field name (optional)\n * @param props.formatData - auto-flatten nested objects (default: true)\n *\n * @returns promise resolving when catalog add completes\n *\n * @throws {ZodError} if entity is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.catalogAdd({\n * entity: \"products\",\n * data: [\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]\n * });\n * ```\n */\n catalogAdd = async ({\n entity,\n data,\n mainUnit,\n formatData,\n }: CatalogAddProps) => {\n ///validate params\n CatalogAddPropsSchema.parse({ entity, data, mainUnit, formatData });\n\n const formattedData =\n formatData === undefined || formatData === true\n ? data.map(flattenNested)\n : data;\n\n return this.makeRequest({\n url: `${this.baseUrl}/catalog`,\n method: \"PUT\",\n data: { data: formattedData, entity, mainUnit },\n headers: this.getHeaders(\"catalog\"),\n });\n };\n\n /**\n * add items to catalog via csv format\n *\n * uploads items to catalog using csv format instead of json. more efficient for\n * large bulk uploads. converts data to csv automatically. does not use makeRequest\n * retry logic (uses raw fetch).\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to convert to csv and upload\n * @param props.mainUnit - primary identifier field name (optional)\n *\n * @returns promise resolving when catalog upload completes\n *\n * @throws {Error} if data is empty\n * @throws {Error} on fetch failures (no automatic retry for csv uploads)\n *\n * @example\n * ```typescript\n * await client.catalogCSVAdd({\n * entity: \"products\",\n * data: [{ id: \"1\", name: \"A\" }, { id: \"2\", name: \"B\" }],\n * mainUnit: \"id\"\n * });\n * ```\n */\n catalogCSVAdd = async ({\n entity,\n data,\n mainUnit,\n }: CatalogAddProps): Promise<{}> => {\n const queryParams: Record<string, string | undefined> = {\n entity,\n mainUnit,\n };\n const queryParamsString: string = Object.entries(queryParams)\n .filter((entry): entry is [string, string] => !!entry[1])\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n\n const path = \"/catalog/csv\";\n const url = `${this.baseUrl}${path}?${queryParamsString}`;\n\n const body: string = bodyToCSV(data);\n\n const r = await fetch(url, { headers: this.getHeaders(\"catalog\"), method: \"PUT\", body });\n\n return r.json() as Promise<{}>;\n };\n\n /**\n * send single event\n *\n * tracks user interactions. supports all event types.\n *\n * @param data - event data\n * @param data.eventType - event type name (e.g., \"click\", \"purchase\", \"view\")\n * @param data.payload - event-specific data (optional)\n * @param data.predictionId - associated prediction id (optional)\n * @param data.predictionIds - associated prediction ids (optional)\n * @param data.sessionId - session identifier (optional)\n * @param data.timestamp - event timestamp (optional, defaults to server time)\n * @param options - optional event configuration\n * @param options.notrace - skip storing event in analytics (default: false)\n *\n * @returns promise resolving when event is recorded\n *\n * @throws {ZodError} if eventType is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEvent({\n * eventType: \"click\",\n * payload: { item_id: \"product-123\" },\n * sessionId: \"session-456\"\n * });\n * ```\n */\n async putEvent(\n data: Event,\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventParamsSchema.parse({ data, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data,\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * send batch of events\n *\n * efficiently tracks multiple events in a single api call. ideal for bulk event\n * uploads, offline event syncing, or high-throughput event tracking. supports\n * up to 500 events per batch.\n *\n * @param events - array of events to send (max 500)\n * @param options - optional batch configuration\n * @param options.notrace - skip storing events in analytics (default: false)\n *\n * @returns promise resolving when all events are recorded\n *\n * @throws {ZodError} if events array is empty, exceeds 500 items, or contains invalid events\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEventBatch([\n * { eventType: \"view\", payload: { item_id: \"item-1\" } },\n * { eventType: \"click\", payload: { item_id: \"item-2\" } },\n * { eventType: \"purchase\", payload: { item_id: \"item-3\", price: 99.99 } }\n * ]);\n * ```\n */\n async putEventBatch(\n events: Event[],\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventBatchParamsSchema.parse({ events, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event/batch${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data: { events },\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * get content ranking prediction\n *\n * requests ranked ordering of content items based on context and user preferences.\n * used for personalized ranking, A/B testing, or contextual bandit scenarios.\n * returns ordered ranking with scores and associated datapoint.\n *\n * @param payload - prediction request payload\n * @param payload.useCase - use case configuration with uuid\n * @param payload.context - context features (user_id, session_id, etc.)\n * @param payload.actions - array of items to rank (item features)\n * @param payload.no_trace - skip storing prediction for analytics (default: false)\n *\n * @returns promise resolving to prediction with ordering, datapoint, and prediction id\n * @returns {object} result\n * @returns {object} result.ordering - item rankings (item_id -> rank)\n * @returns {DataPoint} result.datapoint - full prediction datapoint with scores and propensities\n * @returns {string} result.id - prediction uuid for feedback tracking\n *\n * @throws {ZodError} if useCase uuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const ranking = await client.ranking({\n * useCase: { uuid: \"ranking-use-case\" },\n * context: { user_id: \"user-123\" },\n * actions: [\n * { item_id: \"item-1\", category: \"electronics\" },\n * { item_id: \"item-2\", category: \"books\" }\n * ]\n * });\n * ```\n */\n ranking = async (\n payload: PredictionPayload\n ): Promise<{\n ordering: Record<string, number>;\n datapoint: DataPoint;\n id: string;\n }> => {\n ///validate params\n PredictionPayloadSchema.parse(payload);\n\n const url = `${this.baseUrl}/prediction/ranker`;\n\n const data = this.predictionPreProcessing(payload);\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data,\n headers: this.getHeaders(\"robin\"),\n });\n };\n\n /**\n * send feedback for prediction\n *\n * submits outcome feedback for a previous prediction.\n *\n * @param payload - feedback payload\n * @param payload.predictionUuid - id of the prediction to provide feedback for (from ranking() response)\n * @param payload.value - feedback data (e.g., { reward: 1 }, { clicked: true }, { rating: 4.5 })\n * @param payload.modelUuid - optional specific model uuid to send feedback to\n *\n * @returns promise resolving when feedback is recorded\n *\n * @throws {ZodError} if predictionUuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const pred = await client.ranking({...});\n * // later, after user interaction\n * await client.feedback({\n * predictionUuid: pred.id,\n * value: { clicked: true, purchased: false }\n * });\n * ```\n */\n feedback = async (payload: {\n modelUuid?: string;\n predictionUuid: string;\n value: Record<string, unknown>;\n }) => {\n ///validate params\n FeedbackParamsSchema.parse(payload);\n\n const url = `${this.baseUrl}/feedback`;\n\n return this.makeRequest({\n method: \"POST\",\n url: url,\n data: payload,\n headers: this.getHeaders(\"robin\"),\n });\n };\n}\n\nexport { Client };\n","import type { ContentSelectionFilter, FilterCondition } from \"./type\";\n\n/**\n * fluent builder for creating content selection filters\n *\n * provides chainable api for constructing complex filter conditions. supports\n * must (required), should (optional/or), and must_not (exclusion) filter types.\n * use with search(), getRecommendations(), and other content selection methods.\n *\n * filter types:\n * - must: all conditions must match (AND logic)\n * - should: at least one condition should match (OR logic)\n * - must_not: conditions must not match (NOT logic)\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"electronics\")\n * .range(\"price\", { gte: 100, lte: 500 })\n * .match(\"out_of_stock\", false, \"must_not\")\n * .build();\n * ```\n */\nexport class FilterBuilder {\n private must: FilterCondition[] = [];\n private should: FilterCondition[] = [];\n private must_not: FilterCondition[] = [];\n\n /**\n * add exact match filter condition\n *\n * filters items where field exactly matches the specified value.\n * supports string, number, and boolean values.\n *\n * @param field - field name to filter on\n * @param value - value to match (string | number | boolean)\n * @param type - filter type: \"must\" (required), \"should\" (optional), or \"must_not\" (exclude). default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // required match\n * builder.match(\"category\", \"electronics\");\n *\n * // optional match (or condition)\n * builder.match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\");\n *\n * // exclusion\n * builder.match(\"status\", \"deleted\", \"must_not\");\n * ```\n */\n match(\n field: string,\n value: string | number | boolean,\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Match\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add numeric range filter condition\n *\n * filters items where numeric field falls within specified range.\n * supports gte (>=), lte (<=), gt (>), and lt (<) operators.\n *\n * @param field - numeric field name to filter on\n * @param value - range specification with operators\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // price between 100 and 500\n * builder.range(\"price\", { gte: 100, lte: 500 });\n *\n * // rating above 4\n * builder.range(\"rating\", { gt: 4 });\n *\n * // exclude expensive items\n * builder.range(\"price\", { gte: 1000 }, \"must_not\");\n * ```\n */\n range(\n field: string,\n value: { gte?: number; lte?: number; gt?: number; lt?: number },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Range\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add datetime range filter condition\n *\n * filters items where datetime field falls within specified range.\n * values should be RFC 3339 formatted strings (e.g., \"2025-12-15T00:00:00Z\").\n *\n * @param field - datetime field name to filter on\n * @param value - range specification with operators (RFC 3339 strings)\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // events between two dates\n * builder.datetimeRange(\"start_date\", {\n * gte: \"2025-12-15T00:00:00Z\",\n * lte: \"2025-12-31T23:59:59Z\"\n * });\n *\n * // events after a specific date\n * builder.datetimeRange(\"created_at\", { gt: \"2025-01-01T00:00:00Z\" });\n * ```\n */\n datetimeRange(\n field: string,\n value: { gte?: string; lte?: string; gt?: string; lt?: string },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"DatetimeRange\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add geo-radius filter condition\n *\n * filters items where geo-location field falls within specified radius\n * from a center point. useful for location-based filtering.\n *\n * @param field - geo-location field name\n * @param lat - latitude of center point (degrees, -90 to 90)\n * @param lon - longitude of center point (degrees, -180 to 180)\n * @param radius - search radius in meters\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // items within 5km of new york city\n * builder.geoRadius(\"location\", 40.7128, -74.0060, 5000);\n *\n * // exclude items near specific location\n * builder.geoRadius(\"warehouse\", 37.7749, -122.4194, 10000, \"must_not\");\n * ```\n */\n geoRadius(\n field: string,\n lat: number,\n lon: number,\n radius: number,\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"GeoRadius\", value: { lat, lon, radius } },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * build final filter object\n *\n * constructs the complete filter object from all added conditions.\n * call this method last after chaining all filter methods.\n *\n * @returns content selection filter ready to use with client methods\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"clothing\")\n * .range(\"price\", { gte: 20, lte: 100 })\n * .match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\")\n * .build();\n *\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * filters: filter\n * });\n * ```\n */\n build(): ContentSelectionFilter {\n const filter: ContentSelectionFilter = {};\n\n if (this.must.length > 0) {\n filter.must = this.must;\n }\n if (this.should.length > 0) {\n filter.should = this.should;\n }\n if (this.must_not.length > 0) {\n filter.must_not = this.must_not;\n }\n\n return filter;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/request.ts","../src/schemas.ts","../src/utils.ts","../src/client.ts","../src/filters.ts"],"names":["z","stringify"],"mappings":"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","file":"index.cjs","sourcesContent":["/** maximum number of retry attempts for failed requests */\nconst MAX_RETRIES = 3;\n/** base delay in milliseconds for exponential backoff (1s) */\nconst BASE_DELAY_MS = 1000;\n/** request timeout in milliseconds (30s) */\nconst REQUEST_TIMEOUT_MS = 30_000;\n\n/**\n * check if http status code is retryable\n *\n * determines whether a request should be retried based on status code.\n * server errors (5xx) are retryable, client errors (4xx) are not.\n *\n * @param status - http status code\n * @returns true if status is 500-599 (server error), false otherwise\n */\nconst isRetryableError = (status: number): boolean => status >= 500 && status <= 599; // 5xx server errors\n\n/**\n * calculate exponential backoff delay\n *\n * computes retry delay using exponential backoff strategy.\n * delays: attempt 0 = 1s, attempt 1 = 2s, attempt 2 = 4s\n *\n * @param attempt - current retry attempt number (0-indexed)\n * @returns delay in milliseconds (2^attempt * 1000)\n */\nconst getRetryDelay = (attempt: number): number => 2 ** attempt * BASE_DELAY_MS;\n\n/**\n * make http request with automatic retry logic and timeout handling\n *\n * resilient http request function with built-in retry logic, exponential backoff,\n * and timeout protection. automatically retries transient failures (5xx errors,\n * network issues, timeouts) up to 3 times. does not retry client errors (4xx).\n *\n * **retry behavior:**\n * - max retries: 3 (4 total attempts)\n * - backoff delays: 1s, 2s, 4s\n * - timeout per attempt: 30s\n * - retries on: 500-599 status codes, network errors, timeouts\n * - no retry on: 400-499 status codes\n *\n * **error messages:**\n * - 4xx errors: `Request failed: {status} {statusText} {body}`\n * - 5xx after retries: `Request failed after 3 retries: {status} {statusText} {body}`\n * - timeout: `Request timeout after 30000ms (3 retries)`\n * - network: `Network error after 3 retries: {message}`\n *\n * @param inputs - request configuration object\n * @param inputs.url - full url to request\n * @param inputs.method - http method (default: \"GET\")\n * @param inputs.data - request body data (auto-serialized to json)\n * @param inputs.headers - http headers to send\n *\n * @returns promise resolving to parsed json response (type A)\n *\n * @throws {Error} immediately on 4xx client errors (no retry)\n * @throws {Error} after 3 retries on persistent 5xx errors\n * @throws {Error} after 3 retries on persistent network errors\n * @throws {Error} after 3 retries on persistent timeouts\n *\n * @example\n * ```typescript\n * const response = await makeRequest({\n * url: \"https://api.example.com/data\",\n * method: \"POST\",\n * data: { key: \"value\" },\n * headers: { \"Authorization\": \"Bearer token\" }\n * });\n * ```\n */\nexport const makeRequest = async <A, B extends Record<string, unknown>>({\n url,\n method = \"GET\",\n data,\n headers,\n}: MakeRequestInputs<B>): Promise<A> => {\n const body = data ? JSON.stringify(data) : undefined;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method,\n body,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n const error = new Error(`Request failed: ${response.status} ${response.statusText} ${errorText}`);\n\n ///don't retry client errors (4xx)\n if (!isRetryableError(response.status)) {\n throw error;\n }\n\n ///retry server errors (5xx) if attempts remain\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));\n continue; ///retry\n }\n\n ///final attempt failed\n throw new Error(\n `Request failed after ${MAX_RETRIES} retries: ${response.status} ${response.statusText} ${errorText}`,\n { cause: error }\n );\n }\n\n ///success\n return response.json() as Promise<A>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n ///re-throw non-retryable errors immediately\n if (error instanceof Error) {\n ///non-retryable errors from response handling\n if (error.message.startsWith(\"Request failed:\") && !error.message.includes(\"retries\")) {\n throw error;\n }\n\n ///abort controller timeout\n if (error.name === \"AbortError\") {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));\n continue; ///retry on timeout\n }\n throw new Error(`Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`, { cause: error });\n }\n\n ///network errors (dns, connection refused, etc.)\n if (\n error.message.includes(\"fetch\") ||\n error.message.includes(\"network\") ||\n error.message.includes(\"Failed to fetch\")\n ) {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));\n continue; ///retry on network error\n }\n throw new Error(`Network error after ${MAX_RETRIES} retries: ${error.message}`, { cause: error });\n }\n }\n\n ///re-throw unknown errors\n throw error;\n }\n }\n\n ///should never reach here, but typescript needs it\n throw lastError || new Error(\"Unexpected error in makeRequest\");\n};\n\n/**\n * http request input parameters\n *\n * configuration object for makeRequest function. supports generic data type\n * for request body to maintain type safety.\n */\nexport type MakeRequestInputs<B extends Record<string, unknown>> = {\n /** full url to request */\n url: string;\n /** http method (GET, POST, PUT, DELETE, etc.) */\n method?: string;\n /** request body data (will be json-stringified) */\n data?: B;\n /** http headers object */\n headers: Record<string, string>;\n};\n","import { z } from \"zod\";\n\n/**\n * zod schema for event validation\n *\n * validates event structure before sending to api. ensures eventType is non-empty.\n * automatically validated when calling putEvent() or putEventBatch().\n */\nexport const EventSchema = z.object({\n eventType: z.string().min(1, \"event type required\"),\n payload: z.record(z.string(), z.any()).optional(),\n predictionIds: z.array(z.string()).optional(),\n predictionId: z.string().optional(),\n timestamp: z.string().optional(),\n sessionId: z.union([z.string(), z.number()]).optional(),\n units: z.record(z.string(), z.string()).optional(),\n value: z.string().optional(),\n});\n\n///prediction unit schema\nexport const PredictionUnitSchema = z.record(z.string(), z.string());\n\n/**\n * zod schema for prediction payload validation\n *\n * validates prediction request structure. ensures useCase uuid is non-empty and\n * actions array is provided. automatically validated when calling ranking().\n */\nexport const PredictionPayloadSchema = z.object({\n useCase: z.object({\n uuid: z.string().min(1, \"use case uuid required\"),\n }),\n context: PredictionUnitSchema,\n actions: z.array(PredictionUnitSchema),\n no_trace: z.boolean().optional(),\n});\n\n///catalog add schema\nexport const CatalogAddPropsSchema = z.object({\n entity: z.string().min(1, \"entity required\"),\n data: z.array(z.record(z.string(), z.any())),\n mainUnit: z.string().optional(),\n formatData: z.boolean().optional(),\n});\n\n///model option schema\nexport const ModelOptionSchema = z.object({\n id: z.string().min(1, \"model id required\"),\n instance_id: z.string().optional(),\n});\n\n///content selection options schema\nexport const ContentSelectionOptionsSchema = z.object({\n retriever_model: ModelOptionSchema.optional(),\n embedder_model: ModelOptionSchema.optional(),\n ranker_model: ModelOptionSchema.optional(),\n user_embedding: z.array(z.number()).optional(),\n action_sequence: z.array(z.string()).optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_vectors: z.boolean().optional(),\n with_payload: z.union([z.boolean(), z.array(z.string())]).optional(),\n use_faiss: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n item_id: z.string().optional(),\n image: z.string().optional(),\n});\n\n///filter condition schema\nexport const FilterConditionSchema = z.object({\n field: z.string().min(1, \"filter field required\"),\n condition: z.union([\n z.object({\n type: z.literal(\"Match\"),\n value: z.union([z.string(), z.number(), z.boolean()]),\n }),\n z.object({\n type: z.literal(\"Range\"),\n value: z.object({\n gte: z.number().optional(),\n lte: z.number().optional(),\n gt: z.number().optional(),\n lt: z.number().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"DatetimeRange\"),\n value: z.object({\n gte: z.string().optional(),\n lte: z.string().optional(),\n gt: z.string().optional(),\n lt: z.string().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"GeoRadius\"),\n value: z.object({\n lat: z.number(),\n lon: z.number(),\n radius: z.number().positive(),\n }),\n }),\n ]),\n});\n\n///content selection filter schema\nexport const ContentSelectionFilterSchema = z.object({\n must: z.array(FilterConditionSchema).optional(),\n should: z.array(FilterConditionSchema).optional(),\n must_not: z.array(FilterConditionSchema).optional(),\n});\n\n/**\n * zod schema for content selection request validation\n *\n * validates search request structure. ensures use_case is non-empty and limit\n * is within bounds (1-1000). automatically validated when calling contentSelection()\n * and all convenience methods.\n *\n * **validation rules:**\n * - use_case: must be non-empty string\n * - limit: must be positive integer, max 1000\n * - filters: must match ContentSelectionFilterSchema structure\n */\nexport const ContentSelectionRequestSchema = z.object({\n use_case: z.string().min(1, \"use case required\"),\n context: z.record(z.string(), z.string()).optional(),\n search: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n options: ContentSelectionOptionsSchema.optional(),\n debug: z.boolean().optional(),\n});\n\n///search method params schema\nexport const SearchParamsSchema = z.object({\n query: z.string(),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///recommendations params schema\nexport const RecommendationsParamsSchema = z.object({\n useCase: z.string().min(1, \"use case required\"),\n params: z.object({\n user_id: z.string().optional(),\n session_id: z.string().optional(),\n action_sequence: z.array(z.string()).optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n hnsw_ef: z.number().int().positive().optional(),\n debug: z.boolean().optional(),\n }),\n});\n\n///similar items params schema\nexport const SimilarItemsParamsSchema = z.object({\n itemId: z.string().min(1, \"item id required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n limit: z.number().int().positive().max(1000).optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///search by image params schema\nexport const SearchByImageParamsSchema = z.object({\n image: z.string().min(1, \"image required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n query: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///search by vector params schema\nexport const SearchByVectorParamsSchema = z.object({\n vector: z.array(z.number()).min(1, \"vector must have at least 1 dimension\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///put event params schema\nexport const PutEventParamsSchema = z.object({\n data: EventSchema,\n options: z\n .object({\n notrace: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * zod schema for batch event validation\n *\n * validates event batch requests. enforces max batch size of 500 events and\n * validates each individual event in the batch. automatically validated when\n * calling putEventBatch().\n *\n * **validation rules:**\n * - events: must be non-empty array, max 500 events\n * - each event: must pass EventSchema validation\n */\nexport const PutEventBatchParamsSchema = z.object({\n events: z.array(EventSchema).max(500, \"max 500 events per batch\"),\n options: z\n .object({\n notrace: z.boolean().optional(),\n })\n .optional(),\n});\n\n///feedback params schema\nexport const FeedbackParamsSchema = z.object({\n modelUuid: z.string().optional(),\n predictionUuid: z.string().min(1, \"prediction uuid required\"),\n value: z.record(z.string(), z.any()),\n});\n\n///infer types from schemas for runtime type checking\nexport type Event = z.infer<typeof EventSchema>;\nexport type PredictionUnit = z.infer<typeof PredictionUnitSchema>;\nexport type PredictionPayload = z.infer<typeof PredictionPayloadSchema>;\nexport type CatalogAddProps = z.infer<typeof CatalogAddPropsSchema>;\nexport type ModelOption = z.infer<typeof ModelOptionSchema>;\nexport type ContentSelectionOptions = z.infer<typeof ContentSelectionOptionsSchema>;\nexport type FilterCondition = z.infer<typeof FilterConditionSchema>;\nexport type ContentSelectionFilter = z.infer<typeof ContentSelectionFilterSchema>;\nexport type ContentSelectionRequest = z.infer<typeof ContentSelectionRequestSchema>;\n","import { stringify } from \"csv-stringify/sync\";\n\ntype NestedObject = Record<string, unknown>;\n\ntype FlattenedObject = Record<string, unknown>;\n\n/**\n * flatten nested object structure\n *\n * converts nested objects into flat structure with underscore-separated keys.\n * handles arrays by joining with commas. used by catalogAdd to prepare data\n * for api ingestion.\n *\n * @param obj - object to flatten (can contain nested objects and arrays)\n * @returns flattened object with underscore-separated keys\n *\n * @example\n * ```typescript\n * const nested = {\n * name: \"Product\",\n * meta: { color: \"red\", size: \"large\" },\n * tags: [\"new\", \"sale\"]\n * };\n * const flat = flattenNested(nested);\n * // Result: { name: \"Product\", meta_color: \"red\", meta_size: \"large\", tags: \"new,sale\" }\n * ```\n */\nexport const flattenNested = (obj: NestedObject): FlattenedObject => {\n const result: FlattenedObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n if (Array.isArray(nestedValue)) {\n result[`${key}_${nestedKey}`] = nestedValue.join(\",\");\n } else if (typeof nestedValue === \"object\" && nestedValue !== null) {\n for (const [subKey, subValue] of Object.entries(nestedValue)) {\n result[`${nestedKey}_${subKey}`] = subValue;\n }\n } else {\n result[`${key}_${nestedKey}`] = nestedValue;\n }\n }\n } else if (Array.isArray(value)) {\n result[key] = value.join(\",\");\n } else {\n result[key] = value;\n }\n }\n\n return result;\n};\n\n/**\n * format row data for csv conversion\n *\n * internal helper that prepares a single row for csv export by flattening\n * and converting values to strings based on header order.\n *\n * @param rowHeaders - array of column headers\n * @param row - data row to format\n * @returns array of string values in header order\n * @private\n */\nconst preFormatRow = (rowHeaders: string[], row: Record<string, unknown>) => {\n const flattenedRow = flattenNested(row);\n return rowHeaders.map((header) => {\n const value = flattenedRow[header];\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return \"\";\n }\n\n // Handle objects (including arrays)\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // Convert to string for other types\n return String(value);\n });\n};\n\n/**\n * convert array of objects to csv format\n *\n * transforms data array into csv string with headers. automatically flattens nested\n * objects, handles nulls/undefined, and properly quotes strings. used by catalogCSVAdd\n * for bulk catalog uploads.\n *\n * @param data - array of objects to convert to csv\n * @returns csv string with headers and properly formatted rows\n *\n * @throws {Error} if data array is empty\n *\n * @example\n * ```typescript\n * const csv = bodyToCSV([\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]);\n * // Result: CSV string with headers and 2 data rows\n * ```\n */\nexport const bodyToCSV = (data: Record<string, unknown>[]) => {\n if (data.length === 0) {\n throw new Error(\"data is empty\");\n }\n\n const [row0] = data;\n if (!row0) {\n throw new Error(\"data is empty\");\n }\n\n const rowHeaders: string[] = Object.keys(flattenNested(row0));\n // Prepare data for csv-parse\n const csvData = [rowHeaders, ...data.map((row) => preFormatRow(rowHeaders, row))];\n\n return stringify(csvData, {\n delimiter: \",\",\n quote: true,\n quoted_string: true,\n header: false,\n }).trim();\n};\n","import * as Request from \"./request\";\nimport {\n CatalogAddPropsSchema,\n ContentSelectionRequestSchema,\n FeedbackParamsSchema,\n PredictionPayloadSchema,\n PutEventBatchParamsSchema,\n PutEventParamsSchema,\n RecommendationsParamsSchema,\n SearchByImageParamsSchema,\n SearchByVectorParamsSchema,\n SearchParamsSchema,\n SimilarItemsParamsSchema,\n} from \"./schemas\";\nimport type {\n CatalogAddProps,\n ContentSelectionFilter,\n ContentSelectionRequest,\n ContentSelectionResponse,\n DataPoint,\n Event,\n PredictionPayload,\n} from \"./type\";\nimport { bodyToCSV, flattenNested } from \"./utils\";\n\nexport type {\n ContentSelectionFilter,\n ContentSelectionRequest,\n ContentSelectionResponse,\n DataPoint,\n Event,\n PredictionPayload,\n};\n\nconst hostDefault = \"https://app.usealbatross.ai/api\";\n\n/**\n * albatross sdk client for content selection, predictions, events, and catalog management\n *\n * main entry point for interacting with albatross apis. provides methods for search,\n * recommendations, predictions, event tracking, and catalog operations. handles\n * authentication, retries, and validates all inputs automatically.\n */\nclass Client {\n public token: string;\n public tenantId: string;\n public baseUrl: string;\n makeRequest: <A, B extends Record<string, unknown>>(inputs: Request.MakeRequestInputs<B>) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n\n /**\n * create new albatross sdk client instance\n *\n * initializes client with authentication credentials and optional custom configurations.\n *\n * @param token - api authentication bearer token\n * @param tenantId - tenant/instance identifier (same value used for both auth header types)\n * @param baseUrl - api base url (default: https://app.usealbatross.ai/api)\n * @param options - optional client configuration\n * @param options.makeRequest - custom http request handler\n * @param options.predictionPreProcessing - hook to transform prediction payloads before sending\n *\n * @example\n * ```typescript\n * const client = new Client(\n * \"your-api-token\",\n * \"tenant-uuid-123\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // with custom base url\n * const client = new Client(\n * \"token\",\n * \"tenant-id\",\n * \"https://custom.api.com\"\n * );\n * ```\n */\n constructor(\n token: string,\n tenantId: string,\n baseUrl: string = hostDefault,\n options: Partial<{\n makeRequest: <A, B extends Record<string, unknown>>(inputs: Request.MakeRequestInputs<B>) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n }> = {}\n ) {\n this.token = token;\n this.tenantId = tenantId;\n this.baseUrl = baseUrl;\n this.makeRequest = options.makeRequest || Request.makeRequest;\n this.predictionPreProcessing = options.predictionPreProcessing || ((data) => data);\n }\n\n /**\n * generate http headers based on endpoint type\n *\n * implements dual authentication strategy by sending different headers\n * depending on which service is being called.\n *\n * @param endpointType - \"robin\" for prediction/content-selection, \"catalog\" for events/catalog\n * @returns headers object with authentication and content-type\n * @private\n */\n private getHeaders(endpointType: \"robin\" | \"catalog\"): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n };\n\n if (endpointType === \"robin\") {\n headers[\"X-Tenant-Id\"] = this.tenantId;\n } else {\n ///catalog includes both catalog and events endpoints\n headers[\"x-instance-id\"] = this.tenantId;\n }\n\n return headers;\n }\n\n /**\n * validate base64 image size\n *\n * enforces 50mb size limit on images to prevent memory issues and ensure\n * reasonable api request sizes. checks base64 string length (not decoded size).\n *\n * @param base64Image - base64-encoded image string (with or without data url prefix)\n * @throws {Error} if image exceeds 50mb (52428800 bytes)\n * @private\n */\n private static validateImageSize(base64Image: string): void {\n const MAX_SIZE = 52_428_800; // 50mb\n if (base64Image.length > MAX_SIZE) {\n throw new Error(`image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`);\n }\n }\n\n /**\n * perform content selection (core method)\n *\n * low-level content selection method that all convenience methods use internally.\n * supports all search modes: text, image, vector, item similarity, user recommendations.\n * use specific convenience methods (search, searchByImage, etc.) for common use cases.\n *\n * @param request - content selection request configuration\n * @param request.use_case - use case identifier\n * @param request.context - optional context (user_id, session_id)\n * @param request.search - text search query (optional)\n * @param request.limit - max results (1-1000, default: varies by method)\n * @param request.filters - filter conditions to apply\n * @param request.options - search options (models, embeddings, item_id, image, etc.)\n * @param request.debug - enable debug info in response\n *\n * @returns promise resolving to search results with items, metadata, and optional debug info\n *\n * @throws {ZodError} if request validation fails\n * @throws {Error} if image in options exceeds 50mb\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.contentSelection({\n * use_case: \"product-search\",\n * search: \"red shoes\",\n * limit: 20\n * });\n * ```\n */\n async contentSelection(request: ContentSelectionRequest): Promise<ContentSelectionResponse> {\n ///validate request\n ContentSelectionRequestSchema.parse(request);\n\n ///validate image size if provided\n if (request.options?.image) {\n Client.validateImageSize(request.options.image);\n }\n\n const url = `${this.baseUrl}/prediction/content-selection`;\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data: request,\n headers: this.getHeaders(\"robin\"),\n });\n }\n\n /**\n * perform text-based content search\n *\n * searches content using semantic text matching. ideal for product search,\n * document retrieval, or any text-based similarity search. supports filtering,\n * pagination, and performance tuning.\n *\n * @param query - search query text\n * @param useCase - use case identifier for search\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: varies)\n * @param options.filters - filter conditions to apply (use FilterBuilder to create)\n * @param options.hnsw_ef - hnsw search parameter for speed/accuracy tradeoff (higher = more accurate but slower)\n * @param options.with_payload - include item metadata in results (default: false)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to search results with matching items and metadata\n *\n * @throws {ZodError} if query is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * limit: 20,\n * filters: new FilterBuilder().match(\"category\", \"footwear\").build()\n * });\n * ```\n */\n async search(\n query: string,\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n hnsw_ef?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchParamsSchema.parse({ query, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n search: query,\n limit: options?.limit,\n filters: options?.filters,\n options: {\n hnsw_ef: options?.hnsw_ef,\n with_payload: options?.with_payload,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get personalized recommendations for user\n *\n * retrieves content recommendations based on user behavior and action history.\n * can use user_id/session_id context or action sequence.\n *\n * @param useCase - use case identifier\n * @param params - recommendation parameters\n * @param params.user_id - user identifier (optional, pairs with session_id)\n * @param params.session_id - session identifier (optional, pairs with user_id)\n * @param params.action_sequence - array of item ids representing user actions (optional)\n * @param params.limit - max results to return (1-1000, default: 100)\n * @param params.filters - filter conditions to apply\n * @param params.with_payload - include item metadata in results (default: true)\n * @param params.with_vectors - include embedding vectors in results (default: true)\n * @param params.hnsw_ef - hnsw parameter (default: 256 when context provided, otherwise not set)\n * @param params.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to personalized recommendations\n *\n * @throws {ZodError} if useCase is empty or params are invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const recs = await client.getRecommendations(\"product-recs\", {\n * user_id: \"user-123\",\n * session_id: \"session-456\",\n * limit: 10\n * });\n * ```\n */\n async getRecommendations(\n useCase: string,\n params: {\n user_id?: string;\n session_id?: string;\n action_sequence?: string[];\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n hnsw_ef?: number;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n RecommendationsParamsSchema.parse({ useCase, params });\n\n const context =\n params.user_id && params.session_id ? { user_id: params.user_id, session_id: params.session_id } : undefined;\n\n return this.contentSelection({\n use_case: useCase,\n context,\n limit: params.limit || 100,\n filters: params.filters,\n options: {\n action_sequence: params.action_sequence,\n hnsw_ef: params.hnsw_ef || (context ? 256 : undefined),\n with_payload: params.with_payload ?? true,\n with_vectors: params.with_vectors ?? true,\n },\n debug: params.debug,\n });\n }\n\n /**\n * find similar items by item id\n *\n * retrieves items similar to a given item. ideal for \"similar products\",\n * \"you may also like\", or \"related items\" features.\n *\n * @param itemId - id of the reference item to find similarities for\n * @param useCase - use case identifier\n * @param options - optional configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to similar items\n *\n * @throws {ZodError} if itemId is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const similar = await client.getSimilarItems(\"product-123\", \"product-similarity\", {\n * limit: 5\n * });\n * ```\n */\n async getSimilarItems(\n itemId: string,\n useCase: string,\n options?: {\n limit?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SimilarItemsParamsSchema.parse({ itemId, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 10,\n options: {\n item_id: itemId,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by image (visual/multimodal search)\n *\n * searches content using image similarity or combined image+text (multimodal).\n * ideal for visual search, \"find similar products by photo\", or \"search by image\"\n * features. supports combining image with text query for multimodal search.\n *\n * @param image - base64-encoded image string (max 50mb)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.query - optional text query for multimodal search (image + text)\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.use_knn - use knn instead of hnsw for search (slower but potentially more accurate)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to visually similar items\n *\n * @throws {Error} if image exceeds 50mb\n * @throws {ZodError} if image is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.searchByImage(base64Image, \"visual-search\", {\n * limit: 10\n * });\n * ```\n */\n async searchByImage(\n image: string,\n useCase: string,\n options?: {\n query?: string;\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n use_knn?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByImageParamsSchema.parse({ image, useCase, options });\n\n Client.validateImageSize(image);\n\n return this.contentSelection({\n use_case: useCase,\n search: options?.query,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n image,\n with_payload: options?.with_payload ?? true,\n use_knn: options?.use_knn,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by embedding vector (direct vector similarity)\n *\n * searches content using a provided embedding vector. useful when you have\n * pre-computed embeddings or want direct control over the search vector.\n * bypasses text/image encoding and searches directly in vector space.\n *\n * @param vector - embedding vector (array of numbers, typically 64-1536 dimensions)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to items with similar embeddings\n *\n * @throws {ZodError} if vector is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3, ...]; // your pre-computed vector\n * const results = await client.searchByVector(embedding, \"vector-search\", {\n * limit: 15\n * });\n * ```\n */\n async searchByVector(\n vector: number[],\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByVectorParamsSchema.parse({ vector, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n user_embedding: vector,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get api version information\n *\n * retrieves current api version and build info. useful for debugging,\n * compatibility checking, or displaying version information.\n *\n * @returns promise resolving to version information object\n *\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const version = await client.getVersion();\n * console.log(`API version: ${version}`);\n * ```\n */\n async getVersion() {\n const url = `${this.baseUrl}/version`;\n return this.makeRequest({ url, headers: this.getHeaders(\"catalog\") });\n }\n\n /**\n * add items to catalog\n *\n * uploads items to the catalog for a specific entity type (e.g., products, articles).\n * automatically flattens nested objects unless formatData is set to false.\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to add to catalog\n * @param props.mainUnit - primary identifier field name (optional)\n * @param props.formatData - auto-flatten nested objects (default: true)\n *\n * @returns promise resolving when catalog add completes\n *\n * @throws {ZodError} if entity is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.catalogAdd({\n * entity: \"products\",\n * data: [\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]\n * });\n * ```\n */\n catalogAdd = async ({ entity, data, mainUnit, formatData }: CatalogAddProps) => {\n ///validate params\n CatalogAddPropsSchema.parse({ entity, data, mainUnit, formatData });\n\n const formattedData = formatData === undefined || formatData === true ? data.map(flattenNested) : data;\n\n return this.makeRequest({\n url: `${this.baseUrl}/catalog`,\n method: \"PUT\",\n data: { data: formattedData, entity, mainUnit },\n headers: this.getHeaders(\"catalog\"),\n });\n };\n\n /**\n * add items to catalog via csv format\n *\n * uploads items to catalog using csv format instead of json. more efficient for\n * large bulk uploads. converts data to csv automatically. does not use makeRequest\n * retry logic (uses raw fetch).\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to convert to csv and upload\n * @param props.mainUnit - primary identifier field name (optional)\n *\n * @returns promise resolving when catalog upload completes\n *\n * @throws {Error} if data is empty\n * @throws {Error} on fetch failures (no automatic retry for csv uploads)\n *\n * @example\n * ```typescript\n * await client.catalogCSVAdd({\n * entity: \"products\",\n * data: [{ id: \"1\", name: \"A\" }, { id: \"2\", name: \"B\" }],\n * mainUnit: \"id\"\n * });\n * ```\n */\n catalogCSVAdd = async ({ entity, data, mainUnit }: CatalogAddProps): Promise<{}> => {\n const queryParams: Record<string, string | undefined> = {\n entity,\n mainUnit,\n };\n const queryParamsString: string = Object.entries(queryParams)\n .filter((entry): entry is [string, string] => !!entry[1])\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n\n const path = \"/catalog/csv\";\n const url = `${this.baseUrl}${path}?${queryParamsString}`;\n\n const body: string = bodyToCSV(data);\n\n const r = await fetch(url, { headers: this.getHeaders(\"catalog\"), method: \"PUT\", body });\n\n return r.json() as Promise<{}>;\n };\n\n /**\n * send single event\n *\n * tracks user interactions. supports all event types.\n *\n * @param data - event data\n * @param data.eventType - event type name (e.g., \"click\", \"purchase\", \"view\")\n * @param data.payload - event-specific data (optional)\n * @param data.predictionId - associated prediction id (optional)\n * @param data.predictionIds - associated prediction ids (optional)\n * @param data.sessionId - session identifier (optional)\n * @param data.timestamp - event timestamp (optional, defaults to server time)\n * @param options - optional event configuration\n * @param options.notrace - skip storing event in analytics (default: false)\n *\n * @returns promise resolving when event is recorded\n *\n * @throws {ZodError} if eventType is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEvent({\n * eventType: \"click\",\n * payload: { item_id: \"product-123\" },\n * sessionId: \"session-456\"\n * });\n * ```\n */\n async putEvent(\n data: Event,\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventParamsSchema.parse({ data, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data,\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * send batch of events\n *\n * efficiently tracks multiple events in a single api call. ideal for bulk event\n * uploads, offline event syncing, or high-throughput event tracking. supports\n * up to 500 events per batch.\n *\n * @param events - array of events to send (max 500)\n * @param options - optional batch configuration\n * @param options.notrace - skip storing events in analytics (default: false)\n *\n * @returns promise resolving when all events are recorded\n *\n * @throws {ZodError} if events array is empty, exceeds 500 items, or contains invalid events\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEventBatch([\n * { eventType: \"view\", payload: { item_id: \"item-1\" } },\n * { eventType: \"click\", payload: { item_id: \"item-2\" } },\n * { eventType: \"purchase\", payload: { item_id: \"item-3\", price: 99.99 } }\n * ]);\n * ```\n */\n async putEventBatch(\n events: Event[],\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventBatchParamsSchema.parse({ events, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event/batch${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data: { events },\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * get content ranking prediction\n *\n * requests ranked ordering of content items based on context and user preferences.\n * used for personalized ranking, A/B testing, or contextual bandit scenarios.\n * returns ordered ranking with scores and associated datapoint.\n *\n * @param payload - prediction request payload\n * @param payload.useCase - use case configuration with uuid\n * @param payload.context - context features (user_id, session_id, etc.)\n * @param payload.actions - array of items to rank (item features)\n * @param payload.no_trace - skip storing prediction for analytics (default: false)\n *\n * @returns promise resolving to prediction with ordering, datapoint, and prediction id\n * @returns {object} result\n * @returns {object} result.ordering - item rankings (item_id -> rank)\n * @returns {DataPoint} result.datapoint - full prediction datapoint with scores and propensities\n * @returns {string} result.id - prediction uuid for feedback tracking\n *\n * @throws {ZodError} if useCase uuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const ranking = await client.ranking({\n * useCase: { uuid: \"ranking-use-case\" },\n * context: { user_id: \"user-123\" },\n * actions: [\n * { item_id: \"item-1\", category: \"electronics\" },\n * { item_id: \"item-2\", category: \"books\" }\n * ]\n * });\n * ```\n */\n ranking = async (\n payload: PredictionPayload\n ): Promise<{\n ordering: Record<string, number>;\n datapoint: DataPoint;\n id: string;\n }> => {\n ///validate params\n PredictionPayloadSchema.parse(payload);\n\n const url = `${this.baseUrl}/prediction/ranker`;\n\n const data = this.predictionPreProcessing(payload);\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data,\n headers: this.getHeaders(\"robin\"),\n });\n };\n\n /**\n * send feedback for prediction\n *\n * submits outcome feedback for a previous prediction.\n *\n * @param payload - feedback payload\n * @param payload.predictionUuid - id of the prediction to provide feedback for (from ranking() response)\n * @param payload.value - feedback data (e.g., { reward: 1 }, { clicked: true }, { rating: 4.5 })\n * @param payload.modelUuid - optional specific model uuid to send feedback to\n *\n * @returns promise resolving when feedback is recorded\n *\n * @throws {ZodError} if predictionUuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const pred = await client.ranking({...});\n * // later, after user interaction\n * await client.feedback({\n * predictionUuid: pred.id,\n * value: { clicked: true, purchased: false }\n * });\n * ```\n */\n feedback = async (payload: { modelUuid?: string; predictionUuid: string; value: Record<string, unknown> }) => {\n ///validate params\n FeedbackParamsSchema.parse(payload);\n\n const url = `${this.baseUrl}/feedback`;\n\n return this.makeRequest({\n method: \"POST\",\n url: url,\n data: payload,\n headers: this.getHeaders(\"robin\"),\n });\n };\n}\n\nexport { Client };\n","import type { ContentSelectionFilter, FilterCondition } from \"./type\";\n\n/**\n * fluent builder for creating content selection filters\n *\n * provides chainable api for constructing complex filter conditions. supports\n * must (required), should (optional/or), and must_not (exclusion) filter types.\n * use with search(), getRecommendations(), and other content selection methods.\n *\n * filter types:\n * - must: all conditions must match (AND logic)\n * - should: at least one condition should match (OR logic)\n * - must_not: conditions must not match (NOT logic)\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"electronics\")\n * .range(\"price\", { gte: 100, lte: 500 })\n * .match(\"out_of_stock\", false, \"must_not\")\n * .build();\n * ```\n */\nexport class FilterBuilder {\n private must: FilterCondition[] = [];\n private should: FilterCondition[] = [];\n private must_not: FilterCondition[] = [];\n\n /**\n * add exact match filter condition\n *\n * filters items where field exactly matches the specified value.\n * supports string, number, and boolean values.\n *\n * @param field - field name to filter on\n * @param value - value to match (string | number | boolean)\n * @param type - filter type: \"must\" (required), \"should\" (optional), or \"must_not\" (exclude). default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // required match\n * builder.match(\"category\", \"electronics\");\n *\n * // optional match (or condition)\n * builder.match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\");\n *\n * // exclusion\n * builder.match(\"status\", \"deleted\", \"must_not\");\n * ```\n */\n match(field: string, value: string | number | boolean, type: \"must\" | \"should\" | \"must_not\" = \"must\"): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Match\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add numeric range filter condition\n *\n * filters items where numeric field falls within specified range.\n * supports gte (>=), lte (<=), gt (>), and lt (<) operators.\n *\n * @param field - numeric field name to filter on\n * @param value - range specification with operators\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // price between 100 and 500\n * builder.range(\"price\", { gte: 100, lte: 500 });\n *\n * // rating above 4\n * builder.range(\"rating\", { gt: 4 });\n *\n * // exclude expensive items\n * builder.range(\"price\", { gte: 1000 }, \"must_not\");\n * ```\n */\n range(\n field: string,\n value: { gte?: number; lte?: number; gt?: number; lt?: number },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Range\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add datetime range filter condition\n *\n * filters items where datetime field falls within specified range.\n * values should be RFC 3339 formatted strings (e.g., \"2025-12-15T00:00:00Z\").\n *\n * @param field - datetime field name to filter on\n * @param value - range specification with operators (RFC 3339 strings)\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // events between two dates\n * builder.datetimeRange(\"start_date\", {\n * gte: \"2025-12-15T00:00:00Z\",\n * lte: \"2025-12-31T23:59:59Z\"\n * });\n *\n * // events after a specific date\n * builder.datetimeRange(\"created_at\", { gt: \"2025-01-01T00:00:00Z\" });\n * ```\n */\n datetimeRange(\n field: string,\n value: { gte?: string; lte?: string; gt?: string; lt?: string },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"DatetimeRange\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add geo-radius filter condition\n *\n * filters items where geo-location field falls within specified radius\n * from a center point. useful for location-based filtering.\n *\n * @param field - geo-location field name\n * @param lat - latitude of center point (degrees, -90 to 90)\n * @param lon - longitude of center point (degrees, -180 to 180)\n * @param radius - search radius in meters\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // items within 5km of new york city\n * builder.geoRadius(\"location\", 40.7128, -74.0060, 5000);\n *\n * // exclude items near specific location\n * builder.geoRadius(\"warehouse\", 37.7749, -122.4194, 10000, \"must_not\");\n * ```\n */\n geoRadius(\n field: string,\n lat: number,\n lon: number,\n radius: number,\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"GeoRadius\", value: { lat, lon, radius } },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * build final filter object\n *\n * constructs the complete filter object from all added conditions.\n * call this method last after chaining all filter methods.\n *\n * @returns content selection filter ready to use with client methods\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"clothing\")\n * .range(\"price\", { gte: 20, lte: 100 })\n * .match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\")\n * .build();\n *\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * filters: filter\n * });\n * ```\n */\n build(): ContentSelectionFilter {\n const filter: ContentSelectionFilter = {};\n\n if (this.must.length > 0) {\n filter.must = this.must;\n }\n if (this.should.length > 0) {\n filter.should = this.should;\n }\n if (this.must_not.length > 0) {\n filter.must_not = this.must_not;\n }\n\n return filter;\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -639,7 +639,7 @@ declare class Client {
639
639
  * });
640
640
  * ```
641
641
  */
642
- catalogAdd: ({ entity, data, mainUnit, formatData, }: CatalogAddProps) => Promise<unknown>;
642
+ catalogAdd: ({ entity, data, mainUnit, formatData }: CatalogAddProps) => Promise<unknown>;
643
643
  /**
644
644
  * add items to catalog via csv format
645
645
  *
@@ -666,7 +666,7 @@ declare class Client {
666
666
  * });
667
667
  * ```
668
668
  */
669
- catalogCSVAdd: ({ entity, data, mainUnit, }: CatalogAddProps) => Promise<{}>;
669
+ catalogCSVAdd: ({ entity, data, mainUnit }: CatalogAddProps) => Promise<{}>;
670
670
  /**
671
671
  * send single event
672
672
  *
package/dist/index.d.ts CHANGED
@@ -639,7 +639,7 @@ declare class Client {
639
639
  * });
640
640
  * ```
641
641
  */
642
- catalogAdd: ({ entity, data, mainUnit, formatData, }: CatalogAddProps) => Promise<unknown>;
642
+ catalogAdd: ({ entity, data, mainUnit, formatData }: CatalogAddProps) => Promise<unknown>;
643
643
  /**
644
644
  * add items to catalog via csv format
645
645
  *
@@ -666,7 +666,7 @@ declare class Client {
666
666
  * });
667
667
  * ```
668
668
  */
669
- catalogCSVAdd: ({ entity, data, mainUnit, }: CatalogAddProps) => Promise<{}>;
669
+ catalogCSVAdd: ({ entity, data, mainUnit }: CatalogAddProps) => Promise<{}>;
670
670
  /**
671
671
  * send single event
672
672
  *
package/dist/index.js CHANGED
@@ -17,10 +17,7 @@ var makeRequest = async ({
17
17
  let lastError = null;
18
18
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {
19
19
  const controller = new AbortController();
20
- const timeoutId = setTimeout(
21
- () => controller.abort(),
22
- REQUEST_TIMEOUT_MS
23
- );
20
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
24
21
  try {
25
22
  const response = await fetch(url, {
26
23
  method,
@@ -31,17 +28,13 @@ var makeRequest = async ({
31
28
  clearTimeout(timeoutId);
32
29
  if (!response.ok) {
33
30
  const errorText = await response.text();
34
- const error = new Error(
35
- `Request failed: ${response.status} ${response.statusText} ${errorText}`
36
- );
31
+ const error = new Error(`Request failed: ${response.status} ${response.statusText} ${errorText}`);
37
32
  if (!isRetryableError(response.status)) {
38
33
  throw error;
39
34
  }
40
35
  if (attempt < MAX_RETRIES) {
41
36
  lastError = error;
42
- await new Promise(
43
- (resolve) => setTimeout(resolve, getRetryDelay(attempt))
44
- );
37
+ await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));
45
38
  continue;
46
39
  }
47
40
  throw new Error(
@@ -59,28 +52,18 @@ var makeRequest = async ({
59
52
  if (error.name === "AbortError") {
60
53
  if (attempt < MAX_RETRIES) {
61
54
  lastError = error;
62
- await new Promise(
63
- (resolve) => setTimeout(resolve, getRetryDelay(attempt))
64
- );
55
+ await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));
65
56
  continue;
66
57
  }
67
- throw new Error(
68
- `Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`,
69
- { cause: error }
70
- );
58
+ throw new Error(`Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`, { cause: error });
71
59
  }
72
60
  if (error.message.includes("fetch") || error.message.includes("network") || error.message.includes("Failed to fetch")) {
73
61
  if (attempt < MAX_RETRIES) {
74
62
  lastError = error;
75
- await new Promise(
76
- (resolve) => setTimeout(resolve, getRetryDelay(attempt))
77
- );
63
+ await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));
78
64
  continue;
79
65
  }
80
- throw new Error(
81
- `Network error after ${MAX_RETRIES} retries: ${error.message}`,
82
- { cause: error }
83
- );
66
+ throw new Error(`Network error after ${MAX_RETRIES} retries: ${error.message}`, { cause: error });
84
67
  }
85
68
  }
86
69
  throw error;
@@ -301,10 +284,7 @@ var bodyToCSV = (data) => {
301
284
  throw new Error("data is empty");
302
285
  }
303
286
  const rowHeaders = Object.keys(flattenNested(row0));
304
- const csvData = [
305
- rowHeaders,
306
- ...data.map((row) => preFormatRow(rowHeaders, row))
307
- ];
287
+ const csvData = [rowHeaders, ...data.map((row) => preFormatRow(rowHeaders, row))];
308
288
  return stringify(csvData, {
309
289
  delimiter: ",",
310
290
  quote: true,
@@ -393,9 +373,7 @@ var Client = class _Client {
393
373
  static validateImageSize(base64Image) {
394
374
  const MAX_SIZE = 52428800;
395
375
  if (base64Image.length > MAX_SIZE) {
396
- throw new Error(
397
- `image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`
398
- );
376
+ throw new Error(`image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`);
399
377
  }
400
378
  }
401
379
  /**
@@ -720,12 +698,7 @@ var Client = class _Client {
720
698
  * });
721
699
  * ```
722
700
  */
723
- catalogAdd = async ({
724
- entity,
725
- data,
726
- mainUnit,
727
- formatData
728
- }) => {
701
+ catalogAdd = async ({ entity, data, mainUnit, formatData }) => {
729
702
  CatalogAddPropsSchema.parse({ entity, data, mainUnit, formatData });
730
703
  const formattedData = formatData === void 0 || formatData === true ? data.map(flattenNested) : data;
731
704
  return this.makeRequest({
@@ -761,11 +734,7 @@ var Client = class _Client {
761
734
  * });
762
735
  * ```
763
736
  */
764
- catalogCSVAdd = async ({
765
- entity,
766
- data,
767
- mainUnit
768
- }) => {
737
+ catalogCSVAdd = async ({ entity, data, mainUnit }) => {
769
738
  const queryParams = {
770
739
  entity,
771
740
  mainUnit
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/request.ts","../src/schemas.ts","../src/utils.ts","../src/client.ts","../src/filters.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** maximum number of retry attempts for failed requests */\nconst MAX_RETRIES = 3;\n/** base delay in milliseconds for exponential backoff (1s) */\nconst BASE_DELAY_MS = 1000;\n/** request timeout in milliseconds (30s) */\nconst REQUEST_TIMEOUT_MS = 30_000;\n\n/**\n * check if http status code is retryable\n *\n * determines whether a request should be retried based on status code.\n * server errors (5xx) are retryable, client errors (4xx) are not.\n *\n * @param status - http status code\n * @returns true if status is 500-599 (server error), false otherwise\n */\nconst isRetryableError = (status: number): boolean =>\n status >= 500 && status <= 599; // 5xx server errors\n\n/**\n * calculate exponential backoff delay\n *\n * computes retry delay using exponential backoff strategy.\n * delays: attempt 0 = 1s, attempt 1 = 2s, attempt 2 = 4s\n *\n * @param attempt - current retry attempt number (0-indexed)\n * @returns delay in milliseconds (2^attempt * 1000)\n */\nconst getRetryDelay = (attempt: number): number =>\n 2 ** attempt * BASE_DELAY_MS;\n\n/**\n * make http request with automatic retry logic and timeout handling\n *\n * resilient http request function with built-in retry logic, exponential backoff,\n * and timeout protection. automatically retries transient failures (5xx errors,\n * network issues, timeouts) up to 3 times. does not retry client errors (4xx).\n *\n * **retry behavior:**\n * - max retries: 3 (4 total attempts)\n * - backoff delays: 1s, 2s, 4s\n * - timeout per attempt: 30s\n * - retries on: 500-599 status codes, network errors, timeouts\n * - no retry on: 400-499 status codes\n *\n * **error messages:**\n * - 4xx errors: `Request failed: {status} {statusText} {body}`\n * - 5xx after retries: `Request failed after 3 retries: {status} {statusText} {body}`\n * - timeout: `Request timeout after 30000ms (3 retries)`\n * - network: `Network error after 3 retries: {message}`\n *\n * @param inputs - request configuration object\n * @param inputs.url - full url to request\n * @param inputs.method - http method (default: \"GET\")\n * @param inputs.data - request body data (auto-serialized to json)\n * @param inputs.headers - http headers to send\n *\n * @returns promise resolving to parsed json response (type A)\n *\n * @throws {Error} immediately on 4xx client errors (no retry)\n * @throws {Error} after 3 retries on persistent 5xx errors\n * @throws {Error} after 3 retries on persistent network errors\n * @throws {Error} after 3 retries on persistent timeouts\n *\n * @example\n * ```typescript\n * const response = await makeRequest({\n * url: \"https://api.example.com/data\",\n * method: \"POST\",\n * data: { key: \"value\" },\n * headers: { \"Authorization\": \"Bearer token\" }\n * });\n * ```\n */\nexport const makeRequest = async <A, B extends Record<string, unknown>>({\n url,\n method = \"GET\",\n data,\n headers,\n}: MakeRequestInputs<B>): Promise<A> => {\n const body = data ? JSON.stringify(data) : undefined;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n REQUEST_TIMEOUT_MS\n );\n\n try {\n const response = await fetch(url, {\n method,\n body,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n const error = new Error(\n `Request failed: ${response.status} ${response.statusText} ${errorText}`\n );\n\n ///don't retry client errors (4xx)\n if (!isRetryableError(response.status)) {\n throw error;\n }\n\n ///retry server errors (5xx) if attempts remain\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelay(attempt))\n );\n continue; ///retry\n }\n\n ///final attempt failed\n throw new Error(\n `Request failed after ${MAX_RETRIES} retries: ${response.status} ${response.statusText} ${errorText}`,\n { cause: error }\n );\n }\n\n ///success\n return response.json() as Promise<A>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n ///re-throw non-retryable errors immediately\n if (error instanceof Error) {\n ///non-retryable errors from response handling\n if (error.message.startsWith(\"Request failed:\") &&\n !error.message.includes(\"retries\")) {\n throw error;\n }\n\n ///abort controller timeout\n if (error.name === \"AbortError\") {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelay(attempt))\n );\n continue; ///retry on timeout\n }\n throw new Error(\n `Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`,\n { cause: error }\n );\n }\n\n ///network errors (dns, connection refused, etc.)\n if (\n error.message.includes(\"fetch\") ||\n error.message.includes(\"network\") ||\n error.message.includes(\"Failed to fetch\")\n ) {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) =>\n setTimeout(resolve, getRetryDelay(attempt))\n );\n continue; ///retry on network error\n }\n throw new Error(\n `Network error after ${MAX_RETRIES} retries: ${error.message}`,\n { cause: error }\n );\n }\n }\n\n ///re-throw unknown errors\n throw error;\n }\n }\n\n ///should never reach here, but typescript needs it\n throw lastError || new Error(\"Unexpected error in makeRequest\");\n};\n\n/**\n * http request input parameters\n *\n * configuration object for makeRequest function. supports generic data type\n * for request body to maintain type safety.\n */\nexport type MakeRequestInputs<B extends Record<string, unknown>> = {\n /** full url to request */\n url: string;\n /** http method (GET, POST, PUT, DELETE, etc.) */\n method?: string;\n /** request body data (will be json-stringified) */\n data?: B;\n /** http headers object */\n headers: Record<string, string>;\n};\n","import { z } from \"zod\";\n\n/**\n * zod schema for event validation\n *\n * validates event structure before sending to api. ensures eventType is non-empty.\n * automatically validated when calling putEvent() or putEventBatch().\n */\nexport const EventSchema = z.object({\n eventType: z.string().min(1, \"event type required\"),\n payload: z.record(z.string(), z.any()).optional(),\n predictionIds: z.array(z.string()).optional(),\n predictionId: z.string().optional(),\n timestamp: z.string().optional(),\n sessionId: z.union([z.string(), z.number()]).optional(),\n units: z.record(z.string(), z.string()).optional(),\n value: z.string().optional(),\n});\n\n///prediction unit schema\nexport const PredictionUnitSchema = z.record(z.string(), z.string());\n\n/**\n * zod schema for prediction payload validation\n *\n * validates prediction request structure. ensures useCase uuid is non-empty and\n * actions array is provided. automatically validated when calling ranking().\n */\nexport const PredictionPayloadSchema = z.object({\n useCase: z.object({\n uuid: z.string().min(1, \"use case uuid required\"),\n }),\n context: PredictionUnitSchema,\n actions: z.array(PredictionUnitSchema),\n no_trace: z.boolean().optional(),\n});\n\n///catalog add schema\nexport const CatalogAddPropsSchema = z.object({\n entity: z.string().min(1, \"entity required\"),\n data: z.array(z.record(z.string(), z.any())),\n mainUnit: z.string().optional(),\n formatData: z.boolean().optional(),\n});\n\n///model option schema\nexport const ModelOptionSchema = z.object({\n id: z.string().min(1, \"model id required\"),\n instance_id: z.string().optional(),\n});\n\n///content selection options schema\nexport const ContentSelectionOptionsSchema = z.object({\n retriever_model: ModelOptionSchema.optional(),\n embedder_model: ModelOptionSchema.optional(),\n ranker_model: ModelOptionSchema.optional(),\n user_embedding: z.array(z.number()).optional(),\n action_sequence: z.array(z.string()).optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_vectors: z.boolean().optional(),\n with_payload: z.union([z.boolean(), z.array(z.string())]).optional(),\n use_faiss: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n item_id: z.string().optional(),\n image: z.string().optional(),\n});\n\n///filter condition schema\nexport const FilterConditionSchema = z.object({\n field: z.string().min(1, \"filter field required\"),\n condition: z.union([\n z.object({\n type: z.literal(\"Match\"),\n value: z.union([z.string(), z.number(), z.boolean()]),\n }),\n z.object({\n type: z.literal(\"Range\"),\n value: z.object({\n gte: z.number().optional(),\n lte: z.number().optional(),\n gt: z.number().optional(),\n lt: z.number().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"DatetimeRange\"),\n value: z.object({\n gte: z.string().optional(),\n lte: z.string().optional(),\n gt: z.string().optional(),\n lt: z.string().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"GeoRadius\"),\n value: z.object({\n lat: z.number(),\n lon: z.number(),\n radius: z.number().positive(),\n }),\n }),\n ]),\n});\n\n///content selection filter schema\nexport const ContentSelectionFilterSchema = z.object({\n must: z.array(FilterConditionSchema).optional(),\n should: z.array(FilterConditionSchema).optional(),\n must_not: z.array(FilterConditionSchema).optional(),\n});\n\n/**\n * zod schema for content selection request validation\n *\n * validates search request structure. ensures use_case is non-empty and limit\n * is within bounds (1-1000). automatically validated when calling contentSelection()\n * and all convenience methods.\n *\n * **validation rules:**\n * - use_case: must be non-empty string\n * - limit: must be positive integer, max 1000\n * - filters: must match ContentSelectionFilterSchema structure\n */\nexport const ContentSelectionRequestSchema = z.object({\n use_case: z.string().min(1, \"use case required\"),\n context: z.record(z.string(), z.string()).optional(),\n search: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n options: ContentSelectionOptionsSchema.optional(),\n debug: z.boolean().optional(),\n});\n\n///search method params schema\nexport const SearchParamsSchema = z.object({\n query: z.string(),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///recommendations params schema\nexport const RecommendationsParamsSchema = z.object({\n useCase: z.string().min(1, \"use case required\"),\n params: z.object({\n user_id: z.string().optional(),\n session_id: z.string().optional(),\n action_sequence: z.array(z.string()).optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n hnsw_ef: z.number().int().positive().optional(),\n debug: z.boolean().optional(),\n }),\n});\n\n///similar items params schema\nexport const SimilarItemsParamsSchema = z.object({\n itemId: z.string().min(1, \"item id required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n limit: z.number().int().positive().max(1000).optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///search by image params schema\nexport const SearchByImageParamsSchema = z.object({\n image: z.string().min(1, \"image required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n query: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///search by vector params schema\nexport const SearchByVectorParamsSchema = z.object({\n vector: z.array(z.number()).min(1, \"vector must have at least 1 dimension\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z.object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n }).optional(),\n});\n\n///put event params schema\nexport const PutEventParamsSchema = z.object({\n data: EventSchema,\n options: z.object({\n notrace: z.boolean().optional(),\n }).optional(),\n});\n\n/**\n * zod schema for batch event validation\n *\n * validates event batch requests. enforces max batch size of 500 events and\n * validates each individual event in the batch. automatically validated when\n * calling putEventBatch().\n *\n * **validation rules:**\n * - events: must be non-empty array, max 500 events\n * - each event: must pass EventSchema validation\n */\nexport const PutEventBatchParamsSchema = z.object({\n events: z.array(EventSchema).max(500, \"max 500 events per batch\"),\n options: z.object({\n notrace: z.boolean().optional(),\n }).optional(),\n});\n\n///feedback params schema\nexport const FeedbackParamsSchema = z.object({\n modelUuid: z.string().optional(),\n predictionUuid: z.string().min(1, \"prediction uuid required\"),\n value: z.record(z.string(), z.any()),\n});\n\n///infer types from schemas for runtime type checking\nexport type Event = z.infer<typeof EventSchema>;\nexport type PredictionUnit = z.infer<typeof PredictionUnitSchema>;\nexport type PredictionPayload = z.infer<typeof PredictionPayloadSchema>;\nexport type CatalogAddProps = z.infer<typeof CatalogAddPropsSchema>;\nexport type ModelOption = z.infer<typeof ModelOptionSchema>;\nexport type ContentSelectionOptions = z.infer<typeof ContentSelectionOptionsSchema>;\nexport type FilterCondition = z.infer<typeof FilterConditionSchema>;\nexport type ContentSelectionFilter = z.infer<typeof ContentSelectionFilterSchema>;\nexport type ContentSelectionRequest = z.infer<typeof ContentSelectionRequestSchema>;\n","import { stringify } from \"csv-stringify/sync\";\n\ntype NestedObject = Record<string, unknown>;\n\ntype FlattenedObject = Record<string, unknown>;\n\n/**\n * flatten nested object structure\n *\n * converts nested objects into flat structure with underscore-separated keys.\n * handles arrays by joining with commas. used by catalogAdd to prepare data\n * for api ingestion.\n *\n * @param obj - object to flatten (can contain nested objects and arrays)\n * @returns flattened object with underscore-separated keys\n *\n * @example\n * ```typescript\n * const nested = {\n * name: \"Product\",\n * meta: { color: \"red\", size: \"large\" },\n * tags: [\"new\", \"sale\"]\n * };\n * const flat = flattenNested(nested);\n * // Result: { name: \"Product\", meta_color: \"red\", meta_size: \"large\", tags: \"new,sale\" }\n * ```\n */\nexport const flattenNested = (obj: NestedObject): FlattenedObject => {\n const result: FlattenedObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n if (Array.isArray(nestedValue)) {\n result[`${key}_${nestedKey}`] = nestedValue.join(\",\");\n } else if (typeof nestedValue === \"object\" && nestedValue !== null) {\n for (const [subKey, subValue] of Object.entries(nestedValue)) {\n result[`${nestedKey}_${subKey}`] = subValue;\n }\n } else {\n result[`${key}_${nestedKey}`] = nestedValue;\n }\n }\n } else if (Array.isArray(value)) {\n result[key] = value.join(\",\");\n } else {\n result[key] = value;\n }\n }\n\n return result;\n};\n\n/**\n * format row data for csv conversion\n *\n * internal helper that prepares a single row for csv export by flattening\n * and converting values to strings based on header order.\n *\n * @param rowHeaders - array of column headers\n * @param row - data row to format\n * @returns array of string values in header order\n * @private\n */\nconst preFormatRow = (rowHeaders: string[], row: Record<string, unknown>) => {\n const flattenedRow = flattenNested(row);\n return rowHeaders.map((header) => {\n const value = flattenedRow[header];\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return \"\";\n }\n\n // Handle objects (including arrays)\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // Convert to string for other types\n return String(value);\n });\n};\n\n/**\n * convert array of objects to csv format\n *\n * transforms data array into csv string with headers. automatically flattens nested\n * objects, handles nulls/undefined, and properly quotes strings. used by catalogCSVAdd\n * for bulk catalog uploads.\n *\n * @param data - array of objects to convert to csv\n * @returns csv string with headers and properly formatted rows\n *\n * @throws {Error} if data array is empty\n *\n * @example\n * ```typescript\n * const csv = bodyToCSV([\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]);\n * // Result: CSV string with headers and 2 data rows\n * ```\n */\nexport const bodyToCSV = (data: Record<string, unknown>[]) => {\n if (data.length === 0) {\n throw new Error(\"data is empty\");\n }\n\n const [row0] = data;\n if (!row0) {\n throw new Error(\"data is empty\");\n }\n\n const rowHeaders: string[] = Object.keys(flattenNested(row0));\n // Prepare data for csv-parse\n const csvData = [\n rowHeaders,\n ...data.map((row) => preFormatRow(rowHeaders, row)),\n ];\n\n return stringify(csvData, {\n delimiter: \",\",\n quote: true,\n quoted_string: true,\n header: false,\n }).trim();\n};\n","import * as Request from \"./request\";\nimport {\n CatalogAddPropsSchema,\n ContentSelectionRequestSchema,\n FeedbackParamsSchema,\n PredictionPayloadSchema,\n PutEventBatchParamsSchema,\n PutEventParamsSchema,\n RecommendationsParamsSchema,\n SearchByImageParamsSchema,\n SearchByVectorParamsSchema,\n SearchParamsSchema,\n SimilarItemsParamsSchema,\n} from \"./schemas\";\nimport type {\n CatalogAddProps,\n ContentSelectionFilter,\n ContentSelectionRequest,\n ContentSelectionResponse,\n DataPoint,\n Event,\n PredictionPayload,\n} from \"./type\";\nimport { bodyToCSV, flattenNested } from \"./utils\";\n\nexport type { ContentSelectionFilter, ContentSelectionRequest, ContentSelectionResponse, DataPoint, Event, PredictionPayload };\n\nconst hostDefault = \"https://app.usealbatross.ai/api\";\n\n/**\n * albatross sdk client for content selection, predictions, events, and catalog management\n *\n * main entry point for interacting with albatross apis. provides methods for search,\n * recommendations, predictions, event tracking, and catalog operations. handles\n * authentication, retries, and validates all inputs automatically.\n */\nclass Client {\n public token: string;\n public tenantId: string;\n public baseUrl: string;\n makeRequest: <A, B extends Record<string, unknown>>(\n inputs: Request.MakeRequestInputs<B>\n ) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n\n /**\n * create new albatross sdk client instance\n *\n * initializes client with authentication credentials and optional custom configurations.\n *\n * @param token - api authentication bearer token\n * @param tenantId - tenant/instance identifier (same value used for both auth header types)\n * @param baseUrl - api base url (default: https://app.usealbatross.ai/api)\n * @param options - optional client configuration\n * @param options.makeRequest - custom http request handler\n * @param options.predictionPreProcessing - hook to transform prediction payloads before sending\n *\n * @example\n * ```typescript\n * const client = new Client(\n * \"your-api-token\",\n * \"tenant-uuid-123\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // with custom base url\n * const client = new Client(\n * \"token\",\n * \"tenant-id\",\n * \"https://custom.api.com\"\n * );\n * ```\n */\n constructor(\n token: string,\n tenantId: string,\n baseUrl: string = hostDefault,\n options: Partial<{\n makeRequest: <A, B extends Record<string, unknown>>(\n inputs: Request.MakeRequestInputs<B>\n ) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n }> = {}\n ) {\n this.token = token;\n this.tenantId = tenantId;\n this.baseUrl = baseUrl;\n this.makeRequest = options.makeRequest || Request.makeRequest;\n this.predictionPreProcessing =\n options.predictionPreProcessing || ((data) => data);\n }\n\n /**\n * generate http headers based on endpoint type\n *\n * implements dual authentication strategy by sending different headers\n * depending on which service is being called.\n *\n * @param endpointType - \"robin\" for prediction/content-selection, \"catalog\" for events/catalog\n * @returns headers object with authentication and content-type\n * @private\n */\n private getHeaders(endpointType: \"robin\" | \"catalog\"): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n };\n\n if (endpointType === \"robin\") {\n headers[\"X-Tenant-Id\"] = this.tenantId;\n } else {\n ///catalog includes both catalog and events endpoints\n headers[\"x-instance-id\"] = this.tenantId;\n }\n\n return headers;\n }\n\n /**\n * validate base64 image size\n *\n * enforces 50mb size limit on images to prevent memory issues and ensure\n * reasonable api request sizes. checks base64 string length (not decoded size).\n *\n * @param base64Image - base64-encoded image string (with or without data url prefix)\n * @throws {Error} if image exceeds 50mb (52428800 bytes)\n * @private\n */\n private static validateImageSize(base64Image: string): void {\n const MAX_SIZE = 52_428_800; // 50mb\n if (base64Image.length > MAX_SIZE) {\n throw new Error(\n `image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`\n );\n }\n }\n\n /**\n * perform content selection (core method)\n *\n * low-level content selection method that all convenience methods use internally.\n * supports all search modes: text, image, vector, item similarity, user recommendations.\n * use specific convenience methods (search, searchByImage, etc.) for common use cases.\n *\n * @param request - content selection request configuration\n * @param request.use_case - use case identifier\n * @param request.context - optional context (user_id, session_id)\n * @param request.search - text search query (optional)\n * @param request.limit - max results (1-1000, default: varies by method)\n * @param request.filters - filter conditions to apply\n * @param request.options - search options (models, embeddings, item_id, image, etc.)\n * @param request.debug - enable debug info in response\n *\n * @returns promise resolving to search results with items, metadata, and optional debug info\n *\n * @throws {ZodError} if request validation fails\n * @throws {Error} if image in options exceeds 50mb\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.contentSelection({\n * use_case: \"product-search\",\n * search: \"red shoes\",\n * limit: 20\n * });\n * ```\n */\n async contentSelection(\n request: ContentSelectionRequest\n ): Promise<ContentSelectionResponse> {\n ///validate request\n ContentSelectionRequestSchema.parse(request);\n\n ///validate image size if provided\n if (request.options?.image) {\n Client.validateImageSize(request.options.image);\n }\n\n const url = `${this.baseUrl}/prediction/content-selection`;\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data: request,\n headers: this.getHeaders(\"robin\"),\n });\n }\n\n /**\n * perform text-based content search\n *\n * searches content using semantic text matching. ideal for product search,\n * document retrieval, or any text-based similarity search. supports filtering,\n * pagination, and performance tuning.\n *\n * @param query - search query text\n * @param useCase - use case identifier for search\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: varies)\n * @param options.filters - filter conditions to apply (use FilterBuilder to create)\n * @param options.hnsw_ef - hnsw search parameter for speed/accuracy tradeoff (higher = more accurate but slower)\n * @param options.with_payload - include item metadata in results (default: false)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to search results with matching items and metadata\n *\n * @throws {ZodError} if query is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * limit: 20,\n * filters: new FilterBuilder().match(\"category\", \"footwear\").build()\n * });\n * ```\n */\n async search(\n query: string,\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n hnsw_ef?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchParamsSchema.parse({ query, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n search: query,\n limit: options?.limit,\n filters: options?.filters,\n options: {\n hnsw_ef: options?.hnsw_ef,\n with_payload: options?.with_payload,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get personalized recommendations for user\n *\n * retrieves content recommendations based on user behavior and action history.\n * can use user_id/session_id context or action sequence.\n *\n * @param useCase - use case identifier\n * @param params - recommendation parameters\n * @param params.user_id - user identifier (optional, pairs with session_id)\n * @param params.session_id - session identifier (optional, pairs with user_id)\n * @param params.action_sequence - array of item ids representing user actions (optional)\n * @param params.limit - max results to return (1-1000, default: 100)\n * @param params.filters - filter conditions to apply\n * @param params.with_payload - include item metadata in results (default: true)\n * @param params.with_vectors - include embedding vectors in results (default: true)\n * @param params.hnsw_ef - hnsw parameter (default: 256 when context provided, otherwise not set)\n * @param params.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to personalized recommendations\n *\n * @throws {ZodError} if useCase is empty or params are invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const recs = await client.getRecommendations(\"product-recs\", {\n * user_id: \"user-123\",\n * session_id: \"session-456\",\n * limit: 10\n * });\n * ```\n */\n async getRecommendations(\n useCase: string,\n params: {\n user_id?: string;\n session_id?: string;\n action_sequence?: string[];\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n hnsw_ef?: number;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n RecommendationsParamsSchema.parse({ useCase, params });\n\n const context =\n params.user_id && params.session_id\n ? { user_id: params.user_id, session_id: params.session_id }\n : undefined;\n\n return this.contentSelection({\n use_case: useCase,\n context,\n limit: params.limit || 100,\n filters: params.filters,\n options: {\n action_sequence: params.action_sequence,\n hnsw_ef: params.hnsw_ef || (context ? 256 : undefined),\n with_payload: params.with_payload ?? true,\n with_vectors: params.with_vectors ?? true,\n },\n debug: params.debug,\n });\n }\n\n /**\n * find similar items by item id\n *\n * retrieves items similar to a given item. ideal for \"similar products\",\n * \"you may also like\", or \"related items\" features.\n *\n * @param itemId - id of the reference item to find similarities for\n * @param useCase - use case identifier\n * @param options - optional configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to similar items\n *\n * @throws {ZodError} if itemId is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const similar = await client.getSimilarItems(\"product-123\", \"product-similarity\", {\n * limit: 5\n * });\n * ```\n */\n async getSimilarItems(\n itemId: string,\n useCase: string,\n options?: {\n limit?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SimilarItemsParamsSchema.parse({ itemId, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 10,\n options: {\n item_id: itemId,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by image (visual/multimodal search)\n *\n * searches content using image similarity or combined image+text (multimodal).\n * ideal for visual search, \"find similar products by photo\", or \"search by image\"\n * features. supports combining image with text query for multimodal search.\n *\n * @param image - base64-encoded image string (max 50mb)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.query - optional text query for multimodal search (image + text)\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.use_knn - use knn instead of hnsw for search (slower but potentially more accurate)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to visually similar items\n *\n * @throws {Error} if image exceeds 50mb\n * @throws {ZodError} if image is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.searchByImage(base64Image, \"visual-search\", {\n * limit: 10\n * });\n * ```\n */\n async searchByImage(\n image: string,\n useCase: string,\n options?: {\n query?: string;\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n use_knn?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByImageParamsSchema.parse({ image, useCase, options });\n\n Client.validateImageSize(image);\n\n return this.contentSelection({\n use_case: useCase,\n search: options?.query,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n image,\n with_payload: options?.with_payload ?? true,\n use_knn: options?.use_knn,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by embedding vector (direct vector similarity)\n *\n * searches content using a provided embedding vector. useful when you have\n * pre-computed embeddings or want direct control over the search vector.\n * bypasses text/image encoding and searches directly in vector space.\n *\n * @param vector - embedding vector (array of numbers, typically 64-1536 dimensions)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to items with similar embeddings\n *\n * @throws {ZodError} if vector is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3, ...]; // your pre-computed vector\n * const results = await client.searchByVector(embedding, \"vector-search\", {\n * limit: 15\n * });\n * ```\n */\n async searchByVector(\n vector: number[],\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByVectorParamsSchema.parse({ vector, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n user_embedding: vector,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get api version information\n *\n * retrieves current api version and build info. useful for debugging,\n * compatibility checking, or displaying version information.\n *\n * @returns promise resolving to version information object\n *\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const version = await client.getVersion();\n * console.log(`API version: ${version}`);\n * ```\n */\n async getVersion() {\n const url = `${this.baseUrl}/version`;\n return this.makeRequest({ url, headers: this.getHeaders(\"catalog\") });\n }\n\n /**\n * add items to catalog\n *\n * uploads items to the catalog for a specific entity type (e.g., products, articles).\n * automatically flattens nested objects unless formatData is set to false.\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to add to catalog\n * @param props.mainUnit - primary identifier field name (optional)\n * @param props.formatData - auto-flatten nested objects (default: true)\n *\n * @returns promise resolving when catalog add completes\n *\n * @throws {ZodError} if entity is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.catalogAdd({\n * entity: \"products\",\n * data: [\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]\n * });\n * ```\n */\n catalogAdd = async ({\n entity,\n data,\n mainUnit,\n formatData,\n }: CatalogAddProps) => {\n ///validate params\n CatalogAddPropsSchema.parse({ entity, data, mainUnit, formatData });\n\n const formattedData =\n formatData === undefined || formatData === true\n ? data.map(flattenNested)\n : data;\n\n return this.makeRequest({\n url: `${this.baseUrl}/catalog`,\n method: \"PUT\",\n data: { data: formattedData, entity, mainUnit },\n headers: this.getHeaders(\"catalog\"),\n });\n };\n\n /**\n * add items to catalog via csv format\n *\n * uploads items to catalog using csv format instead of json. more efficient for\n * large bulk uploads. converts data to csv automatically. does not use makeRequest\n * retry logic (uses raw fetch).\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to convert to csv and upload\n * @param props.mainUnit - primary identifier field name (optional)\n *\n * @returns promise resolving when catalog upload completes\n *\n * @throws {Error} if data is empty\n * @throws {Error} on fetch failures (no automatic retry for csv uploads)\n *\n * @example\n * ```typescript\n * await client.catalogCSVAdd({\n * entity: \"products\",\n * data: [{ id: \"1\", name: \"A\" }, { id: \"2\", name: \"B\" }],\n * mainUnit: \"id\"\n * });\n * ```\n */\n catalogCSVAdd = async ({\n entity,\n data,\n mainUnit,\n }: CatalogAddProps): Promise<{}> => {\n const queryParams: Record<string, string | undefined> = {\n entity,\n mainUnit,\n };\n const queryParamsString: string = Object.entries(queryParams)\n .filter((entry): entry is [string, string] => !!entry[1])\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n\n const path = \"/catalog/csv\";\n const url = `${this.baseUrl}${path}?${queryParamsString}`;\n\n const body: string = bodyToCSV(data);\n\n const r = await fetch(url, { headers: this.getHeaders(\"catalog\"), method: \"PUT\", body });\n\n return r.json() as Promise<{}>;\n };\n\n /**\n * send single event\n *\n * tracks user interactions. supports all event types.\n *\n * @param data - event data\n * @param data.eventType - event type name (e.g., \"click\", \"purchase\", \"view\")\n * @param data.payload - event-specific data (optional)\n * @param data.predictionId - associated prediction id (optional)\n * @param data.predictionIds - associated prediction ids (optional)\n * @param data.sessionId - session identifier (optional)\n * @param data.timestamp - event timestamp (optional, defaults to server time)\n * @param options - optional event configuration\n * @param options.notrace - skip storing event in analytics (default: false)\n *\n * @returns promise resolving when event is recorded\n *\n * @throws {ZodError} if eventType is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEvent({\n * eventType: \"click\",\n * payload: { item_id: \"product-123\" },\n * sessionId: \"session-456\"\n * });\n * ```\n */\n async putEvent(\n data: Event,\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventParamsSchema.parse({ data, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data,\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * send batch of events\n *\n * efficiently tracks multiple events in a single api call. ideal for bulk event\n * uploads, offline event syncing, or high-throughput event tracking. supports\n * up to 500 events per batch.\n *\n * @param events - array of events to send (max 500)\n * @param options - optional batch configuration\n * @param options.notrace - skip storing events in analytics (default: false)\n *\n * @returns promise resolving when all events are recorded\n *\n * @throws {ZodError} if events array is empty, exceeds 500 items, or contains invalid events\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEventBatch([\n * { eventType: \"view\", payload: { item_id: \"item-1\" } },\n * { eventType: \"click\", payload: { item_id: \"item-2\" } },\n * { eventType: \"purchase\", payload: { item_id: \"item-3\", price: 99.99 } }\n * ]);\n * ```\n */\n async putEventBatch(\n events: Event[],\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventBatchParamsSchema.parse({ events, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event/batch${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data: { events },\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * get content ranking prediction\n *\n * requests ranked ordering of content items based on context and user preferences.\n * used for personalized ranking, A/B testing, or contextual bandit scenarios.\n * returns ordered ranking with scores and associated datapoint.\n *\n * @param payload - prediction request payload\n * @param payload.useCase - use case configuration with uuid\n * @param payload.context - context features (user_id, session_id, etc.)\n * @param payload.actions - array of items to rank (item features)\n * @param payload.no_trace - skip storing prediction for analytics (default: false)\n *\n * @returns promise resolving to prediction with ordering, datapoint, and prediction id\n * @returns {object} result\n * @returns {object} result.ordering - item rankings (item_id -> rank)\n * @returns {DataPoint} result.datapoint - full prediction datapoint with scores and propensities\n * @returns {string} result.id - prediction uuid for feedback tracking\n *\n * @throws {ZodError} if useCase uuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const ranking = await client.ranking({\n * useCase: { uuid: \"ranking-use-case\" },\n * context: { user_id: \"user-123\" },\n * actions: [\n * { item_id: \"item-1\", category: \"electronics\" },\n * { item_id: \"item-2\", category: \"books\" }\n * ]\n * });\n * ```\n */\n ranking = async (\n payload: PredictionPayload\n ): Promise<{\n ordering: Record<string, number>;\n datapoint: DataPoint;\n id: string;\n }> => {\n ///validate params\n PredictionPayloadSchema.parse(payload);\n\n const url = `${this.baseUrl}/prediction/ranker`;\n\n const data = this.predictionPreProcessing(payload);\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data,\n headers: this.getHeaders(\"robin\"),\n });\n };\n\n /**\n * send feedback for prediction\n *\n * submits outcome feedback for a previous prediction.\n *\n * @param payload - feedback payload\n * @param payload.predictionUuid - id of the prediction to provide feedback for (from ranking() response)\n * @param payload.value - feedback data (e.g., { reward: 1 }, { clicked: true }, { rating: 4.5 })\n * @param payload.modelUuid - optional specific model uuid to send feedback to\n *\n * @returns promise resolving when feedback is recorded\n *\n * @throws {ZodError} if predictionUuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const pred = await client.ranking({...});\n * // later, after user interaction\n * await client.feedback({\n * predictionUuid: pred.id,\n * value: { clicked: true, purchased: false }\n * });\n * ```\n */\n feedback = async (payload: {\n modelUuid?: string;\n predictionUuid: string;\n value: Record<string, unknown>;\n }) => {\n ///validate params\n FeedbackParamsSchema.parse(payload);\n\n const url = `${this.baseUrl}/feedback`;\n\n return this.makeRequest({\n method: \"POST\",\n url: url,\n data: payload,\n headers: this.getHeaders(\"robin\"),\n });\n };\n}\n\nexport { Client };\n","import type { ContentSelectionFilter, FilterCondition } from \"./type\";\n\n/**\n * fluent builder for creating content selection filters\n *\n * provides chainable api for constructing complex filter conditions. supports\n * must (required), should (optional/or), and must_not (exclusion) filter types.\n * use with search(), getRecommendations(), and other content selection methods.\n *\n * filter types:\n * - must: all conditions must match (AND logic)\n * - should: at least one condition should match (OR logic)\n * - must_not: conditions must not match (NOT logic)\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"electronics\")\n * .range(\"price\", { gte: 100, lte: 500 })\n * .match(\"out_of_stock\", false, \"must_not\")\n * .build();\n * ```\n */\nexport class FilterBuilder {\n private must: FilterCondition[] = [];\n private should: FilterCondition[] = [];\n private must_not: FilterCondition[] = [];\n\n /**\n * add exact match filter condition\n *\n * filters items where field exactly matches the specified value.\n * supports string, number, and boolean values.\n *\n * @param field - field name to filter on\n * @param value - value to match (string | number | boolean)\n * @param type - filter type: \"must\" (required), \"should\" (optional), or \"must_not\" (exclude). default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // required match\n * builder.match(\"category\", \"electronics\");\n *\n * // optional match (or condition)\n * builder.match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\");\n *\n * // exclusion\n * builder.match(\"status\", \"deleted\", \"must_not\");\n * ```\n */\n match(\n field: string,\n value: string | number | boolean,\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Match\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add numeric range filter condition\n *\n * filters items where numeric field falls within specified range.\n * supports gte (>=), lte (<=), gt (>), and lt (<) operators.\n *\n * @param field - numeric field name to filter on\n * @param value - range specification with operators\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // price between 100 and 500\n * builder.range(\"price\", { gte: 100, lte: 500 });\n *\n * // rating above 4\n * builder.range(\"rating\", { gt: 4 });\n *\n * // exclude expensive items\n * builder.range(\"price\", { gte: 1000 }, \"must_not\");\n * ```\n */\n range(\n field: string,\n value: { gte?: number; lte?: number; gt?: number; lt?: number },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Range\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add datetime range filter condition\n *\n * filters items where datetime field falls within specified range.\n * values should be RFC 3339 formatted strings (e.g., \"2025-12-15T00:00:00Z\").\n *\n * @param field - datetime field name to filter on\n * @param value - range specification with operators (RFC 3339 strings)\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // events between two dates\n * builder.datetimeRange(\"start_date\", {\n * gte: \"2025-12-15T00:00:00Z\",\n * lte: \"2025-12-31T23:59:59Z\"\n * });\n *\n * // events after a specific date\n * builder.datetimeRange(\"created_at\", { gt: \"2025-01-01T00:00:00Z\" });\n * ```\n */\n datetimeRange(\n field: string,\n value: { gte?: string; lte?: string; gt?: string; lt?: string },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"DatetimeRange\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add geo-radius filter condition\n *\n * filters items where geo-location field falls within specified radius\n * from a center point. useful for location-based filtering.\n *\n * @param field - geo-location field name\n * @param lat - latitude of center point (degrees, -90 to 90)\n * @param lon - longitude of center point (degrees, -180 to 180)\n * @param radius - search radius in meters\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // items within 5km of new york city\n * builder.geoRadius(\"location\", 40.7128, -74.0060, 5000);\n *\n * // exclude items near specific location\n * builder.geoRadius(\"warehouse\", 37.7749, -122.4194, 10000, \"must_not\");\n * ```\n */\n geoRadius(\n field: string,\n lat: number,\n lon: number,\n radius: number,\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"GeoRadius\", value: { lat, lon, radius } },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * build final filter object\n *\n * constructs the complete filter object from all added conditions.\n * call this method last after chaining all filter methods.\n *\n * @returns content selection filter ready to use with client methods\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"clothing\")\n * .range(\"price\", { gte: 20, lte: 100 })\n * .match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\")\n * .build();\n *\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * filters: filter\n * });\n * ```\n */\n build(): ContentSelectionFilter {\n const filter: ContentSelectionFilter = {};\n\n if (this.must.length > 0) {\n filter.must = this.must;\n }\n if (this.should.length > 0) {\n filter.should = this.should;\n }\n if (this.must_not.length > 0) {\n filter.must_not = this.must_not;\n }\n\n return filter;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/request.ts","../src/schemas.ts","../src/utils.ts","../src/client.ts","../src/filters.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** maximum number of retry attempts for failed requests */\nconst MAX_RETRIES = 3;\n/** base delay in milliseconds for exponential backoff (1s) */\nconst BASE_DELAY_MS = 1000;\n/** request timeout in milliseconds (30s) */\nconst REQUEST_TIMEOUT_MS = 30_000;\n\n/**\n * check if http status code is retryable\n *\n * determines whether a request should be retried based on status code.\n * server errors (5xx) are retryable, client errors (4xx) are not.\n *\n * @param status - http status code\n * @returns true if status is 500-599 (server error), false otherwise\n */\nconst isRetryableError = (status: number): boolean => status >= 500 && status <= 599; // 5xx server errors\n\n/**\n * calculate exponential backoff delay\n *\n * computes retry delay using exponential backoff strategy.\n * delays: attempt 0 = 1s, attempt 1 = 2s, attempt 2 = 4s\n *\n * @param attempt - current retry attempt number (0-indexed)\n * @returns delay in milliseconds (2^attempt * 1000)\n */\nconst getRetryDelay = (attempt: number): number => 2 ** attempt * BASE_DELAY_MS;\n\n/**\n * make http request with automatic retry logic and timeout handling\n *\n * resilient http request function with built-in retry logic, exponential backoff,\n * and timeout protection. automatically retries transient failures (5xx errors,\n * network issues, timeouts) up to 3 times. does not retry client errors (4xx).\n *\n * **retry behavior:**\n * - max retries: 3 (4 total attempts)\n * - backoff delays: 1s, 2s, 4s\n * - timeout per attempt: 30s\n * - retries on: 500-599 status codes, network errors, timeouts\n * - no retry on: 400-499 status codes\n *\n * **error messages:**\n * - 4xx errors: `Request failed: {status} {statusText} {body}`\n * - 5xx after retries: `Request failed after 3 retries: {status} {statusText} {body}`\n * - timeout: `Request timeout after 30000ms (3 retries)`\n * - network: `Network error after 3 retries: {message}`\n *\n * @param inputs - request configuration object\n * @param inputs.url - full url to request\n * @param inputs.method - http method (default: \"GET\")\n * @param inputs.data - request body data (auto-serialized to json)\n * @param inputs.headers - http headers to send\n *\n * @returns promise resolving to parsed json response (type A)\n *\n * @throws {Error} immediately on 4xx client errors (no retry)\n * @throws {Error} after 3 retries on persistent 5xx errors\n * @throws {Error} after 3 retries on persistent network errors\n * @throws {Error} after 3 retries on persistent timeouts\n *\n * @example\n * ```typescript\n * const response = await makeRequest({\n * url: \"https://api.example.com/data\",\n * method: \"POST\",\n * data: { key: \"value\" },\n * headers: { \"Authorization\": \"Bearer token\" }\n * });\n * ```\n */\nexport const makeRequest = async <A, B extends Record<string, unknown>>({\n url,\n method = \"GET\",\n data,\n headers,\n}: MakeRequestInputs<B>): Promise<A> => {\n const body = data ? JSON.stringify(data) : undefined;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method,\n body,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n const error = new Error(`Request failed: ${response.status} ${response.statusText} ${errorText}`);\n\n ///don't retry client errors (4xx)\n if (!isRetryableError(response.status)) {\n throw error;\n }\n\n ///retry server errors (5xx) if attempts remain\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));\n continue; ///retry\n }\n\n ///final attempt failed\n throw new Error(\n `Request failed after ${MAX_RETRIES} retries: ${response.status} ${response.statusText} ${errorText}`,\n { cause: error }\n );\n }\n\n ///success\n return response.json() as Promise<A>;\n } catch (error) {\n clearTimeout(timeoutId);\n\n ///re-throw non-retryable errors immediately\n if (error instanceof Error) {\n ///non-retryable errors from response handling\n if (error.message.startsWith(\"Request failed:\") && !error.message.includes(\"retries\")) {\n throw error;\n }\n\n ///abort controller timeout\n if (error.name === \"AbortError\") {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));\n continue; ///retry on timeout\n }\n throw new Error(`Request timeout after ${REQUEST_TIMEOUT_MS}ms (${MAX_RETRIES} retries)`, { cause: error });\n }\n\n ///network errors (dns, connection refused, etc.)\n if (\n error.message.includes(\"fetch\") ||\n error.message.includes(\"network\") ||\n error.message.includes(\"Failed to fetch\")\n ) {\n if (attempt < MAX_RETRIES) {\n lastError = error;\n await new Promise((resolve) => setTimeout(resolve, getRetryDelay(attempt)));\n continue; ///retry on network error\n }\n throw new Error(`Network error after ${MAX_RETRIES} retries: ${error.message}`, { cause: error });\n }\n }\n\n ///re-throw unknown errors\n throw error;\n }\n }\n\n ///should never reach here, but typescript needs it\n throw lastError || new Error(\"Unexpected error in makeRequest\");\n};\n\n/**\n * http request input parameters\n *\n * configuration object for makeRequest function. supports generic data type\n * for request body to maintain type safety.\n */\nexport type MakeRequestInputs<B extends Record<string, unknown>> = {\n /** full url to request */\n url: string;\n /** http method (GET, POST, PUT, DELETE, etc.) */\n method?: string;\n /** request body data (will be json-stringified) */\n data?: B;\n /** http headers object */\n headers: Record<string, string>;\n};\n","import { z } from \"zod\";\n\n/**\n * zod schema for event validation\n *\n * validates event structure before sending to api. ensures eventType is non-empty.\n * automatically validated when calling putEvent() or putEventBatch().\n */\nexport const EventSchema = z.object({\n eventType: z.string().min(1, \"event type required\"),\n payload: z.record(z.string(), z.any()).optional(),\n predictionIds: z.array(z.string()).optional(),\n predictionId: z.string().optional(),\n timestamp: z.string().optional(),\n sessionId: z.union([z.string(), z.number()]).optional(),\n units: z.record(z.string(), z.string()).optional(),\n value: z.string().optional(),\n});\n\n///prediction unit schema\nexport const PredictionUnitSchema = z.record(z.string(), z.string());\n\n/**\n * zod schema for prediction payload validation\n *\n * validates prediction request structure. ensures useCase uuid is non-empty and\n * actions array is provided. automatically validated when calling ranking().\n */\nexport const PredictionPayloadSchema = z.object({\n useCase: z.object({\n uuid: z.string().min(1, \"use case uuid required\"),\n }),\n context: PredictionUnitSchema,\n actions: z.array(PredictionUnitSchema),\n no_trace: z.boolean().optional(),\n});\n\n///catalog add schema\nexport const CatalogAddPropsSchema = z.object({\n entity: z.string().min(1, \"entity required\"),\n data: z.array(z.record(z.string(), z.any())),\n mainUnit: z.string().optional(),\n formatData: z.boolean().optional(),\n});\n\n///model option schema\nexport const ModelOptionSchema = z.object({\n id: z.string().min(1, \"model id required\"),\n instance_id: z.string().optional(),\n});\n\n///content selection options schema\nexport const ContentSelectionOptionsSchema = z.object({\n retriever_model: ModelOptionSchema.optional(),\n embedder_model: ModelOptionSchema.optional(),\n ranker_model: ModelOptionSchema.optional(),\n user_embedding: z.array(z.number()).optional(),\n action_sequence: z.array(z.string()).optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_vectors: z.boolean().optional(),\n with_payload: z.union([z.boolean(), z.array(z.string())]).optional(),\n use_faiss: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n item_id: z.string().optional(),\n image: z.string().optional(),\n});\n\n///filter condition schema\nexport const FilterConditionSchema = z.object({\n field: z.string().min(1, \"filter field required\"),\n condition: z.union([\n z.object({\n type: z.literal(\"Match\"),\n value: z.union([z.string(), z.number(), z.boolean()]),\n }),\n z.object({\n type: z.literal(\"Range\"),\n value: z.object({\n gte: z.number().optional(),\n lte: z.number().optional(),\n gt: z.number().optional(),\n lt: z.number().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"DatetimeRange\"),\n value: z.object({\n gte: z.string().optional(),\n lte: z.string().optional(),\n gt: z.string().optional(),\n lt: z.string().optional(),\n }),\n }),\n z.object({\n type: z.literal(\"GeoRadius\"),\n value: z.object({\n lat: z.number(),\n lon: z.number(),\n radius: z.number().positive(),\n }),\n }),\n ]),\n});\n\n///content selection filter schema\nexport const ContentSelectionFilterSchema = z.object({\n must: z.array(FilterConditionSchema).optional(),\n should: z.array(FilterConditionSchema).optional(),\n must_not: z.array(FilterConditionSchema).optional(),\n});\n\n/**\n * zod schema for content selection request validation\n *\n * validates search request structure. ensures use_case is non-empty and limit\n * is within bounds (1-1000). automatically validated when calling contentSelection()\n * and all convenience methods.\n *\n * **validation rules:**\n * - use_case: must be non-empty string\n * - limit: must be positive integer, max 1000\n * - filters: must match ContentSelectionFilterSchema structure\n */\nexport const ContentSelectionRequestSchema = z.object({\n use_case: z.string().min(1, \"use case required\"),\n context: z.record(z.string(), z.string()).optional(),\n search: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n options: ContentSelectionOptionsSchema.optional(),\n debug: z.boolean().optional(),\n});\n\n///search method params schema\nexport const SearchParamsSchema = z.object({\n query: z.string(),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n hnsw_ef: z.number().int().positive().optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///recommendations params schema\nexport const RecommendationsParamsSchema = z.object({\n useCase: z.string().min(1, \"use case required\"),\n params: z.object({\n user_id: z.string().optional(),\n session_id: z.string().optional(),\n action_sequence: z.array(z.string()).optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n hnsw_ef: z.number().int().positive().optional(),\n debug: z.boolean().optional(),\n }),\n});\n\n///similar items params schema\nexport const SimilarItemsParamsSchema = z.object({\n itemId: z.string().min(1, \"item id required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n limit: z.number().int().positive().max(1000).optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///search by image params schema\nexport const SearchByImageParamsSchema = z.object({\n image: z.string().min(1, \"image required\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n query: z.string().optional(),\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n use_knn: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///search by vector params schema\nexport const SearchByVectorParamsSchema = z.object({\n vector: z.array(z.number()).min(1, \"vector must have at least 1 dimension\"),\n useCase: z.string().min(1, \"use case required\"),\n options: z\n .object({\n limit: z.number().int().positive().max(1000).optional(),\n filters: ContentSelectionFilterSchema.optional(),\n with_payload: z.boolean().optional(),\n with_vectors: z.boolean().optional(),\n debug: z.boolean().optional(),\n })\n .optional(),\n});\n\n///put event params schema\nexport const PutEventParamsSchema = z.object({\n data: EventSchema,\n options: z\n .object({\n notrace: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * zod schema for batch event validation\n *\n * validates event batch requests. enforces max batch size of 500 events and\n * validates each individual event in the batch. automatically validated when\n * calling putEventBatch().\n *\n * **validation rules:**\n * - events: must be non-empty array, max 500 events\n * - each event: must pass EventSchema validation\n */\nexport const PutEventBatchParamsSchema = z.object({\n events: z.array(EventSchema).max(500, \"max 500 events per batch\"),\n options: z\n .object({\n notrace: z.boolean().optional(),\n })\n .optional(),\n});\n\n///feedback params schema\nexport const FeedbackParamsSchema = z.object({\n modelUuid: z.string().optional(),\n predictionUuid: z.string().min(1, \"prediction uuid required\"),\n value: z.record(z.string(), z.any()),\n});\n\n///infer types from schemas for runtime type checking\nexport type Event = z.infer<typeof EventSchema>;\nexport type PredictionUnit = z.infer<typeof PredictionUnitSchema>;\nexport type PredictionPayload = z.infer<typeof PredictionPayloadSchema>;\nexport type CatalogAddProps = z.infer<typeof CatalogAddPropsSchema>;\nexport type ModelOption = z.infer<typeof ModelOptionSchema>;\nexport type ContentSelectionOptions = z.infer<typeof ContentSelectionOptionsSchema>;\nexport type FilterCondition = z.infer<typeof FilterConditionSchema>;\nexport type ContentSelectionFilter = z.infer<typeof ContentSelectionFilterSchema>;\nexport type ContentSelectionRequest = z.infer<typeof ContentSelectionRequestSchema>;\n","import { stringify } from \"csv-stringify/sync\";\n\ntype NestedObject = Record<string, unknown>;\n\ntype FlattenedObject = Record<string, unknown>;\n\n/**\n * flatten nested object structure\n *\n * converts nested objects into flat structure with underscore-separated keys.\n * handles arrays by joining with commas. used by catalogAdd to prepare data\n * for api ingestion.\n *\n * @param obj - object to flatten (can contain nested objects and arrays)\n * @returns flattened object with underscore-separated keys\n *\n * @example\n * ```typescript\n * const nested = {\n * name: \"Product\",\n * meta: { color: \"red\", size: \"large\" },\n * tags: [\"new\", \"sale\"]\n * };\n * const flat = flattenNested(nested);\n * // Result: { name: \"Product\", meta_color: \"red\", meta_size: \"large\", tags: \"new,sale\" }\n * ```\n */\nexport const flattenNested = (obj: NestedObject): FlattenedObject => {\n const result: FlattenedObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n if (Array.isArray(nestedValue)) {\n result[`${key}_${nestedKey}`] = nestedValue.join(\",\");\n } else if (typeof nestedValue === \"object\" && nestedValue !== null) {\n for (const [subKey, subValue] of Object.entries(nestedValue)) {\n result[`${nestedKey}_${subKey}`] = subValue;\n }\n } else {\n result[`${key}_${nestedKey}`] = nestedValue;\n }\n }\n } else if (Array.isArray(value)) {\n result[key] = value.join(\",\");\n } else {\n result[key] = value;\n }\n }\n\n return result;\n};\n\n/**\n * format row data for csv conversion\n *\n * internal helper that prepares a single row for csv export by flattening\n * and converting values to strings based on header order.\n *\n * @param rowHeaders - array of column headers\n * @param row - data row to format\n * @returns array of string values in header order\n * @private\n */\nconst preFormatRow = (rowHeaders: string[], row: Record<string, unknown>) => {\n const flattenedRow = flattenNested(row);\n return rowHeaders.map((header) => {\n const value = flattenedRow[header];\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return \"\";\n }\n\n // Handle objects (including arrays)\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n\n // Convert to string for other types\n return String(value);\n });\n};\n\n/**\n * convert array of objects to csv format\n *\n * transforms data array into csv string with headers. automatically flattens nested\n * objects, handles nulls/undefined, and properly quotes strings. used by catalogCSVAdd\n * for bulk catalog uploads.\n *\n * @param data - array of objects to convert to csv\n * @returns csv string with headers and properly formatted rows\n *\n * @throws {Error} if data array is empty\n *\n * @example\n * ```typescript\n * const csv = bodyToCSV([\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]);\n * // Result: CSV string with headers and 2 data rows\n * ```\n */\nexport const bodyToCSV = (data: Record<string, unknown>[]) => {\n if (data.length === 0) {\n throw new Error(\"data is empty\");\n }\n\n const [row0] = data;\n if (!row0) {\n throw new Error(\"data is empty\");\n }\n\n const rowHeaders: string[] = Object.keys(flattenNested(row0));\n // Prepare data for csv-parse\n const csvData = [rowHeaders, ...data.map((row) => preFormatRow(rowHeaders, row))];\n\n return stringify(csvData, {\n delimiter: \",\",\n quote: true,\n quoted_string: true,\n header: false,\n }).trim();\n};\n","import * as Request from \"./request\";\nimport {\n CatalogAddPropsSchema,\n ContentSelectionRequestSchema,\n FeedbackParamsSchema,\n PredictionPayloadSchema,\n PutEventBatchParamsSchema,\n PutEventParamsSchema,\n RecommendationsParamsSchema,\n SearchByImageParamsSchema,\n SearchByVectorParamsSchema,\n SearchParamsSchema,\n SimilarItemsParamsSchema,\n} from \"./schemas\";\nimport type {\n CatalogAddProps,\n ContentSelectionFilter,\n ContentSelectionRequest,\n ContentSelectionResponse,\n DataPoint,\n Event,\n PredictionPayload,\n} from \"./type\";\nimport { bodyToCSV, flattenNested } from \"./utils\";\n\nexport type {\n ContentSelectionFilter,\n ContentSelectionRequest,\n ContentSelectionResponse,\n DataPoint,\n Event,\n PredictionPayload,\n};\n\nconst hostDefault = \"https://app.usealbatross.ai/api\";\n\n/**\n * albatross sdk client for content selection, predictions, events, and catalog management\n *\n * main entry point for interacting with albatross apis. provides methods for search,\n * recommendations, predictions, event tracking, and catalog operations. handles\n * authentication, retries, and validates all inputs automatically.\n */\nclass Client {\n public token: string;\n public tenantId: string;\n public baseUrl: string;\n makeRequest: <A, B extends Record<string, unknown>>(inputs: Request.MakeRequestInputs<B>) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n\n /**\n * create new albatross sdk client instance\n *\n * initializes client with authentication credentials and optional custom configurations.\n *\n * @param token - api authentication bearer token\n * @param tenantId - tenant/instance identifier (same value used for both auth header types)\n * @param baseUrl - api base url (default: https://app.usealbatross.ai/api)\n * @param options - optional client configuration\n * @param options.makeRequest - custom http request handler\n * @param options.predictionPreProcessing - hook to transform prediction payloads before sending\n *\n * @example\n * ```typescript\n * const client = new Client(\n * \"your-api-token\",\n * \"tenant-uuid-123\"\n * );\n * ```\n *\n * @example\n * ```typescript\n * // with custom base url\n * const client = new Client(\n * \"token\",\n * \"tenant-id\",\n * \"https://custom.api.com\"\n * );\n * ```\n */\n constructor(\n token: string,\n tenantId: string,\n baseUrl: string = hostDefault,\n options: Partial<{\n makeRequest: <A, B extends Record<string, unknown>>(inputs: Request.MakeRequestInputs<B>) => Promise<A>;\n predictionPreProcessing: (data: PredictionPayload) => PredictionPayload;\n }> = {}\n ) {\n this.token = token;\n this.tenantId = tenantId;\n this.baseUrl = baseUrl;\n this.makeRequest = options.makeRequest || Request.makeRequest;\n this.predictionPreProcessing = options.predictionPreProcessing || ((data) => data);\n }\n\n /**\n * generate http headers based on endpoint type\n *\n * implements dual authentication strategy by sending different headers\n * depending on which service is being called.\n *\n * @param endpointType - \"robin\" for prediction/content-selection, \"catalog\" for events/catalog\n * @returns headers object with authentication and content-type\n * @private\n */\n private getHeaders(endpointType: \"robin\" | \"catalog\"): Record<string, string> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n };\n\n if (endpointType === \"robin\") {\n headers[\"X-Tenant-Id\"] = this.tenantId;\n } else {\n ///catalog includes both catalog and events endpoints\n headers[\"x-instance-id\"] = this.tenantId;\n }\n\n return headers;\n }\n\n /**\n * validate base64 image size\n *\n * enforces 50mb size limit on images to prevent memory issues and ensure\n * reasonable api request sizes. checks base64 string length (not decoded size).\n *\n * @param base64Image - base64-encoded image string (with or without data url prefix)\n * @throws {Error} if image exceeds 50mb (52428800 bytes)\n * @private\n */\n private static validateImageSize(base64Image: string): void {\n const MAX_SIZE = 52_428_800; // 50mb\n if (base64Image.length > MAX_SIZE) {\n throw new Error(`image size (${base64Image.length} bytes) exceeds maximum (${MAX_SIZE} bytes)`);\n }\n }\n\n /**\n * perform content selection (core method)\n *\n * low-level content selection method that all convenience methods use internally.\n * supports all search modes: text, image, vector, item similarity, user recommendations.\n * use specific convenience methods (search, searchByImage, etc.) for common use cases.\n *\n * @param request - content selection request configuration\n * @param request.use_case - use case identifier\n * @param request.context - optional context (user_id, session_id)\n * @param request.search - text search query (optional)\n * @param request.limit - max results (1-1000, default: varies by method)\n * @param request.filters - filter conditions to apply\n * @param request.options - search options (models, embeddings, item_id, image, etc.)\n * @param request.debug - enable debug info in response\n *\n * @returns promise resolving to search results with items, metadata, and optional debug info\n *\n * @throws {ZodError} if request validation fails\n * @throws {Error} if image in options exceeds 50mb\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.contentSelection({\n * use_case: \"product-search\",\n * search: \"red shoes\",\n * limit: 20\n * });\n * ```\n */\n async contentSelection(request: ContentSelectionRequest): Promise<ContentSelectionResponse> {\n ///validate request\n ContentSelectionRequestSchema.parse(request);\n\n ///validate image size if provided\n if (request.options?.image) {\n Client.validateImageSize(request.options.image);\n }\n\n const url = `${this.baseUrl}/prediction/content-selection`;\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data: request,\n headers: this.getHeaders(\"robin\"),\n });\n }\n\n /**\n * perform text-based content search\n *\n * searches content using semantic text matching. ideal for product search,\n * document retrieval, or any text-based similarity search. supports filtering,\n * pagination, and performance tuning.\n *\n * @param query - search query text\n * @param useCase - use case identifier for search\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: varies)\n * @param options.filters - filter conditions to apply (use FilterBuilder to create)\n * @param options.hnsw_ef - hnsw search parameter for speed/accuracy tradeoff (higher = more accurate but slower)\n * @param options.with_payload - include item metadata in results (default: false)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to search results with matching items and metadata\n *\n * @throws {ZodError} if query is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * limit: 20,\n * filters: new FilterBuilder().match(\"category\", \"footwear\").build()\n * });\n * ```\n */\n async search(\n query: string,\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n hnsw_ef?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchParamsSchema.parse({ query, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n search: query,\n limit: options?.limit,\n filters: options?.filters,\n options: {\n hnsw_ef: options?.hnsw_ef,\n with_payload: options?.with_payload,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get personalized recommendations for user\n *\n * retrieves content recommendations based on user behavior and action history.\n * can use user_id/session_id context or action sequence.\n *\n * @param useCase - use case identifier\n * @param params - recommendation parameters\n * @param params.user_id - user identifier (optional, pairs with session_id)\n * @param params.session_id - session identifier (optional, pairs with user_id)\n * @param params.action_sequence - array of item ids representing user actions (optional)\n * @param params.limit - max results to return (1-1000, default: 100)\n * @param params.filters - filter conditions to apply\n * @param params.with_payload - include item metadata in results (default: true)\n * @param params.with_vectors - include embedding vectors in results (default: true)\n * @param params.hnsw_ef - hnsw parameter (default: 256 when context provided, otherwise not set)\n * @param params.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to personalized recommendations\n *\n * @throws {ZodError} if useCase is empty or params are invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const recs = await client.getRecommendations(\"product-recs\", {\n * user_id: \"user-123\",\n * session_id: \"session-456\",\n * limit: 10\n * });\n * ```\n */\n async getRecommendations(\n useCase: string,\n params: {\n user_id?: string;\n session_id?: string;\n action_sequence?: string[];\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n hnsw_ef?: number;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n RecommendationsParamsSchema.parse({ useCase, params });\n\n const context =\n params.user_id && params.session_id ? { user_id: params.user_id, session_id: params.session_id } : undefined;\n\n return this.contentSelection({\n use_case: useCase,\n context,\n limit: params.limit || 100,\n filters: params.filters,\n options: {\n action_sequence: params.action_sequence,\n hnsw_ef: params.hnsw_ef || (context ? 256 : undefined),\n with_payload: params.with_payload ?? true,\n with_vectors: params.with_vectors ?? true,\n },\n debug: params.debug,\n });\n }\n\n /**\n * find similar items by item id\n *\n * retrieves items similar to a given item. ideal for \"similar products\",\n * \"you may also like\", or \"related items\" features.\n *\n * @param itemId - id of the reference item to find similarities for\n * @param useCase - use case identifier\n * @param options - optional configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to similar items\n *\n * @throws {ZodError} if itemId is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const similar = await client.getSimilarItems(\"product-123\", \"product-similarity\", {\n * limit: 5\n * });\n * ```\n */\n async getSimilarItems(\n itemId: string,\n useCase: string,\n options?: {\n limit?: number;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SimilarItemsParamsSchema.parse({ itemId, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 10,\n options: {\n item_id: itemId,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by image (visual/multimodal search)\n *\n * searches content using image similarity or combined image+text (multimodal).\n * ideal for visual search, \"find similar products by photo\", or \"search by image\"\n * features. supports combining image with text query for multimodal search.\n *\n * @param image - base64-encoded image string (max 50mb)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.query - optional text query for multimodal search (image + text)\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.use_knn - use knn instead of hnsw for search (slower but potentially more accurate)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to visually similar items\n *\n * @throws {Error} if image exceeds 50mb\n * @throws {ZodError} if image is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const results = await client.searchByImage(base64Image, \"visual-search\", {\n * limit: 10\n * });\n * ```\n */\n async searchByImage(\n image: string,\n useCase: string,\n options?: {\n query?: string;\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n use_knn?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByImageParamsSchema.parse({ image, useCase, options });\n\n Client.validateImageSize(image);\n\n return this.contentSelection({\n use_case: useCase,\n search: options?.query,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n image,\n with_payload: options?.with_payload ?? true,\n use_knn: options?.use_knn,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * search by embedding vector (direct vector similarity)\n *\n * searches content using a provided embedding vector. useful when you have\n * pre-computed embeddings or want direct control over the search vector.\n * bypasses text/image encoding and searches directly in vector space.\n *\n * @param vector - embedding vector (array of numbers, typically 64-1536 dimensions)\n * @param useCase - use case identifier\n * @param options - optional search configuration\n * @param options.limit - max results to return (1-1000, default: 100)\n * @param options.filters - filter conditions to apply\n * @param options.with_payload - include item metadata in results (default: true)\n * @param options.with_vectors - include embedding vectors in results (default: false)\n * @param options.debug - enable debug info in response (default: false)\n *\n * @returns promise resolving to items with similar embeddings\n *\n * @throws {ZodError} if vector is empty or useCase is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3, ...]; // your pre-computed vector\n * const results = await client.searchByVector(embedding, \"vector-search\", {\n * limit: 15\n * });\n * ```\n */\n async searchByVector(\n vector: number[],\n useCase: string,\n options?: {\n limit?: number;\n filters?: ContentSelectionFilter;\n with_payload?: boolean;\n with_vectors?: boolean;\n debug?: boolean;\n }\n ): Promise<ContentSelectionResponse> {\n ///validate params\n SearchByVectorParamsSchema.parse({ vector, useCase, options });\n\n return this.contentSelection({\n use_case: useCase,\n limit: options?.limit || 20,\n filters: options?.filters,\n options: {\n user_embedding: vector,\n with_payload: options?.with_payload ?? true,\n with_vectors: options?.with_vectors,\n },\n debug: options?.debug,\n });\n }\n\n /**\n * get api version information\n *\n * retrieves current api version and build info. useful for debugging,\n * compatibility checking, or displaying version information.\n *\n * @returns promise resolving to version information object\n *\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const version = await client.getVersion();\n * console.log(`API version: ${version}`);\n * ```\n */\n async getVersion() {\n const url = `${this.baseUrl}/version`;\n return this.makeRequest({ url, headers: this.getHeaders(\"catalog\") });\n }\n\n /**\n * add items to catalog\n *\n * uploads items to the catalog for a specific entity type (e.g., products, articles).\n * automatically flattens nested objects unless formatData is set to false.\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to add to catalog\n * @param props.mainUnit - primary identifier field name (optional)\n * @param props.formatData - auto-flatten nested objects (default: true)\n *\n * @returns promise resolving when catalog add completes\n *\n * @throws {ZodError} if entity is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.catalogAdd({\n * entity: \"products\",\n * data: [\n * { id: \"1\", name: \"Product A\", price: 99.99 },\n * { id: \"2\", name: \"Product B\", price: 149.99 }\n * ]\n * });\n * ```\n */\n catalogAdd = async ({ entity, data, mainUnit, formatData }: CatalogAddProps) => {\n ///validate params\n CatalogAddPropsSchema.parse({ entity, data, mainUnit, formatData });\n\n const formattedData = formatData === undefined || formatData === true ? data.map(flattenNested) : data;\n\n return this.makeRequest({\n url: `${this.baseUrl}/catalog`,\n method: \"PUT\",\n data: { data: formattedData, entity, mainUnit },\n headers: this.getHeaders(\"catalog\"),\n });\n };\n\n /**\n * add items to catalog via csv format\n *\n * uploads items to catalog using csv format instead of json. more efficient for\n * large bulk uploads. converts data to csv automatically. does not use makeRequest\n * retry logic (uses raw fetch).\n *\n * @param props - catalog add configuration\n * @param props.entity - entity type name (e.g., \"products\", \"articles\")\n * @param props.data - array of items to convert to csv and upload\n * @param props.mainUnit - primary identifier field name (optional)\n *\n * @returns promise resolving when catalog upload completes\n *\n * @throws {Error} if data is empty\n * @throws {Error} on fetch failures (no automatic retry for csv uploads)\n *\n * @example\n * ```typescript\n * await client.catalogCSVAdd({\n * entity: \"products\",\n * data: [{ id: \"1\", name: \"A\" }, { id: \"2\", name: \"B\" }],\n * mainUnit: \"id\"\n * });\n * ```\n */\n catalogCSVAdd = async ({ entity, data, mainUnit }: CatalogAddProps): Promise<{}> => {\n const queryParams: Record<string, string | undefined> = {\n entity,\n mainUnit,\n };\n const queryParamsString: string = Object.entries(queryParams)\n .filter((entry): entry is [string, string] => !!entry[1])\n .map(([k, v]) => `${k}=${encodeURIComponent(v)}`)\n .join(\"&\");\n\n const path = \"/catalog/csv\";\n const url = `${this.baseUrl}${path}?${queryParamsString}`;\n\n const body: string = bodyToCSV(data);\n\n const r = await fetch(url, { headers: this.getHeaders(\"catalog\"), method: \"PUT\", body });\n\n return r.json() as Promise<{}>;\n };\n\n /**\n * send single event\n *\n * tracks user interactions. supports all event types.\n *\n * @param data - event data\n * @param data.eventType - event type name (e.g., \"click\", \"purchase\", \"view\")\n * @param data.payload - event-specific data (optional)\n * @param data.predictionId - associated prediction id (optional)\n * @param data.predictionIds - associated prediction ids (optional)\n * @param data.sessionId - session identifier (optional)\n * @param data.timestamp - event timestamp (optional, defaults to server time)\n * @param options - optional event configuration\n * @param options.notrace - skip storing event in analytics (default: false)\n *\n * @returns promise resolving when event is recorded\n *\n * @throws {ZodError} if eventType is empty or data is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEvent({\n * eventType: \"click\",\n * payload: { item_id: \"product-123\" },\n * sessionId: \"session-456\"\n * });\n * ```\n */\n async putEvent(\n data: Event,\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventParamsSchema.parse({ data, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data,\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * send batch of events\n *\n * efficiently tracks multiple events in a single api call. ideal for bulk event\n * uploads, offline event syncing, or high-throughput event tracking. supports\n * up to 500 events per batch.\n *\n * @param events - array of events to send (max 500)\n * @param options - optional batch configuration\n * @param options.notrace - skip storing events in analytics (default: false)\n *\n * @returns promise resolving when all events are recorded\n *\n * @throws {ZodError} if events array is empty, exceeds 500 items, or contains invalid events\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * await client.putEventBatch([\n * { eventType: \"view\", payload: { item_id: \"item-1\" } },\n * { eventType: \"click\", payload: { item_id: \"item-2\" } },\n * { eventType: \"purchase\", payload: { item_id: \"item-3\", price: 99.99 } }\n * ]);\n * ```\n */\n async putEventBatch(\n events: Event[],\n options?: { notrace?: boolean }\n // oxlint-disable-next-line no-explicit-any -- public SDK API: server response shape varies, callers may chain on result\n ): Promise<any> {\n ///validate params\n PutEventBatchParamsSchema.parse({ events, options });\n\n const queryString = options?.notrace ? \"?notrace=true\" : \"\";\n const url = `${this.baseUrl}/event/batch${queryString}`;\n\n return this.makeRequest({\n method: \"PUT\",\n url,\n data: { events },\n headers: this.getHeaders(\"catalog\"),\n });\n }\n\n /**\n * get content ranking prediction\n *\n * requests ranked ordering of content items based on context and user preferences.\n * used for personalized ranking, A/B testing, or contextual bandit scenarios.\n * returns ordered ranking with scores and associated datapoint.\n *\n * @param payload - prediction request payload\n * @param payload.useCase - use case configuration with uuid\n * @param payload.context - context features (user_id, session_id, etc.)\n * @param payload.actions - array of items to rank (item features)\n * @param payload.no_trace - skip storing prediction for analytics (default: false)\n *\n * @returns promise resolving to prediction with ordering, datapoint, and prediction id\n * @returns {object} result\n * @returns {object} result.ordering - item rankings (item_id -> rank)\n * @returns {DataPoint} result.datapoint - full prediction datapoint with scores and propensities\n * @returns {string} result.id - prediction uuid for feedback tracking\n *\n * @throws {ZodError} if useCase uuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const ranking = await client.ranking({\n * useCase: { uuid: \"ranking-use-case\" },\n * context: { user_id: \"user-123\" },\n * actions: [\n * { item_id: \"item-1\", category: \"electronics\" },\n * { item_id: \"item-2\", category: \"books\" }\n * ]\n * });\n * ```\n */\n ranking = async (\n payload: PredictionPayload\n ): Promise<{\n ordering: Record<string, number>;\n datapoint: DataPoint;\n id: string;\n }> => {\n ///validate params\n PredictionPayloadSchema.parse(payload);\n\n const url = `${this.baseUrl}/prediction/ranker`;\n\n const data = this.predictionPreProcessing(payload);\n\n return this.makeRequest({\n method: \"POST\",\n url,\n data,\n headers: this.getHeaders(\"robin\"),\n });\n };\n\n /**\n * send feedback for prediction\n *\n * submits outcome feedback for a previous prediction.\n *\n * @param payload - feedback payload\n * @param payload.predictionUuid - id of the prediction to provide feedback for (from ranking() response)\n * @param payload.value - feedback data (e.g., { reward: 1 }, { clicked: true }, { rating: 4.5 })\n * @param payload.modelUuid - optional specific model uuid to send feedback to\n *\n * @returns promise resolving when feedback is recorded\n *\n * @throws {ZodError} if predictionUuid is empty or payload is invalid\n * @throws {Error} on 4xx client errors (no retry)\n * @throws {Error} on persistent 5xx/network errors after 3 retries\n *\n * @example\n * ```typescript\n * const pred = await client.ranking({...});\n * // later, after user interaction\n * await client.feedback({\n * predictionUuid: pred.id,\n * value: { clicked: true, purchased: false }\n * });\n * ```\n */\n feedback = async (payload: { modelUuid?: string; predictionUuid: string; value: Record<string, unknown> }) => {\n ///validate params\n FeedbackParamsSchema.parse(payload);\n\n const url = `${this.baseUrl}/feedback`;\n\n return this.makeRequest({\n method: \"POST\",\n url: url,\n data: payload,\n headers: this.getHeaders(\"robin\"),\n });\n };\n}\n\nexport { Client };\n","import type { ContentSelectionFilter, FilterCondition } from \"./type\";\n\n/**\n * fluent builder for creating content selection filters\n *\n * provides chainable api for constructing complex filter conditions. supports\n * must (required), should (optional/or), and must_not (exclusion) filter types.\n * use with search(), getRecommendations(), and other content selection methods.\n *\n * filter types:\n * - must: all conditions must match (AND logic)\n * - should: at least one condition should match (OR logic)\n * - must_not: conditions must not match (NOT logic)\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"electronics\")\n * .range(\"price\", { gte: 100, lte: 500 })\n * .match(\"out_of_stock\", false, \"must_not\")\n * .build();\n * ```\n */\nexport class FilterBuilder {\n private must: FilterCondition[] = [];\n private should: FilterCondition[] = [];\n private must_not: FilterCondition[] = [];\n\n /**\n * add exact match filter condition\n *\n * filters items where field exactly matches the specified value.\n * supports string, number, and boolean values.\n *\n * @param field - field name to filter on\n * @param value - value to match (string | number | boolean)\n * @param type - filter type: \"must\" (required), \"should\" (optional), or \"must_not\" (exclude). default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // required match\n * builder.match(\"category\", \"electronics\");\n *\n * // optional match (or condition)\n * builder.match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\");\n *\n * // exclusion\n * builder.match(\"status\", \"deleted\", \"must_not\");\n * ```\n */\n match(field: string, value: string | number | boolean, type: \"must\" | \"should\" | \"must_not\" = \"must\"): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Match\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add numeric range filter condition\n *\n * filters items where numeric field falls within specified range.\n * supports gte (>=), lte (<=), gt (>), and lt (<) operators.\n *\n * @param field - numeric field name to filter on\n * @param value - range specification with operators\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // price between 100 and 500\n * builder.range(\"price\", { gte: 100, lte: 500 });\n *\n * // rating above 4\n * builder.range(\"rating\", { gt: 4 });\n *\n * // exclude expensive items\n * builder.range(\"price\", { gte: 1000 }, \"must_not\");\n * ```\n */\n range(\n field: string,\n value: { gte?: number; lte?: number; gt?: number; lt?: number },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"Range\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add datetime range filter condition\n *\n * filters items where datetime field falls within specified range.\n * values should be RFC 3339 formatted strings (e.g., \"2025-12-15T00:00:00Z\").\n *\n * @param field - datetime field name to filter on\n * @param value - range specification with operators (RFC 3339 strings)\n * @param value.gte - greater than or equal to\n * @param value.lte - less than or equal to\n * @param value.gt - greater than\n * @param value.lt - less than\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // events between two dates\n * builder.datetimeRange(\"start_date\", {\n * gte: \"2025-12-15T00:00:00Z\",\n * lte: \"2025-12-31T23:59:59Z\"\n * });\n *\n * // events after a specific date\n * builder.datetimeRange(\"created_at\", { gt: \"2025-01-01T00:00:00Z\" });\n * ```\n */\n datetimeRange(\n field: string,\n value: { gte?: string; lte?: string; gt?: string; lt?: string },\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"DatetimeRange\", value },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * add geo-radius filter condition\n *\n * filters items where geo-location field falls within specified radius\n * from a center point. useful for location-based filtering.\n *\n * @param field - geo-location field name\n * @param lat - latitude of center point (degrees, -90 to 90)\n * @param lon - longitude of center point (degrees, -180 to 180)\n * @param radius - search radius in meters\n * @param type - filter type: \"must\", \"should\", or \"must_not\". default: \"must\"\n *\n * @returns this filter builder for method chaining\n *\n * @example\n * ```typescript\n * // items within 5km of new york city\n * builder.geoRadius(\"location\", 40.7128, -74.0060, 5000);\n *\n * // exclude items near specific location\n * builder.geoRadius(\"warehouse\", 37.7749, -122.4194, 10000, \"must_not\");\n * ```\n */\n geoRadius(\n field: string,\n lat: number,\n lon: number,\n radius: number,\n type: \"must\" | \"should\" | \"must_not\" = \"must\"\n ): this {\n const condition: FilterCondition = {\n field,\n condition: { type: \"GeoRadius\", value: { lat, lon, radius } },\n };\n\n if (type === \"must\") {\n this.must.push(condition);\n } else if (type === \"should\") {\n this.should.push(condition);\n } else {\n this.must_not.push(condition);\n }\n\n return this;\n }\n\n /**\n * build final filter object\n *\n * constructs the complete filter object from all added conditions.\n * call this method last after chaining all filter methods.\n *\n * @returns content selection filter ready to use with client methods\n *\n * @example\n * ```typescript\n * const filter = new FilterBuilder()\n * .match(\"category\", \"clothing\")\n * .range(\"price\", { gte: 20, lte: 100 })\n * .match(\"brand\", \"nike\", \"should\")\n * .match(\"brand\", \"adidas\", \"should\")\n * .build();\n *\n * const results = await client.search(\"red shoes\", \"product-search\", {\n * filters: filter\n * });\n * ```\n */\n build(): ContentSelectionFilter {\n const filter: ContentSelectionFilter = {};\n\n if (this.must.length > 0) {\n filter.must = this.must;\n }\n if (this.should.length > 0) {\n filter.should = this.should;\n }\n if (this.must_not.length > 0) {\n filter.must_not = this.must_not;\n }\n\n return filter;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@albatrossai/albatross-sdk",
3
- "version": "1.1.43",
3
+ "version": "1.1.44",
4
+ "files": [
5
+ "dist"
6
+ ],
4
7
  "type": "module",
5
8
  "main": "./dist/index.js",
6
9
  "module": "./dist/index.js",
@@ -12,9 +15,6 @@
12
15
  "require": "./dist/index.cjs"
13
16
  }
14
17
  },
15
- "files": [
16
- "dist"
17
- ],
18
18
  "scripts": {
19
19
  "build": "tsup",
20
20
  "dev": "tsup --watch",
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "devDependencies": {
30
30
  "tsup": "^8.3.5",
31
- "typescript": "catalog:build",
32
- "typedoc": "^0.26.11"
31
+ "typedoc": "^0.26.11",
32
+ "typescript": "catalog:build"
33
33
  }
34
34
  }