AnswerMate / app.py
Brasd99's picture
Added types to methods
ab581cb
raw
history blame
3.19 kB
import gradio as gr
from gradio.components import Textbox
import requests
import json
import time
from typing import List, Tuple, Dict, Any
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()