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 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 # Wait for the server to start time.sleep(10) llm = Ollama(model="llama3.1") print("Модель 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} Question: {input} """ def upload_file_vdb(file): print(f"Загружаем файл") 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: print(f"Файл успешно загружен.") return f"Файл успешно загружен." else: print(f"Ошибка при загрузке файла: {response.json().get('detail')}") return f"Ошибка: {response.json().get('detail')}" def generate_response(user_query): print(f"Генерация ответа на запрос: {user_query}") prompt = ChatPromptTemplate.from_template(template) documents = retrieve_from_vdb(user_query) context = "\n".join(documents) print(f"Контекст из базы данных: {context[:100]}...") full_prompt = prompt.format(context=context, input=user_query) response = llm.invoke(full_prompt) print(f"Сгенерированный ответ: {response}") return response def process_comments(ACCESS_TOKEN): print("Начинаем процесс скрытия отрицательных комментариев.") hidden_comments_data = hide_negative_comments(ACCESS_TOKEN) print(f"Количество постов с скрытыми комментариями: {len(hidden_comments_data)}") print("Получение неотвеченных комментариев.") posts_with_unanswered_comments = get_unanswered_comments(ACCESS_TOKEN) page_id = get_page_id(ACCESS_TOKEN) if not page_id: print("Не удалось получить ID страницы.") return {"status": "failed", "reason": "Не удалось получить ID страницы."} print(f"ID страницы: {page_id}") processed_posts = [] 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: message = comment['message'] print(f"Обработка комментария: {message}") classification = classify_comment(message) print(f"Классификация комментария: {classification}") if classification == "interrogative": response_message = generate_response(message) print(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) if __name__ == "__main__": demo.launch( debug=True, server_port=7860, server_name="0.0.0.0", )