@albatrossai/albatross-sdk 1.1.42 → 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 +8 -8
- package/dist/index.cjs +64 -95
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +64 -95
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
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
|
|
19
|
+
import { Client } from "@albatrossai/albatross-sdk";
|
|
20
20
|
|
|
21
|
-
const client = new Client(
|
|
21
|
+
const client = new Client("your-api-token", "your-tenant-id");
|
|
22
22
|
|
|
23
23
|
// Search
|
|
24
|
-
const results = await client.search(
|
|
24
|
+
const results = await client.search("query", "use-case", { limit: 10 });
|
|
25
25
|
|
|
26
26
|
// Recommendations
|
|
27
|
-
const recs = await client.getRecommendations(
|
|
28
|
-
user_id:
|
|
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:
|
|
35
|
-
payload: { user_id:
|
|
34
|
+
eventType: "view",
|
|
35
|
+
payload: { user_id: "user-123", item_id: "item-456" },
|
|
36
36
|
});
|
|
37
37
|
```
|
|
38
38
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var sync = require('csv-stringify/sync');
|
|
4
3
|
var zod = require('zod');
|
|
4
|
+
var sync = require('csv-stringify/sync');
|
|
5
5
|
|
|
6
6
|
// src/request.ts
|
|
7
7
|
var MAX_RETRIES = 3;
|
|
@@ -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;
|
|
@@ -90,62 +73,6 @@ var makeRequest = async ({
|
|
|
90
73
|
}
|
|
91
74
|
throw lastError || new Error("Unexpected error in makeRequest");
|
|
92
75
|
};
|
|
93
|
-
var flattenNested = (obj) => {
|
|
94
|
-
const result = {};
|
|
95
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
96
|
-
if (typeof value === "object" && !Array.isArray(value) && value !== null) {
|
|
97
|
-
for (const [nestedKey, nestedValue] of Object.entries(value)) {
|
|
98
|
-
if (Array.isArray(nestedValue)) {
|
|
99
|
-
result[`${key}_${nestedKey}`] = nestedValue.join(",");
|
|
100
|
-
} else if (typeof nestedValue === "object" && nestedValue !== null) {
|
|
101
|
-
for (const [subKey, subValue] of Object.entries(nestedValue)) {
|
|
102
|
-
result[`${nestedKey}_${subKey}`] = subValue;
|
|
103
|
-
}
|
|
104
|
-
} else {
|
|
105
|
-
result[`${key}_${nestedKey}`] = nestedValue;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
} else if (Array.isArray(value)) {
|
|
109
|
-
result[key] = value.join(",");
|
|
110
|
-
} else {
|
|
111
|
-
result[key] = value;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return result;
|
|
115
|
-
};
|
|
116
|
-
var preFormatRow = (rowHeaders, row) => {
|
|
117
|
-
const flattenedRow = flattenNested(row);
|
|
118
|
-
return rowHeaders.map((header) => {
|
|
119
|
-
const value = flattenedRow[header];
|
|
120
|
-
if (value === null || value === void 0) {
|
|
121
|
-
return "";
|
|
122
|
-
}
|
|
123
|
-
if (typeof value === "object") {
|
|
124
|
-
return JSON.stringify(value);
|
|
125
|
-
}
|
|
126
|
-
return String(value);
|
|
127
|
-
});
|
|
128
|
-
};
|
|
129
|
-
var bodyToCSV = (data) => {
|
|
130
|
-
if (data.length === 0) {
|
|
131
|
-
throw new Error("data is empty");
|
|
132
|
-
}
|
|
133
|
-
const [row0] = data;
|
|
134
|
-
if (!row0) {
|
|
135
|
-
throw new Error("data is empty");
|
|
136
|
-
}
|
|
137
|
-
const rowHeaders = Object.keys(flattenNested(row0));
|
|
138
|
-
const csvData = [
|
|
139
|
-
rowHeaders,
|
|
140
|
-
...data.map((row) => preFormatRow(rowHeaders, row))
|
|
141
|
-
];
|
|
142
|
-
return sync.stringify(csvData, {
|
|
143
|
-
delimiter: ",",
|
|
144
|
-
quote: true,
|
|
145
|
-
quoted_string: true,
|
|
146
|
-
header: false
|
|
147
|
-
}).trim();
|
|
148
|
-
};
|
|
149
76
|
var EventSchema = zod.z.object({
|
|
150
77
|
eventType: zod.z.string().min(1, "event type required"),
|
|
151
78
|
payload: zod.z.record(zod.z.string(), zod.z.any()).optional(),
|
|
@@ -314,6 +241,59 @@ var FeedbackParamsSchema = zod.z.object({
|
|
|
314
241
|
predictionUuid: zod.z.string().min(1, "prediction uuid required"),
|
|
315
242
|
value: zod.z.record(zod.z.string(), zod.z.any())
|
|
316
243
|
});
|
|
244
|
+
var flattenNested = (obj) => {
|
|
245
|
+
const result = {};
|
|
246
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
247
|
+
if (typeof value === "object" && !Array.isArray(value) && value !== null) {
|
|
248
|
+
for (const [nestedKey, nestedValue] of Object.entries(value)) {
|
|
249
|
+
if (Array.isArray(nestedValue)) {
|
|
250
|
+
result[`${key}_${nestedKey}`] = nestedValue.join(",");
|
|
251
|
+
} else if (typeof nestedValue === "object" && nestedValue !== null) {
|
|
252
|
+
for (const [subKey, subValue] of Object.entries(nestedValue)) {
|
|
253
|
+
result[`${nestedKey}_${subKey}`] = subValue;
|
|
254
|
+
}
|
|
255
|
+
} else {
|
|
256
|
+
result[`${key}_${nestedKey}`] = nestedValue;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
} else if (Array.isArray(value)) {
|
|
260
|
+
result[key] = value.join(",");
|
|
261
|
+
} else {
|
|
262
|
+
result[key] = value;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return result;
|
|
266
|
+
};
|
|
267
|
+
var preFormatRow = (rowHeaders, row) => {
|
|
268
|
+
const flattenedRow = flattenNested(row);
|
|
269
|
+
return rowHeaders.map((header) => {
|
|
270
|
+
const value = flattenedRow[header];
|
|
271
|
+
if (value === null || value === void 0) {
|
|
272
|
+
return "";
|
|
273
|
+
}
|
|
274
|
+
if (typeof value === "object") {
|
|
275
|
+
return JSON.stringify(value);
|
|
276
|
+
}
|
|
277
|
+
return String(value);
|
|
278
|
+
});
|
|
279
|
+
};
|
|
280
|
+
var bodyToCSV = (data) => {
|
|
281
|
+
if (data.length === 0) {
|
|
282
|
+
throw new Error("data is empty");
|
|
283
|
+
}
|
|
284
|
+
const [row0] = data;
|
|
285
|
+
if (!row0) {
|
|
286
|
+
throw new Error("data is empty");
|
|
287
|
+
}
|
|
288
|
+
const rowHeaders = Object.keys(flattenNested(row0));
|
|
289
|
+
const csvData = [rowHeaders, ...data.map((row) => preFormatRow(rowHeaders, row))];
|
|
290
|
+
return sync.stringify(csvData, {
|
|
291
|
+
delimiter: ",",
|
|
292
|
+
quote: true,
|
|
293
|
+
quoted_string: true,
|
|
294
|
+
header: false
|
|
295
|
+
}).trim();
|
|
296
|
+
};
|
|
317
297
|
|
|
318
298
|
// src/client.ts
|
|
319
299
|
var hostDefault = "https://app.usealbatross.ai/api";
|
|
@@ -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
|