> For the complete documentation index, see [llms.txt](https://docs.rememberizer.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rememberizer.ai/de/entwicklerressourcen/api-docs/vector-store/upload-files-to-a-vector-store.md).

# Dateien in einen Vektor-Speicher hochladen

{% openapi src="/files/ruiFvGmmJmrVu2Iycaim" path="/vector-stores/{vector-store-id}/documents/upload" method="post" %}
[rememberizer\_openapi.yml](https://2490272757-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fx5M0COIHmFFlpJ9e5pvp%2Fuploads%2Fgit-blob-77b6137eeb641262ec8e531c78123c02b825b865%2Frememberizer_openapi.yml?alt=media\&token=22d7ca07-e3b4-475f-840e-857109bf09bc)
{% endopenapi %}

## Beispielanfragen

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST \
  https://api.rememberizer.ai/api/v1/vector-stores/vs_abc123/documents/upload \
  -H "x-api-key: YOUR_API_KEY" \
  -F "files=@/path/to/document1.pdf" \
  -F "files=@/path/to/document2.docx"
```

{% hint style="info" %}
Ersetzen Sie `YOUR_API_KEY` durch Ihren tatsächlichen Vector Store API-Schlüssel, `vs_abc123` durch Ihre Vector Store-ID und geben Sie die Pfade zu Ihren lokalen Dateien an.
{% endhint %}
{% endtab %}

{% tab title="JavaScript" %}

```javascript
const uploadFiles = async (vectorStoreId, files) => {
  const formData = new FormData();
  
  // Fügen Sie mehrere Dateien zu den Formulardaten hinzu
  for (const file of files) {
    formData.append('files', file);
  }
  
  const response = await fetch(`https://api.rememberizer.ai/api/v1/vector-stores/${vectorStoreId}/documents/upload`, {
    method: 'POST',
    headers: {
      'x-api-key': 'YOUR_API_KEY'
      // Hinweis: Setzen Sie den Content-Type-Header nicht, er wird automatisch mit dem richtigen Boundary gesetzt
    },
    body: formData
  });
  
  const data = await response.json();
  console.log(data);
};

// Beispielverwendung mit einem Dateieingabeelement
const fileInput = document.getElementById('fileInput');
uploadFiles('vs_abc123', fileInput.files);
```

{% hint style="info" %}
Ersetzen Sie `YOUR_API_KEY` durch Ihren tatsächlichen Vector Store API-Schlüssel und `vs_abc123` durch Ihre Vector Store-ID.
{% endhint %}
{% endtab %}

{% tab title="Python" %}

```python
import requests

def upload_files(vector_store_id, file_paths):
    headers = {
        "x-api-key": "YOUR_API_KEY"
    }
    
    files = [('files', (file_path.split('/')[-1], open(file_path, 'rb'))) for file_path in file_paths]
    
    response = requests.post(
        f"https://api.rememberizer.ai/api/v1/vector-stores/{vector_store_id}/documents/upload",
        headers=headers,
        files=files
    )
    
    data = response.json()
    print(data)

upload_files('vs_abc123', ['/path/to/document1.pdf', '/path/to/document2.docx'])
```

{% hint style="info" %}
Ersetzen Sie `YOUR_API_KEY` durch Ihren tatsächlichen Vector Store API-Schlüssel, `vs_abc123` durch Ihre Vector Store-ID und geben Sie die Pfade zu Ihren lokalen Dateien an.
{% endhint %}
{% endtab %}

{% tab title="Ruby" %}
\`\`\`ruby require 'net/http' require 'uri' require 'json'

def upload\_files(vector\_store\_id, file\_paths) uri = URI("<https://api.rememberizer.ai/api/v1/vector-stores/#{vector\\_store\\_id}/documents/upload>")

## Erstellen Sie ein neues HTTP-Objekt

http = Net::HTTP.new(uri.host, uri.port) http.use\_ssl = true

## Erstellen Sie eine Multipart-Form-Anfrage

request = Net::HTTP::Post.new(uri) request\['x-api-key'] = 'YOUR\_API\_KEY'

## Erstellen Sie ein Multipart-Boundary

boundary = "RubyFormBoundary#{rand(1000000)}" request\['Content-Type'] = "multipart/form-data; boundary=#{boundary}"

## Erstellen Sie den Anfragekörper

body = \[] file\_paths.each do |file\_path| file\_name = File.basename(file\_path) file\_content = File.read(file\_path, mode: 'rb')

```
body << "--#{boundary}\r\n"
body << "Content-Disposition: form-data; name=\"files\"; filename=\"#{file_name}\"\r\n"
body << "Content-Type: #{get_content_type(file_name)}\r\n\r\n"
body << file_content
body << "\r\n"
```

end body << "--#{boundary}--\r\n"

request.body = body.join

## Senden Sie die Anfrage

response = http.request(request)

## Analysieren und geben Sie die Antwort zurück

JSON.parse(response.body) end

```

# Hilfsmethode zur Bestimmung des Inhalts Typs
def get_content_type(filename)
  ext = File.extname(filename).downcase
  case ext
  when '.pdf'  then 'application/pdf'
  when '.doc'  then 'application/msword'
  when '.docx' then 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  when '.txt'  then 'text/plain'
  when '.md'   then 'text/markdown'
  when '.json' then 'application/json'
  else 'application/octet-stream'
  end
end

# Beispielverwendung
result = upload_files('vs_abc123', ['/path/to/document1.pdf', '/path/to/document2.docx'])
puts result
```

{% hint style="info" %} Ersetzen Sie `YOUR_API_KEY` durch Ihren tatsächlichen Vector Store API-Schlüssel, `vs_abc123` durch Ihre Vector Store-ID und geben Sie die Pfade zu Ihren lokalen Dateien an. {% endhint %} {% endtab %} {% endtabs %}

### Pfadparameter

| Parameter       | Typ    | Beschreibung                                                                             |
| --------------- | ------ | ---------------------------------------------------------------------------------------- |
| vector-store-id | string | **Erforderlich.** Die ID des Vektor-Speichers, in den Dateien hochgeladen werden sollen. |

### Anfragekörper

Dieser Endpunkt akzeptiert eine `multipart/form-data`-Anfrage mit einer oder mehreren Dateien im Feld `files`.

### Antwortformat

```json
{
  "documents": [
    {
      "id": 1234,
      "name": "document1.pdf",
      "type": "application/pdf",
      "size": 250000,
      "status": "processing",
      "created": "2023-06-15T10:15:00Z",
      "vector_store": "vs_abc123"
    },
    {
      "id": 1235,
      "name": "document2.docx",
      "type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      "size": 180000,
      "status": "processing",
      "created": "2023-06-15T10:15:00Z",
      "vector_store": "vs_abc123"
    }
  ],
  "errors": []
}
```

Wenn einige Dateien nicht hochgeladen werden können, werden sie im `errors`-Array aufgelistet:

```json
{
  "documents": [
    {
      "id": 1234,
      "name": "document1.pdf",
      "type": "application/pdf",
      "size": 250000,
      "status": "processing",
      "created": "2023-06-15T10:15:00Z",
      "vector_store": "vs_abc123"
    }
  ],
  "errors": [
    {
      "file": "document2.docx",
      "error": "Dateiformat nicht unterstützt"
    }
  ]
}
```

### Authentifizierung

Dieser Endpunkt erfordert eine Authentifizierung mit einem API-Schlüssel im `x-api-key`-Header.

### Unterstützte Dateiformate

* PDF (`.pdf`)
* Microsoft Word (`.doc`, `.docx`)
* Microsoft Excel (`.xls`, `.xlsx`)
* Microsoft PowerPoint (`.ppt`, `.pptx`)
* Textdateien (`.txt`)
* Markdown (`.md`)
* JSON (`.json`)
* HTML (`.html`, `.htm`)

### Dateigrößenbeschränkungen

* Maximale Dateigröße pro Datei: 50MB
* Maximale Gesamtgröße der Anfrage: 100MB
* Maximale Anzahl von Dateien pro Anfrage: 20

### Fehlerantworten

| Statuscode | Beschreibung                                                                             |
| ---------- | ---------------------------------------------------------------------------------------- |
| 400        | Ungültige Anfrage - Keine Dateien bereitgestellt oder ungültiges Anfrageformat           |
| 401        | Nicht autorisiert - Ungültiger oder fehlender API-Schlüssel                              |
| 404        | Nicht gefunden - Vektor-Speicher nicht gefunden                                          |
| 413        | Payload zu groß - Dateien überschreiten das Größenlimit                                  |
| 415        | Nicht unterstützter Medientyp - Dateiformat wird nicht unterstützt                       |
| 500        | Interner Serverfehler                                                                    |
| 207        | Multi-Status - Einige Dateien wurden erfolgreich hochgeladen, andere sind fehlgeschlagen |

### Verarbeitungsstatus

Dateien werden zunächst mit dem Status `processing` akzeptiert. Sie können den Verarbeitungsstatus der Dokumente über den [Get a List of Documents in a Vector Store](/de/entwicklerressourcen/api-docs/vector-store/get-a-list-of-documents-in-a-vector-store.md) Endpunkt überprüfen. Der endgültige Status wird einer der folgenden sein:

* `done`: Dokument wurde erfolgreich verarbeitet
* `error`: Während der Verarbeitung ist ein Fehler aufgetreten
* `processing`: Dokument wird noch verarbeitet

Die Verarbeitungszeit hängt von der Dateigröße und -komplexität ab. Die typische Verarbeitungszeit liegt zwischen 30 Sekunden und 5 Minuten pro Dokument.

### Batch-Operationen

Um mehrere Dateien effizient in Ihren Vector Store hochzuladen, unterstützt Rememberizer Batch-Operationen. Dieser Ansatz hilft, die Leistung beim Umgang mit einer großen Anzahl von Dokumenten zu optimieren.

#### Batch-Upload-Implementierung

{% tabs %} {% tab title="Python" %}

```python
import os
import requests
import time
import concurrent.futures
from pathlib import Path

def batch_upload_to_vector_store(vector_store_id, folder_path, batch_size=5, file_types=None):
    """
    Laden Sie alle Dateien aus einem Verzeichnis in Chargen in einen Vektorstore hoch
    
    Args:
        vector_store_id: ID des Vektorstores
        folder_path: Pfad zum Ordner mit den hochzuladenden Dateien
        batch_size: Anzahl der Dateien, die in jeder Charge hochgeladen werden sollen
        file_types: Optionale Liste von Dateierweiterungen zum Filtern (z.B. ['.pdf', '.docx'])
        
    Returns:
        Liste der Upload-Ergebnisse
    """
    api_key = "YOUR_API_KEY"
    headers = {"x-api-key": api_key}
    
    # Liste der Dateien im Verzeichnis abrufen
    files = []
    for entry in os.scandir(folder_path):
        if entry.is_file():
            file_path = Path(entry.path)
            # Nach Dateierweiterung filtern, falls angegeben
            if file_types is None or file_path.suffix.lower() in file_types:
                files.append(file_path)
    
    print(f"Gefunden {len(files)} Dateien zum Hochladen")
    results = []
    
    # Dateien in Chargen verarbeiten
    for i in range(0, len(files), batch_size):
        batch = files[i:i+batch_size]
        print(f"Verarbeite Charge {i//batch_size + 1}/{(len(files) + batch_size - 1)//batch_size}: {len(batch)} Dateien")
        
        # Charge hochladen
        upload_files = []
        for file_path in batch:
            upload_files.append(('files', (file_path.name, open(file_path, 'rb'))))
        
        try:
            response = requests.post(
                f"https://api.rememberizer.ai/api/v1/vector-stores/{vector_store_id}/documents/upload",
                headers=headers,
                files=upload_files
            )
            
            # Alle Datei-Handles schließen
            for _, (_, file_obj) in upload_files:
                file_obj.close()
            
            if response.status_code in (200, 201, 207):
                batch_result = response.json()
                results.append(batch_result)
                print(f"Charge erfolgreich hochgeladen - {len(batch_result.get('documents', []))} Dokumente verarbeitet")
                
                # Auf Fehler überprüfen
                if batch_result.get('errors') and len(batch_result['errors']) > 0:
                    print(f"Aufgetretene Fehler: {len(batch_result['errors'])}")
                    for error in batch_result['errors']:
                        print(f"- {error['file']}: {error['error']}")
            else:
                print(f"Batch-Upload fehlgeschlagen mit Statuscode {response.status_code}: {response.text}")
                results.append({"error": f"Batch fehlgeschlagen: {response.text}"})
                
        except Exception as e:
            print(f"Ausnahme während des Batch-Uploads: {str(e)}")
            results.append({"error": str(e)})
            
            # Alle verbleibenden Datei-Handles im Falle einer Ausnahme schließen
            for _, (_, file_obj) in upload_files:
                try:
                    file_obj.close()
                except:
                    pass
        
        # Ratenbegrenzung - Pause zwischen den Chargen
        if i + batch_size < len(files):
            print("Pause vor der nächsten Charge...")
            time.sleep(2)
    
    return results

# Beispielverwendung
results = batch_upload_to_vector_store(
    'vs_abc123',
    '/path/to/documents/folder',
    batch_size=5,
    file_types=['.pdf', '.docx', '.txt']
)
```

{% endtab %}

{% tab title="JavaScript" %}

```javascript
/**
 * Dateien in Batches in einen Vektor-Speicher hochladen
 * 
 * @param {string} vectorStoreId - ID des Vektor-Speichers
 * @param {FileList|File[]} files - Zu ladende Dateien
 * @param {Object} options - Konfigurationsoptionen
 * @returns {Promise<Array>} - Liste der Upload-Ergebnisse
 */
async function batchUploadToVectorStore(vectorStoreId, files, options = {}) {
  const {
    batchSize = 5,
    delayBetweenBatches = 2000,
    onProgress = null
  } = options;
  
  const apiKey = 'YOUR_API_KEY';
  const results = [];
  const fileList = Array.from(files);
  const totalBatches = Math.ceil(fileList.length / batchSize);
  
  console.log(`Bereite den Upload von ${fileList.length} Dateien in ${totalBatches} Batches vor`);
  
  // Dateien in Batches verarbeiten
  for (let i = 0; i < fileList.length; i += batchSize) {
    const batch = fileList.slice(i, i + batchSize);
    const batchNumber = Math.floor(i / batchSize) + 1;
    
    console.log(`Verarbeite Batch ${batchNumber}/${totalBatches}: ${batch.length} Dateien`);
    
    if (onProgress) {
      onProgress({
        currentBatch: batchNumber,
        totalBatches: totalBatches,
        filesInBatch: batch.length,
        totalFiles: fileList.length,
        completedFiles: i
      });
    }
    
    // FormData für diesen Batch erstellen
    const formData = new FormData();
    batch.forEach(file => {
      formData.append('files', file);
    });
    
    try {
      const response = await fetch(
        `https://api.rememberizer.ai/api/v1/vector-stores/${vectorStoreId}/documents/upload`,
        {
          method: 'POST',
          headers: {
            'x-api-key': apiKey
          },
          body: formData
        }
      );
      
      if (response.ok) {
        const batchResult = await response.json();
        results.push(batchResult);
        
        console.log(`Batch erfolgreich hochgeladen - ${batchResult.documents?.length || 0} Dokumente verarbeitet`);
        
        // Auf Fehler prüfen
        if (batchResult.errors && batchResult.errors.length > 0) {
          console.warn(`Fehler aufgetreten: ${batchResult.errors.length}`);
          batchResult.errors.forEach(error => {
            console.warn(`- ${error.file}: ${error.error}`);
          });
        }
      } else {
        console.error(`Batch-Upload fehlgeschlagen mit Status ${response.status}: ${await response.text()}`);
        results.push({ error: `Batch fehlgeschlagen mit Status: ${response.status}` });
      }
    } catch (error) {
      console.error(`Ausnahme während des Batch-Uploads: ${error.message}`);
      results.push({ error: error.message });
    }
    
    // Verzögerung zwischen den Batches hinzufügen, um Ratenbegrenzung zu vermeiden
    if (i + batchSize < fileList.length) {
      console.log(`Pause für ${delayBetweenBatches}ms vor dem nächsten Batch...`);
      await new Promise(resolve => setTimeout(resolve, delayBetweenBatches));
    }
  }
  
  console.log(`Upload abgeschlossen. ${fileList.length} Dateien verarbeitet.`);
  return results;
}

// Beispielverwendung mit Dateieingabeelement
document.getElementById('upload-button').addEventListener('click', async () => {
  const fileInput = document.getElementById('file-input');
  const vectorStoreId = 'vs_abc123';
  
  const progressBar = document.getElementById('progress-bar');
  
  try {
    const results = await batchUploadToVectorStore(vectorStoreId, fileInput.files, {
      batchSize: 5,
      onProgress: (progress) => {
        // Fortschritts-UI aktualisieren
        const percentage = Math.round((progress.completedFiles / progress.totalFiles) * 100);
        progressBar.style.width = `${percentage}%`;
        progressBar.textContent = `${percentage}% (Batch ${progress.currentBatch}/${progress.totalBatches})`;
      }
    });
    
    console.log('Vollständige Upload-Ergebnisse:', results);
  } catch (error) {
    console.error('Upload fehlgeschlagen:', error);
  }
});
```

{% endtab %}

{% tab title="Ruby" %}

```

ruby
require 'net/http'
require 'uri'
require 'json'
require 'mime/types'

# Dateien in Chargen in einen Vektor-Store hochladen
#
# @param vector_store_id [String] ID des Vektor-Speichers
# @param folder_path [String] Pfad zum Ordner, der die hochzuladenden Dateien enthält
# @param batch_size [Integer] Anzahl der Dateien, die in jedem Batch hochgeladen werden sollen
# @param file_types [Array<String>] Optionales Array von Dateierweiterungen zur Filterung
# @param delay_between_batches [Float] Sekunden, die zwischen den Batches gewartet werden sollen
# @return [Array] Liste der Upload-Ergebnisse
def batch_upload_to_vector_store(vector_store_id, folder_path, batch_size: 5, file_types: nil, delay_between_batches: 2.0)
  api_key = 'YOUR_API_KEY'
  results = []
  
  # Liste der Dateien im Verzeichnis abrufen
  files = Dir.entries(folder_path)
    .select { |f| File.file?(File.join(folder_path, f)) }
    .select { |f| file_types.nil? || file_types.include?(File.extname(f).downcase) }
    .map { |f| File.join(folder_path, f) }
  
  puts "Gefunden: #{files.count} Dateien zum Hochladen"
  total_batches = (files.count.to_f / batch_size).ceil
  
  # Dateien in Batches verarbeiten
  files.each_slice(batch_size).with_index do |batch, batch_index|
    puts "Verarbeite Batch #{batch_index + 1}/#{total_batches}: #{batch.count} Dateien"
    
    # HTTP-Anfrage vorbereiten
    uri = URI("https://api.rememberizer.ai/api/v1/vector-stores/#{vector_store_id}/documents/upload")
    request = Net::HTTP::Post.new(uri)
    request['x-api-key'] = api_key
    
    # Erstelle eine Multipart-Form-Grenze
    boundary = "RubyBoundary#{rand(1000000)}"
    request['Content-Type'] = "multipart/form-data; boundary=#{boundary}"
    
    # Baue den Anfragekörper
    body = []
    batch.each do |file_path|
      file_name = File.basename(file_path)
      mime_type = MIME::Types.type_for(file_path).first&.content_type || 'application/octet-stream'
      
      begin
        file_content = File.binread(file_path)
        
        body << "--#{boundary}\r\n"
        body << "Content-Disposition: form-data; name=\"files\"; filename=\"#{file_name}\"\r\n"
        body << "Content-Type: #{mime_type}\r\n\r\n"
        body << file_content
        body << "\r\n"
      rescue => e
        puts "Fehler beim Lesen der Datei #{file_path}: #{e.message}"
      end
    end
    body << "--#{boundary}--\r\n"
    
    request.body = body.join
    
    # Anfrage senden
    begin
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true
      response = http.request(request)
      
      if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 207
        batch_result = JSON.parse(response.body)
        results << batch_result
        
        puts "Batch erfolgreich hochgeladen - #{batch_result['documents']&.count || 0} Dokumente verarbeitet"
        
        # Auf Fehler prüfen
        if batch_result['errors'] && !batch_result['errors'].empty?
          puts "Aufgetretene Fehler: #{batch_result['errors'].count}"
          batch_result['errors'].each do |error|
            puts "- #{error['file']}: #{error['error']}"
          end
        end
      else
        puts "Batch-Upload fehlgeschlagen mit Statuscode #{response.code}: #{response.body}"
        results << { "error" => "Batch fehlgeschlagen: #{response.body}" }
      end
    rescue => e
      puts "Ausnahme während des Batch-Uploads: #{e.message}"
      results << { "error" => e.message }
    end
    
    # Ratenbegrenzung - Pause zwischen Batches
    if batch_index < total_batches - 1
      puts "Pause für #{delay_between_batches} Sekunden vor dem nächsten Batch..."
      sleep(delay_between_batches)
    end
  end
  
  puts "Upload abgeschlossen. Verarbeitet: #{files.count} Dateien."
  results
end

# Beispielverwendung
results = batch_upload_to_vector_store(
  'vs_abc123',
  '/path/to/documents/folder',
  batch_size: 5,
  file_types: ['.pdf', '.docx', '.txt'],
  delay_between_batches: 2.0
)
```

{% endtab %}
{% endtabs %}

### Batch-Upload-Best Practices

Um die Leistung und Zuverlässigkeit beim Hochladen großer Dateimengen zu optimieren:

1. **Batch-Größe verwalten**: Halten Sie die Batch-Größen zwischen 5-10 Dateien für optimale Leistung. Zu viele Dateien in einer einzigen Anfrage erhöhen das Risiko von Zeitüberschreitungen.
2. **Ratenbegrenzung implementieren**: Fügen Sie zwischen den Batches Verzögerungen hinzu (2-3 Sekunden empfohlen), um API-Ratenlimits zu vermeiden.
3. **Fehler-Wiederholungslogik hinzufügen**: Implementieren Sie für Produktionssysteme eine Wiederholungslogik für fehlgeschlagene Uploads mit exponentiellem Backoff.
4. **Dateitypen validieren**: Filtern Sie Dateien vorab, um sicherzustellen, dass es sich um unterstützte Typen handelt, bevor Sie den Upload versuchen.
5. **Batch-Fortschritt überwachen**: Bieten Sie für benutzerorientierte Anwendungen Rückmeldungen zum Fortschritt bei Batch-Operationen.
6. **Teilweise Erfolge behandeln**: Die API kann einen Statuscode 207 für teilweise Erfolge zurückgeben. Überprüfen Sie immer die Status einzelner Dokumente.
7. **Ressourcen bereinigen**: Stellen Sie sicher, dass alle Dateihandles ordnungsgemäß geschlossen werden, insbesondere wenn Fehler auftreten.
8. **Weise parallelisieren**: Bei sehr großen Uploads (Tausende von Dateien) sollten Sie mehrere gleichzeitige Batch-Prozesse in verschiedene Vektor-Speicher anvisieren und die Ergebnisse später bei Bedarf kombinieren.
9. **Prüfziffern implementieren**: Überprüfen Sie für kritische Daten die Dateiintegrität vor und nach dem Upload mit Prüfziffern.
10. **Umfassende Ergebnisse protokollieren**: Führen Sie detaillierte Protokolle aller Upload-Operationen zur Fehlersuche.

Durch die Befolgung dieser Best Practices können Sie die großflächige Dokumentenaufnahme in Ihre Vektor-Speicher effizient verwalten.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rememberizer.ai/de/entwicklerressourcen/api-docs/vector-store/upload-files-to-a-vector-store.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
