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("Начинаем процесс скрытия отрицательных комментариев.") result_hide_comments = hide_negative_comments(ACCESS_TOKEN) print(f"Количество скрытых комментариев: {result_hide_comments}") print("Получение неотвеченных комментариев.") comments = get_unanswered_comments(ACCESS_TOKEN) unanswered_comments = [] page_id = get_page_id(ACCESS_TOKEN) if not page_id: print("Не удалось получить ID страницы.") return {"status": "failed", "reason": "Не удалось получить ID страницы."} print(f"ID страницы: {page_id}") for comment in comments: if comment.get('is_hidden', False): print(f"Комментарий скрыт: {comment['id']}") continue comment_id = comment['id'] if not has_page_replied(comment_id, page_id, ACCESS_TOKEN): unanswered_comments.append(comment) print(f"Найдено {len(unanswered_comments)} неотвеченных комментариев.") 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}") reply_comment(message=response_message, comment_id=comment['id'], token=ACCESS_TOKEN) return { "status": "completed", "processed_comments": len(unanswered_comments), "hidden_comments": result_hide_comments } 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 # share=True if "True" in sys.argv else False, # inbrowser=True if "--open" in sys.argv else False, # server_port=24000, # server_name="0.0.0.0", )