@things-factory/integration-label-studio 9.1.19

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.
Files changed (152) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/EXTERNAL_DATA_SOURCING.md +484 -0
  3. package/IMPLEMENTATION_GUIDE.md +469 -0
  4. package/INTEGRATION.md +279 -0
  5. package/README.md +1014 -0
  6. package/SETUP_GUIDE.md +577 -0
  7. package/TEST_GUIDE.md +387 -0
  8. package/UI_CUSTOMIZATION.md +395 -0
  9. package/USER_SYNC_GUIDE.md +514 -0
  10. package/client/bootstrap.ts +1 -0
  11. package/client/index.ts +1 -0
  12. package/client/label-studio-label-page.ts +52 -0
  13. package/client/label-studio-project-create.ts +216 -0
  14. package/client/label-studio-project-list.ts +214 -0
  15. package/client/label-studio-wrapper.ts +294 -0
  16. package/client/route.ts +15 -0
  17. package/client/tsconfig.json +13 -0
  18. package/config/config.development.js +124 -0
  19. package/config/config.production.js +182 -0
  20. package/dist-client/bootstrap.d.ts +1 -0
  21. package/dist-client/bootstrap.js +2 -0
  22. package/dist-client/bootstrap.js.map +1 -0
  23. package/dist-client/index.d.ts +1 -0
  24. package/dist-client/index.js +2 -0
  25. package/dist-client/index.js.map +1 -0
  26. package/dist-client/label-studio-label-page.d.ts +8 -0
  27. package/dist-client/label-studio-label-page.js +54 -0
  28. package/dist-client/label-studio-label-page.js.map +1 -0
  29. package/dist-client/label-studio-project-create.d.ts +16 -0
  30. package/dist-client/label-studio-project-create.js +235 -0
  31. package/dist-client/label-studio-project-create.js.map +1 -0
  32. package/dist-client/label-studio-project-list.d.ts +16 -0
  33. package/dist-client/label-studio-project-list.js +222 -0
  34. package/dist-client/label-studio-project-list.js.map +1 -0
  35. package/dist-client/label-studio-wrapper.d.ts +57 -0
  36. package/dist-client/label-studio-wrapper.js +304 -0
  37. package/dist-client/label-studio-wrapper.js.map +1 -0
  38. package/dist-client/route.d.ts +1 -0
  39. package/dist-client/route.js +14 -0
  40. package/dist-client/route.js.map +1 -0
  41. package/dist-client/tsconfig.tsbuildinfo +1 -0
  42. package/dist-server/controller/label-studio-role-mapper.d.ts +35 -0
  43. package/dist-server/controller/label-studio-role-mapper.js +65 -0
  44. package/dist-server/controller/label-studio-role-mapper.js.map +1 -0
  45. package/dist-server/controller/user-provisioning-service.d.ts +66 -0
  46. package/dist-server/controller/user-provisioning-service.js +264 -0
  47. package/dist-server/controller/user-provisioning-service.js.map +1 -0
  48. package/dist-server/index.d.ts +7 -0
  49. package/dist-server/index.js +19 -0
  50. package/dist-server/index.js.map +1 -0
  51. package/dist-server/route/label-studio-sso.d.ts +2 -0
  52. package/dist-server/route/label-studio-sso.js +156 -0
  53. package/dist-server/route/label-studio-sso.js.map +1 -0
  54. package/dist-server/route/webhook.d.ts +65 -0
  55. package/dist-server/route/webhook.js +248 -0
  56. package/dist-server/route/webhook.js.map +1 -0
  57. package/dist-server/route.d.ts +1 -0
  58. package/dist-server/route.js +21 -0
  59. package/dist-server/route.js.map +1 -0
  60. package/dist-server/service/ai-prediction-service.d.ts +27 -0
  61. package/dist-server/service/ai-prediction-service.js +222 -0
  62. package/dist-server/service/ai-prediction-service.js.map +1 -0
  63. package/dist-server/service/dataset-labeling-integration.d.ts +44 -0
  64. package/dist-server/service/dataset-labeling-integration.js +512 -0
  65. package/dist-server/service/dataset-labeling-integration.js.map +1 -0
  66. package/dist-server/service/external-data-source-service.d.ts +78 -0
  67. package/dist-server/service/external-data-source-service.js +415 -0
  68. package/dist-server/service/external-data-source-service.js.map +1 -0
  69. package/dist-server/service/index.d.ts +12 -0
  70. package/dist-server/service/index.js +27 -0
  71. package/dist-server/service/index.js.map +1 -0
  72. package/dist-server/service/label-studio-sso-service.d.ts +38 -0
  73. package/dist-server/service/label-studio-sso-service.js +98 -0
  74. package/dist-server/service/label-studio-sso-service.js.map +1 -0
  75. package/dist-server/service/ml/ml-backend-service.d.ts +23 -0
  76. package/dist-server/service/ml/ml-backend-service.js +153 -0
  77. package/dist-server/service/ml/ml-backend-service.js.map +1 -0
  78. package/dist-server/service/prediction/prediction-management.d.ts +32 -0
  79. package/dist-server/service/prediction/prediction-management.js +299 -0
  80. package/dist-server/service/prediction/prediction-management.js.map +1 -0
  81. package/dist-server/service/project/project-management.d.ts +36 -0
  82. package/dist-server/service/project/project-management.js +309 -0
  83. package/dist-server/service/project/project-management.js.map +1 -0
  84. package/dist-server/service/task/task-management.d.ts +42 -0
  85. package/dist-server/service/task/task-management.js +372 -0
  86. package/dist-server/service/task/task-management.js.map +1 -0
  87. package/dist-server/service/user-provisioning/user-sync-mutation.d.ts +28 -0
  88. package/dist-server/service/user-provisioning/user-sync-mutation.js +111 -0
  89. package/dist-server/service/user-provisioning/user-sync-mutation.js.map +1 -0
  90. package/dist-server/service/webhook/webhook-management.d.ts +21 -0
  91. package/dist-server/service/webhook/webhook-management.js +134 -0
  92. package/dist-server/service/webhook/webhook-management.js.map +1 -0
  93. package/dist-server/tsconfig.tsbuildinfo +1 -0
  94. package/dist-server/types/dataset-labeling-types.d.ts +71 -0
  95. package/dist-server/types/dataset-labeling-types.js +259 -0
  96. package/dist-server/types/dataset-labeling-types.js.map +1 -0
  97. package/dist-server/types/label-studio-types.d.ts +128 -0
  98. package/dist-server/types/label-studio-types.js +494 -0
  99. package/dist-server/types/label-studio-types.js.map +1 -0
  100. package/dist-server/types/prediction-types.d.ts +39 -0
  101. package/dist-server/types/prediction-types.js +121 -0
  102. package/dist-server/types/prediction-types.js.map +1 -0
  103. package/dist-server/utils/annotation-exporter.d.ts +104 -0
  104. package/dist-server/utils/annotation-exporter.js +261 -0
  105. package/dist-server/utils/annotation-exporter.js.map +1 -0
  106. package/dist-server/utils/label-config-builder.d.ts +117 -0
  107. package/dist-server/utils/label-config-builder.js +286 -0
  108. package/dist-server/utils/label-config-builder.js.map +1 -0
  109. package/dist-server/utils/label-studio-api-client.d.ts +180 -0
  110. package/dist-server/utils/label-studio-api-client.js +401 -0
  111. package/dist-server/utils/label-studio-api-client.js.map +1 -0
  112. package/dist-server/utils/media-url-extractor.d.ts +45 -0
  113. package/dist-server/utils/media-url-extractor.js +152 -0
  114. package/dist-server/utils/media-url-extractor.js.map +1 -0
  115. package/dist-server/utils/task-transformer.d.ts +108 -0
  116. package/dist-server/utils/task-transformer.js +260 -0
  117. package/dist-server/utils/task-transformer.js.map +1 -0
  118. package/package.json +47 -0
  119. package/server/SERVER_STRUCTURE.md +351 -0
  120. package/server/controller/label-studio-role-mapper.ts +76 -0
  121. package/server/controller/user-provisioning-service.ts +340 -0
  122. package/server/index.ts +19 -0
  123. package/server/route/label-studio-sso.ts +194 -0
  124. package/server/route/webhook.ts +304 -0
  125. package/server/route.ts +35 -0
  126. package/server/service/ai-prediction-service.ts +239 -0
  127. package/server/service/dataset-labeling-integration.ts +590 -0
  128. package/server/service/external-data-source-service.ts +438 -0
  129. package/server/service/index.ts +24 -0
  130. package/server/service/label-studio-sso-service.ts +108 -0
  131. package/server/service/labeling-scenario-service.ts.deprecated +566 -0
  132. package/server/service/ml/ml-backend-service.ts +127 -0
  133. package/server/service/prediction/prediction-management.ts +281 -0
  134. package/server/service/project/project-management.ts +284 -0
  135. package/server/service/task/task-management.ts +363 -0
  136. package/server/service/user-provisioning/user-sync-mutation.ts +80 -0
  137. package/server/service/webhook/webhook-management.ts +109 -0
  138. package/server/tsconfig.json +11 -0
  139. package/server/types/dataset-labeling-types.ts +181 -0
  140. package/server/types/global.d.ts +23 -0
  141. package/server/types/label-studio-types.ts +346 -0
  142. package/server/types/prediction-types.ts +86 -0
  143. package/server/types/scenario-types.ts.deprecated +362 -0
  144. package/server/utils/annotation-exporter.ts +340 -0
  145. package/server/utils/label-config-builder.ts +340 -0
  146. package/server/utils/label-studio-api-client.ts +487 -0
  147. package/server/utils/media-url-extractor.ts +193 -0
  148. package/server/utils/task-transformer.ts +342 -0
  149. package/test-ai-prediction.js +268 -0
  150. package/test-dataset-integration.js +449 -0
  151. package/test-simple.js +89 -0
  152. package/things-factory.config.js +12 -0
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ /**
3
+ * Label Config Builder
4
+ *
5
+ * Flexible, declarative Label Studio configuration generator.
6
+ * Supports any data type and control combination without hardcoding templates.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LabelConfigTemplates = exports.LabelConfigBuilder = void 0;
10
+ class LabelConfigBuilder {
11
+ /**
12
+ * Build Label Studio XML configuration from specification
13
+ */
14
+ static build(spec) {
15
+ const dataName = spec.dataName || 'data';
16
+ const dataTag = this.buildDataTag(spec.dataType, dataName);
17
+ const controlTags = spec.controls.map(c => this.buildControlTag(c));
18
+ return `
19
+ <View>
20
+ ${dataTag}
21
+ ${controlTags.join('\n ')}
22
+ </View>
23
+ `.trim();
24
+ }
25
+ /**
26
+ * Build data source tag (Image, Text, Audio, etc.)
27
+ */
28
+ static buildDataTag(type, name) {
29
+ const capitalizedType = type.charAt(0).toUpperCase() + type.slice(1);
30
+ return `<${capitalizedType} name="${name}" value="$${name}"/>`;
31
+ }
32
+ /**
33
+ * Build control tag based on type
34
+ */
35
+ static buildControlTag(control) {
36
+ switch (control.type) {
37
+ case 'choices':
38
+ return this.buildChoices(control);
39
+ case 'labels':
40
+ return this.buildLabels(control);
41
+ case 'textarea':
42
+ return this.buildTextArea(control);
43
+ case 'rating':
44
+ return this.buildRating(control);
45
+ case 'rectangles':
46
+ return this.buildRectangles(control);
47
+ case 'polygon':
48
+ return this.buildPolygon(control);
49
+ case 'keypoint':
50
+ return this.buildKeypoint(control);
51
+ case 'brush':
52
+ return this.buildBrush(control);
53
+ default:
54
+ throw new Error(`Unknown control type: ${control.type}`);
55
+ }
56
+ }
57
+ /**
58
+ * Build Choices control (single or multiple selection)
59
+ */
60
+ static buildChoices(control) {
61
+ const config = control.config;
62
+ const choice = config.choice || 'single';
63
+ const required = config.required ? 'required="true"' : '';
64
+ const choiceElements = config.choices
65
+ .map(c => ` <Choice value="${this.escapeXml(c)}"/>`)
66
+ .join('\n');
67
+ return `<Choices name="${control.name}" toName="${control.toName}" choice="${choice}" ${required}>
68
+ ${choiceElements}
69
+ </Choices>`;
70
+ }
71
+ /**
72
+ * Build Labels control (for NER, classification, etc.)
73
+ */
74
+ static buildLabels(control) {
75
+ const config = control.config;
76
+ const labelElements = config.labels
77
+ .map(l => {
78
+ const background = l.background ? `background="${l.background}"` : '';
79
+ const hotkey = l.hotkey ? `hotkey="${l.hotkey}"` : '';
80
+ return ` <Label value="${this.escapeXml(l.value)}" ${background} ${hotkey}/>`;
81
+ })
82
+ .join('\n');
83
+ return `<Labels name="${control.name}" toName="${control.toName}">
84
+ ${labelElements}
85
+ </Labels>`;
86
+ }
87
+ /**
88
+ * Build TextArea control
89
+ */
90
+ static buildTextArea(control) {
91
+ const placeholder = control.config.placeholder ? `placeholder="${control.config.placeholder}"` : '';
92
+ const required = control.config.required ? 'required="true"' : '';
93
+ const maxSubmissions = control.config.maxSubmissions ? `maxSubmissions="${control.config.maxSubmissions}"` : '';
94
+ return `<TextArea name="${control.name}" toName="${control.toName}" ${placeholder} ${required} ${maxSubmissions}/>`;
95
+ }
96
+ /**
97
+ * Build Rating control
98
+ */
99
+ static buildRating(control) {
100
+ const config = control.config;
101
+ const maxRating = config.maxRating || 5;
102
+ const icon = config.icon || 'star';
103
+ const size = config.size || 'medium';
104
+ return `<Rating name="${control.name}" toName="${control.toName}" maxRating="${maxRating}" icon="${icon}" size="${size}"/>`;
105
+ }
106
+ /**
107
+ * Build Rectangle control (bounding boxes)
108
+ */
109
+ static buildRectangles(control) {
110
+ const labels = control.config.labels ? `labels="${control.config.labels.join(',')}"` : '';
111
+ return `<Rectangle name="${control.name}" toName="${control.toName}" ${labels}/>`;
112
+ }
113
+ /**
114
+ * Build Polygon control
115
+ */
116
+ static buildPolygon(control) {
117
+ const labels = control.config.labels ? `labels="${control.config.labels.join(',')}"` : '';
118
+ return `<Polygon name="${control.name}" toName="${control.toName}" ${labels}/>`;
119
+ }
120
+ /**
121
+ * Build Keypoint control
122
+ */
123
+ static buildKeypoint(control) {
124
+ const labels = control.config.labels ? `labels="${control.config.labels.join(',')}"` : '';
125
+ return `<KeyPoint name="${control.name}" toName="${control.toName}" ${labels}/>`;
126
+ }
127
+ /**
128
+ * Build Brush control (semantic segmentation)
129
+ */
130
+ static buildBrush(control) {
131
+ const labels = control.config.labels ? `labels="${control.config.labels.join(',')}"` : '';
132
+ return `<Brush name="${control.name}" toName="${control.toName}" ${labels}/>`;
133
+ }
134
+ /**
135
+ * Escape XML special characters
136
+ */
137
+ static escapeXml(str) {
138
+ return str
139
+ .replace(/&/g, '&amp;')
140
+ .replace(/</g, '&lt;')
141
+ .replace(/>/g, '&gt;')
142
+ .replace(/"/g, '&quot;')
143
+ .replace(/'/g, '&apos;');
144
+ }
145
+ }
146
+ exports.LabelConfigBuilder = LabelConfigBuilder;
147
+ /**
148
+ * Pre-built template generators for common use cases
149
+ */
150
+ class LabelConfigTemplates {
151
+ /**
152
+ * Generate Rank N image classification config
153
+ * Example: WBM Rank 3 classification
154
+ */
155
+ static imageRankN(ranks, classes) {
156
+ const controls = [];
157
+ for (let i = 1; i <= ranks; i++) {
158
+ controls.push({
159
+ type: 'choices',
160
+ name: `rank${i}`,
161
+ toName: 'data',
162
+ config: {
163
+ choices: classes,
164
+ choice: 'single',
165
+ required: i === 1 // First rank is required
166
+ }
167
+ });
168
+ }
169
+ return {
170
+ dataType: 'image',
171
+ controls
172
+ };
173
+ }
174
+ /**
175
+ * Simple image classification
176
+ */
177
+ static imageClassification(classes, multiLabel = false) {
178
+ return {
179
+ dataType: 'image',
180
+ controls: [
181
+ {
182
+ type: 'choices',
183
+ name: 'choice',
184
+ toName: 'data',
185
+ config: {
186
+ choices: classes,
187
+ choice: multiLabel ? 'multiple' : 'single',
188
+ required: true
189
+ }
190
+ }
191
+ ]
192
+ };
193
+ }
194
+ /**
195
+ * Text classification (sentiment, intent, etc.)
196
+ */
197
+ static textClassification(classes) {
198
+ return {
199
+ dataType: 'text',
200
+ controls: [
201
+ {
202
+ type: 'choices',
203
+ name: 'choice',
204
+ toName: 'data',
205
+ config: {
206
+ choices: classes,
207
+ choice: 'single',
208
+ required: true
209
+ }
210
+ }
211
+ ]
212
+ };
213
+ }
214
+ /**
215
+ * Named Entity Recognition
216
+ */
217
+ static namedEntityRecognition(labels) {
218
+ return {
219
+ dataType: 'text',
220
+ controls: [
221
+ {
222
+ type: 'labels',
223
+ name: 'label',
224
+ toName: 'data',
225
+ config: {
226
+ labels
227
+ }
228
+ }
229
+ ]
230
+ };
231
+ }
232
+ /**
233
+ * Object detection (bounding boxes)
234
+ */
235
+ static objectDetection(labels) {
236
+ return {
237
+ dataType: 'image',
238
+ controls: [
239
+ {
240
+ type: 'rectangles',
241
+ name: 'bbox',
242
+ toName: 'data',
243
+ config: {
244
+ labels
245
+ }
246
+ },
247
+ {
248
+ type: 'labels',
249
+ name: 'label',
250
+ toName: 'data',
251
+ config: {
252
+ labels: labels.map(l => ({ value: l }))
253
+ }
254
+ }
255
+ ]
256
+ };
257
+ }
258
+ /**
259
+ * Semantic segmentation
260
+ */
261
+ static semanticSegmentation(labels) {
262
+ return {
263
+ dataType: 'image',
264
+ controls: [
265
+ {
266
+ type: 'brush',
267
+ name: 'segmentation',
268
+ toName: 'data',
269
+ config: {
270
+ labels
271
+ }
272
+ },
273
+ {
274
+ type: 'labels',
275
+ name: 'label',
276
+ toName: 'data',
277
+ config: {
278
+ labels: labels.map(l => ({ value: l }))
279
+ }
280
+ }
281
+ ]
282
+ };
283
+ }
284
+ }
285
+ exports.LabelConfigTemplates = LabelConfigTemplates;
286
+ //# sourceMappingURL=label-config-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-config-builder.js","sourceRoot":"","sources":["../../server/utils/label-config-builder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Label Config Builder\n *\n * Flexible, declarative Label Studio configuration generator.\n * Supports any data type and control combination without hardcoding templates.\n */\n\nexport interface LabelConfigSpec {\n dataType: 'image' | 'text' | 'audio' | 'video' | 'timeseries' | 'html' | 'hypertext'\n dataName?: string // default: 'data'\n controls: ControlSpec[]\n}\n\nexport interface ControlSpec {\n type: 'choices' | 'labels' | 'textarea' | 'rating' | 'rectangles' | 'polygon' | 'keypoint' | 'brush'\n name: string\n toName: string\n config: any\n}\n\nexport interface ChoicesConfig {\n choices: string[]\n choice?: 'single' | 'multiple'\n required?: boolean\n}\n\nexport interface LabelsConfig {\n labels: Array<{\n value: string\n background?: string\n hotkey?: string\n }>\n}\n\nexport interface RatingConfig {\n maxRating?: number\n icon?: string\n size?: 'small' | 'medium' | 'large'\n}\n\nexport class LabelConfigBuilder {\n /**\n * Build Label Studio XML configuration from specification\n */\n static build(spec: LabelConfigSpec): string {\n const dataName = spec.dataName || 'data'\n const dataTag = this.buildDataTag(spec.dataType, dataName)\n const controlTags = spec.controls.map(c => this.buildControlTag(c))\n\n return `\n<View>\n ${dataTag}\n ${controlTags.join('\\n ')}\n</View>\n `.trim()\n }\n\n /**\n * Build data source tag (Image, Text, Audio, etc.)\n */\n private static buildDataTag(type: string, name: string): string {\n const capitalizedType = type.charAt(0).toUpperCase() + type.slice(1)\n return `<${capitalizedType} name=\"${name}\" value=\"$${name}\"/>`\n }\n\n /**\n * Build control tag based on type\n */\n private static buildControlTag(control: ControlSpec): string {\n switch (control.type) {\n case 'choices':\n return this.buildChoices(control)\n case 'labels':\n return this.buildLabels(control)\n case 'textarea':\n return this.buildTextArea(control)\n case 'rating':\n return this.buildRating(control)\n case 'rectangles':\n return this.buildRectangles(control)\n case 'polygon':\n return this.buildPolygon(control)\n case 'keypoint':\n return this.buildKeypoint(control)\n case 'brush':\n return this.buildBrush(control)\n default:\n throw new Error(`Unknown control type: ${control.type}`)\n }\n }\n\n /**\n * Build Choices control (single or multiple selection)\n */\n private static buildChoices(control: ControlSpec): string {\n const config = control.config as ChoicesConfig\n const choice = config.choice || 'single'\n const required = config.required ? 'required=\"true\"' : ''\n\n const choiceElements = config.choices\n .map(c => ` <Choice value=\"${this.escapeXml(c)}\"/>`)\n .join('\\n')\n\n return `<Choices name=\"${control.name}\" toName=\"${control.toName}\" choice=\"${choice}\" ${required}>\n${choiceElements}\n </Choices>`\n }\n\n /**\n * Build Labels control (for NER, classification, etc.)\n */\n private static buildLabels(control: ControlSpec): string {\n const config = control.config as LabelsConfig\n\n const labelElements = config.labels\n .map(l => {\n const background = l.background ? `background=\"${l.background}\"` : ''\n const hotkey = l.hotkey ? `hotkey=\"${l.hotkey}\"` : ''\n return ` <Label value=\"${this.escapeXml(l.value)}\" ${background} ${hotkey}/>`\n })\n .join('\\n')\n\n return `<Labels name=\"${control.name}\" toName=\"${control.toName}\">\n${labelElements}\n </Labels>`\n }\n\n /**\n * Build TextArea control\n */\n private static buildTextArea(control: ControlSpec): string {\n const placeholder = control.config.placeholder ? `placeholder=\"${control.config.placeholder}\"` : ''\n const required = control.config.required ? 'required=\"true\"' : ''\n const maxSubmissions = control.config.maxSubmissions ? `maxSubmissions=\"${control.config.maxSubmissions}\"` : ''\n\n return `<TextArea name=\"${control.name}\" toName=\"${control.toName}\" ${placeholder} ${required} ${maxSubmissions}/>`\n }\n\n /**\n * Build Rating control\n */\n private static buildRating(control: ControlSpec): string {\n const config = control.config as RatingConfig\n const maxRating = config.maxRating || 5\n const icon = config.icon || 'star'\n const size = config.size || 'medium'\n\n return `<Rating name=\"${control.name}\" toName=\"${control.toName}\" maxRating=\"${maxRating}\" icon=\"${icon}\" size=\"${size}\"/>`\n }\n\n /**\n * Build Rectangle control (bounding boxes)\n */\n private static buildRectangles(control: ControlSpec): string {\n const labels = control.config.labels ? `labels=\"${control.config.labels.join(',')}\"` : ''\n return `<Rectangle name=\"${control.name}\" toName=\"${control.toName}\" ${labels}/>`\n }\n\n /**\n * Build Polygon control\n */\n private static buildPolygon(control: ControlSpec): string {\n const labels = control.config.labels ? `labels=\"${control.config.labels.join(',')}\"` : ''\n return `<Polygon name=\"${control.name}\" toName=\"${control.toName}\" ${labels}/>`\n }\n\n /**\n * Build Keypoint control\n */\n private static buildKeypoint(control: ControlSpec): string {\n const labels = control.config.labels ? `labels=\"${control.config.labels.join(',')}\"` : ''\n return `<KeyPoint name=\"${control.name}\" toName=\"${control.toName}\" ${labels}/>`\n }\n\n /**\n * Build Brush control (semantic segmentation)\n */\n private static buildBrush(control: ControlSpec): string {\n const labels = control.config.labels ? `labels=\"${control.config.labels.join(',')}\"` : ''\n return `<Brush name=\"${control.name}\" toName=\"${control.toName}\" ${labels}/>`\n }\n\n /**\n * Escape XML special characters\n */\n private static escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n }\n}\n\n/**\n * Pre-built template generators for common use cases\n */\nexport class LabelConfigTemplates {\n /**\n * Generate Rank N image classification config\n * Example: WBM Rank 3 classification\n */\n static imageRankN(ranks: number, classes: string[]): LabelConfigSpec {\n const controls: ControlSpec[] = []\n\n for (let i = 1; i <= ranks; i++) {\n controls.push({\n type: 'choices',\n name: `rank${i}`,\n toName: 'data',\n config: {\n choices: classes,\n choice: 'single',\n required: i === 1 // First rank is required\n }\n })\n }\n\n return {\n dataType: 'image',\n controls\n }\n }\n\n /**\n * Simple image classification\n */\n static imageClassification(classes: string[], multiLabel: boolean = false): LabelConfigSpec {\n return {\n dataType: 'image',\n controls: [\n {\n type: 'choices',\n name: 'choice',\n toName: 'data',\n config: {\n choices: classes,\n choice: multiLabel ? 'multiple' : 'single',\n required: true\n }\n }\n ]\n }\n }\n\n /**\n * Text classification (sentiment, intent, etc.)\n */\n static textClassification(classes: string[]): LabelConfigSpec {\n return {\n dataType: 'text',\n controls: [\n {\n type: 'choices',\n name: 'choice',\n toName: 'data',\n config: {\n choices: classes,\n choice: 'single',\n required: true\n }\n }\n ]\n }\n }\n\n /**\n * Named Entity Recognition\n */\n static namedEntityRecognition(labels: Array<{ value: string; background: string }>): LabelConfigSpec {\n return {\n dataType: 'text',\n controls: [\n {\n type: 'labels',\n name: 'label',\n toName: 'data',\n config: {\n labels\n }\n }\n ]\n }\n }\n\n /**\n * Object detection (bounding boxes)\n */\n static objectDetection(labels: string[]): LabelConfigSpec {\n return {\n dataType: 'image',\n controls: [\n {\n type: 'rectangles',\n name: 'bbox',\n toName: 'data',\n config: {\n labels\n }\n },\n {\n type: 'labels',\n name: 'label',\n toName: 'data',\n config: {\n labels: labels.map(l => ({ value: l }))\n }\n }\n ]\n }\n }\n\n /**\n * Semantic segmentation\n */\n static semanticSegmentation(labels: string[]): LabelConfigSpec {\n return {\n dataType: 'image',\n controls: [\n {\n type: 'brush',\n name: 'segmentation',\n toName: 'data',\n config: {\n labels\n }\n },\n {\n type: 'labels',\n name: 'label',\n toName: 'data',\n config: {\n labels: labels.map(l => ({ value: l }))\n }\n }\n ]\n }\n }\n}\n"]}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Label Studio API Client
3
+ * Provides methods to interact with Label Studio REST API
4
+ */
5
+ export declare class LabelStudioApiClient {
6
+ private client;
7
+ private serverUrl;
8
+ private apiToken;
9
+ constructor();
10
+ private ensureInitialized;
11
+ /**
12
+ * Get all projects
13
+ */
14
+ getProjects(): Promise<any[]>;
15
+ /**
16
+ * Get project by ID
17
+ */
18
+ getProject(projectId: number): Promise<any>;
19
+ /**
20
+ * Create new project
21
+ */
22
+ createProject(data: {
23
+ title: string;
24
+ description?: string;
25
+ label_config: string;
26
+ expert_instruction?: string;
27
+ }): Promise<any>;
28
+ /**
29
+ * Update project
30
+ */
31
+ updateProject(projectId: number, data: any): Promise<any>;
32
+ /**
33
+ * Delete project
34
+ */
35
+ deleteProject(projectId: number): Promise<void>;
36
+ /**
37
+ * Get tasks for a project
38
+ */
39
+ getTasks(projectId: number, params?: {
40
+ page?: number;
41
+ page_size?: number;
42
+ }): Promise<any>;
43
+ /**
44
+ * Get single task
45
+ */
46
+ getTask(taskId: number): Promise<any>;
47
+ /**
48
+ * Create task
49
+ */
50
+ createTask(projectId: number, data: any): Promise<any>;
51
+ /**
52
+ * Import tasks in bulk
53
+ */
54
+ importTasks(projectId: number, tasks: any[]): Promise<any>;
55
+ /**
56
+ * Delete task
57
+ */
58
+ deleteTask(taskId: number): Promise<void>;
59
+ /**
60
+ * Get annotations for a task
61
+ */
62
+ getAnnotations(taskId: number): Promise<any[]>;
63
+ /**
64
+ * Create annotation
65
+ */
66
+ createAnnotation(taskId: number, annotation: any): Promise<any>;
67
+ /**
68
+ * Update annotation
69
+ */
70
+ updateAnnotation(annotationId: number, data: any): Promise<any>;
71
+ /**
72
+ * Delete annotation
73
+ */
74
+ deleteAnnotation(annotationId: number): Promise<void>;
75
+ /**
76
+ * Get all predictions for a task
77
+ */
78
+ getPredictions(taskId: number): Promise<any[]>;
79
+ /**
80
+ * Get predictions for a project
81
+ */
82
+ getProjectPredictions(projectId: number): Promise<any[]>;
83
+ /**
84
+ * Get single prediction by ID
85
+ */
86
+ getPrediction(predictionId: number): Promise<any>;
87
+ /**
88
+ * Create a prediction for a task
89
+ */
90
+ createPrediction(data: {
91
+ task: number;
92
+ result: any[];
93
+ score?: number;
94
+ model_version?: string;
95
+ }): Promise<any>;
96
+ /**
97
+ * Create predictions in bulk
98
+ */
99
+ createPredictions(predictions: Array<{
100
+ task: number;
101
+ result: any[];
102
+ score?: number;
103
+ model_version?: string;
104
+ }>): Promise<any>;
105
+ /**
106
+ * Update prediction
107
+ */
108
+ updatePrediction(predictionId: number, data: any): Promise<any>;
109
+ /**
110
+ * Delete prediction
111
+ */
112
+ deletePrediction(predictionId: number): Promise<void>;
113
+ /**
114
+ * Import predictions for a project
115
+ * This is useful for bulk importing AI model predictions
116
+ */
117
+ importPredictions(projectId: number, predictions: any[]): Promise<any>;
118
+ /**
119
+ * Export annotations
120
+ */
121
+ exportAnnotations(projectId: number, format?: 'JSON' | 'JSON_MIN' | 'CSV' | 'TSV' | 'CONLL2003' | 'COCO' | 'VOC' | 'YOLO'): Promise<any>;
122
+ /**
123
+ * Get export files
124
+ */
125
+ getExportFiles(projectId: number): Promise<any[]>;
126
+ /**
127
+ * Get ML backends for project
128
+ */
129
+ getMLBackends(projectId: number): Promise<any[]>;
130
+ /**
131
+ * Add ML backend to project
132
+ */
133
+ addMLBackend(data: {
134
+ project: number;
135
+ url: string;
136
+ title: string;
137
+ is_interactive?: boolean;
138
+ }): Promise<any>;
139
+ /**
140
+ * Delete ML backend
141
+ */
142
+ deleteMLBackend(mlBackendId: number): Promise<void>;
143
+ /**
144
+ * Trigger predictions for tasks
145
+ */
146
+ triggerPredictions(projectId: number, taskIds?: number[]): Promise<any>;
147
+ /**
148
+ * Train ML model
149
+ */
150
+ trainModel(mlBackendId: number): Promise<any>;
151
+ /**
152
+ * Get project statistics
153
+ */
154
+ getProjectStats(projectId: number): Promise<any>;
155
+ /**
156
+ * Get annotator statistics
157
+ */
158
+ getAnnotatorStats(projectId: number): Promise<any[]>;
159
+ /**
160
+ * Create webhook
161
+ */
162
+ createWebhook(data: {
163
+ project: number;
164
+ url: string;
165
+ send_payload?: boolean;
166
+ send_for_all_actions?: boolean;
167
+ headers?: {
168
+ [key: string]: string;
169
+ };
170
+ }): Promise<any>;
171
+ /**
172
+ * Get webhooks for project
173
+ */
174
+ getWebhooks(projectId: number): Promise<any[]>;
175
+ /**
176
+ * Delete webhook
177
+ */
178
+ deleteWebhook(webhookId: number): Promise<void>;
179
+ }
180
+ export declare const labelStudioApi: LabelStudioApiClient;