new_ads_obnova / app.py
Uniaff's picture
Update app.py
2cc2995 verified
import os
import sys
import time
import gradio as gr
import requests
from langchain.prompts import ChatPromptTemplate
from langchain_community.llms import Ollama
import subprocess
from datetime import datetime
from func_ai import classify_comment, retrieve_from_vdb, VECTOR_API_URL
from func_facebook import get_page_id, has_page_replied, get_unanswered_comments, reply_comment, hide_negative_comments
def log_message(message):
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f"[{timestamp}] {message}")
# Wait for the server to start
time.sleep(10)
llm = Ollama(model="llama3.1")
log_message("Модель Ollama 'llama3.1' инициализирована.")
template = """
You are an assistant answering users' questions using the provided context. Your tasks:
1. **Brevity**: Respond concisely, using only relevant information from the context.
2. **Politeness**: Start your response with a greeting and maintain a respectful tone.
3. **Clarity**: Avoid unnecessary explanations and use simple language.
4. **Language of the response**: Detect the language of the user's comment and reply in the same language.
5. **Safety**: Do not use phrases like "according to the context" and remove any warnings.
6. **Accuracy**: Provide the user with only important and verified purchase links.
<context>
{context}
</context>
Question: {input}
"""
def delete_faiss_index():
log_message("Удаляем FAISS индекс.")
response = requests.delete(f"{VECTOR_API_URL}/delete_index/")
if response.status_code == 200:
log_message("FAISS индекс успешно удален.")
return "Faiss успешно удален."
else:
log_message(f"Ошибка при удалении FAISS индекса: {response.json().get('detail')}")
return {"status": "error", "message": response.json().get("detail", "Ошибка при удалении FAISS индекса.")}
def upload_file_vdb(file):
log_message("Загружаем файл")
API_URL = f"{VECTOR_API_URL}/upload/"
file_path = file
file_name = os.path.basename(file_path)
# Открываем файл в бинарном режиме
with open(file_path, 'rb') as f:
files = {'file': (file_name, f)}
response = requests.post(API_URL, files=files)
# Обработка ответа от сервера
if response.status_code == 200:
log_message("Файл успешно загружен.")
return "Файл успешно загружен."
else:
log_message(f"Ошибка при загрузке файла: {response.json().get('detail')}")
return f"Ошибка: {response.json().get('detail')}"
def generate_response(user_query):
log_message(f"Генерация ответа на запрос: {user_query}")
prompt = ChatPromptTemplate.from_template(template)
documents = retrieve_from_vdb(user_query)
context = "\n".join(documents)
log_message(f"Контекст из базы данных: {context[:100]}...")
full_prompt = prompt.format(context=context, input=user_query)
response = llm.invoke(full_prompt)
log_message(f"Сгенерированный ответ: {response}")
return response
def process_comments(ACCESS_TOKEN):
log_message("Начинаем процесс скрытия отрицательных комментариев.")
hidden_comments_data = hide_negative_comments(ACCESS_TOKEN)
log_message(f"Количество постов с скрытыми комментариями: {len(hidden_comments_data)}")
log_message("Получение неотвеченных комментариев.")
posts_with_unanswered_comments = get_unanswered_comments(ACCESS_TOKEN)
page_id = get_page_id(ACCESS_TOKEN)
if not page_id:
log_message("Не удалось получить ID страницы.")
return {"status": "failed", "reason": "Не удалось получить ID страницы."}
log_message(f"ID страницы: {page_id}")
processed_posts = []
processed_comment_ids = set() # Отслеживание обработанных комментариев
for post_data in posts_with_unanswered_comments:
post_id = post_data['post_id']
post_message = post_data['post_message']
unanswered_comments = post_data['unanswered_comments']
post_replies = []
for comment in unanswered_comments:
comment_id = comment['id']
if comment_id in processed_comment_ids:
log_message(f"Комментарий {comment_id} уже обработан. Пропуск.")
continue
processed_comment_ids.add(comment_id)
message = comment['message']
log_message(f"Обработка комментария: {message}")
classification = classify_comment(message)
log_message(f"Классификация комментария: {classification}")
if classification == "interrogative":
response_message = generate_response(message)
log_message(f"Ответ на комментарий: {response_message}")
success = reply_comment(comment_id=comment['id'], message=response_message, token=ACCESS_TOKEN)
if success:
post_replies.append({
'comment_id': comment['id'],
'comment_message': comment['message'],
'reply_message': response_message
})
processed_posts.append({
'post_id': post_id,
'post_message': post_message,
'hidden_comments': next((item['hidden_comments'] for item in hidden_comments_data if item['post_id'] == post_id), []),
'replies': post_replies
})
return {
"status": "completed",
"posts": processed_posts
}
with gr.Blocks() as demo:
with gr.Tab("Главная страница"):
gr.Markdown("# Facebook Comment Filter")
token_input = gr.Textbox(label="Access Token")
output_main = gr.JSON()
process_btn = gr.Button("Процессировать комментарии")
process_btn.click(process_comments, inputs=token_input, outputs=output_main)
with gr.Tab("Загрузить данные"):
gr.Markdown("# Отправь excel файл")
file_input = gr.File(label="Загрузите Excel файл (.xlsx)")
output_second = gr.Text()
second_page_btn = gr.Button("Отправить файл")
second_page_btn.click(upload_file_vdb, inputs=file_input, outputs=output_second)
delete_btn = gr.Button("Удалить FAISS индекс")
delete_btn.click(delete_faiss_index, outputs=output_second)
if __name__ == "__main__":
demo.launch(
debug=True,
server_port=7860,
server_name="0.0.0.0",
)