Spaces:
Runtime error
Runtime error
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() |