File size: 7,384 Bytes
0472e0d
0f5a06e
a028061
 
0472e0d
 
 
 
 
f739e90
a028061
 
0472e0d
9b29345
 
 
 
a028061
0f5a06e
 
0472e0d
9b29345
0472e0d
 
764a151
0472e0d
 
098508e
0472e0d
 
 
764a151
098508e
764a151
0472e0d
 
 
 
 
 
972cdd8
0472e0d
 
a028061
9b29345
 
 
a028061
9b29345
 
 
 
 
 
 
0472e0d
 
9b29345
0472e0d
 
 
 
 
 
 
 
 
 
 
 
9b29345
 
0472e0d
9b29345
0472e0d
 
a028061
 
9b29345
0472e0d
 
9b29345
0472e0d
 
 
9b29345
0472e0d
 
a028061
 
9b29345
cb5e151
9b29345
0472e0d
9b29345
cb5e151
0472e0d
cb5e151
0472e0d
9b29345
0472e0d
 
9b29345
0472e0d
cb5e151
9b29345
cb5e151
 
 
 
 
 
 
 
 
9b29345
 
 
 
 
 
cb5e151
9b29345
f739e90
 
 
 
 
 
 
 
 
 
cb5e151
 
 
 
a028061
 
cb5e151
 
0472e0d
 
 
cb5e151
0472e0d
 
 
 
 
 
 
a028061
0472e0d
 
a028061
 
 
 
 
 
 
 
 
 
 
 
 
 
0472e0d
 
 
02e4f0b
9aebc33
 
a028061
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import os
import time
from datetime import datetime

import gradio as gr
import requests
from langchain.prompts import ChatPromptTemplate
from langchain_community.llms import Ollama

from func_ai import VECTOR_API_URL
from func_facebook import get_page_id, 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 only the links provided in the context. Your tasks:

1. **Brevity**: Respond concisely, using only relevant information from the context.
2. **Politeness**: Start your response with a greeting if appropriate, but prioritize maintaining a respectful and professional 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**: Only use the links provided in the context and **always include them at the end of your response**.
7. **Stay on Topic**: If the user's input is a greeting or not directly related to the context, politely guide them back to the relevant topic without engaging in small talk.
8. **Links**: Always provide the relevant links from the context at the end of the response and **do not add any other 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, context):
    log_message(f"Генерация ответа на запрос: {user_query}")
    prompt = ChatPromptTemplate.from_template(template)

    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, user_context):
    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}")

            response_message = generate_response(message, context=user_context)
            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")
        context_input = gr.Textbox(label="Контекст")  # Добавлено текстовое поле для ввода контекста
        output_main = gr.JSON()
        process_btn = gr.Button("Процессировать комментарии")
        process_btn.click(
            process_comments,
            inputs=[token_input, context_input],  # Обновлено: добавлен context_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",
    )