File size: 3,620 Bytes
e6e2b1d
 
 
 
eb3f110
 
 
 
 
 
 
39b2f30
eb3f110
ab581cb
8916e27
39b2f30
8916e27
 
39b2f30
 
 
 
8916e27
 
e6e2b1d
eb3f110
8916e27
 
 
eb3f110
 
8916e27
eb3f110
 
 
8916e27
eb3f110
 
ab581cb
e34ec31
eb3f110
39b2f30
 
84fc647
39b2f30
eb3f110
 
 
ab581cb
a8c7fff
39b2f30
eb3f110
39b2f30
a8c7fff
ab581cb
a8c7fff
39b2f30
eb3f110
39b2f30
eb3f110
ff6490e
a8c7fff
 
 
 
 
 
39b2f30
 
eb3f110
ff6490e
39b2f30
a8c7fff
eb3f110
 
 
 
a8c7fff
 
eb3f110
a8c7fff
 
eb3f110
 
76c067f
 
5475510
76c067f
 
 
5475510
 
 
 
 
 
 
 
76c067f
 
 
 
ff6490e
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
from typing import List, Tuple, Dict, Any
import time
import json
import requests
import gradio as gr
from gradio.components import Textbox

MAX_QUESTIONS_COUNT = 25
MAX_TAGS_COUNT = 5
MAX_ATTEMPS = 3
WAIT_TIME = 3
CHATGPT_URL = 'https://free.churchless.tech/v1/chat/completions'

def get_answer(question: str) -> Dict[str, Any]:
    headers = {
        'Content-Type': 'application/json; charset=utf-8'
    }
    payload = {
        'model': 'gpt-3.5-turbo',
        'messages': [{
            'role': 'user',
            'content': question
        }]
    }

    try:
        response = requests.post(CHATGPT_URL, headers=headers, data=json.dumps(payload))
        response.raise_for_status()
        content = response.json()['choices'][0]['message']['content']
        return {
            'status': True,
            'content': content
        }
    except:
        return {
            'status': False
        }

def format_results(results: List[Tuple[str, str]]) -> str:
    output = ''
    for i, (question, answer) in enumerate(results):
        output += f'Question №{i+1}: {question}\n'
        output += f'Answer: {answer}\n'
        if i < len(results) - 1:
            output += '--------------------------------------\n\n'
    output = output.strip()
    return output

def validate_tags(tags: str) -> None:
    if not tags:
        raise gr.Error('Validation error. It is necessary to set at least one tag')
    if len(tags) > MAX_TAGS_COUNT:
        raise gr.Error(f'Validation error. The maximum allowed number of tags is {MAX_TAGS_COUNT}.')

def validate_questions(questions: str) -> None:
    if not questions:
        raise gr.Error('Validation error. It is necessary to ask at least one question')
    if len(questions) > MAX_QUESTIONS_COUNT:
        raise gr.Error(f'Validation error. The maximum allowed number of questions is {MAX_QUESTIONS_COUNT}.')

def find_answers(tags: str, questions: str, progress=gr.Progress()) -> str:
    tags = tags.split('\n')
    questions = questions.split('\n')

    validate_tags(tags)
    validate_questions(questions)

    tags_str = ''.join([f'[{tag}]' for tag in tags])

    results = []
    for question in progress.tqdm(questions):
        tagged_question = f'{tags_str} {question}'
        for attempt in range(MAX_ATTEMPS):
            answer = get_answer(tagged_question)
            if answer['status']:
                results.append((question, answer['content']))
                break
            elif attempt == MAX_ATTEMPS - 1:
                results.append((question, 'An error occurred while receiving data.'))
            else:
                time.sleep(WAIT_TIME)

    return format_results(results)

title = '<h1 style="text-align:center">AnswerMate</h1>'

with gr.Blocks(theme='soft', title='AnswerMate') as blocks:
    gr.HTML(title)
    gr.Markdown('The service allows you to get answers to all questions on the specified topic.')
    with gr.Row():
        tags_input = gr.Textbox(
            label='Enter tags (each line is a separate tag). Maximum: 5.', 
            placeholder='.Net\nC#', 
            lines=5)
        questions_input = gr.Textbox(
            label='Enter questions (each line is a separate question). Maximum 25.', 
            placeholder='What is inheritance, encapsulation, abstraction, polymorphism?\nWhat is CLR?', 
            lines=25)
    process_button = gr.Button('Find answers')
    outputs = gr.Textbox(label='Output', placeholder='Output will appear here')
    process_button.click(fn=find_answers, inputs=[tags_input, questions_input], outputs=outputs)

blocks.queue(concurrency_count=1).launch()