Importujte dokumenty
Tento návod ukazuje, ako dostať vaše dokumenty do Sursy cez API kariet: niekoľko dokumentov zo skriptu alebo všetky dokumenty systému pravidelnou úlohou. Každý dokument sa stane kartou v kolekcii. Ľudia ju nájdu vo vyhľadávaní, asistent z nej odpovedá a má vlastníka, štítky, overenie a oprávnenia ako ktorákoľvek iná karta.
Ak chcete, aby Sursa sama zistila, ktoré dokumenty sa vo vašom systéme vymazali, alebo ak dokumenty odosielate z integračnej platformy, použite namiesto toho vlastný zdroj. Je určený na úplné a prírastkové synchronizácie. Tento návod opisuje priamy zápis do kolekcie.
Potrebujete kľúč API s rozsahom cards:write a rolou, ktorá smie zapisovať do cieľovej kolekcie (editor alebo
admin). Ukážky používajú pomocnú funkciu z Rýchleho štartu.
Vyberte správnu operáciu
| Máte | Použite |
|---|---|
| Záznam so stabilným identifikátorom vo vašom systéme | PUT /v1/cards-by-external-id/{external_id}: vytvorenie alebo nahradenie podľa vášho identifikátora. |
| Text, ktorý pridáte raz, bez vlastného identifikátora | POST /v1/cards/text |
| Súbor, ktorý pridáte raz | POST /v1/cards |
| Archív ZIP s mnohými súbormi | POST /v1/cards/archive |
| Súbor väčší ako limit jednej požiadavky | Nahrávanie po častiach a potom ktorúkoľvek z operácií vyššie. |
| Nový obsah pre kartu, ktorú už máte | PUT /v1/cards/{card_id}/content |
Pri všetkom, čo importujete viac ako raz, používajte external_id. Vďaka nemu je každý import opakovateľný:
opätovné spustenie aktualizuje karty, ktoré vytvoril, namiesto toho, aby pridalo kópie.
Vytvorenie alebo nahradenie karty podľa vášho identifikátora
PUT /v1/cards-by-external-id/{external_id} prijíma identifikátor záznamu vo vašom systéme. Ak žiadna karta toto
external_id nemá, vytvorí novú (201). Ak ho niektorá karta má, nahradí jej obsah a údaje (200).
curl -X PUT https://api.sursa.com/v1/cards-by-external-id/kb-article-1042 \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"collection_id": 3,
"folder_id": "0f8e2d7c-4b6a-4e1f-9c3d-2a5b8e7f1c40",
"title": "Returning a damaged item",
"content_type": "html",
"body": "<h2>Damaged items</h2><p>Send a photo within 7 days and we ship a replacement.</p>",
"tags": ["returns", "shipping"],
"metadata": {"source": "helpdesk", "article_id": "1042"}
}'Čo sa stane pri opakovaní:
- Obsah sa nezmenil: nová verzia nevznikne. Odpoveď je
200s"status": "skipped"a"reason": "unchanged". Opakovať požiadavku je vždy bezpečné, aj bezIdempotency-Key. - Obsah sa zmenil: karta dostane novú verziu a znova sa indexuje. Jej názov, štítky, vlastník, kategória
a
metadataprevezmú odoslané hodnoty;metadatasa nahradí ako celok. - Kolekcia a priečinok platia len pri vytvorení karty. Ak chcete kartu neskôr presunúť, zmeňte ju cez
PATCH /v1/cards/{card_id}.
Nová verzia odstráni overenie karty, ako každá zmena obsahu: overovateľ ju musí znova overiť.
Textové formáty
content_type | Telo je |
|---|---|
markdown (predvolené) | Markdown. |
html | HTML. Vyčistí sa na jednoduché značky: nadpisy, odseky, zoznamy, tabuľky a odkazy http, https a mailto. Skripty, štýly, rámce, formuláre a obrázky sa odstránia aj s obsahom. |
text | Obyčajný text. Odseky sú oddelené prázdnymi riadkami. |
Čakať na kartu, alebo nie
Predvolene sa požiadavka vráti, keď je karta pripravená na vyhľadanie, s "status": "ready" a kartou v card.
Trvá to od zlomku sekundy pri krátkom texte po minútu alebo viac pri dlhom súbore.
Pri hromadných importoch odošlite "async": true. Odpoveď príde hneď s "status": "queued" a úlohou indexovania
v job (s jej job_id). Úlohu skontrolujte cez GET /v1/jobs/{job_id} alebo sledujte
všetky úlohy v GET /v1/jobs/stream. Úloha skončí so status done, error alebo canceled.
curl https://api.sursa.com/v1/jobs/48213 \
-H "Authorization: Bearer $SURSA_API_KEY"Nahratie súboru
Súbory sa posielajú v požiadavke multipart/form-data v poli file. Sursa číta PDF, Word, Excel, PowerPoint,
tabuľky OpenDocument, CSV, Markdown, HTML, AsciiDoc, e-maily (.eml), obyčajný text a bežné formáty obrázkov.
Overí, že názov súboru, deklarovaný typ a obsah sa zhodujú, a nezhodu odmietne s 415.
Ak chcete vytvoriť alebo nahradiť kartu so súborom podľa vlastného identifikátora, odošlite súbor na tú istú
operáciu PUT /v1/cards-by-external-id/{external_id}:
curl -X PUT https://api.sursa.com/v1/cards-by-external-id/handbook-2026 \
-H "Authorization: Bearer $SURSA_API_KEY" \
-F "file=@employee-handbook.pdf" \
-F "collection_id=3" \
-F "tags=hr,policies" \
-F 'metadata={"owner_team":"people"}'Vo formulári je tags reťazec oddelený čiarkami a metadata objekt JSON zapísaný ako reťazec. Nová karta bez
title dostane ako názov názov súboru.
Ak chcete súbor pridať raz, bez vlastného identifikátora, použite POST /v1/cards
s tým istým formulárom a s Idempotency-Key. Nahratie súboru, ktorý už kolekcia má, vráti "status": "skipped"
s "duplicate": true a existujúcim card_id, pokiaľ neodošlete external_id.
Veľkosť jedného súboru obmedzuje inštalácia (predvolene 200 MB). Väčšie súbory alebo súbory v nespoľahlivých sieťach najprv nahrajte po častiach.
Nahradenie obsahu karty
Keď už ID karty v Surse máte, PUT /v1/cards/{card_id}/content nahradí
jej text alebo súbor a všetko ostatné zachová: vlastníka, štítky, overovateľov, interval overovania a ručne
nastavenú kategóriu.
curl -X PUT https://api.sursa.com/v1/cards/3f2c9a7e-5b1d-4c8e-9f0a-1b2c3d4e5f60/content \
-H "Authorization: Bearer $SURSA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content_type": "markdown", "body": "# Refund policy\n\nRefunds are processed within 10 days."}'- Rovnaký obsah znova vráti
"status": "skipped"s"reason": "unchanged". - Karta, ktorá sa práve indexuje, vráti
409s kódomcards.indexing_in_progress. Zopakujte o niekoľko sekúnd. - Karta, ktorá pochádza zo zdroja, napríklad z konektora alebo vlastného zdroja, sa mení len vo svojom zdroji:
cards.managed_by_source. - Kľúč musí vidieť celú kartu; čiastočne viditeľná karta vráti
cards.content_whole_access.
Import mnohých dokumentov
Slučka cez vaše záznamy s PUT /v1/cards-by-external-id/… je najjednoduchší hromadný import a možno ju bezpečne
kedykoľvek zastaviť a spustiť znova. Aby bola rýchla a ohľaduplná k limitu frekvencie:
- Odošlite
"async": true, aby sa každá požiadavka vrátila hneď, ako sa karta zaradí do frontu. - Spúšťajte niekoľko požiadaviek súbežne (4 až 8) a spomaľte, keď hlavička
RateLimitukazuje, že zostáva málo požiadaviek. Pozri Limity frekvencie a kvóty. - Pri
429počkajte podľaRetry-After; pri sieťovej chybe alebo5xxzopakujte tú istú požiadavku. Opakovania neuškodia. - Zaznamenajte
external_idkaždého záznamu, ktorý skončí chybou, a tieto záznamy zopakujte na konci.
import { api } from "./sursa.mjs";
async function importAll(records, concurrency = 6) {
const failed = [];
const queue = [...records];
async function worker() {
for (let record = queue.shift(); record; record = queue.shift()) {
try {
await api("PUT", `/v1/cards-by-external-id/${encodeURIComponent(record.id)}`, {
collection_id: 3,
title: record.title,
content_type: "html",
body: record.html,
metadata: { source: "helpdesk" },
async: true,
});
} catch (error) {
failed.push({ id: record.id, error: String(error) });
}
}
}
await Promise.all(Array.from({ length: concurrency }, worker));
return failed;
}Pri archíve ZIP so súbormi POST /v1/cards/archive jednou požiadavkou
premení každý podporovaný súbor v ňom na kartu. Hneď odpovie plánom (ktoré súbory sa stanú kartami, ktoré sa
preskočia a prečo) a úlohou; výsledok oznámi GET /v1/archives/{job_id}.
Vyhľadanie a odstránenie importovaných kariet
- Kartu podľa vlastného identifikátora načítate cez
GET /v1/cards-by-external-id/{external_id}. - Karty jedného importu vypíšete filtrom metadát:
GET /v1/cards?metadata[source]=helpdesk. Pozri Metadáta. - Kartu vymažete cez
DELETE /v1/cards/{card_id}.
Bežné chyby
| Kód | Príčina | Čo robiť |
|---|---|---|
collections.not_found | Kľúč nevidí žiadnu kolekciu s týmto ID alebo názvom. | Skontrolujte collection_id cez GET /v1/collections. |
collections.no_write_access | Kľúč nesmie zapisovať do tejto kolekcie. | Použite kľúč s rolou editor a prístupom ku kolekcii. |
cards.external_id_taken | POST s external_id, ktoré už má iná karta. | Na nahradenie použite PUT /v1/cards-by-external-id/…. |
cards.managed_by_source | Karta patrí zdroju. | Zmeňte dokument v jeho zdroji. |
files.type_mismatch | Názov, typ a obsah súboru sa nezhodujú. | Odošlite súbor s jeho skutočnou príponou. |
files.too_large | Súbor prekračuje limit nahrávania alebo úložisko organizácie. | Použite nahrávanie po častiach alebo uvoľnite úložisko. |
limits.cards | Organizácia dosiahla limit kariet svojej tarify. | Vymažte karty, ktoré už nepotrebujete, alebo zmeňte tarifu. |
api.metadata_invalid | metadata prekračuje limit. | Pozri Metadáta. |