Spaces:
Running
Running
from flask import Flask,make_response,render_template, request, redirect, url_for, session, jsonify, flash | |
from datetime import datetime, timedelta | |
import sqlite3 | |
from urllib.parse import urlparse | |
import requests | |
import yt_dlp | |
import functools | |
import time | |
import tempfile | |
import re | |
import psycopg2 | |
from markupsafe import Markup | |
from gradio_client import Client,handle_file | |
from functools import wraps | |
import os | |
import google.generativeai as genai | |
import textwrap | |
import PIL.Image | |
from werkzeug.utils import secure_filename | |
from pytube import YouTube | |
from psycopg2.extras import RealDictCursor | |
import redis | |
DATABASE_URL='postgres://default:LcAf9t8VFUgW@ep-steep-scene-a4pezmy7.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require' | |
GOOGLE_API_KEY = '' | |
generation_config = { | |
"temperature": 1, | |
"top_p": 0.95, | |
"top_k": 64, | |
"max_output_tokens": 8192, | |
} | |
safety_settings = [ | |
{ | |
"category": "HARM_CATEGORY_HARASSMENT", | |
"threshold": "BLOCK_NONE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_HATE_SPEECH", | |
"threshold": "BLOCK_NONE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", | |
"threshold": "BLOCK_NONE" | |
}, | |
{ | |
"category": "HARM_CATEGORY_DANGEROUS_CONTENT", | |
"threshold": "BLOCK_NONE" | |
}, | |
] | |
genai.configure(api_key=GOOGLE_API_KEY) | |
MAX_CONTENT_LENGTH = 760 * 1024 * 1024 # 16MB max file size | |
def create_connection(): | |
#le première c'est pour boma langue | |
#conn = psycopg2.connect("postgres://default:9fmSeFktMRV4@ep-cold-butterfly-a4hwib6l.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require") | |
conn = psycopg2.connect("postgres://default:LcAf9t8VFUgW@ep-steep-scene-a4pezmy7.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require") | |
return conn | |
app = Flask(__name__) | |
app.secret_key = "uyyhhy77uu" | |
app.permanent_session_lifetime = timedelta(days=200) | |
def philosophie(): | |
return render_template("philosophie.html") | |
# Route pour récupérer la liste des cours | |
def get_philosophy_courses(): | |
try: | |
conn = psycopg2.connect(DATABASE_URL) | |
cur = conn.cursor(cursor_factory=RealDictCursor) | |
cur.execute(""" | |
SELECT id, title, author, updated_at | |
FROM cours_philosophie | |
ORDER BY title | |
""") | |
courses = cur.fetchall() | |
cur.close() | |
conn.close() | |
return jsonify(courses) | |
except Exception as e: | |
print(f"Erreur lors de la récupération des cours : {e}") | |
return jsonify({"error": str(e)}), 500 | |
# Route pour récupérer les détails d'un cours spécifique | |
def get_philosophy_course(course_id): | |
try: | |
conn = psycopg2.connect(DATABASE_URL) | |
cur = conn.cursor(cursor_factory=RealDictCursor) | |
cur.execute(""" | |
SELECT id, title, content, author, created_at, updated_at | |
FROM cours_philosophie | |
WHERE id = %s | |
""", (course_id,)) | |
course = cur.fetchone() | |
cur.close() | |
conn.close() | |
if course: | |
return jsonify(course) | |
return jsonify({"error": "Cours non trouvé"}), 404 | |
except Exception as e: | |
print(f"Erreur lors de la récupération du cours : {e}") | |
return jsonify({"error": str(e)}), 500 | |
# Route Flask mise à jour | |
def submit_philo(): | |
data = request.json | |
phi_prompt = data.get('question', '').strip() | |
phi_type = data.get('type', '1') # Type 1 par défaut | |
course_id = data.get('courseId') | |
if not phi_prompt: | |
return jsonify({"error": "Veuillez saisir un sujet."}), 400 | |
try: | |
# Récupération du contenu du cours si un cours est sélectionné | |
course_content = "" | |
course_info = "" | |
if course_id: | |
conn = psycopg2.connect(DATABASE_URL) | |
cur = conn.cursor(cursor_factory=RealDictCursor) | |
cur.execute(""" | |
SELECT content, author, title | |
FROM cours_philosophie | |
WHERE id = %s | |
""", (course_id,)) | |
result = cur.fetchone() | |
if result: | |
course_content = result['content'] | |
course_info = f"\nBasé sur le cours '{result['title']}' de {result['author']}" | |
cur.close() | |
conn.close() | |
# Sélection de la méthodologie selon le type | |
if phi_type == '1': | |
methodologie = f""" | |
Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant: | |
# INTRODUCTION: | |
- Amorcer le sujet avec moins de deux phrases | |
- Poser le problème | |
- Formuler la problématique autour de deux questions essentielles: | |
- Question-thèse | |
- Question-antithèse | |
# DEVELOPPEMENT | |
## Première Partie: Formuler la thèse initiale | |
Je veux trois arguments avec le plan suivant (Argument + Explication de l'argument + Illustration soit avec un exemple de la vie courante soit avec une citation philosophique). Je veux que ce soit le plus détaillé possible surtout sur la partie explication. Je veux un gros texte. | |
## Deuxième Partie: Formuler l'antithèse | |
Je veux trois arguments avec le plan suivant (Argument + Explication de l'argument + Illustration soit avec un exemple de la vie courante soit avec une citation philosophique). Je veux que ce soit le plus détaillé possible surtout sur la partie explication. Je veux un gros texte. | |
# CONCLUSION | |
1. Bilan de la réflexion: | |
- Résumer les grandes parties de la réflexion | |
2. Prise de position | |
Je veux un travail bien détaillé et complet avec un français raffiné et soutenu. | |
""" | |
else: # Type 2 | |
methodologie = f""" | |
Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant: | |
# INTRODUCTION: | |
- Approche par constat | |
- Posez la citation | |
- Reformulation de la citation | |
- Nuancez la thèse (antithèse) | |
- De cette opposition naît le problème | |
- En quoi | |
- Idée de la citation | |
# DÉVELOPPEMENT: | |
## Première partie (Thèse) | |
- Introduction partielle (thèse + arguments1 + arguments2) | |
- Argument 1: | |
* Explications | |
* Illustration (citation + reformulation) | |
- Argument 2: | |
* Explications | |
* Illustration (exemple + explication) | |
- Transition: | |
* Bilan (thèse + arguments1 + arguments2) | |
* Annonce de l'idée critique | |
## Deuxième partie (Antithèse) | |
- Introduction partielle (antithèse + arguments3 + arguments4) | |
- Argument 3: | |
* Explications | |
* Illustration (citation + reformulation) | |
- Argument 4: | |
* Explications | |
* Illustration (exemple + reformulation) | |
# CONCLUSION: | |
- Bilan global de l'analyse (rappel du problème + thèse + antithèse) | |
- Prise de position (réponse à la question critique de l'introduction) | |
Je veux un travail bien détaillé et complet avec un français raffiné et soutenu. | |
""" | |
# Ajout du contenu du cours à la prompt si disponible | |
if course_content: | |
methodologie += f"\nEn te basant sur le cours suivant:\n{course_content}" | |
prompt = methodologie | |
try: | |
model = genai.GenerativeModel(model_name="models/gemini-1.5-flash", safety_settings=safety_settings) | |
response = model.generate_content(prompt, request_options={"timeout": 900}) | |
dissertation = response.text | |
return jsonify({"response": dissertation}), 200 | |
except Exception as e: | |
print(f"Erreur dans la génération de contenu : {e}") | |
return jsonify({"error": str(e)}), 500 | |
except Exception as e: | |
print(f"Erreur dans submit_philo : {e}") | |
return jsonify({"error": str(e)}), 500 | |
def manage_philosophy_courses(): | |
if request.method == 'GET': | |
try: | |
conn = psycopg2.connect(DATABASE_URL) | |
cur = conn.cursor(cursor_factory=RealDictCursor) | |
cur.execute("SELECT * FROM cours_philosophie") | |
courses = cur.fetchall() | |
cur.close() | |
conn.close() | |
return render_template('philosophy_courses.html', courses=courses) | |
except Exception as e: | |
flash(f'Erreur lors de la récupération des cours : {e}', 'danger') | |
return redirect(url_for('manage_philosophy_courses')) | |
elif request.method == 'POST': | |
if 'title' in request.form: # Vérification pour savoir si le formulaire soumis est celui d'ajout | |
try: | |
title = request.form.get('title') | |
content = request.form.get('content') | |
author = request.form.get('author') | |
conn = psycopg2.connect(DATABASE_URL) | |
cur = conn.cursor() | |
cur.execute(""" | |
INSERT INTO cours_philosophie (title, content, author) | |
VALUES (%s, %s, %s) | |
""", (title, content, author)) | |
conn.commit() | |
cur.close() | |
conn.close() | |
flash('Cours ajouté avec succès !', 'success') | |
return redirect(url_for('manage_philosophy_courses')) | |
except Exception as e: | |
flash(f'Erreur lors de l\'ajout du cours : {e}', 'danger') | |
return redirect(url_for('manage_philosophy_courses')) | |
else: | |
try: | |
course_id = request.form.get('id') | |
conn = psycopg2.connect(DATABASE_URL) | |
cur = conn.cursor() | |
cur.execute("DELETE FROM cours_philosophie WHERE id = %s", (course_id,)) | |
conn.commit() | |
cur.close() | |
conn.close() | |
flash('Cours supprimé avec succès !', 'success') | |
return redirect(url_for('manage_philosophy_courses')) | |
except Exception as e: | |
flash(f'Erreur lors de la suppression du cours : {e}', 'danger') | |
return redirect(url_for('manage_philosophy_courses')) | |