From d810033b54258ab0c62577737eb0ab2dd657fb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pa=C4=BEo?= Date: Sat, 25 Nov 2023 15:11:14 +0100 Subject: [PATCH] feat: added initial setup of project with working databasepdf --- .idea/vcs.xml | 6 +++ backend/app.py | 43 +++++++++++++++++++ .../versions/08afc1f4ebcc_summarize.py | 34 +++++++++++++++ backend/test.py | 11 +++++ frontend/src/components/PdfUpload.jsx | 25 ++++++++++- 5 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 backend/migrations/versions/08afc1f4ebcc_summarize.py create mode 100644 backend/test.py diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/backend/app.py b/backend/app.py index 52292a7..f9fc592 100644 --- a/backend/app.py +++ b/backend/app.py @@ -4,9 +4,14 @@ from flask_migrate import Migrate from PyPDF2 import PdfReader import re +import openai from dotenv import load_dotenv load_dotenv() + +# Configure OpenAI with your API Key +openai.api_key = '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', + app = Flask(__name__) CORS(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:heslo@localhost/hackathon' @@ -23,6 +28,13 @@ def __init__(self, text, filename): self.text = text self.filename = filename +class PdfSummary(db.Model): + id = db.Column(db.Integer, primary_key=True) + summary_text = db.Column(db.Text) + pdf_text_id = db.Column(db.Integer, db.ForeignKey('pdf_text.id'), nullable=False) + + pdf_text = db.relationship('PdfText', backref=db.backref('summary', lazy=True)) + @app.route('/upload_pdf', methods=['POST']) def upload_pdf(): uploaded_file = request.files.get('file') @@ -57,6 +69,37 @@ def delete_pdf_text(pdf_text_id): else: return jsonify({"message": "PDF Text not found"}), 404 + +@app.route('/summarize_pdf', methods=['POST']) +def summarize_pdf(): + data = request.json + pdf_text_id = data.get('pdf_text_id') + + if not pdf_text_id: + return jsonify({"error": "PDF text ID is required"}), 400 + + pdf_text_record = PdfText.query.get(pdf_text_id) + if not pdf_text_record: + return jsonify({"error": "PDF text not found"}), 404 + + try: + response = openai.Completion.create( + engine="text-davinci-003", + prompt=f"Summarize the following text:\n\n{pdf_text_record.text}", + max_tokens=150 + ) + summary = response.choices[0].text.strip() + + # Save the summary to the database + new_summary = PdfSummary(summary_text=summary, pdf_text_id=pdf_text_id) + db.session.add(new_summary) + db.session.commit() + + return jsonify({"summary": summary}) + except Exception as e: + print(f"Error: {e}") + return jsonify({"error": "An error occurred during summarization"}), 500 + def init_db(): db.create_all() diff --git a/backend/migrations/versions/08afc1f4ebcc_summarize.py b/backend/migrations/versions/08afc1f4ebcc_summarize.py new file mode 100644 index 0000000..cf0e120 --- /dev/null +++ b/backend/migrations/versions/08afc1f4ebcc_summarize.py @@ -0,0 +1,34 @@ +"""summarize + +Revision ID: 08afc1f4ebcc +Revises: c4b843d1ef4c +Create Date: 2023-11-25 14:41:14.451331 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '08afc1f4ebcc' +down_revision = 'c4b843d1ef4c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('pdf_summary', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('summary_text', sa.Text(), nullable=True), + sa.Column('pdf_text_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['pdf_text_id'], ['pdf_text.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('pdf_summary') + # ### end Alembic commands ### diff --git a/backend/test.py b/backend/test.py new file mode 100644 index 0000000..3422b5d --- /dev/null +++ b/backend/test.py @@ -0,0 +1,11 @@ +import openai + +# Set the API key directly +openai.api_key = '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' + +response = openai.Completion.create( + engine="gpt-3.5-turbo-instruct", + prompt="Write a tagline for an ice cream shop." +) + +print(response.choices[0].text.strip()) diff --git a/frontend/src/components/PdfUpload.jsx b/frontend/src/components/PdfUpload.jsx index 3c0eb0f..7801334 100644 --- a/frontend/src/components/PdfUpload.jsx +++ b/frontend/src/components/PdfUpload.jsx @@ -5,6 +5,8 @@ const PdfUpload = () => { const [pdfTexts, setPdfTexts] = useState([]); const [selectedFile, setSelectedFile] = useState(null); const [isUploading, setIsUploading] = useState(false); + const [selectedPdfTextId, setSelectedPdfTextId] = useState(null); + const [summary, setSummary] = useState(''); const fetchPdfTexts = async () => { try { @@ -44,12 +46,23 @@ const PdfUpload = () => { } }; + const summarizePdfText = async (pdfTextId) => { + setSelectedPdfTextId(pdfTextId); + try { + const response = await axios.post('/summarize_pdf', { pdf_text_id: pdfTextId }); + setSummary(response.data.summary); // Store the summary in state + } catch (error) { + console.error('Failed to summarize PDF text:', error); + setSummary(''); // Clear previous summary on error + } + }; + useEffect(() => { fetchPdfTexts(); }, []); return ( -
+
{
    {pdfTexts.map((text) => (
  • - {text.filename} + + {selectedPdfTextId === text.id && summary && ( +
    +

    Summary:

    +

    {summary}

    +
    + )}
  • ))}