Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Upload a file (PDF, DOCX, PPTX, XLSX, HTML, EPUB, image) or URL to the Knowledge base. Triggers Marker parsing, chunking, embedding, and async classification. Use when the user says 'index this PDF', 'add this URL to the knowledge base', 'upload these files to Academy', or pastes a file path/URL with ingestion intent.
.claude/skills/evolution-foundation-knowledge-ingest/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 105% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -45% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -20% | 0% |
Group: Ingestion. Upload + automatic classification via pipeline parse → chunk → embed → enqueue classify.
| Name | Type | Required | Description | |---|---|---|---| | file_path | str | one of two | Local path | | url | str | one of two | URL to download first | | connection | str | no | Defaults to first ready | | space | str | yes | Destination space slug | | unit_id | str | no | Associated unit | | title | str | no | Derived from filename if absent | | tags | liststr] | no | User-defined tags |
If connection not provided, use first ready. If none: error ("Run knowledge-admin action=connect").
Validate space via GET /spaces. If not found: list spaces + ask for confirmation.
If url:
pythonimport requests, tempfile from pathlib import Path from urllib.parse import urlparse parsed = urlparse(url) filename = Path(parsed.path).name or "downloaded" tmp = Path(tempfile.gettempdir()) / filename with requests.get(url, stream=True, timeout=60) as r: r.raise_for_status() with open(tmp, "wb") as f: for chunk in r.iter_content(8192): f.write(chunk) file_path = str(tmp)
If file_path: validate existence.
pythonfrom dashboard.backend.sdk_client import evo with open(file_path, "rb") as f: result = evo.post( "/api/knowledge/v1/documents", files={"file": f}, data={ "space": space, "unit_id": unit_id, "title": title or Path(file_path).stem, "tags": ",".join(tags or []), }, headers={"X-Knowledge-Connection": connection}, ) document_id = result["document_id"]
Endpoint returns 202 Accepted + document_id. Async worker.
Interval 2s, timeout 10min:
pythonimport time deadline = time.time() + 600 while time.time() < deadline: status = evo.get( f"/api/knowledge/v1/documents/{document_id}/status", headers={"X-Knowledge-Connection": connection}, ) phase = status.get("phase") if phase in ("done", "ready"): break if phase == "error": raise RuntimeError(status.get("error")) time.sleep(2)
Classification is asynchronous. 1 extra GET on /documents/{id}:
content_type != null: show full classification✓ Document uploaded: {title}
document_id: {uuid}
space: {connection}/{space}
unit: {unit_title or "none"}
status: ready
chunks: {N}
classification:
content_type: {lesson|tutorial|faq|...}
difficulty: {...}
topics: [...]
elapsed: {X}s{path}"knowledge-admin action=install-parser"{phase}. Check knowledge-browse."| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,531 | 11,146 | -18% | 1 | 1 | 0% | 1,692 | 3,477 | +105% | 0 | 0 | — |
case-02 | fail→fail | 12,986 | 13,602 | +5% | 1 | 1 | 0% | 511 | 2,403 | +370% | 0 | 0 | — |
case-03 | fail→fail | 7,034 | 9,264 | +32% | 1 | 1 | 0% | 1,122 | 1,924 | +71% | 0 | 0 | — |
case-04 | fail→pass | 14,654 | 2,657 | -82% | 1 | 1 | 0% | 2,187 | 1,386 | -37% | 0 | 0 | — |
case-05 | fail→pass | 13,959 | 1,710 | -88% | 1 | 1 | 0% | 2,178 | 1,189 | -45% | 0 | 0 | — |
case-06 | fail→pass | 10,489 | 3,128 | -70% | 1 | 1 | 0% | 1,782 | 1,453 | -18% | 0 | 0 | — |
case-07 | fail→pass | 10,364 | 2,129 | -79% | 1 | 1 | 0% | 1,636 | 1,307 | -20% | 0 | 0 | — |
case-08 | fail→pass | 6,144 | 1,597 | -74% | 1 | 1 | 0% | 987 | 1,197 | +21% | 0 | 0 | — |
case-09 | fail→pass | 21,165 | 5,087 | -76% | 1 | 1 | 0% | 655 | 1,991 | +204% | 0 | 0 | — |
case-10 | fail→pass | 11,134 | 6,374 | -43% | 1 | 1 | 0% | 2,174 | 1,508 | -31% | 0 | 0 | — |
case-11 | fail→pass | 3,777 | 2,207 | -42% | 1 | 1 | 0% | 641 | 1,378 | +115% | 0 | 0 | — |
case-12 | fail→pass | 10,649 | 2,262 | -79% | 1 | 1 | 0% | 1,954 | 1,342 | -31% | 0 | 0 | — |
case-13 | fail→pass | 7,281 | 2,085 | -71% | 1 | 1 | 0% | 1,181 | 1,385 | +17% | 0 | 0 | — |
case-14 | pass→pass | 7,130 | 1,789 | -75% | 1 | 1 | 0% | 1,292 | 1,242 | -4% | 0 | 0 | — |
case-15 | pass→pass | 9,229 | 1,983 | -79% | 1 | 1 | 0% | 1,597 | 1,318 | -17% | 0 | 0 | — |
case-16 | fail→pass | 6,767 | 2,015 | -70% | 1 | 1 | 0% | 1,135 | 1,282 | +13% | 0 | 0 | — |
case-17 | pass→pass | 8,359 | 1,676 | -80% | 1 | 1 | 0% | 1,362 | 1,202 | -12% | 0 | 0 | — |
case-18 | fail→pass | 7,254 | 3,185 | -56% | 1 | 1 | 0% | 1,418 | 1,619 | +14% | 0 | 0 | — |
case-19 | fail→pass | 4,716 | 2,251 | -52% | 1 | 1 | 0% | 825 | 1,389 | +68% | 0 | 0 | — |
case-20 | pass→pass | 9,920 | 11,614 | +17% | 1 | 1 | 0% | 1,486 | 3,027 | +104% | 0 | 0 | — |
case-21 | pass→pass | 10,148 | 8,586 | -15% | 1 | 1 | 0% | 2,015 | 2,527 | +25% | 0 | 0 | — |
case-22 | pass→pass | 6,437 | 6,203 | -4% | 1 | 1 | 0% | 1,241 | 2,069 | +67% | 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 20 counted toward the lift figure. The other 2 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 +64 percentage points is the difference between those two pass rates over the 20 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.