@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.
- package/CHANGELOG.md +85 -0
- package/EXTERNAL_DATA_SOURCING.md +484 -0
- package/IMPLEMENTATION_GUIDE.md +469 -0
- package/INTEGRATION.md +279 -0
- package/README.md +1014 -0
- package/SETUP_GUIDE.md +577 -0
- package/TEST_GUIDE.md +387 -0
- package/UI_CUSTOMIZATION.md +395 -0
- package/USER_SYNC_GUIDE.md +514 -0
- package/client/bootstrap.ts +1 -0
- package/client/index.ts +1 -0
- package/client/label-studio-label-page.ts +52 -0
- package/client/label-studio-project-create.ts +216 -0
- package/client/label-studio-project-list.ts +214 -0
- package/client/label-studio-wrapper.ts +294 -0
- package/client/route.ts +15 -0
- package/client/tsconfig.json +13 -0
- package/config/config.development.js +124 -0
- package/config/config.production.js +182 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +2 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/label-studio-label-page.d.ts +8 -0
- package/dist-client/label-studio-label-page.js +54 -0
- package/dist-client/label-studio-label-page.js.map +1 -0
- package/dist-client/label-studio-project-create.d.ts +16 -0
- package/dist-client/label-studio-project-create.js +235 -0
- package/dist-client/label-studio-project-create.js.map +1 -0
- package/dist-client/label-studio-project-list.d.ts +16 -0
- package/dist-client/label-studio-project-list.js +222 -0
- package/dist-client/label-studio-project-list.js.map +1 -0
- package/dist-client/label-studio-wrapper.d.ts +57 -0
- package/dist-client/label-studio-wrapper.js +304 -0
- package/dist-client/label-studio-wrapper.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +14 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/controller/label-studio-role-mapper.d.ts +35 -0
- package/dist-server/controller/label-studio-role-mapper.js +65 -0
- package/dist-server/controller/label-studio-role-mapper.js.map +1 -0
- package/dist-server/controller/user-provisioning-service.d.ts +66 -0
- package/dist-server/controller/user-provisioning-service.js +264 -0
- package/dist-server/controller/user-provisioning-service.js.map +1 -0
- package/dist-server/index.d.ts +7 -0
- package/dist-server/index.js +19 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/route/label-studio-sso.d.ts +2 -0
- package/dist-server/route/label-studio-sso.js +156 -0
- package/dist-server/route/label-studio-sso.js.map +1 -0
- package/dist-server/route/webhook.d.ts +65 -0
- package/dist-server/route/webhook.js +248 -0
- package/dist-server/route/webhook.js.map +1 -0
- package/dist-server/route.d.ts +1 -0
- package/dist-server/route.js +21 -0
- package/dist-server/route.js.map +1 -0
- package/dist-server/service/ai-prediction-service.d.ts +27 -0
- package/dist-server/service/ai-prediction-service.js +222 -0
- package/dist-server/service/ai-prediction-service.js.map +1 -0
- package/dist-server/service/dataset-labeling-integration.d.ts +44 -0
- package/dist-server/service/dataset-labeling-integration.js +512 -0
- package/dist-server/service/dataset-labeling-integration.js.map +1 -0
- package/dist-server/service/external-data-source-service.d.ts +78 -0
- package/dist-server/service/external-data-source-service.js +415 -0
- package/dist-server/service/external-data-source-service.js.map +1 -0
- package/dist-server/service/index.d.ts +12 -0
- package/dist-server/service/index.js +27 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/label-studio-sso-service.d.ts +38 -0
- package/dist-server/service/label-studio-sso-service.js +98 -0
- package/dist-server/service/label-studio-sso-service.js.map +1 -0
- package/dist-server/service/ml/ml-backend-service.d.ts +23 -0
- package/dist-server/service/ml/ml-backend-service.js +153 -0
- package/dist-server/service/ml/ml-backend-service.js.map +1 -0
- package/dist-server/service/prediction/prediction-management.d.ts +32 -0
- package/dist-server/service/prediction/prediction-management.js +299 -0
- package/dist-server/service/prediction/prediction-management.js.map +1 -0
- package/dist-server/service/project/project-management.d.ts +36 -0
- package/dist-server/service/project/project-management.js +309 -0
- package/dist-server/service/project/project-management.js.map +1 -0
- package/dist-server/service/task/task-management.d.ts +42 -0
- package/dist-server/service/task/task-management.js +372 -0
- package/dist-server/service/task/task-management.js.map +1 -0
- package/dist-server/service/user-provisioning/user-sync-mutation.d.ts +28 -0
- package/dist-server/service/user-provisioning/user-sync-mutation.js +111 -0
- package/dist-server/service/user-provisioning/user-sync-mutation.js.map +1 -0
- package/dist-server/service/webhook/webhook-management.d.ts +21 -0
- package/dist-server/service/webhook/webhook-management.js +134 -0
- package/dist-server/service/webhook/webhook-management.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/dist-server/types/dataset-labeling-types.d.ts +71 -0
- package/dist-server/types/dataset-labeling-types.js +259 -0
- package/dist-server/types/dataset-labeling-types.js.map +1 -0
- package/dist-server/types/label-studio-types.d.ts +128 -0
- package/dist-server/types/label-studio-types.js +494 -0
- package/dist-server/types/label-studio-types.js.map +1 -0
- package/dist-server/types/prediction-types.d.ts +39 -0
- package/dist-server/types/prediction-types.js +121 -0
- package/dist-server/types/prediction-types.js.map +1 -0
- package/dist-server/utils/annotation-exporter.d.ts +104 -0
- package/dist-server/utils/annotation-exporter.js +261 -0
- package/dist-server/utils/annotation-exporter.js.map +1 -0
- package/dist-server/utils/label-config-builder.d.ts +117 -0
- package/dist-server/utils/label-config-builder.js +286 -0
- package/dist-server/utils/label-config-builder.js.map +1 -0
- package/dist-server/utils/label-studio-api-client.d.ts +180 -0
- package/dist-server/utils/label-studio-api-client.js +401 -0
- package/dist-server/utils/label-studio-api-client.js.map +1 -0
- package/dist-server/utils/media-url-extractor.d.ts +45 -0
- package/dist-server/utils/media-url-extractor.js +152 -0
- package/dist-server/utils/media-url-extractor.js.map +1 -0
- package/dist-server/utils/task-transformer.d.ts +108 -0
- package/dist-server/utils/task-transformer.js +260 -0
- package/dist-server/utils/task-transformer.js.map +1 -0
- package/package.json +47 -0
- package/server/SERVER_STRUCTURE.md +351 -0
- package/server/controller/label-studio-role-mapper.ts +76 -0
- package/server/controller/user-provisioning-service.ts +340 -0
- package/server/index.ts +19 -0
- package/server/route/label-studio-sso.ts +194 -0
- package/server/route/webhook.ts +304 -0
- package/server/route.ts +35 -0
- package/server/service/ai-prediction-service.ts +239 -0
- package/server/service/dataset-labeling-integration.ts +590 -0
- package/server/service/external-data-source-service.ts +438 -0
- package/server/service/index.ts +24 -0
- package/server/service/label-studio-sso-service.ts +108 -0
- package/server/service/labeling-scenario-service.ts.deprecated +566 -0
- package/server/service/ml/ml-backend-service.ts +127 -0
- package/server/service/prediction/prediction-management.ts +281 -0
- package/server/service/project/project-management.ts +284 -0
- package/server/service/task/task-management.ts +363 -0
- package/server/service/user-provisioning/user-sync-mutation.ts +80 -0
- package/server/service/webhook/webhook-management.ts +109 -0
- package/server/tsconfig.json +11 -0
- package/server/types/dataset-labeling-types.ts +181 -0
- package/server/types/global.d.ts +23 -0
- package/server/types/label-studio-types.ts +346 -0
- package/server/types/prediction-types.ts +86 -0
- package/server/types/scenario-types.ts.deprecated +362 -0
- package/server/utils/annotation-exporter.ts +340 -0
- package/server/utils/label-config-builder.ts +340 -0
- package/server/utils/label-studio-api-client.ts +487 -0
- package/server/utils/media-url-extractor.ts +193 -0
- package/server/utils/task-transformer.ts +342 -0
- package/test-ai-prediction.js +268 -0
- package/test-dataset-integration.js +449 -0
- package/test-simple.js +89 -0
- package/things-factory.config.js +12 -0
package/INTEGRATION.md
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# Label Studio Integration Guide
|
|
2
|
+
|
|
3
|
+
This document explains how to integrate Label Studio with Things Factory using subdomain-based cookie sharing for SSO authentication.
|
|
4
|
+
|
|
5
|
+
## Architecture Overview
|
|
6
|
+
|
|
7
|
+
The integration uses **subdomain cookie sharing** instead of proxying, which simplifies deployment and improves performance.
|
|
8
|
+
|
|
9
|
+
### Flow Diagram
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
13
|
+
│ 1. Frontend calls SSO setup endpoint │
|
|
14
|
+
│ GET /label-studio/sso/setup │
|
|
15
|
+
│ Credentials: include │
|
|
16
|
+
└────────────────────┬────────────────────────────────────────────┘
|
|
17
|
+
│
|
|
18
|
+
▼
|
|
19
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
20
|
+
│ 2. Backend requests JWT from Label Studio │
|
|
21
|
+
│ POST http://label.example.com:8080/api/sso/token │
|
|
22
|
+
│ Authorization: Token {apiToken} │
|
|
23
|
+
│ Body: { email: "user@example.com" } │
|
|
24
|
+
└────────────────────┬────────────────────────────────────────────┘
|
|
25
|
+
│
|
|
26
|
+
▼
|
|
27
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
28
|
+
│ 3. Backend sets cookie with shared domain │
|
|
29
|
+
│ Set-Cookie: ls_auth_token={jwt} │
|
|
30
|
+
│ Domain: .example.com ← Shared across all *.example.com │
|
|
31
|
+
│ Path: / │
|
|
32
|
+
│ SameSite: Lax │
|
|
33
|
+
└────────────────────┬────────────────────────────────────────────┘
|
|
34
|
+
│
|
|
35
|
+
▼
|
|
36
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
37
|
+
│ 4. Frontend loads Label Studio in iframe │
|
|
38
|
+
│ <iframe src="http://label.example.com:8080/projects/1"> │
|
|
39
|
+
│ Cookie is automatically sent with request │
|
|
40
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
### 1. Domain Setup
|
|
46
|
+
|
|
47
|
+
Both Things Factory and Label Studio must be accessible via subdomain pattern:
|
|
48
|
+
|
|
49
|
+
**Development (localhost):**
|
|
50
|
+
```
|
|
51
|
+
Things Factory: http://app.dataset.localhost:3000
|
|
52
|
+
Label Studio: http://label.dataset.localhost:8080
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Production:**
|
|
56
|
+
```
|
|
57
|
+
Things Factory: https://app.example.com
|
|
58
|
+
Label Studio: https://label.example.com
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Important:** Modern browsers automatically resolve `*.localhost` to `127.0.0.1`, so no `/etc/hosts` modification is needed for development.
|
|
62
|
+
|
|
63
|
+
### 2. Label Studio Configuration
|
|
64
|
+
|
|
65
|
+
Create or update `.env` file in Label Studio installation:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# JWT SSO Settings
|
|
69
|
+
JWT_SSO_SECRET=your-secret-key-here
|
|
70
|
+
JWT_SSO_ALGORITHM=HS256
|
|
71
|
+
JWT_SSO_TOKEN_PARAM=token
|
|
72
|
+
JWT_SSO_EMAIL_CLAIM=email
|
|
73
|
+
JWT_SSO_USERNAME_CLAIM=username
|
|
74
|
+
JWT_SSO_FIRST_NAME_CLAIM=first_name
|
|
75
|
+
JWT_SSO_LAST_NAME_CLAIM=last_name
|
|
76
|
+
JWT_SSO_AUTO_CREATE_USERS=true
|
|
77
|
+
JWT_SSO_COOKIE_NAME=ls_auth_token
|
|
78
|
+
|
|
79
|
+
# CORS and CSRF Settings
|
|
80
|
+
CSRF_TRUSTED_ORIGINS=http://app.dataset.localhost:3000,http://label.dataset.localhost:8080
|
|
81
|
+
ALLOWED_HOSTS=localhost,label.dataset.localhost,*.dataset.localhost
|
|
82
|
+
|
|
83
|
+
# CSP Settings - Allow iframe embedding
|
|
84
|
+
ENABLE_CSP=False
|
|
85
|
+
|
|
86
|
+
# Session Settings
|
|
87
|
+
SESSION_COOKIE_SAMESITE=Lax
|
|
88
|
+
SESSION_COOKIE_SECURE=0 # Set to 1 for HTTPS
|
|
89
|
+
SESSION_COOKIE_HTTPONLY=0
|
|
90
|
+
SESSION_COOKIE_PATH=/
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Things Factory Configuration
|
|
94
|
+
|
|
95
|
+
Add Label Studio configuration to your Things Factory config file:
|
|
96
|
+
|
|
97
|
+
**config/default.json:**
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"labelStudio": {
|
|
101
|
+
"serverUrl": "http://label.dataset.localhost:8080",
|
|
102
|
+
"apiToken": "your-label-studio-api-token",
|
|
103
|
+
"cookieDomain": ".dataset.localhost"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**config/production.json:**
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"labelStudio": {
|
|
112
|
+
"serverUrl": "https://label.example.com",
|
|
113
|
+
"apiToken": "your-label-studio-api-token",
|
|
114
|
+
"cookieDomain": ".example.com"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 4. Get Label Studio API Token
|
|
120
|
+
|
|
121
|
+
1. Start Label Studio and login as admin
|
|
122
|
+
2. Navigate to **Account & Settings** → **Access Token**
|
|
123
|
+
3. Click **Create new token**
|
|
124
|
+
4. Copy the token and add it to Things Factory configuration
|
|
125
|
+
|
|
126
|
+
## Usage
|
|
127
|
+
|
|
128
|
+
### Embedding Label Studio
|
|
129
|
+
|
|
130
|
+
Use the `<label-studio-wrapper>` component to embed Label Studio:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import '@things-factory/integration-label-studio/client'
|
|
134
|
+
|
|
135
|
+
// In your component
|
|
136
|
+
render() {
|
|
137
|
+
const projectId = 123
|
|
138
|
+
const path = `/projects/${projectId}`
|
|
139
|
+
|
|
140
|
+
return html`
|
|
141
|
+
<label-studio-wrapper .path=${path}></label-studio-wrapper>
|
|
142
|
+
`
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### API Endpoints
|
|
147
|
+
|
|
148
|
+
The integration provides the following endpoints:
|
|
149
|
+
|
|
150
|
+
**SSO Setup:**
|
|
151
|
+
```
|
|
152
|
+
GET /label-studio/sso/setup
|
|
153
|
+
```
|
|
154
|
+
Sets up SSO authentication by acquiring JWT token and setting cookie.
|
|
155
|
+
|
|
156
|
+
**Health Check:**
|
|
157
|
+
```
|
|
158
|
+
GET /label-studio/sso/health
|
|
159
|
+
```
|
|
160
|
+
Returns Label Studio integration status.
|
|
161
|
+
|
|
162
|
+
**Configuration:**
|
|
163
|
+
```
|
|
164
|
+
GET /label-studio/sso/config
|
|
165
|
+
```
|
|
166
|
+
Returns current Label Studio configuration.
|
|
167
|
+
|
|
168
|
+
## Development Setup
|
|
169
|
+
|
|
170
|
+
### 1. Start Label Studio
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
cd /path/to/label-studio
|
|
174
|
+
label-studio start --host label.dataset.localhost --port 8080
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 2. Start Things Factory
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cd /path/to/things-factory
|
|
181
|
+
DEBUG=things-factory:* yarn workspace @things-factory/your-app run serve:dev
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 3. Access Application
|
|
185
|
+
|
|
186
|
+
Open browser to:
|
|
187
|
+
```
|
|
188
|
+
http://app.dataset.localhost:3000
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Troubleshooting
|
|
192
|
+
|
|
193
|
+
### Cookie Not Set
|
|
194
|
+
|
|
195
|
+
**Symptom:** SSO setup succeeds but cookie doesn't appear in browser
|
|
196
|
+
|
|
197
|
+
**Solutions:**
|
|
198
|
+
1. Verify `cookieDomain` in Things Factory config matches your domain pattern
|
|
199
|
+
2. Check Label Studio `ALLOWED_HOSTS` includes your subdomain
|
|
200
|
+
3. Ensure both services use same root domain (e.g., both use `*.dataset.localhost`)
|
|
201
|
+
|
|
202
|
+
### CORS Errors
|
|
203
|
+
|
|
204
|
+
**Symptom:** Browser blocks requests with CORS errors
|
|
205
|
+
|
|
206
|
+
**Solutions:**
|
|
207
|
+
1. Add Things Factory domain to Label Studio's `CSRF_TRUSTED_ORIGINS`
|
|
208
|
+
2. Verify `ALLOWED_HOSTS` includes all subdomain patterns
|
|
209
|
+
3. Check `ENABLE_CSP=False` in Label Studio configuration
|
|
210
|
+
|
|
211
|
+
### Authentication Loop
|
|
212
|
+
|
|
213
|
+
**Symptom:** Label Studio keeps showing login page
|
|
214
|
+
|
|
215
|
+
**Solutions:**
|
|
216
|
+
1. Verify JWT SSO settings in Label Studio `.env`
|
|
217
|
+
2. Check cookie is being sent with iframe requests (browser DevTools → Network)
|
|
218
|
+
3. Ensure `JWT_SSO_COOKIE_NAME=ls_auth_token` matches implementation
|
|
219
|
+
|
|
220
|
+
### Token Expiration
|
|
221
|
+
|
|
222
|
+
**Symptom:** Users get logged out after 10 minutes
|
|
223
|
+
|
|
224
|
+
**Solution:**
|
|
225
|
+
Label Studio JWT tokens expire after 600 seconds (10 minutes) by default. The integration automatically handles re-authentication on page refresh.
|
|
226
|
+
|
|
227
|
+
## Security Considerations
|
|
228
|
+
|
|
229
|
+
### Production Checklist
|
|
230
|
+
|
|
231
|
+
- ✅ Use HTTPS for all services
|
|
232
|
+
- ✅ Set `SESSION_COOKIE_SECURE=1` in Label Studio
|
|
233
|
+
- ✅ Set `httpOnly: true` in SSO route cookie options
|
|
234
|
+
- ✅ Use strong `JWT_SSO_SECRET`
|
|
235
|
+
- ✅ Limit `ALLOWED_HOSTS` to specific domains
|
|
236
|
+
- ✅ Enable CSRF protection
|
|
237
|
+
- ✅ Use firewall rules to restrict Label Studio access
|
|
238
|
+
|
|
239
|
+
### Cookie Domain Best Practices
|
|
240
|
+
|
|
241
|
+
**Do:**
|
|
242
|
+
- Use `.example.com` for sharing across all subdomains
|
|
243
|
+
- Use specific subdomain pattern for restricted access
|
|
244
|
+
|
|
245
|
+
**Don't:**
|
|
246
|
+
- Use `.localhost` (it's a Public Suffix, browsers block it)
|
|
247
|
+
- Use broad TLDs like `.com` (browsers will reject it)
|
|
248
|
+
|
|
249
|
+
## Migration from Proxy Approach
|
|
250
|
+
|
|
251
|
+
If you're migrating from the previous proxy-based integration:
|
|
252
|
+
|
|
253
|
+
### Changes Required
|
|
254
|
+
|
|
255
|
+
1. **Configuration:**
|
|
256
|
+
- Add `cookieDomain` to Label Studio config
|
|
257
|
+
- Update Label Studio `.env` with CORS settings
|
|
258
|
+
|
|
259
|
+
2. **Frontend:**
|
|
260
|
+
- No changes needed - component interface remains the same
|
|
261
|
+
- Iframe URLs now point directly to Label Studio (not proxied)
|
|
262
|
+
|
|
263
|
+
3. **Nginx/Proxy:**
|
|
264
|
+
- Remove proxy rules for `/label-studio/*` paths
|
|
265
|
+
- Label Studio should be directly accessible on its subdomain
|
|
266
|
+
|
|
267
|
+
### Benefits of Subdomain Approach
|
|
268
|
+
|
|
269
|
+
- ✅ **Simpler deployment** - No complex proxy configuration
|
|
270
|
+
- ✅ **Better performance** - No proxy overhead
|
|
271
|
+
- ✅ **Easier debugging** - Direct access to Label Studio
|
|
272
|
+
- ✅ **Standard approach** - Follows common SSO patterns
|
|
273
|
+
- ✅ **Better caching** - Browser can cache Label Studio assets
|
|
274
|
+
|
|
275
|
+
## References
|
|
276
|
+
|
|
277
|
+
- [Label Studio SSO Documentation](https://labelstud.io/guide/auth_setup.html#JWT-SSO)
|
|
278
|
+
- [Cookie Domain Specification](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent)
|
|
279
|
+
- [Public Suffix List](https://publicsuffix.org/)
|