Zum Inhalt springen

Viele Dateien auf einmal per API in eine Collection hochladen

Für einzelne Dokumente funktioniert die Upload-Seite gut. Wenn Sie aber Dutzende oder Hunderte von Dateien hinzufügen müssen — etwa beim Einrichten eines neuen Space, beim Umzug von Inhalten oder beim Laden eines Archivs — zeigt Ihnen diese Anleitung, wie Sie einen ganzen Ordner auf einmal hochladen und dabei jede Datei der gewünschten Collection zuordnen.

Dazu führen Sie ein kleines Skript auf Ihrem Rechner aus. Sie müssen dafür nicht entwickeln können, arbeiten aber im Terminal.

Sie benötigen:

  • Ein Smartchat-Konto, das Dateien im Ziel-Space hinzufügen darf
  • Die Space-ID des Ziel-Space — das Skript kann sie für Sie ermitteln
  • Die Collection-ID der Collection, in die die Dateien sollen
  • Den Ordner mit den Dateien auf Ihrem Rechner
  • Python, eingerichtet wie unten beschrieben

Das Skript benötigt Python 3.10 oder neuer sowie ein zusätzliches Paket namens httpx.

Prüfen Sie Ihre Version im Terminal:

Terminal-Fenster
python3 --version

Sie erhalten eine Ausgabe wie Python 3.12.5. Entscheidend ist die mittlere Zahl: Sie muss 10 oder höher sein.

Alle Befehle unten sind in zwei Varianten angegeben. Verwenden Sie den Tab uv, sofern Sie nicht bereits ein eingerichtetes Python bevorzugen.

Hier herunterladen: upload-files-to-collection.py

Speichern Sie die Datei an einem Ort, den Sie wiederfinden, und öffnen Sie dort ein Terminal.

Hier ist nichts weiter einzurichten. uv liest die benötigten Pakete aus dem Skript selbst und kümmert sich beim ersten Ausführen um alles Weitere.

Terminal-Fenster
uv run upload-files-to-collection.py --list-spaces

Das Skript fragt nach Ihrer Smartchat-E-Mail-Adresse und Ihrem Passwort und listet anschließend alle Spaces auf, in denen Sie Mitglied sind — jeweils mit ID und Namen. Der Space, in dem Sie gerade arbeiten, ist mit einem * markiert.

Kopieren Sie die ID des Space, in den Sie hochladen möchten.

Öffnen Sie in Smartchat Workspace → Collection und dort die gewünschte Collection. Verwenden Sie die Schaltfläche Copy ID oben rechts auf der Seite.

Die Schaltfläche „Copy ID" oben rechts auf der Collection-Seite

Damit liegt die Collection-ID in Ihrer Zwischenablage.

Machen Sie vor dem eigentlichen Upload einen Probelauf. Mit --dry-run listet das Skript die Dateien auf, die es senden würde, und beendet sich, ohne Smartchat zu kontaktieren:

Terminal-Fenster
uv run upload-files-to-collection.py \
--folder ./meine-dokumente \
--space-id <Ihre-Space-ID> \
--collection-id <Ihre-Collection-ID> \
--dry-run

Lesen Sie die Liste aufmerksam. Standardmäßig nimmt das Skript alles aus dem Ordner mit, auch Dateien in Unterordnern. Mit einem Muster grenzen Sie die Auswahl ein:

Terminal-Fenster
--glob '**/*.pdf' # nur PDFs, auch in Unterordnern
--glob '*.pdf' # nur PDFs direkt im Ordner
--glob '*' # alles im Ordner, aber keine Unterordner

Behalten Sie die Anführungszeichen um das Muster bei.

Versteckte Dateien werden immer ausgelassen, unabhängig vom Muster. Das betrifft alles, dessen Name mit einem Punkt beginnt, etwa .DS_Store, sowie sämtliche Inhalte versteckter Ordner wie .git. Das Skript nennt Ihnen die Anzahl der übersprungenen Dateien.

Wenn die Liste stimmt, entfernen Sie --dry-run und führen den Befehl erneut aus:

Terminal-Fenster
uv run upload-files-to-collection.py \
--folder ./meine-dokumente \
--space-id <Ihre-Space-ID> \
--collection-id <Ihre-Collection-ID>

Das Skript fragt nach Ihrem Passwort und arbeitet dann die Dateien ab. Für jede Datei zeigt es eine Fortschrittsanzeige mit der bisherigen Wartezeit, denn die Verarbeitung dauert je nach Dateigröße von wenigen Sekunden bis zu mehreren Minuten.

Zum Schluss gibt es eine Zusammenfassung aus: wie viele Dateien erfolgreich waren, wie viele fehlgeschlagen sind und woran es jeweils lag. Lassen Sie das Terminal-Fenster bis zum Ende geöffnet.

Das Skript erledigt pro Datei dieselben drei Schritte, die Sie auch von Hand in der Oberfläche ausführen würden:

  1. Es lädt die Datei in den Speicher des Space hoch.
  2. Es wartet, bis der Upload abgeschlossen ist.
  3. Es beauftragt Smartchat mit der Verarbeitung — dabei wird der Text ausgelesen, in kleine durchsuchbare Abschnitte zerlegt und Ihrer Collection hinzugefügt.

Danach ist nichts weiter zu tun. Die Zuordnung zur Collection ist Teil des Verarbeitungsauftrags; es gibt also keinen separaten Schritt, um die hochgeladenen Dateien in Ihre Collection zu legen.

Öffnen Sie die Collection unter Workspace → Collection und laden Sie die Seite neu. Ihre Dateien sollten dort aufgeführt sein.

Falls noch nicht alle sichtbar sind, warten Sie einen Moment und laden Sie erneut — die Dateien werden von einem Hintergrundprozess in die Collection eingetragen, daher liegt zwischen dem Ende des Skripts und der vollständigen Anzeige oft eine kurze Verzögerung.

Smartchat vermeidet es, dasselbe Dokument doppelt zu speichern; manche Dateien werden deshalb bewusst nicht hochgeladen. Das ist der häufigste Grund, warum ein Lauf so wirkt, als sei nichts passiert:

Meldung des SkriptsBedeutungWas zu tun ist
DUPLICATEDEine Datei mit demselben Namen und demselben Inhalt liegt bereits in diesem Ordner des SpaceNichts — sie ist bereits vorhanden
EXISTSEine Datei mit demselben Namen ist vorhanden, ihr Inhalt unterscheidet sich aberMit --overwrite ersetzen
Es passiert scheinbar nichtsDie Datei wurde bereits hochgeladen und verarbeitetDer Inhalt muss sich von der vorhandenen Fassung unterscheiden

Wenn Sie testen und möchten, dass eine Datei jedes Mal durchläuft, ändern Sie sowohl den Namen als auch den Inhalt.

Schlägt eine Datei fehl, läuft das Skript weiter und meldet die Fehler am Ende — eine einzelne problematische Datei stoppt also nicht den Rest.

Taucht eine Datei gar nicht in der Collection auf, öffnen Sie die Upload-Seite im Space-Administrations-Panel: Dort ist jede Datei mit ihrem aktuellen Status aufgeführt. Fehler bei der Dateiverarbeitung erklärt die einzelnen Status und ihre Ursachen. Für sehr große Dateien gelten eigene Regeln, beschrieben unter Maximale Dateigröße.

Außerdem sollten Sie wissen:

  • Dateien aus Unterordnern verlieren ihren Ordner. Es wird nur der Dateiname übertragen; berichte/zusammenfassung.pdf und archiv/zusammenfassung.pdf werden also zu zwei Dateien mit demselben Namen, und die zweite gilt als Dublette oder Konflikt. Laden Sie solche Ordner nacheinander hoch und trennen Sie sie mit --folder-path.
  • Ein erneuter Lauf ist nicht kostenlos. Ein weiterer Verarbeitungsauftrag erzeugt immer neue Arbeit, selbst wenn die Datei selbst übersprungen wird. Starten Sie einen großen Stapel nicht neu, nur um einzelne Fehlschläge nachzuholen — legen Sie die betroffenen Dateien stattdessen in einen eigenen Ordner.
  • Das Skript abzubrechen ist unbedenklich. Bereits hochgeladene Dateien bleiben erhalten und werden fertig verarbeitet. Es bleibt nichts halb geschrieben zurück.
OptionStandardWirkung
--folderDer Ordner, aus dem hochgeladen wird (erforderlich)
--space-idDer Space, in den hochgeladen wird (erforderlich)
--collection-idDie Collection, in die die Dateien kommen (erforderlich)
--globallesWelche Dateien ausgewählt werden, als Muster. Versteckte Dateien werden immer übersprungen
--dry-runDateien auflisten und beenden, ohne hochzuladen
--list-spacesIhre Spaces mit IDs anzeigen und beenden
--overwriteausVorhandene Dateien mit abweichendem Inhalt ersetzen
--folder-pathDie Dateien in einen benannten Ordner im Space legen
--gatewaynoraWelche Smartchat-Umgebung verwendet wird
--scopespacespace (geteilt) oder private (nur für Sie)
--batch-size10Wie viele Dateien pro Upload-Anfrage gesendet werden
--ingestion-config-idEine feste Verarbeitungskonfiguration für alle Dateien verwenden
-vAusführliche Ausgabe, hilfreich beim Melden von Problemen

Sie können Ihr Passwort in der Umgebungsvariablen SMARTCHAT_PASSWORD hinterlegen, um es nicht bei jedem Lauf eingeben zu müssen. Dort abgelegte Werte sind für andere Programme auf Ihrem Rechner sichtbar — geben Sie das Passwort daher besser bei Nachfrage ein.

Das Skript ist ein ausgearbeitetes Beispiel für die Datei-API und ausdrücklich zum Anpassen gedacht. Es nutzt nur die Python-Standardbibliothek und httpx, deklariert als Inline Script Metadata, sodass uv run die Abhängigkeit ohne Projekt auflöst. Jeder Schritt ist eine eigene Methode, der Endpunkt jeweils darüber dokumentiert.

Die Aufrufe in ihrer Reihenfolge:

SchrittAufruf
AnmeldenPOST /api/v1/auth/user
Aktiven Space setzenGET /user-manager/api/v1/spaces/switch?space_id=, danach erneut anmelden
HochladenPOST /file-manager/api/v1/files/?file_scope=space
Auf Speicherung wartenGET /file-manager/api/v1/files/{file_id}, bis status gleich uploaded ist
Verarbeitungskonfiguration ermittelnGET /config-manager/api/v1/space/ingestion/config?file_id=
Verarbeitung beauftragenPOST /ingest-master/api/v1/task mit collectionId
WartenGET /ingest-master/api/v1/task/{id}, bis status gleich ingested ist

Drei Fallstricke:

  • Nach dem Space-Wechsel erneut anmelden. Der aktive Space steckt im Access Token; ein vor dem Wechsel ausgestelltes Token zeigt weiterhin auf den alten Space. Das Gateway setzt die Header x-active-space-id, x-user-id und x-active-permissions aus Ihrem Token — setzen Sie sie niemals selbst. Aus demselben Grund ist ein Space-Wechsel im Browser während eines Laufs gefährlich.
  • Das erste Pfadsegment ist ein Gateway-Service-Key, kein Repository-Name. file-manager führt zu aifs-files-management. Ein falscher Key liefert 404 Service not registered — das sieht nach einem leeren Ergebnis aus, ist aber eine falsche URL.
  • collectionId im Verarbeitungsauftrag genügt. Damit landet die Datei sowohl für die Suche als auch in der Chat-Oberfläche in der Collection. PUT /ingest-master/api/v1/files dient dazu, Dateien nachträglich zu reparieren, die ohne Collection verarbeitet wurden; für neue Dateien wird es nicht benötigt.

Die vollständigen API-Definitionen werden pro Service veröffentlicht und sind die maßgebliche Referenz:

https://<gateway-host>/file-manager/api/v1/openapi.json
https://<gateway-host>/ingest-master/api/v1/openapi.json
https://<gateway-host>/config-manager/api/v1/openapi.json
https://<gateway-host>/user-manager/api/v1/openapi.json

Die browsbaren Fassungen unter /file-manager/redoc beziehen ihre Inhalte aus genau diesen Dateien.