File size: 5,025 Bytes
ebd324a
 
00a711c
 
ebd324a
 
6afe6e2
 
ebd324a
6afe6e2
ebd324a
 
 
 
6afe6e2
 
 
ebd324a
6afe6e2
 
 
ebd324a
6afe6e2
 
 
00a711c
6afe6e2
 
1ee72b8
6afe6e2
 
 
 
 
ebd324a
 
d6f1646
ebd324a
 
1ee72b8
ebd324a
00a711c
332053a
ebd324a
dad9e49
 
 
 
 
 
 
 
0d737d9
 
 
 
 
 
 
 
 
 
 
 
ebd324a
00a711c
 
ebd324a
 
 
1ee72b8
0d737d9
ebd324a
 
 
 
dad9e49
0d737d9
6afe6e2
 
698e114
 
6afe6e2
698e114
6afe6e2
698e114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6afe6e2
698e114
dad9e49
92f7ad1
698e114
0971287
92f7ad1
0d737d9
92f7ad1
 
 
 
 
 
 
 
 
 
 
dad9e49
 
 
 
 
 
 
 
 
698e114
 
 
6afe6e2
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
import gradio as gr
from transformers import pipeline
from langchain import PromptTemplate
from langchain.chains import LLMChain
from langchain_google_genai import ChatGoogleGenerativeAI
import os
from PIL import Image
import json

# Retrieve the API keys and other secrets from the environment
api_key = os.environ.get('GOOGLE_API_KEY')
if api_key is None:
    raise ValueError("No API key found. Please set the 'GOOGLE_API_KEY' environment variable.")

tracking_id = os.environ.get('TRACKING_ID')
if tracking_id is None:
    raise ValueError("No tracking ID found. Please set the 'TRACKING_ID' environment variable.")

initial_prompt = os.environ.get('initial_prompt')
if initial_prompt is None:
    raise ValueError("No initial prompt found. Please set the 'initial_prompt' environment variable.")

description_json = os.environ.get('description')
if description_json is None:
    raise ValueError("No description found. Please set the 'description' environment variable.")

# Convert the description JSON string to a dictionary
description = json.loads(description_json)

# Set the API key for Google
os.environ['GOOGLE_API_KEY'] = api_key

# Initialize the OCR pipeline
ocr_pipe = pipeline("image-to-text", model="jinhybr/OCR-Donut-CORD")

# Initialize the LLM
llm_model = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.4, top_p=0.85)

# Define the prompt template
prompt = PromptTemplate(input_variables=['task_type', 'task_number', 'question', 'content', 'description'], template=initial_prompt)

# Define the LLM chain
chain = LLMChain(llm=llm_model, prompt=prompt)

# Define the function to toggle input visibility
def toggle_input(input_type):
    if input_type == "Image":
        return gr.update(visible=True), gr.update(visible=False)
    else:
        return gr.update(visible=False), gr.update(visible=True)

# Define the evaluation function
def evaluate(task_type, task_number, question, input_type, image=None, text=None):
    if input_type == "Image" and image is not None:
        # Process the image to extract text
        text_content = ocr_pipe(image)
        content = text_content[0]['generated_text']
    elif input_type == "Text" and text is not None:
        content = text
    else:
        return "Please provide the required input based on your selection."

    # Retrieve the description for the given task type and number, or use a default value
    task_description = description.get((task_type, task_number), "No description available for this task.")

    # Run the chain
    result = chain.run({
        'task_type': task_type,
        'task_number': task_number,
        'question': question,
        'content': content,
        'description': task_description
    })

    return result



footer_html_with_analytics = f"""
<script async src="https://www.googletagmanager.com/gtag/js?id={tracking_id}"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){{dataLayer.push(arguments);}}
  gtag('js', new Date());
  gtag('config', '{tracking_id}');
</script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<div style='text-align: center; margin-top: 20px;'>
    <p>Developed by Hossein Mohseni</p>
    <p>Contact Information:</p>
    <p>
        <a href='mailto:[email protected]' style='margin-right: 10px;'>
            <i class='fas fa-envelope'></i>
        </a>
        <a href='https://www.linkedin.com/in/mohsenihossein/' target='_blank' style='margin-right: 10px;'>
            <i class='fab fa-linkedin'></i>
        </a>
        <a href='https://t.me/mohsenih1999' target='_blank'>
            <i class='fab fa-telegram'></i>
        </a>
    </p>
    <p>This application is a demonstration. To enhance and improve it, your feedback is highly appreciated.</p>
</div>
"""


# Create the Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("# IELTS Writing Evaluation")
    
    with gr.Row():
        test_type = gr.Dropdown(choices=["Academic", "General"], label="Test Type", value="Academic")
        task_number = gr.Dropdown(choices=["Task 1", "Task 2"], label="Task Number", value="Task 1")
        question = gr.Textbox(label="Question")
        input_type = gr.Radio(choices=["Image", "Text"], label="Input Type", value="Image")
        
    with gr.Row():
        image_input = gr.Image(type="pil", label="Upload Image", visible=True)
        text_input = gr.Textbox(label="Enter Text", visible=False)

    input_type.change(toggle_input, [input_type], [image_input, text_input])

    result_output = gr.Markdown(label="Result")
    
    # Define the submit button and the function to be called
    submit_button = gr.Button("Submit")
    submit_button.click(fn=evaluate, 
                        inputs=[test_type, task_number, question, input_type, image_input, text_input], 
                        outputs=result_output)
    
    # Add the footer HTML
    gr.HTML(footer_html_with_analytics)

# Launch the interface
demo.launch(share=True, debug=True)