PanarinI commited on
Commit
8e56b35
·
1 Parent(s): 05a4419
Files changed (2) hide show
  1. README.md +5 -0
  2. app/test_gradio.py +94 -94
README.md CHANGED
@@ -10,3 +10,8 @@ pinned: false
10
  ---
11
 
12
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
10
  ---
11
 
12
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
13
+
14
+
15
+ git add .
16
+ git commit -m "..."
17
+ git push space main
app/test_gradio.py CHANGED
@@ -4,6 +4,7 @@ from openai import OpenAI
4
  import gradio as gr
5
  import requests
6
  import logging
 
7
 
8
  # Настройка логирования
9
  logging.basicConfig(
@@ -15,154 +16,153 @@ logging.basicConfig(
15
  load_dotenv()
16
  api_key = os.getenv("API_KEY_openai")
17
  client = OpenAI(api_key=api_key) if api_key else None
 
18
 
19
 
20
- def analyze_image(image_url: str):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  if not client:
22
- raise gr.Error("API ключ OpenAI не настроен")
23
 
24
  try:
25
- response = client.chat.completions.create(
26
- model="gpt-4o-mini", # Исправлено на корректное имя модели
27
- messages=[
28
- {
29
- "role": "user",
30
- "content": [
31
- {"type": "image_url", "image_url": {"url": image_url}},
32
- {"type": "text", "text": """Определи предмет и учебник. Ответь строго в формате:
33
- Предмет: [название]
34
- Учебник: [название]"""}
35
- ]
36
- }
37
  ],
38
- max_tokens=300
 
39
  )
40
- return parse_response(response.choices[0].message.content)
41
  except Exception as e:
42
- logging.error(f"Ошибка анализа: {e}")
43
- raise gr.Error(f"Ошибка при анализе изображения: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
 
46
  def generate_lesson_plan(
47
- textbook: str,
48
- subject: str,
49
- methodology: str,
50
- duration: int,
51
- hw_required: bool,
52
- file_search: bool,
53
- image_url: str = None
54
- ):
55
- # Формирование контента для API
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  content = [
57
  {"type": "text", "text": f"""
58
- Создай структурированный план урока со следующими параметрами:
59
  - Учебник: {textbook}
60
  - Предмет: {subject}
61
  - Методика: {methodology}
62
- - Длительность: {duration} минут
63
- - Домашнее задание: {'требуется' if hw_required else 'не требуется'}
64
  """}
65
  ]
66
 
67
- # Динамически добавляем изображение если есть
68
  if image_url:
69
  content.append({"type": "image_url", "image_url": {"url": image_url}})
70
 
71
- # Подготовка инструментов
72
  tools = []
73
- tool_choice = None
74
- if file_search:
75
  tools.append({
76
  "type": "file_search",
77
  "vector_store_ids": [VS_ID],
78
  "max_num_results": 10
79
  })
80
- tool_choice = {"type": "file_search"}
81
 
82
- # Вызов API через responses.create()
83
  try:
84
  response = client.responses.create(
85
- instructions="Ты эксперт в области образования. Составь детальный план урока.",
86
  input=content,
87
  model="gpt-4o-mini",
88
  tools=tools if tools else None,
89
- tool_choice=tool_choice,
90
- include=["file_search_call.results"] if file_search else None,
91
- max_output_tokens=8192,
92
- #reasoning={"effort": "medium"},
93
- stream=False
94
  )
95
-
96
- # Обработка ответа
97
- try:
98
- return response.output_text
99
- except AttributeError:
100
- logging.error("Не удалось получить output_text из ответа")
101
- return "Ошибка: некорректный формат ответа"
102
-
103
  except Exception as e:
104
- logging.error(f"API Error: {str(e)}")
105
  raise gr.Error(f"Ошибка генерации: {str(e)}")
106
 
107
 
108
- # Упрощенный интерфейс для тестирования
109
- def process_inputs(image, textbook, subject, methodology, auto_detect):
110
- try:
111
- if image and auto_detect:
112
- # Для теста просто возвращаем примерные значения
113
- return "Математика", "Алгебра 7 класс", "Пример плана урока будет здесь"
114
-
115
- return generate_lesson_plan(
116
- textbook=textbook or "Не указан",
117
- subject=subject or "Не указан",
118
- methodology=methodology or "PPP"
119
- )
120
- except Exception as e:
121
- return f"Ошибка: {str(e)}"
122
-
123
-
124
- with gr.Blocks(title="Генератор планов уроков") as demo:
125
- gr.Markdown("## Генератор планов уроков")
126
-
127
  with gr.Row():
128
  with gr.Column():
129
- # Секция изображения
130
- auto_detect = gr.Checkbox(label="Использовать автоопределение", value=True)
131
- image = gr.Image(label="Обложка учебника", type="filepath")
132
 
133
- # Основные параметры
134
- textbook = gr.Textbox(label="Название учебника*")
135
  subject = gr.Textbox(label="Предмет*")
136
  methodology = gr.Dropdown(
137
- label="Методика обучения*",
138
- choices=["PPP", "TTT", "Интерактивная", "Проектная"],
139
  value="PPP"
140
  )
141
 
142
- # Дополнительные параметры
143
- with gr.Accordion("Дополнительные настройки", open=False):
144
- duration = gr.Slider(15, 120, value=45, step=5, label="Длительность урока (мин)")
145
  hw_required = gr.Checkbox(label="Домашнее задание")
146
- file_search = gr.Checkbox(label="Использовать файловый поиск", value=False)
147
 
148
- btn = gr.Button("Сгенерировать план", variant="primary")
149
 
150
  with gr.Column():
151
- output = gr.Markdown("## Ваш план урока появится здесь")
152
 
153
  btn.click(
154
- fn=generate_lesson_plan,
155
- inputs=[textbook, subject, methodology, duration, hw_required, file_search, image],
 
 
 
156
  outputs=output
157
  )
158
 
159
  if __name__ == "__main__":
160
- try:
161
- demo.launch(
162
- server_port=7861, # Пробуем другой порт
163
- inbrowser=True,
164
- show_error=True
165
- )
166
- except Exception as e:
167
- print(f"Ошибка запуска: {e}")
168
- demo.launch()
 
4
  import gradio as gr
5
  import requests
6
  import logging
7
+ from typing import Optional
8
 
9
  # Настройка логирования
10
  logging.basicConfig(
 
16
  load_dotenv()
17
  api_key = os.getenv("API_KEY_openai")
18
  client = OpenAI(api_key=api_key) if api_key else None
19
+ VS_ID = os.getenv("VECTOR_STORE_ID", "")
20
 
21
 
22
+ def upload_to_catbox(file_bytes: bytes) -> str:
23
+ """Загружает изображение на catbox.moe"""
24
+ try:
25
+ response = requests.post(
26
+ "https://catbox.moe/user/api.php",
27
+ files={"fileToUpload": file_bytes},
28
+ data={"reqtype": "fileupload"},
29
+ timeout=10
30
+ )
31
+ response.raise_for_status()
32
+ return response.text.strip()
33
+ except Exception as e:
34
+ logging.error(f"Ошибка загрузки: {str(e)}")
35
+ raise gr.Error("Не удалось загрузить изображение")
36
+
37
+
38
+ def analyze_image(image_url: str) -> tuple[str, str]:
39
+ """Анализ изображения через Vision API"""
40
  if not client:
41
+ raise gr.Error("API ключ не настроен")
42
 
43
  try:
44
+ response = client.responses.create(
45
+ instructions="Определи предмет и учебник по обложке",
46
+ input=[
47
+ {"type": "image_url", "image_url": {"url": image_url}},
48
+ {"type": "text", "text": "Ответь в формате:\nПредмет: [название]\nУчебник: [название]"}
 
 
 
 
 
 
 
49
  ],
50
+ model="gpt-4o-mini",
51
+ max_output_tokens=300
52
  )
53
+ return parse_response(response.output_text)
54
  except Exception as e:
55
+ logging.error(f"Vision API error: {str(e)}")
56
+ raise gr.Error(f"Ошибка анализа: {str(e)}")
57
+
58
+
59
+ def parse_response(text: str) -> tuple[str, str]:
60
+ """Парсинг ответа от API"""
61
+ subject = textbook = "Не определено"
62
+ for line in text.split('\n'):
63
+ line = line.lower().strip()
64
+ if "предмет:" in line:
65
+ subject = line.split("предмет:")[1].strip().capitalize()
66
+ elif "учебник:" in line:
67
+ textbook = line.split("учебник:")[1].strip().capitalize()
68
+ return subject, textbook
69
 
70
 
71
  def generate_lesson_plan(
72
+ textbook: str,
73
+ subject: str,
74
+ methodology: str,
75
+ duration: int,
76
+ hw_required: bool,
77
+ file_search: bool,
78
+ image_path: Optional[str] = None
79
+ ) -> str:
80
+ """Основная функция генерации плана"""
81
+ if not client:
82
+ raise gr.Error("API ключ не работает")
83
+
84
+ # Загрузка изображения
85
+ image_url = None
86
+ if image_path:
87
+ try:
88
+ with open(image_path, "rb") as f:
89
+ image_url = upload_to_catbox(f.read())
90
+ except Exception as e:
91
+ logging.error(f"Image error: {str(e)}")
92
+
93
+ # Формирование запроса
94
  content = [
95
  {"type": "text", "text": f"""
96
+ Создай план урока:
97
  - Учебник: {textbook}
98
  - Предмет: {subject}
99
  - Методика: {methodology}
100
+ - Длительность: {duration} мин
101
+ - ДЗ: {'Да' if hw_required else 'Нет'}
102
  """}
103
  ]
104
 
 
105
  if image_url:
106
  content.append({"type": "image_url", "image_url": {"url": image_url}})
107
 
108
+ # Настройка инструментов
109
  tools = []
110
+ if file_search and VS_ID:
 
111
  tools.append({
112
  "type": "file_search",
113
  "vector_store_ids": [VS_ID],
114
  "max_num_results": 10
115
  })
 
116
 
 
117
  try:
118
  response = client.responses.create(
119
+ instructions="Ты эксперт-педагог. Составь детальный план урока.",
120
  input=content,
121
  model="gpt-4o-mini",
122
  tools=tools if tools else None,
123
+ tool_choice={"type": "file_search"} if tools else None,
124
+ include=["file_search_call.results"] if tools else None,
125
+ max_output_tokens=2000
 
 
126
  )
127
+ return response.output_text
 
 
 
 
 
 
 
128
  except Exception as e:
129
+ logging.error(f"Generation error: {str(e)}")
130
  raise gr.Error(f"Ошибка генерации: {str(e)}")
131
 
132
 
133
+ # Интерфейс
134
+ with gr.Blocks(title="Генератор уроков") as app:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  with gr.Row():
136
  with gr.Column():
137
+ auto_detect = gr.Checkbox(label="Автоопределение", value=True)
138
+ image = gr.Image(label="Фото учебника", type="filepath")
 
139
 
140
+ textbook = gr.Textbox(label="Учебник*")
 
141
  subject = gr.Textbox(label="Предмет*")
142
  methodology = gr.Dropdown(
143
+ label="Методика*",
144
+ choices=["PPP", "TTT", "Интерактивная"],
145
  value="PPP"
146
  )
147
 
148
+ with gr.Accordion("Дополнительно"):
149
+ duration = gr.Slider(15, 120, 45, step=5, label="Длительность (мин)")
 
150
  hw_required = gr.Checkbox(label="Домашнее задание")
151
+ file_search = gr.Checkbox(label="Поиск в базах")
152
 
153
+ btn = gr.Button("Сгенерировать", variant="primary")
154
 
155
  with gr.Column():
156
+ output = gr.Markdown("## План урока")
157
 
158
  btn.click(
159
+ fn=lambda img, tb, sb, meth, dur, hw, fs, ad: (
160
+ analyze_image(upload_to_catbox(open(img, "rb").read())) if ad and img else (tb, sb),
161
+ generate_lesson_plan(tb, sb, meth, dur, hw, fs, img)
162
+ )[1],
163
+ inputs=[image, textbook, subject, methodology, duration, hw_required, file_search, auto_detect],
164
  outputs=output
165
  )
166
 
167
  if __name__ == "__main__":
168
+ app.launch(server_port=7860)