gpt-4o-mini WebApp funktioniert nicht mehr?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vitellinho
User
Beiträge: 14
Registriert: Dienstag 7. März 2023, 11:05

Ich baue derzeit eine Web-App zur Generierung von Karteikarten auf Basis der OpenAI API. Diese soll u.a. auch Lernkarten aus handschriftlichen Notizen generieren. Als Grundlage habe ich einen Python-Code zum Testen geschrieben:

Code: Alles auswählen

from PyPDF2 import PdfReader
from fpdf import FPDF
import re
import openai
from openai import OpenAI

def extract_text_from_pdf(pdf_path):
    text = ""
    try:
        with open(pdf_path, 'rb') as file:
            reader = PdfReader(file)
            for page in reader.pages:
                text += page.extract_text() + "\n"
    except Exception as e:
        print(f"Fehler beim Extrahieren des Textes: {e}")
    return text

def generiere_karteikarten(text, anzahl_karteikarten):
    # System-Prompt definieren
    system_prompt = f"""
You are an AI model specializing in creating flashcards in a question-answer format from PDF documents.
Task: Go through the provided text and extract key concepts, definitions, facts, and critical information. Create {anzahl_karteikarten} flashcards in a question-answer format, maintaining the order of the original document.
Instructions:
• Sequential Processing: Start at the beginning of the text and work sequentially to the end.
• Select Relevant Information: Identify the most important learning points suitable for flashcards.
• Question-Answer Creation:
  • Question: Formulate a clear and concise question that tests the understanding of the key concept.
  • Answer: Provide an accurate and brief answer to the posed question.
• Formatting:
  • Write each question starting with 'Q:' and each answer with 'A:'.
  • Separate each question-answer pair with an empty line.
• No Additional Information: Do not add any additional comments, explanations, or meta-descriptions. Provide only the question-answer pairs in the specified format.
Goal: At the end, there should be {anzahl_karteikarten} flashcards covering the content of the text and in the correct order of the document, so they can be easily matched with the original text.
Note: Process the text in its original language and generate the flashcards in the same language.
"""
    client = OpenAI(
        # This is the default and can be omitted
        api_key="**************",
    )

    # OpenAI API-Aufruf mit aktualisierter Syntax
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": text}
        ],
        max_tokens=1500,  # Passe die Token-Anzahl nach Bedarf an
        temperature=0.7
    )

    karteikarten = response.choices[0].message.content  # Korrekte Zugriffsmethode
    return karteikarten

def erstelle_fragen_antworten_pdf(text, pdf_datei_name):
    muster = r'(Frage:|Antwort:)(.*?)(?=(Frage:|Antwort:|$))'
    abschnitte = re.findall(muster, text, re.DOTALL)

    inhalte = []

    for abschnitt in abschnitte:
        keyword = abschnitt[0].strip()
        inhalt = abschnitt[1].strip()
        if inhalt:
            gesamter_inhalt = f"{keyword} {inhalt}"
            inhalte.append(gesamter_inhalt)

    pdf = FPDF()
    pdf.set_auto_page_break(auto=False)

    for inhalt in inhalte:
        pdf.add_page()
        pdf.set_font("Arial", 'B', 20)
        pdf.set_xy(10, 10)

        seitenbreite = pdf.w - 20  # 10 mm Rand auf jeder Seite
        # Text in Zeilen aufteilen, um die Höhe zu berechnen
        lines = pdf.multi_cell(seitenbreite, 10, inhalt, align='C', split_only=True)
        text_hoehe = len(lines) * 10
        # Y-Position anpassen, um vertikal zu zentrieren
        y = (pdf.h - text_hoehe) / 2
        pdf.set_y(y)

        pdf.multi_cell(seitenbreite, 10, inhalt, align='C')

    pdf.output(pdf_datei_name)

# Hauptprogramm
if __name__ == "__main__":
    # Pfad zur PDF-Datei eingeben
    pdf_file_path = input("Bitte geben Sie den Pfad zur PDF-Datei ein: ")

    # Text aus PDF extrahieren
    extracted_text = extract_text_from_pdf(pdf_file_path)

    # Anzahl der Seiten in der PDF ermitteln
    reader = PdfReader(pdf_file_path)
    anzahl_seiten = len(reader.pages)
    anzahl_karteikarten = anzahl_seiten // 2  # Hälfte der Seitenanzahl
    # Karteikarten generieren
    karteikarten_text = generiere_karteikarten(extracted_text, anzahl_karteikarten)

    # Karteikarten als PDF erstellen
    erstelle_fragen_antworten_pdf(karteikarten_text, 'karteikarten.pdf')

    print("Die Karteikarten-PDF wurde erfolgreich erstellt.")
Mit diesem Code funktioniert alles perfekt. Jetzt habe ich auch einen PHP-Code für meine Website geschrieben:

Code: Alles auswählen

// FPDF-Bibliothek einbinden
require_once get_template_directory() . '/libs/fpdf/fpdf.php';

// Autoloader für Smalot\PdfParser
spl_autoload_register(function ($class) {
    $prefix = 'Smalot\\PdfParser\\';
    $base_dir = get_template_directory() . '/libs/pdfparser/src/Smalot/PdfParser/';

    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        // Klasse gehört nicht zum Namespace Smalot\PdfParser
        return;
    }

    // Relativen Klassennamen erhalten
    $relative_class = substr($class, $len);

    // Namespace-Trenner durch Verzeichnis-Trenner ersetzen und .php anhängen
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

    // Datei einbinden, falls sie existiert
    if (file_exists($file)) {
        require $file;
    }
});

// Die benötigten Klassen verwenden
use Smalot\PdfParser\Parser;

// OpenAI API Schlüssel
define('OPENAI_API_KEY', '**************'); // Ersetzen Sie diesen Platzhalter durch Ihren API-Schlüssel

// Erweiterte FPDF-Klasse mit abgerundeten Rechtecken und Footer
class PDF extends FPDF {
    function RoundedRect($x, $y, $w, $h, $r, $style = '') {
        $k = $this->k;
        $hp = $this->h;
        if ($style == 'F')
            $op = 'f';
        elseif ($style == 'FD' || $style == 'DF')
            $op = 'B';
        else
            $op = 'S';
        $MyArc = 4/3 * (sqrt(2) - 1);
        $this->_out(sprintf('%.2F %.2F m', ($x+$r)*$k, ($hp-$y)*$k ));
        $xc = $x+$w-$r;
        $yc = $y+$r;
        $this->_out(sprintf('%.2F %.2F l', $xc*$k, ($hp-$y)*$k ));
        $this->_Arc($xc+$r*$MyArc, $yc-$r, $xc+$r, $yc-$r*$MyArc, $xc+$r, $yc);
        $xc = $x+$w-$r;
        $yc = $y+$h-$r;
        $this->_out(sprintf('%.2F %.2F l', ($x+$w)*$k, ($hp-$yc)*$k));
        $this->_Arc($xc+$r, $yc+$r*$MyArc, $xc+$r*$MyArc, $yc+$r, $xc, $yc+$r);
        $xc = $x+$r;
        $yc = $y+$h-$r;
        $this->_out(sprintf('%.2F %.2F l', $xc*$k, ($hp-($y+$h))*$k));
        $this->_Arc($xc-$r*$MyArc, $yc+$r, $xc-$r, $yc+$r*$MyArc, $xc-$r, $yc);
        $xc = $x+$r;
        $yc = $y+$r;
        $this->_out(sprintf('%.2F %.2F l', ($x)*$k, ($hp-$yc)*$k ));
        $this->_Arc($xc-$r, $yc-$r*$MyArc, $xc-$r*$MyArc, $yc-$r, $xc, $yc-$r);
        $this->_out($op);
    }

    function _Arc($x1, $y1, $x2, $y2, $x3, $y3) {
        $h = $this->h;
        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c',
            $x1*$this->k, ($h-$y1)*$this->k,
            $x2*$this->k, ($h-$y2)*$this->k,
            $x3*$this->k, ($h-$y3)*$this->k));
    }

    function NbLines($w, $txt) {
        // Berechnet die Anzahl der Zeilen, die eine MultiCell mit Breite w benötigt
        $cw = &$this->CurrentFont['cw'];
        if($w==0)
            $w = $this->w-$this->rMargin-$this->x;
        $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
        $s = str_replace("\r",'',$txt);
        $nb = strlen($s);
        if($nb>0 and $s[$nb-1]=="\n")
            $nb--;
        $sep = -1;
        $i = 0;
        $j = 0;
        $l = 0;
        $nl = 1;
        while($i<$nb) {
            $c = $s[$i];
            if($c=="\n") {
                $i++;
                $sep = -1;
                $j = $i;
                $l = 0;
                $nl++;
                continue;
            }
            if($c==' ')
                $sep = $i;
            $l += isset($cw[$c]) ? $cw[$c] : 0;
            if($l>$wmax) {
                if($sep==-1) {
                    if($i==$j)
                        $i++;
                } else
                    $i = $sep+1;
                $sep = -1;
                $j = $i;
                $l = 0;
                $nl++;
            } else
                $i++;
        }
        return $nl;
    }

    function Footer() {
        // Position 15 mm vom unteren Rand
        $this->SetY(-15);
        // Schriftart setzen (eine Schriftart wählen, die das "©"-Symbol unterstützt)
        $this->SetFont('Arial', 'I', 8);
        // Textfarbe setzen
        $this->SetTextColor(128, 128, 128);
        // Footer-Text definieren
        $footer_text = '©2024 learncardai. All rights reserved';
        // Text konvertieren, um die Kodierung anzupassen
        $footer_text = mb_convert_encoding($footer_text, 'ISO-8859-1', 'UTF-8');
        // Footer-Text hinzufügen
        $this->Cell(0, 10, $footer_text, 0, 0, 'L');
    }
}

// Funktion zum Extrahieren von Text aus PDF
function extract_text_from_pdf($pdf_path) {
    $parser = new Parser();
    try {
        $pdf = $parser->parseFile($pdf_path);
        $text = $pdf->getText();
    } catch (Exception $e) {
        return 'Fehler beim Extrahieren des Textes: ' . $e->getMessage();
    }
    return $text;
}

// Funktion zum Generieren von Karteikarten via OpenAI
function generiere_karteikarten($text, $anzahl_karteikarten) {
    $system_prompt = "
You are an AI model specializing in creating flashcards in a question-answer format from PDF documents.
Task: Go through the provided text and extract key concepts, definitions, facts, and critical information. Create {$anzahl_karteikarten} flashcards in a question-answer format, maintaining the order of the original document.
Instructions:
• Sequential Processing: Start at the beginning of the text and work sequentially to the end.
• Select Relevant Information: Identify the most important learning points suitable for flashcards.
• Question-Answer Creation:
  • Question: Formulate a clear and concise question that tests the understanding of the key concept.
  • Answer: Provide an accurate and brief answer to the posed question.
• Formatting:
  • Write each question starting with 'Q:' and each answer with 'A:'.
  • Separate each question-answer pair with an empty line.
• No Additional Information: Do not add any additional comments, explanations, or meta-descriptions. Provide only the question-answer pairs in the specified format.
Goal: At the end, there should be {$anzahl_karteikarten} flashcards covering the content of the text and in the correct order of the document, so they can be easily matched with the original text.
Note: Process the text in its original language and generate the flashcards in the same language.
    ";
    // OpenAI API Anfrage
    $ch = curl_init();

    $data = [
        'model' => 'gpt-4o-mini',
        'messages' => [
            ['role' => 'system', 'content' => $system_prompt],
            ['role' => 'user', 'content' => $text]
        ],
        'max_tokens' => 6000,
        'temperature' => 0.7
    ];

    curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/chat/completions");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Content-Type: application/json",
        "Authorization: Bearer " . OPENAI_API_KEY
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        return 'Request Error:' . curl_error($ch);
    }
    curl_close($ch);

    $response_data = json_decode($response, true);
    if (isset($response_data['choices'][0]['message']['content'])) {
        return $response_data['choices'][0]['message']['content'];
    } else {
        return 'API Response Error';
    }
}

// Funktion zum Erstellen der Flashcard PDF
function erstelle_fragen_antworten_pdf($text, $pdf_datei_name) {
    $muster = '/(Q:|A:)(.*?)(?=(Q:|A:|$))/s';
    preg_match_all($muster, $text, $abschnitte, PREG_SET_ORDER);

    $qa_pairs = array();
    $current_item = array();

    foreach ($abschnitte as $abschnitt) {
        $keyword = trim($abschnitt[1]);
        $inhalt = trim($abschnitt[2]);

        if ($keyword == 'Q:') {
            $current_item = array();
            $current_item['Q'] = $inhalt;
        } elseif ($keyword == 'A:' && isset($current_item['Q'])) {
            $current_item['A'] = $inhalt;
            $qa_pairs[] = $current_item;
            $current_item = array();
        }
    }

    $pdf = new PDF();
    $pdf->SetAutoPageBreak(false);

    // Pfad zu Ihrem Logo
    $logo_path = ABSPATH . 'wp-content/logo.png';

    foreach ($qa_pairs as $pair) {
        $pdf->AddPage();
        $pdf->SetFont('Arial', 'B', 20);

        // Fügen Sie Ihr Logo oben rechts hinzu
        $logo_width = 30; // Breite des Logos in mm
        $logo_height = 0; // Höhe proportional skalieren
        $x_logo = $pdf->GetPageWidth() - $logo_width - 10; // 10 mm Rand rechts
        $y_logo = 10; // 10 mm von oben

        // Logo hinzufügen
        if (file_exists($logo_path)) {
            $pdf->Image($logo_path, $x_logo, $y_logo, $logo_width, $logo_height);
        }

        // Verarbeiten der Frage
        $question = 'Q: ' . $pair['Q'];
        $question_iso = mb_convert_encoding($question, 'ISO-8859-1', 'UTF-8');

        // Verarbeiten der Antwort
        $answer = 'A: ' . $pair['A'];
        $answer_iso = mb_convert_encoding($answer, 'ISO-8859-1', 'UTF-8');

        // Maximale Textbreite
        $max_text_width = 150; // in mm

        // Einstellungen für die Frage
        $line_height = 10;
        $text_width = $max_text_width;
        $nb_lines_q = $pdf->NbLines($text_width, $question_iso);
        $text_height_q = $nb_lines_q * $line_height;
        $rect_width_q = $text_width + 20;
        $rect_height_q = $text_height_q + 20;
        $page_width = $pdf->GetPageWidth();
        $x_rect_q = ($page_width - $rect_width_q) / 2;
        $y_rect_q = 50; // Abstand von oben

        // Einstellungen für die Antwort
        $nb_lines_a = $pdf->NbLines($text_width, $answer_iso);
        $text_height_a = $nb_lines_a * $line_height;
        $rect_width_a = $text_width + 20;
        $rect_height_a = $text_height_a + 20;
        $x_rect_a = ($page_width - $rect_width_a) / 2;
        $y_rect_a = $pdf->GetPageHeight() - $rect_height_a - 50; // Abstand von unten

        // Zeichnen des Rechtecks für die Frage
        $pdf->SetFillColor(118, 120, 237); // Lila Farbe
        $pdf->SetTextColor(255, 255, 255); // Weißer Text
        $pdf->RoundedRect($x_rect_q, $y_rect_q, $rect_width_q, $rect_height_q, 10, 'F');
        $pdf->SetXY($x_rect_q + 10, $y_rect_q + 10);
        $pdf->MultiCell($text_width, $line_height, $question_iso, 0, 'C');

        // Zeichnen des Rechtecks für die Antwort
        $pdf->RoundedRect($x_rect_a, $y_rect_a, $rect_width_a, $rect_height_a, 10, 'F');
        $pdf->SetXY($x_rect_a + 10, $y_rect_a + 10);
        $pdf->MultiCell($text_width, $line_height, $answer_iso, 0, 'C');

        // Textfarbe zurücksetzen
        $pdf->SetTextColor(0, 0, 0);
    }

    // Speichere das PDF in den Uploads-Ordner
    $upload_dir = wp_upload_dir();
    $pdf_path = $upload_dir['path'] . '/' . $pdf_datei_name;
    $pdf->Output('F', $pdf_path);

    // Rückgabe des Pfades
    return $upload_dir['url'] . '/' . $pdf_datei_name;
}

// Shortcode zur Anzeige des Flashcard-Generators
function flashcard_generator_shortcode() {
    ob_start();
    ?>

    <!-- Stildefinitionen -->
    <style>
    .btn {
        background-color: #6366f1;
        color: #fff;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
        font-size: 16px;
        margin-right: 10px;
        border-radius: 5px;
    }
    .btn:hover {
        background-color: #4f46e5;
    }
    /* Deaktivierter Button */
    .btn:disabled {
        background-color: #cccccc;
        cursor: not-allowed;
    }
    /* Spinner-Stile */
    .spinner-overlay {
        display: none;
        margin-left: 10px;
        vertical-align: middle;
    }
    .spinner {
        border: 8px solid #f3f3f3;
        border-top: 8px solid #6366f1;
        border-radius: 50%;
        width: 30px;
        height: 30px;
        animation: spin 1s linear infinite;
    }
    @keyframes spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }
    /* Stil für die Meldung */
    #file-selected {
        font-size: 16px;
        margin-top: 10px;
        color: black;
        text-align: center;
        display: block;
    }
    /* Container für die Buttons */
    #button-container {
        text-align: center;
    }
    /* Stil für den Download-Button */
    .download-button {
        background-color: #fcd34d;
        color: #fff;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
        font-size: 16px;
        margin-top: 10px;
        border-radius: 5px;
        text-decoration: none;
        display: inline-block;
    }
    .download-button:hover {
        background-color: #fbbf24;
    }
    </style>

    <form id="flashcard-form" enctype="multipart/form-data">
        <div id="button-container">
            <!-- Benutzerdefinierter "Upload PDF" Button -->
            <button type="button" class="btn" id="upload-button">Upload PDF</button>
            <!-- "Create" Button (standardmäßig deaktiviert) -->
            <button type="submit" class="btn" id="submit-button" disabled>Create</button>
            <!-- Lade-Spinner neben dem Button -->
            <div class="spinner-overlay" id="loading-spinner">
                <div class="spinner"></div>
            </div>
            <!-- Anzeige der Meldung -->
            <span id="file-selected"></span>
        </div>
        <!-- Verstecktes File-Input -->
        <input type="file" id="pdf-upload" name="pdf-upload" accept=".pdf" required style="display:none;">
    </form>

    <div class="output-section" style="text-align: center;"></div>

    <script>
    // Event-Listener für den "Upload PDF" Button
    document.getElementById('upload-button').addEventListener('click', function() {
        document.getElementById('pdf-upload').click();
    });

    // Anzeige der Erfolgsmeldung und Aktivieren des "Create"-Buttons
    document.getElementById('pdf-upload').addEventListener('change', function() {
        if (this.files && this.files.length > 0) {
            document.getElementById('file-selected').textContent = 'Successfully uploaded';
            document.getElementById('submit-button').disabled = false; // "Create"-Button aktivieren
        }
    });

    // Event-Listener für das Formular
    document.getElementById('flashcard-form').addEventListener('submit', function(event) {
        event.preventDefault(); // Standardformularübermittlung verhindern

        // Lade-Spinner anzeigen
        document.getElementById('loading-spinner').style.display = 'inline-block';

        // Submit-Button deaktivieren
        document.getElementById('submit-button').disabled = true;

        // Formulardaten sammeln
        var formData = new FormData(this);
        formData.append('action', 'generate_flashcards');

        // AJAX-Anfrage senden
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '<?php echo admin_url('admin-ajax.php'); ?>', true);

        xhr.onload = function () {
            if (xhr.status === 200) {
                // Antwort verarbeiten
                document.querySelector('.output-section').innerHTML = xhr.responseText;

                // Lade-Spinner ausblenden
                document.getElementById('loading-spinner').style.display = 'none';

                // Upload-Button aktivieren und Meldung zurücksetzen
                document.getElementById('upload-button').disabled = false;
                document.getElementById('file-selected').textContent = '';

                // Submit-Button deaktiviert lassen
                document.getElementById('submit-button').disabled = true;
            } else {
                alert('An error occurred! Try it again.');
                // Lade-Spinner ausblenden
                document.getElementById('loading-spinner').style.display = 'none';
                document.getElementById('submit-button').disabled = false;
            }
        };

        xhr.onerror = function () {
            alert('An error occurred! Try it again.');
            // Lade-Spinner ausblenden
            document.getElementById('loading-spinner').style.display = 'none';
            document.getElementById('submit-button').disabled = false;
        };

        xhr.send(formData);

        // Upload-Button deaktivieren (nach dem Senden der Anfrage)
        xhr.addEventListener('loadstart', function() {
            document.getElementById('upload-button').disabled = true;
        });
    });
    </script>

    <?php
    return ob_get_clean();
}
add_shortcode('flashcard_generator', 'flashcard_generator_shortcode');

// AJAX Handler (nur für eingeloggte Benutzer)
add_action('wp_ajax_generate_flashcards', 'generate_flashcards_callback');

function generate_flashcards_callback() {
    // Überprüfen, ob der Benutzer eingeloggt ist
    $current_user = wp_get_current_user();
    if (0 == $current_user->ID) {
        echo 'You must be logged in to use this service.';
        wp_die();
    }

    // Überprüfen, ob der Benutzer Administrator ist
    if (current_user_can('administrator')) {
        $prompt_limit = 9999999;
    } else {
        // Überprüfen, ob das Paid Member Subscriptions Plugin aktiv ist
        if (!function_exists('pms_get_member_subscriptions')) {
            echo 'Subscription functionality is not available.';
            wp_die();
        }

        // Aktives Abonnement des Benutzers abrufen
        $member_subscriptions = pms_get_member_subscriptions(array('user_id' => $current_user->ID, 'status' => 'active'));

        if (empty($member_subscriptions)) {
            echo 'You do not have an active subscription. Register and sign up for a subscription to get access.';
            wp_die();
        }

        // Abonnement-Plan des Benutzers abrufen
        $subscription_plan_id = $member_subscriptions[0]->subscription_plan_id;
        $subscription_plan = pms_get_subscription_plan($subscription_plan_id);
        $subscription_plan_name = $subscription_plan->name;

        // Prompt-Limit basierend auf dem Abonnement festlegen
        switch ($subscription_plan_name) {
            case 'Basic':
                $prompt_limit = 10;
                break;
            case 'Pro':
                $prompt_limit = 30;
                break;
            case 'Group':
            case 'Exam Pass':
                $prompt_limit = 50;
                break;
            default:
                echo 'Your subscription does not allow generating prompts.';
                wp_die();
        }
    }

    // Aktuellen Monat abrufen
    $current_month = date('Y-m');

    // Prompt-Nutzung des Benutzers abrufen
    $usage_month = get_user_meta($current_user->ID, 'prompt_usage_month', true);
    $prompt_usage = get_user_meta($current_user->ID, 'prompt_usage_count', true);

    // Wenn der Monat gewechselt hat, Zähler zurücksetzen
    if ($usage_month != $current_month) {
        $prompt_usage = 0;
        update_user_meta($current_user->ID, 'prompt_usage_month', $current_month);
        update_user_meta($current_user->ID, 'prompt_usage_count', $prompt_usage);
    }

    // Überprüfen, ob das Limit erreicht wurde
    if ($prompt_usage >= $prompt_limit) {
        echo 'You have reached your monthly limit of ' . $prompt_limit . ' prompts.';
        wp_die();
    }

    // Prompt-Nutzung erhöhen
    $prompt_usage++;
    update_user_meta($current_user->ID, 'prompt_usage_count', $prompt_usage);

    // Verarbeitung der hochgeladenen Datei
    if (isset($_FILES['pdf-upload']) && $_FILES['pdf-upload']['error'] == 0) {
        $uploaded_file = $_FILES['pdf-upload']['tmp_name'];
        $original_name = basename($_FILES['pdf-upload']['name']);
        $upload_dir = wp_upload_dir();
        $target_file = $upload_dir['path'] . '/' . $original_name;

        // Verschiebe die hochgeladene Datei
        if (move_uploaded_file($uploaded_file, $target_file)) {
            // Extrahiere Text aus PDF
            $extracted_text = extract_text_from_pdf($target_file);

            // Bestimme die Anzahl der Karteikarten (hier: Seitenanzahl / 2)
            $parser = new Parser();
            try {
                $pdf = $parser->parseFile($target_file);
                $anzahl_seiten = count($pdf->getPages());
                $anzahl_karteikarten = max(1, floor($anzahl_seiten / 1)); // Mindestens 1
            } catch (Exception $e) {
                echo 'Error! Files could not be read: ' . $e->getMessage();
                wp_die();
            }

            // Generiere Karteikarten
            $karteikarten_text = generiere_karteikarten($extracted_text, $anzahl_karteikarten);

            // Erstelle die Flashcard PDF
            $pdf_datei_name = 'karteikarten_' . time() . '.pdf';
            $pdf_url = erstelle_fragen_antworten_pdf($karteikarten_text, $pdf_datei_name);

            // Anzeige-Link zur herunterladbaren PDF
            echo '<p>The flashcards were successfully created!</p>';
            echo '<a href="' . esc_url($pdf_url) . '" class="download-button" target="_blank">Download Flashcards</a>';
        } else {
            echo 'Error! Files could not be read.';
        }
    } else {
        echo 'Please upload a valid PDF file';
    }

    wp_die(); // Wichtig, um sofort zu beenden und eine korrekte Antwort zu senden
}
Die Erstellung von Karteikarten auf der Basis von handschriftlichen Notizen hat in den letzten Wochen auch mit diesem Code funktioniert. Nun habe ich aber das Problem, dass ich nur pdf's mit handschriftlichen Notizen von bis zu 5 Seiten verarbeiten kann. Bei mehr als 6 Seiten bekomme ich die Fehlermeldung 'Ein Fehler ist aufgetreten! Versuchen Sie es erneut.' angezeigt. Die API funktioniert, weil sie in normalem Python-Code funktioniert. Ich habe auch max_tokens geändert, aber leider ohne Erfolg.

Wie gesagt, das Fragwürdige daran ist, dass es letzte Woche noch funktionierte. Seitdem habe ich meinen php-Code stark verändert, aber selbst mit dem Code von letzter Woche funktioniert es nicht mehr. Ich habe auch alle optischen Merkmale meiner Webapp-Version entfernt, wie den lila Hintergrund oder die Integration meines Logos. Aber auch das hat nicht geholfen.

Hat jemand eine Idee, was das Problem sein könnte?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vitellinho: Das sieht jetzt irgendwie mehr nach einer PHP-Frage aus, und nicht nach einer Frage zu Python.

Wo genau tritt denn das Problem auf? Hat OpenAI oder die *Erstellung* von einem PDF überhaupt etwas damit zu tun?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten