AnswerMate / app.py
Brasd99's picture
Added config
e6fa7d1
raw
history blame
3.79 kB
from typing import List, Tuple, Dict, Any
import time
import json
import requests
import gradio as gr
with open("config.json", "r") as f:
config = json.load(f)
max_questions_count = config["MAX_QUESTIONS_COUNT"]
max_tags_count = config["MAX_TAGS_COUNT"]
max_attempts = config["MAX_ATTEMPS"]
wait_time = config["WAIT_TIME"]
chatgpt_url = config["CHATGPT_URL"]
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_attempts):
answer = get_answer(tagged_question)
if answer['status']:
results.append((question, answer['content']))
break
elif attempt == max_attempts - 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=f'Enter tags (each line is a separate tag). Maximum: {max_tags_count}.',
placeholder='.Net\nC#',
lines=max_tags_count
)
questions_input = gr.Textbox(
label=f'Enter questions (each line is a separate question). Maximum: {max_questions_count}.',
placeholder='What is inheritance, encapsulation, abstraction, polymorphism?\nWhat is CLR?',
lines=max_questions_count
)
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()