Spaces:
Runtime error
Runtime error
import gradio as gr | |
import openai | |
import fitz # PyMuPDF | |
import time | |
# Set your OpenAI API key | |
openai.api_key = 'sk-proj-fCrObs9lnucfEFwJdMkHT3BlbkFJA7auo8szgjDuHz28QGBW' | |
def extract_text_from_pdf(pdf_file): | |
text = "" | |
try: | |
if isinstance(pdf_file, bytes): | |
document = fitz.open(stream=pdf_file, filetype="pdf") | |
else: | |
document = fitz.open(stream=pdf_file.read(), filetype="pdf") | |
for page_num in range(len(document)): | |
page = document.load_page(page_num) | |
text += page.get_text() | |
except Exception as e: | |
return str(e) | |
return text | |
def generate_summary(text): | |
response = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo", | |
messages=[ | |
{"role": "system", "content": "You are a summarization assistant."}, | |
{"role": "user", "content": f"Please summarize the following text: {text}"} | |
] | |
) | |
summary = response['choices'][0]['message']['content'].strip() | |
return summary | |
def evaluate_text_against_rubric(rubric_text, text): | |
start_time = time.time() | |
# Split rubric into criteria | |
criteria = [criterion.strip() for criterion in rubric_text.split('\n') if criterion.strip()] | |
if not criteria: | |
return "No valid criteria found in the rubric." | |
if not text: | |
return "No text provided for evaluation." | |
evaluations = {} | |
for i, criterion in enumerate(criteria): | |
try: | |
summary = generate_summary(text[:1000]) | |
evaluations[f'Criteria {i+1}'] = { | |
"Criterion": criterion, | |
"Score": 3, # Dummy score for now | |
"Comment": f"Evaluation based on criterion: {criterion}", | |
"Example": summary | |
} | |
except Exception as e: | |
evaluations[f'Criteria {i+1}'] = { | |
"Criterion": criterion, | |
"Score": 0, | |
"Comment": f"Error during evaluation: {str(e)}", | |
"Example": "" | |
} | |
end_time = time.time() | |
print(f"Evaluation took {end_time - start_time} seconds") | |
return evaluations | |
def evaluate(rubric_pdf, rubric_text, text): | |
rubric = "" | |
if rubric_pdf is not None: | |
rubric = extract_text_from_pdf(rubric_pdf) | |
elif rubric_text: | |
rubric = rubric_text | |
if not rubric: | |
return "No rubric provided." | |
if not text: | |
return "No text provided for evaluation." | |
if len(text) > 2000: | |
return "The text provided exceeds the 2000 character limit." | |
evaluation = evaluate_text_against_rubric(rubric, text) | |
if isinstance(evaluation, str): # If it's an error message | |
return evaluation | |
evaluation_text = "" | |
for criterion, details in evaluation.items(): | |
evaluation_text += f"{criterion}:\n" | |
evaluation_text += f" Criterion: {details['Criterion']}\n" | |
evaluation_text += f" Score: {details['Score']}\n" | |
evaluation_text += f" Comment: {details['Comment']}\n" | |
evaluation_text += f" Example: {details['Example']}\n\n" | |
return evaluation_text | |
# Create Gradio interface | |
with gr.Blocks() as interface: | |
gr.Markdown("# PDF Text Evaluator") | |
gr.Markdown("Upload a rubric as a PDF or paste the rubric text, then paste text for evaluation.") | |
rubric_pdf_input = gr.File(label="Upload Rubric PDF (optional)", type="binary") | |
rubric_text_input = gr.Textbox(lines=10, placeholder="Or enter your rubric text here...", label="Rubric Text (optional)") | |
text_input = gr.Textbox(lines=10, placeholder="Paste the text to be evaluated here (max 2000 characters)...", label="Text to Evaluate") | |
evaluate_button = gr.Button("Evaluate") | |
output = gr.Textbox(label="Evaluation Results") | |
def evaluate_button_clicked(rubric_pdf, rubric_text, text): | |
return evaluate(rubric_pdf, rubric_text, text) | |
evaluate_button.click(evaluate_button_clicked, inputs=[rubric_pdf_input, rubric_text_input, text_input], outputs=output) | |
# Launch the interface | |
interface.launch() | |