zenivan commited on
Commit
710d911
·
1 Parent(s): 2374808
app/main_gradio_test_FS.py CHANGED
@@ -9,11 +9,11 @@ from docx import Document
9
  import tempfile
10
  import boto3
11
  from botocore.exceptions import ClientError
12
-
13
  import random
 
 
14
  from app.quotes import quotes
15
  from app.drawings import drawings
16
- import logging
17
 
18
  # Настройка логирования
19
  logging.basicConfig(
@@ -27,11 +27,9 @@ load_dotenv()
27
  api_key = os.getenv("API_KEY_openai")
28
  client = OpenAI(api_key=api_key)
29
  VS_ID = os.getenv("VECTOR_STORE_ID")
30
- # API_KEY = os.getenv("API_KEY")
31
- # BASE_URL = os.getenv("BASE_URL")
32
- # client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
33
 
34
- # Добавляем функцию для генерации ссылок S3 (аналог из первого проекта)
 
35
  def generate_presigned_url(bucket_name, object_key, expiration=3600):
36
  s3 = boto3.client(
37
  's3',
@@ -82,7 +80,7 @@ def generate_lesson_plan_interface(
82
  }
83
 
84
  if формат_занятия == "Индивидуальное":
85
- количество_детей = 1 # Изменяем значение переменной
86
  params["количество_детей"] = 1 # И обновляем словарь параметров
87
 
88
  # Формируем основной промпт
@@ -177,7 +175,7 @@ def generate_lesson_plan_interface(
177
  's3',
178
  endpoint_url='https://s3.timeweb.cloud',
179
  aws_access_key_id=os.getenv('S3_ACCESS_KEY'),
180
- aws_secret_access_key=os.getenv('S3_SECRET_KEY')
181
  )
182
 
183
  bucket_name = os.getenv('S3_BUCKET_NAME')
@@ -210,6 +208,8 @@ def generate_lesson_plan_interface(
210
  else:
211
  logging.warning(f"Файл {filename} не найден в S3")
212
 
 
 
213
  # АННОТАЦИИ В ЛОГ
214
  # if params['разрешен_web_search']: # Только логируем аннотации при веб-поиске
215
  # try:
 
9
  import tempfile
10
  import boto3
11
  from botocore.exceptions import ClientError
 
12
  import random
13
+ import logging
14
+
15
  from app.quotes import quotes
16
  from app.drawings import drawings
 
17
 
18
  # Настройка логирования
19
  logging.basicConfig(
 
27
  api_key = os.getenv("API_KEY_openai")
28
  client = OpenAI(api_key=api_key)
29
  VS_ID = os.getenv("VECTOR_STORE_ID")
 
 
 
30
 
31
+
32
+ # Функция для генерации presigned URL для S3
33
  def generate_presigned_url(bucket_name, object_key, expiration=3600):
34
  s3 = boto3.client(
35
  's3',
 
80
  }
81
 
82
  if формат_занятия == "Индивидуальное":
83
+ количество_детей = 1 # Принудительно для индивидуального занятия
84
  params["количество_детей"] = 1 # И обновляем словарь параметров
85
 
86
  # Формируем основной промпт
 
175
  's3',
176
  endpoint_url='https://s3.timeweb.cloud',
177
  aws_access_key_id=os.getenv('S3_ACCESS_KEY'),
178
+ aws_secret_access_key=os.getenv('S3_SECRET_KEY'),
179
  )
180
 
181
  bucket_name = os.getenv('S3_BUCKET_NAME')
 
208
  else:
209
  logging.warning(f"Файл {filename} не найден в S3")
210
 
211
+ return full_text
212
+
213
  # АННОТАЦИИ В ЛОГ
214
  # if params['разрешен_web_search']: # Только логируем аннотации при веб-поиске
215
  # try:
app/test_noUI_file_search.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import logging
3
+ from dotenv import load_dotenv
4
+ import boto3
5
+ from botocore.exceptions import ClientError
6
+ from openai import OpenAI
7
+
8
+ # Настройка логирования
9
+ logging.basicConfig(
10
+ level=logging.INFO,
11
+ format='%(asctime)s - %(levelname)s - %(message)s'
12
+ )
13
+ logger = logging.getLogger(__name__)
14
+
15
+ # Загрузка переменных окружения
16
+ load_dotenv()
17
+ api_key = os.getenv("API_KEY_openai")
18
+ client = OpenAI(api_key=api_key)
19
+ VS_ID = os.getenv("VECTOR_STORE_ID")
20
+ bucket_name = os.getenv("S3_BUCKET_NAME")
21
+ prefix = "KB_Logoped" # Префикс для нужных файлов, должен соответствовать вашей структуре S3
22
+
23
+ def get_s3_client():
24
+ return boto3.client(
25
+ 's3',
26
+ endpoint_url='https://s3.timeweb.cloud',
27
+ aws_access_key_id=os.getenv('S3_ACCESS_KEY'),
28
+ aws_secret_access_key=os.getenv('S3_SECRET_KEY')
29
+ )
30
+
31
+ def generate_presigned_url(bucket_name, object_key, expiration=3600):
32
+ """
33
+ Генерирует presigned URL для объекта в S3.
34
+ """
35
+ s3 = get_s3_client()
36
+ try:
37
+ url = s3.generate_presigned_url(
38
+ 'get_object',
39
+ Params={'Bucket': bucket_name, 'Key': object_key},
40
+ ExpiresIn=expiration
41
+ )
42
+ return url
43
+ except Exception as e:
44
+ logger.error(f"Ошибка генерации ссылки для {object_key}: {str(e)}")
45
+ return None
46
+
47
+ def get_file_references(bucket_name, prefix):
48
+ """
49
+ Получает маппинг: имя файла -> путь в S3, основываясь на префиксе.
50
+ """
51
+ s3 = get_s3_client()
52
+ try:
53
+ response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
54
+ if 'Contents' not in response:
55
+ raise FileNotFoundError(f"В бакете {bucket_name}/{prefix} не найдено файлов")
56
+ # Отбираем только PDF-файлы и маппим по имени файла
57
+ file_refs = {
58
+ obj['Key'].split('/')[-1]: obj['Key']
59
+ for obj in response['Contents'] if obj['Key'].endswith('.pdf')
60
+ }
61
+ return file_refs
62
+ except Exception as e:
63
+ logger.error(f"Ошибка получения списка файлов: {str(e)}")
64
+ return {}
65
+
66
+ # Получаем маппинг файлов
67
+ file_references = get_file_references(bucket_name, prefix)
68
+
69
+ # Создаём запрос к OpenAI c инструментом file_search
70
+ response = client.responses.create(
71
+ model="gpt-4o-mini",
72
+ instructions=("ты эксперт в составлении логопедических занятий. "
73
+ "Отвечай строго на основе загруженных источников. "
74
+ "Если даннных в источниках нет - сообщи об этом"),
75
+ input="примеры упражнений на автоматизацию звука Ц",
76
+ tools=[{"type": "file_search", "vector_store_ids": [VS_ID]}],
77
+ )
78
+
79
+ # Обработка ответа:
80
+ # Пытаемся извлечь текст ответа и аннотации (предполагается, что LLM возвращает их во втором элементе output)
81
+ try:
82
+ full_text = response.output[1].content[0].text
83
+ except (AttributeError, IndexError):
84
+ full_text = "Ответ сгенерирован, но не удалось обработать форматирование."
85
+
86
+ try:
87
+ annotations = response.output[1].content[0].annotations
88
+ except (AttributeError, IndexError):
89
+ annotations = []
90
+ logger.warning("Аннотации не найдены в ответе LLM.")
91
+
92
+ # Вставляем ссылки из аннотаций в текст ответа
93
+ # Итерируем в обратном порядке, чтобы позиции вставки не сбивались
94
+ for ann in reversed(annotations):
95
+ filename = ann.filename
96
+ insert_position = ann.index # позиция, куда нужно вставить ссылку
97
+ file_path = file_references.get(filename)
98
+ if file_path:
99
+ download_link = generate_presigned_url(bucket_name, file_path)
100
+ if download_link:
101
+ clickable_link = f" [{filename}]({download_link})"
102
+ # Вставляем ссылку по указанной позиции
103
+ full_text = full_text[:insert_position] + clickable_link + full_text[insert_position:]
104
+ else:
105
+ logger.info(f"Файл {filename} не найден в S3 маппинге.")
106
+
107
+ # Выводим итоговый текст в консоль
108
+ print("Обработанный текст с вставленными ссылками:")
109
+ print(full_text)