File size: 3,184 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
ab581cb
a8c7fff
 
 
 
 
 
39b2f30
 
eb3f110
 
39b2f30
a8c7fff
eb3f110
 
 
 
a8c7fff
 
eb3f110
a8c7fff
 
eb3f110
 
 
39b2f30
 
eb3f110
 
 
39b2f30
eb3f110
 
d308299
 
 
 
 
 
 
 
 
 
eb3f110
 
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
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) -> 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 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)

inputs = [
    Textbox(label='Enter tags (each line is a separate tag). Maximum: 5.', lines=5),
    Textbox(label='Enter questions (each line is a separate question). Maximum 25.', lines=25)
]

outputs = [
    Textbox(label='Answers')
]

title = 'AnswerMate'
description = 'The service allows you to get answers to all questions on the specified topic.'

gradio_interface = gr.Interface(
    theme='soft',
    title=title,
    description=description,
    fn=find_answers, 
    inputs=inputs, 
    outputs=outputs)

gradio_interface.launch()