Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when SynthLabs dataset curation should run as repeatable background HTTP jobs instead of manual UI work.
.claude/skills/mkurman-synthlabs-curation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 1802% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 98% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 327% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 203% | 0% |
Use this skill for SynthLabs dataset curation that runs through existing HTTP job routes instead of manual UI-first work. This is workflow guidance for an external app; do not assume zorai exposes dedicated SynthLabs tools.
Use this skill when:
Do not use this skill when:
synthlabs-setup still needs to start or repair it.jobId, then poll until it reaches completed or failed.apiKey value.synthlabs-ui-operator.GET /api/jobs or session state so you do not start duplicate jobs.GET /api/jobs/:id until the job is completed or failed.progress, result, and error fields before declaring success.synthlabs-ui-operator instead of continuing in blind HTTP mode.List recent jobs, optionally filtered by type or status:
bashcurl -fsS "http://localhost:8787/api/jobs?type=rewrite&status=running&limit=20"
Fetch the full state of one job after start:
bashcurl -fsS "http://localhost:8787/api/jobs/job_123"
Prefer GET /api/jobs/:id once you have a jobId; use GET /api/jobs for discovery, queue visibility, or to confirm whether a similar run is already active.
POST /api/jobs/autoscoreUse autoscore when a session's items need model-based 1-5 scoring.
bashcurl -fsS -X POST "http://localhost:8787/api/jobs/autoscore" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "session_abc", "provider": "openai", "model": "gpt-4.1-mini", "baseUrl": "https://api.openai.com/v1", "apiKey": "<encrypted iv:ciphertext value>", "limit": 100, "offset": 0, "concurrency": 1, "maxRetries": 2, "retryDelay": 2000, "sleepMs": 500, "force": false }'
POST /api/jobs/rewriteUse rewrite when the backend should improve query, reasoning, or answer fields in place.
bashcurl -fsS -X POST "http://localhost:8787/api/jobs/rewrite" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "session_abc", "provider": "openai", "model": "gpt-4.1-mini", "baseUrl": "https://api.openai.com/v1", "apiKey": "<encrypted iv:ciphertext value>", "fields": ["reasoning", "answer"], "limit": 50, "concurrency": 1, "sleepMs": 500 }'
Autoscore and rewrite both call the SynthLabs AI client and decrypt the submitted apiKey. Use an encrypted value compatible with the backend's VITE_API_KEY_SALT or API_KEY_SALT behavior. Do not send a plaintext provider key and do not invent your own encryption flow.
POST /api/jobs/remove-itemsUse remove-items for deterministic cleanup. This route does not need model credentials.
Dry-run a threshold cleanup first:
bashcurl -fsS -X POST "http://localhost:8787/api/jobs/remove-items" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "session_abc", "scoreThreshold": 3, "scoreField": "score", "dryRun": true }'
The route accepts exactly one removal method: indices or scoreThreshold, never both.
POST /api/jobs/migrate-reasoningUse migrate-reasoning to move assistant <think> content into reasoning_content fields for a session. This route does not need model credentials.
bashcurl -fsS -X POST "http://localhost:8787/api/jobs/migrate-reasoning" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "session_abc", "limit": 200, "offset": 0, "concurrency": 5, "sleepMs": 100, "force": false }'
GET /api/logs/stats for log-level summaries before or after a curation pass.bashcurl -fsS "http://localhost:8787/api/logs/stats?sessionUid=session_abc"
GET /api/tags, POST /api/tags, DELETE /api/tags/:uid, GET /api/sessions/:sessionUid/tags, POST /api/sessions/:sessionUid/tags, and DELETE /api/sessions/:sessionUid/tags.POST /api/orphans/check when you need a background scan for orphaned logs.bashcurl -fsS -X POST "http://localhost:8787/api/orphans/check"
{ "jobId": ... } response without polling GET /api/jobs/:id.synthlabs-ui-operator.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→fail | 12,859 | 5,951 | -54% | 1 | 1 | 0% | 2,446 | 2,077 | -15% | 0 | 0 | — |
case-01 | fail→fail | 13,869 | 2,938 | -79% | 1 | 1 | 0% | 597 | 2,182 | +265% | 0 | 0 | — |
case-02 | fail→pass | 12,692 | 7,829 | -38% | 1 | 1 | 0% | 168 | 3,196 | +1802% | 0 | 0 | — |
case-04 | fail→pass | 6,740 | 3,383 | -50% | 1 | 1 | 0% | 1,163 | 2,307 | +98% | 0 | 0 | — |
case-05 | fail→pass | 18,705 | 5,889 | -69% | 1 | 1 | 0% | 1,835 | 2,818 | +54% | 0 | 0 | — |
case-06 | pass→pass | 10,559 | 2,489 | -76% | 1 | 1 | 0% | 1,709 | 2,089 | +22% | 0 | 0 | — |
case-07 | pass→pass | 9,024 | 2,717 | -70% | 1 | 1 | 0% | 1,279 | 2,226 | +74% | 0 | 0 | — |
case-08 | fail→pass | 3,753 | 3,631 | -3% | 1 | 1 | 0% | 542 | 2,313 | +327% | 0 | 0 | — |
case-09 | pass→pass | 8,371 | 2,707 | -68% | 1 | 1 | 0% | 1,320 | 2,204 | +67% | 0 | 0 | — |
case-10 | fail→pass | 4,904 | 1,503 | -69% | 1 | 1 | 0% | 643 | 1,950 | +203% | 0 | 0 | — |
case-11 | fail→pass | 11,030 | 2,400 | -78% | 1 | 1 | 0% | 1,824 | 2,102 | +15% | 0 | 0 | — |
case-12 | fail→pass | 5,800 | 1,608 | -72% | 1 | 1 | 0% | 886 | 1,923 | +117% | 0 | 0 | — |
case-13 | fail→pass | 9,570 | 2,529 | -74% | 1 | 1 | 0% | 1,393 | 2,092 | +50% | 0 | 0 | — |
case-14 | pass→pass | 12,156 | 2,574 | -79% | 1 | 1 | 0% | 1,898 | 2,068 | +9% | 0 | 0 | — |
case-15 | fail→pass | 8,331 | 2,484 | -70% | 1 | 1 | 0% | 1,418 | 2,158 | +52% | 0 | 0 | — |
case-20 | fail→pass | 19,466 | 4,991 | -74% | 1 | 1 | 0% | 1,323 | 2,501 | +89% | 0 | 0 | — |
case-16 | fail→pass | 12,501 | 4,356 | -65% | 1 | 1 | 0% | 1,961 | 2,432 | +24% | 0 | 0 | — |
case-17 | pass→pass | 7,900 | 2,038 | -74% | 1 | 1 | 0% | 1,278 | 2,087 | +63% | 0 | 0 | — |
case-18 | pass→pass | 3,989 | 2,075 | -48% | 1 | 1 | 0% | 571 | 2,030 | +256% | 0 | 0 | — |
case-19 | fail→pass | 8,218 | 2,558 | -69% | 1 | 1 | 0% | 1,339 | 2,170 | +62% | 0 | 0 | — |
case-21 | pass→pass | 7,923 | 3,564 | -55% | 1 | 1 | 0% | 1,225 | 2,302 | +88% | 0 | 0 | — |
case-22 | fail→pass | 14,398 | 6,178 | -57% | 1 | 1 | 0% | 2,939 | 2,492 | -15% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.