Spaces:
Runtime error
Runtime error
File size: 5,599 Bytes
417ad57 d3e1bea |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
from flask import Flask, request, jsonify, render_template, make_response, send_from_directory
import anthropic
import os
import json
from datetime import datetime
import base64
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.route('/')
def index():
recent_files = get_recent_files()
response = make_response(render_template('index.html', recent_files=recent_files))
return response
def get_recent_files():
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
files = os.listdir(app.config['UPLOAD_FOLDER'])
valid_files = [f for f in files if f.lower().endswith(('.pdf', '.txt'))]
valid_files.sort(key=lambda x: os.path.getmtime(os.path.join(app.config['UPLOAD_FOLDER'], x)), reverse=True)
return [{'filename': file, 'date': datetime.fromtimestamp(os.path.getmtime(os.path.join(app.config['UPLOAD_FOLDER'], file))).isoformat()} for file in valid_files[:5]]
@app.route('/get_recent_files')
def get_recent_files_route():
return jsonify(get_recent_files())
@app.route('/upload_file', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'No selected file'}), 400
if file and (file.filename.lower().endswith(('.pdf', '.txt', '.epub'))):
filename = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(filename)
return jsonify({'message': 'File uploaded successfully', 'filename': file.filename}), 200
return jsonify({'error': 'Invalid file type. Please upload a PDF, TXT, or EPUB file.'}), 400
@app.route('/get_epub_content/<path:filename>')
def get_epub_content(filename):
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
if os.path.exists(file_path) and filename.endswith('.epub'):
with open(file_path, 'rb') as file:
epub_content = base64.b64encode(file.read()).decode('utf-8')
return jsonify({'epub_content': epub_content})
return jsonify({'error': 'File not found or not an EPUB'}), 404
@app.route('/open_pdf/<path:filename>')
def open_pdf(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
@app.route('/generate_flashcard', methods=['POST'])
def generate_flashcard():
data = request.json
prompt = data['prompt']
api_key = request.headers.get('X-API-Key')
mode = data.get('mode', 'flashcard')
client = anthropic.Anthropic(api_key=api_key)
try:
model = data.get('model', "claude-3-5-sonnet-20240620")
message = client.messages.create(
model=model,
max_tokens=1024,
messages=[
{"role": "user", "content": prompt}
]
)
content = message.content[0].text
print(prompt)
print(content)
if mode == 'language':
# For Language mode, parse the content and return in the custom format
lines = content.split('\n')
word = ''
translation = ''
answer = ''
for line in lines:
if line.startswith('T:'):
translation = line[2:].strip()
elif line.startswith('Q:'):
word = line[2:].split('<b>')[1].split('</b>')[0].strip()
question = line[2:].strip()
elif line.startswith('A:'):
answer = line[2:].strip()
flashcard = {
'word': word,
'question': question,
'translation': translation,
'answer': answer
}
response = make_response(jsonify({'flashcard': flashcard}))
elif mode == 'flashcard' or 'flashcard' in prompt.lower():
flashcards = []
current_question = ''
current_answer = ''
for line in content.split('\n'):
if line.startswith('Q:'):
if current_question and current_answer:
flashcards.append({'question': current_question, 'answer': current_answer})
current_question = line[2:].strip()
current_answer = ''
elif line.startswith('A:'):
current_answer = line[2:].strip()
if current_question and current_answer:
flashcards.append({'question': current_question, 'answer': current_answer})
response = make_response(jsonify({'flashcards': flashcards}))
elif mode == 'explain' or 'explain' in prompt.lower():
# For Explain mode, return the entire content as the explanation
response = make_response(jsonify({'explanation': content}))
else:
response = make_response(jsonify({'error': 'Invalid mode'}))
# Set cookie with the API key
response.set_cookie('last_working_api_key', api_key, secure=True, httponly=True, samesite='Strict')
return response
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
# Use environment variables to determine the run mode
debug_mode = os.environ.get('FLASK_DEBUG', 'False').lower() == 'true'
app.run(debug=debug_mode, host='0.0.0.0', port=7860)
|