Spaces:
Paused
Paused
PanarinI commited on
Commit ·
1ac5fcd
1
Parent(s): 207901a
it's alive!
Browse files- README.md +0 -0
- TASKS.md +4 -2
- app.log +222 -0
- app/app.log +8 -0
- app/test.py +131 -111
- docs/architecture.md +71 -11
- docs/scheme.mmd +12 -0
- requirements +1 -1
- test_url.py +18 -74
README.md
CHANGED
|
Binary files a/README.md and b/README.md differ
|
|
|
TASKS.md
CHANGED
|
@@ -14,13 +14,15 @@
|
|
| 14 |
[ ] рекламный видеоролик со мной - инструкция по созданию
|
| 15 |
[ ] демонстрация - урок по плану
|
| 16 |
[ ] определить клюбчевые УМК и учебники в госшколах
|
| 17 |
-
|
|
|
|
|
|
|
| 18 |
|
| 19 |
|
| 20 |
|
| 21 |
|
| 22 |
## in progress
|
| 23 |
-
|
| 24 |
[ ] проверка различных основных учебников
|
| 25 |
|
| 26 |
[ ] проверка Responses API - web_search, vision
|
|
|
|
| 14 |
[ ] рекламный видеоролик со мной - инструкция по созданию
|
| 15 |
[ ] демонстрация - урок по плану
|
| 16 |
[ ] определить клюбчевые УМК и учебники в госшколах
|
| 17 |
+
[ ] детектор качества изображения
|
| 18 |
+
[ ] загрузка нескольких страниц учебника
|
| 19 |
+
[ ] интеграция настроек
|
| 20 |
|
| 21 |
|
| 22 |
|
| 23 |
|
| 24 |
## in progress
|
| 25 |
+
[ ] базовый MVP: загрузка > url > LLM1 > настройки > LLM2 > план урока и возможность скачать. Streamlit
|
| 26 |
[ ] проверка различных основных учебников
|
| 27 |
|
| 28 |
[ ] проверка Responses API - web_search, vision
|
app.log
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
2025-04-01 01:22:27,946 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 2 |
+
2025-04-01 01:22:27,948 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 3 |
+
2025-04-01 01:22:27,948 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 4 |
+
2025-04-01 01:22:27,949 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 5 |
+
2025-04-01 01:22:27,949 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 6 |
+
2025-04-01 01:22:27,949 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 7 |
+
2025-04-01 01:23:51,282 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 8 |
+
2025-04-01 01:23:51,283 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 9 |
+
2025-04-01 01:23:51,283 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 10 |
+
2025-04-01 01:23:51,284 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 11 |
+
2025-04-01 01:23:51,284 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 12 |
+
2025-04-01 01:23:51,284 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 13 |
+
2025-04-01 01:24:55,286 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 14 |
+
2025-04-01 01:24:55,287 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 15 |
+
2025-04-01 01:24:55,287 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 16 |
+
2025-04-01 01:24:55,288 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 17 |
+
2025-04-01 01:24:55,288 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 18 |
+
2025-04-01 01:24:55,288 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 19 |
+
2025-04-01 01:28:03,386 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 20 |
+
2025-04-01 01:28:03,388 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 21 |
+
2025-04-01 01:28:03,388 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 22 |
+
2025-04-01 01:28:03,388 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 23 |
+
2025-04-01 01:28:03,389 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 24 |
+
2025-04-01 01:28:03,389 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 25 |
+
2025-04-01 01:32:01,395 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 26 |
+
2025-04-01 01:32:01,396 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 27 |
+
2025-04-01 01:32:01,397 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 28 |
+
2025-04-01 01:32:01,397 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 29 |
+
2025-04-01 01:32:01,397 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 30 |
+
2025-04-01 01:32:01,397 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 31 |
+
2025-04-01 01:34:20,876 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 32 |
+
2025-04-01 01:34:20,877 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 33 |
+
2025-04-01 01:34:20,877 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 34 |
+
2025-04-01 01:34:20,877 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 35 |
+
2025-04-01 01:34:20,877 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 36 |
+
2025-04-01 01:34:20,878 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 37 |
+
2025-04-01 01:36:01,629 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 38 |
+
2025-04-01 01:36:01,631 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 39 |
+
2025-04-01 01:36:01,631 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 40 |
+
2025-04-01 01:36:01,632 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 41 |
+
2025-04-01 01:36:01,632 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 42 |
+
2025-04-01 01:36:02,967 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 43 |
+
2025-04-01 01:36:02,967 - __main__ - INFO - ������ ����������
|
| 44 |
+
2025-04-01 01:37:21,799 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 45 |
+
2025-04-01 01:37:21,811 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 46 |
+
2025-04-01 01:37:21,812 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 47 |
+
2025-04-01 01:37:21,813 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 48 |
+
2025-04-01 01:37:21,813 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 49 |
+
2025-04-01 01:37:23,150 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 50 |
+
2025-04-01 01:37:23,150 - __main__ - INFO - ������ ����������
|
| 51 |
+
2025-04-01 01:37:27,045 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 52 |
+
2025-04-01 01:40:37,348 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 53 |
+
2025-04-01 01:40:37,349 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 54 |
+
2025-04-01 01:40:37,349 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 55 |
+
2025-04-01 01:40:37,349 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 56 |
+
2025-04-01 01:40:37,349 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 57 |
+
2025-04-01 01:40:38,526 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 58 |
+
2025-04-01 01:40:38,527 - __main__ - INFO - ������ ����������
|
| 59 |
+
2025-04-01 01:40:45,110 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 60 |
+
2025-04-01 01:40:45,111 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 61 |
+
2025-04-01 01:40:45,112 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 62 |
+
2025-04-01 01:40:45,112 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 63 |
+
2025-04-01 01:40:45,112 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 64 |
+
2025-04-01 01:40:46,332 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 65 |
+
2025-04-01 01:40:46,332 - __main__ - INFO - ������ ����������
|
| 66 |
+
2025-04-01 01:40:48,810 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 67 |
+
2025-04-01 01:42:19,412 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 68 |
+
2025-04-01 01:42:19,445 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 69 |
+
2025-04-01 01:42:19,445 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 70 |
+
2025-04-01 01:42:19,445 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 71 |
+
2025-04-01 01:42:19,446 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 72 |
+
2025-04-01 01:42:21,587 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 73 |
+
2025-04-01 01:47:09,200 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 74 |
+
2025-04-01 01:47:09,201 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 75 |
+
2025-04-01 01:47:09,202 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 76 |
+
2025-04-01 01:47:09,202 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 77 |
+
2025-04-01 01:47:09,202 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 78 |
+
2025-04-01 01:47:10,399 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 79 |
+
2025-04-01 01:47:19,051 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 80 |
+
2025-04-01 01:47:19,053 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 81 |
+
2025-04-01 01:47:19,057 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 82 |
+
2025-04-01 01:47:19,058 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 83 |
+
2025-04-01 01:47:19,058 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 84 |
+
2025-04-01 01:47:20,327 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 85 |
+
2025-04-01 01:47:22,870 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 86 |
+
2025-04-01 01:47:31,810 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 87 |
+
2025-04-01 01:47:31,813 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 88 |
+
2025-04-01 01:47:31,815 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 89 |
+
2025-04-01 01:47:31,815 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 90 |
+
2025-04-01 01:47:31,816 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 91 |
+
2025-04-01 01:47:33,105 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 92 |
+
2025-04-01 01:47:35,952 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 93 |
+
2025-04-01 01:47:40,627 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 94 |
+
2025-04-01 01:47:40,629 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 95 |
+
2025-04-01 01:47:40,630 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 96 |
+
2025-04-01 01:47:40,631 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 97 |
+
2025-04-01 01:47:40,633 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 98 |
+
2025-04-01 01:47:42,447 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 99 |
+
2025-04-01 01:47:43,119 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 100 |
+
2025-04-01 01:47:43,121 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 101 |
+
2025-04-01 01:47:43,123 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 102 |
+
2025-04-01 01:47:43,124 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 103 |
+
2025-04-01 01:47:43,125 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 104 |
+
2025-04-01 01:47:44,607 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 105 |
+
2025-04-01 01:47:44,714 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 106 |
+
2025-04-01 01:47:46,782 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 107 |
+
2025-04-01 01:47:50,120 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 108 |
+
2025-04-01 01:47:50,122 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 109 |
+
2025-04-01 01:47:50,142 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 110 |
+
2025-04-01 01:47:50,144 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 111 |
+
2025-04-01 01:47:50,148 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 112 |
+
2025-04-01 01:47:52,330 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 113 |
+
2025-04-01 01:47:54,863 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 114 |
+
2025-04-01 01:48:09,433 - httpx - INFO - HTTP Request: POST https://api.aitunnel.ru/v1/chat/completions "HTTP/1.1 200 OK"
|
| 115 |
+
2025-04-01 01:48:09,453 - __main__ - INFO - ���� ����� ������� ������������
|
| 116 |
+
2025-04-01 01:55:53,243 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 117 |
+
2025-04-01 01:55:53,261 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 118 |
+
2025-04-01 01:55:53,261 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 119 |
+
2025-04-01 01:55:53,262 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 120 |
+
2025-04-01 01:55:53,262 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 121 |
+
2025-04-01 01:55:54,587 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 122 |
+
2025-04-01 01:56:00,249 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 123 |
+
2025-04-01 01:56:00,252 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 124 |
+
2025-04-01 01:56:00,254 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 125 |
+
2025-04-01 01:56:00,255 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 126 |
+
2025-04-01 01:56:00,255 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 127 |
+
2025-04-01 01:56:01,550 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 128 |
+
2025-04-01 01:56:04,054 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 129 |
+
2025-04-01 01:56:36,166 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 130 |
+
2025-04-01 01:56:36,166 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 131 |
+
2025-04-01 01:56:36,167 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 132 |
+
2025-04-01 01:56:36,167 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 133 |
+
2025-04-01 01:56:36,167 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 134 |
+
2025-04-01 01:56:37,372 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 135 |
+
2025-04-01 01:57:29,750 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 136 |
+
2025-04-01 01:57:29,751 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 137 |
+
2025-04-01 01:57:29,757 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 138 |
+
2025-04-01 01:57:29,759 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 139 |
+
2025-04-01 01:57:29,760 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 140 |
+
2025-04-01 01:57:30,183 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 141 |
+
2025-04-01 01:57:30,185 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 142 |
+
2025-04-01 01:57:30,185 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 143 |
+
2025-04-01 01:57:30,185 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 144 |
+
2025-04-01 01:57:30,186 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 145 |
+
2025-04-01 01:57:31,484 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 146 |
+
2025-04-01 01:57:31,839 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 147 |
+
2025-04-01 01:57:36,655 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 148 |
+
2025-04-01 01:57:36,655 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 149 |
+
2025-04-01 01:57:36,656 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 150 |
+
2025-04-01 01:57:36,656 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 151 |
+
2025-04-01 01:57:36,658 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 152 |
+
2025-04-01 01:57:37,976 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 153 |
+
2025-04-01 01:57:41,240 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 154 |
+
2025-04-01 01:57:41,245 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 155 |
+
2025-04-01 01:57:41,247 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 156 |
+
2025-04-01 01:57:41,248 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 157 |
+
2025-04-01 01:57:41,249 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 158 |
+
2025-04-01 01:57:42,579 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 159 |
+
2025-04-01 01:58:39,679 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 160 |
+
2025-04-01 01:58:39,679 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 161 |
+
2025-04-01 01:58:39,680 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 162 |
+
2025-04-01 01:58:39,680 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 163 |
+
2025-04-01 01:58:39,680 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 164 |
+
2025-04-01 01:58:40,978 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 165 |
+
2025-04-01 01:58:43,376 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 166 |
+
2025-04-01 01:58:48,116 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 167 |
+
2025-04-01 01:58:48,119 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 168 |
+
2025-04-01 01:58:48,119 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 169 |
+
2025-04-01 01:58:48,119 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 170 |
+
2025-04-01 01:58:48,120 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 171 |
+
2025-04-01 01:58:49,451 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 172 |
+
2025-04-01 01:58:52,061 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 173 |
+
2025-04-01 01:58:55,988 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 174 |
+
2025-04-01 01:58:55,991 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 175 |
+
2025-04-01 01:58:55,992 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 176 |
+
2025-04-01 01:58:55,993 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 177 |
+
2025-04-01 01:58:55,993 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 178 |
+
2025-04-01 01:58:57,219 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 179 |
+
2025-04-01 01:58:59,508 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 180 |
+
2025-04-01 01:59:13,465 - httpx - INFO - HTTP Request: POST https://api.aitunnel.ru/v1/chat/completions "HTTP/1.1 200 OK"
|
| 181 |
+
2025-04-01 01:59:13,479 - __main__ - INFO - ���� ����� ������� ������������
|
| 182 |
+
2025-04-01 01:59:57,157 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 183 |
+
2025-04-01 01:59:57,158 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 184 |
+
2025-04-01 01:59:57,158 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 185 |
+
2025-04-01 01:59:57,158 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 186 |
+
2025-04-01 01:59:57,158 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 187 |
+
2025-04-01 01:59:58,492 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 188 |
+
2025-04-01 02:00:12,813 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 189 |
+
2025-04-01 02:00:12,827 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 190 |
+
2025-04-01 02:00:12,829 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 191 |
+
2025-04-01 02:00:12,830 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 192 |
+
2025-04-01 02:00:12,831 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 193 |
+
2025-04-01 02:00:14,134 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 194 |
+
2025-04-01 02:00:16,556 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 195 |
+
2025-04-01 02:00:27,314 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 196 |
+
2025-04-01 02:00:27,334 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 197 |
+
2025-04-01 02:00:27,335 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 198 |
+
2025-04-01 02:00:27,338 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 199 |
+
2025-04-01 02:00:27,345 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 200 |
+
2025-04-01 02:00:29,034 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 201 |
+
2025-04-01 02:00:31,422 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 202 |
+
2025-04-01 02:01:30,811 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 203 |
+
2025-04-01 02:01:30,812 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 204 |
+
2025-04-01 02:01:30,817 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 205 |
+
2025-04-01 02:01:30,817 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 206 |
+
2025-04-01 02:01:30,819 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 207 |
+
2025-04-01 02:01:32,102 - __main__ - INFO - ������ OpenAI ������� ���������������
|
| 208 |
+
2025-04-01 02:01:34,895 - __main__ - ERROR - ������ �������� �� catbox.moe: 412 Client Error: Precondition Failed for url: https://catbox.moe/user/api.php
|
| 209 |
+
2025-04-01 02:06:36,816 - __main__ - ERROR - ������ ������������� OpenAI: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable
|
| 210 |
+
2025-04-01 02:08:10,426 - __main__ - ERROR - ������ ������������� OpenAI: name 'API_KEY' is not defined
|
| 211 |
+
2025-04-01 02:11:21,874 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 212 |
+
2025-04-01 02:11:21,876 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 213 |
+
2025-04-01 02:11:21,876 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 214 |
+
2025-04-01 02:11:21,876 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 215 |
+
2025-04-01 02:11:21,876 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 216 |
+
2025-04-01 02:11:23,024 - __main__ - INFO - OpenAI ������ ���������������
|
| 217 |
+
2025-04-01 02:11:32,676 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 218 |
+
2025-04-01 02:11:32,676 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 219 |
+
2025-04-01 02:11:32,677 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 220 |
+
2025-04-01 02:11:32,677 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 221 |
+
2025-04-01 02:11:32,683 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 222 |
+
2025-04-01 02:11:34,242 - __main__ - INFO - OpenAI ������ ���������������
|
app/app.log
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
2025-04-01 01:31:35,016 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 14
|
| 2 |
+
2025-04-01 01:31:35,018 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 17
|
| 3 |
+
2025-04-01 01:31:35,018 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 18
|
| 4 |
+
2025-04-01 01:31:35,018 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 19
|
| 5 |
+
2025-04-01 01:31:35,018 - dotenv.main - WARNING - python-dotenv could not parse statement starting at line 21
|
| 6 |
+
2025-04-01 01:31:35,019 - __main__ - ERROR - API_KEY �� ������ � ���������� ���������
|
| 7 |
+
2025-04-01 01:31:35,458 - __main__ - ERROR - ������ ������������� ������� OpenAI: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable
|
| 8 |
+
2025-04-01 01:31:35,459 - __main__ - INFO - ������ ����������
|
app/test.py
CHANGED
|
@@ -1,16 +1,25 @@
|
|
| 1 |
-
import logging
|
| 2 |
import os
|
| 3 |
-
import
|
| 4 |
-
|
| 5 |
-
import streamlit as st
|
| 6 |
-
from openai import OpenAI
|
| 7 |
from dotenv import load_dotenv
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
logger = logging.getLogger(__name__)
|
| 12 |
|
|
|
|
| 13 |
load_dotenv()
|
|
|
|
| 14 |
API_KEY = os.getenv("API_KEY")
|
| 15 |
BASE_URL = os.getenv("BASE_URL")
|
| 16 |
if not API_KEY:
|
|
@@ -21,120 +30,131 @@ if not BASE_URL:
|
|
| 21 |
|
| 22 |
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
|
| 23 |
|
|
|
|
|
|
|
| 24 |
|
| 25 |
-
def encode_image(uploaded_file):
|
| 26 |
-
"""Оптимизированная конвертация в base64"""
|
| 27 |
-
try:
|
| 28 |
-
return base64.b64encode(uploaded_file.read()).decode('utf-8')
|
| 29 |
-
except Exception as e:
|
| 30 |
-
logger.error(f"Ошибка конвертации: {e}")
|
| 31 |
-
return None
|
| 32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
-
def analyze_content(image_b64: str):
|
| 35 |
-
"""Единый оптимизированный запрос для анализа"""
|
| 36 |
-
try:
|
| 37 |
-
response = client.chat.completions.create(
|
| 38 |
-
model="gpt-4o-mini",
|
| 39 |
-
messages=[{
|
| 40 |
-
"role": "user",
|
| 41 |
-
"content": [
|
| 42 |
-
{"type": "text", "text": (
|
| 43 |
-
"Анализ страницы учебника. Ответь ТОЛЬКО в формате:\n"
|
| 44 |
-
"{\n"
|
| 45 |
-
" \"subject\": \"Предмет\",\n"
|
| 46 |
-
" \"textbook\": \"Учебник\",\n"
|
| 47 |
-
" \"topic\": \"Тема\",\n"
|
| 48 |
-
" \"exercises\": [\"конкретные задания из текста\"],\n"
|
| 49 |
-
" \"examples\": [\"конкретные примеры из текста\"]\n"
|
| 50 |
-
"}"
|
| 51 |
-
)},
|
| 52 |
-
{"type": "image_url", "image_url": {
|
| 53 |
-
"url": f"data:image/jpeg;base64,{image_b64}",
|
| 54 |
-
"detail": "high"
|
| 55 |
-
}}
|
| 56 |
-
]
|
| 57 |
-
}],
|
| 58 |
-
max_tokens=1500
|
| 59 |
-
)
|
| 60 |
-
return json.loads(response.choices[0].message.content)
|
| 61 |
-
except Exception as e:
|
| 62 |
-
logger.error(f"Ошибка анализа: {e}")
|
| 63 |
-
return None
|
| 64 |
|
| 65 |
-
|
| 66 |
-
def
|
| 67 |
-
"""
|
| 68 |
try:
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
- Примеры из учебника: {context.get('examples', [])[:2]}
|
| 74 |
-
- Номера страниц и разделов
|
| 75 |
-
- Пошаговые инструкции для учителя
|
| 76 |
-
|
| 77 |
-
Параметры:
|
| 78 |
-
- Предмет: {context['subject']}
|
| 79 |
-
- Учебник: {context['textbook']}
|
| 80 |
-
- Тема: {context['topic']}
|
| 81 |
-
"""
|
| 82 |
-
|
| 83 |
-
response = client.chat.completions.create(
|
| 84 |
-
model="gpt-4o-mini",
|
| 85 |
-
messages=[{"role": "user", "content": prompt}],
|
| 86 |
-
temperature=0.3,
|
| 87 |
-
max_tokens=2000
|
| 88 |
)
|
| 89 |
-
|
|
|
|
| 90 |
except Exception as e:
|
| 91 |
-
|
| 92 |
return None
|
| 93 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
|
| 95 |
-
#
|
| 96 |
-
st.
|
| 97 |
-
st.title("📘 Генератор уроков с привязкой к учебнику")
|
| 98 |
-
|
| 99 |
-
if "context" not in st.session_state:
|
| 100 |
-
st.session_state.context = {}
|
| 101 |
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
st.
|
| 105 |
|
| 106 |
-
uploaded_file = st.file_uploader("Страница учебника", type=["jpg", "png", "jpeg"])
|
| 107 |
if uploaded_file:
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
+
import logging
|
| 3 |
+
|
|
|
|
|
|
|
| 4 |
from dotenv import load_dotenv
|
| 5 |
+
import requests
|
| 6 |
+
from pydantic import BaseModel
|
| 7 |
+
from openai import OpenAI, APIError
|
| 8 |
+
import streamlit as st
|
| 9 |
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
# --- Настройка логирования ---
|
| 13 |
+
logging.basicConfig(
|
| 14 |
+
level=logging.INFO,
|
| 15 |
+
format='%(asctime)s - %(levelname)s - %(message)s',
|
| 16 |
+
handlers=[logging.StreamHandler()]
|
| 17 |
+
)
|
| 18 |
logger = logging.getLogger(__name__)
|
| 19 |
|
| 20 |
+
# --- Получение ключей API из окружения ---
|
| 21 |
load_dotenv()
|
| 22 |
+
|
| 23 |
API_KEY = os.getenv("API_KEY")
|
| 24 |
BASE_URL = os.getenv("BASE_URL")
|
| 25 |
if not API_KEY:
|
|
|
|
| 30 |
|
| 31 |
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
|
| 32 |
|
| 33 |
+
# Настройки
|
| 34 |
+
st.set_page_config(page_title="Генератор планов уроков", layout="wide")
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
+
# Pydantic модель для структурированного вывода
|
| 38 |
+
class TextbookInfo(BaseModel):
|
| 39 |
+
subject: str = ""
|
| 40 |
+
textbook_name: str = ""
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
+
# Функция загрузки изображения на catbox.moe
|
| 44 |
+
def upload_to_catbox(file_bytes):
|
| 45 |
+
"""Загружает файл на catbox.moe и возвращает прямую ссылку"""
|
| 46 |
try:
|
| 47 |
+
response = requests.post(
|
| 48 |
+
"https://catbox.moe/user/api.php",
|
| 49 |
+
files={"fileToUpload": file_bytes},
|
| 50 |
+
data={"reqtype": "fileupload"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
)
|
| 52 |
+
response.raise_for_status()
|
| 53 |
+
return response.text.strip() # Пример: https://files.catbox.moe/abc123.png
|
| 54 |
except Exception as e:
|
| 55 |
+
st.error(f"Ошибка загрузки: {e}")
|
| 56 |
return None
|
| 57 |
|
| 58 |
+
# Инициализация состояний
|
| 59 |
+
if "textbook_data" not in st.session_state:
|
| 60 |
+
st.session_state.textbook_data = TextbookInfo()
|
| 61 |
+
if "image_url" not in st.session_state:
|
| 62 |
+
st.session_state.image_url = None
|
| 63 |
|
| 64 |
+
# Интерфейс
|
| 65 |
+
left_col, right_col = st.columns([2, 3])
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
+
with left_col:
|
| 68 |
+
st.header("Загрузка учебника")
|
| 69 |
+
uploaded_file = st.file_uploader("Выберите изображение страницы", type=["jpg", "png", "jpeg"])
|
| 70 |
|
|
|
|
| 71 |
if uploaded_file:
|
| 72 |
+
# Загрузка изображения и получение URL через catbox.moe
|
| 73 |
+
image_bytes = uploaded_file.getvalue()
|
| 74 |
+
try:
|
| 75 |
+
image_url = upload_to_catbox(image_bytes)
|
| 76 |
+
if not image_url:
|
| 77 |
+
logger.error("Не удалось получить URL изображения после загрузки.")
|
| 78 |
+
except Exception as e:
|
| 79 |
+
logger.error(f"Ошибка при загрузке изображения: {e}")
|
| 80 |
+
st.error("Не удалось загрузить изображение. Попробуйте снова.")
|
| 81 |
+
if image_url:
|
| 82 |
+
st.session_state.image_url = image_url
|
| 83 |
+
st.success("Изображение загружено успешно!")
|
| 84 |
+
|
| 85 |
+
# Первый запрос к LLM для определения предмета и учебника
|
| 86 |
+
with st.spinner("Анализ изображения..."):
|
| 87 |
+
try:
|
| 88 |
+
completion = client.beta.chat.completions.parse(
|
| 89 |
+
model="gpt-4o-mini",
|
| 90 |
+
messages=[
|
| 91 |
+
{"role": "system",
|
| 92 |
+
"content": "Определи предмет и название учебника по изображению страницы. Если не уверен — оставь поля пустыми."},
|
| 93 |
+
{"role": "user", "content": [
|
| 94 |
+
{"type": "image_url", "image_url": {"url": image_url}},
|
| 95 |
+
{"type": "text", "text": "Что это за учебник? Определи предмет и точное название."}
|
| 96 |
+
]}
|
| 97 |
+
],
|
| 98 |
+
response_format=TextbookInfo
|
| 99 |
+
)
|
| 100 |
+
st.session_state.textbook_data = completion.choices[0].message.parsed
|
| 101 |
+
except Exception as e:
|
| 102 |
+
st.error(f"Ошибка анализа: {e}")
|
| 103 |
+
st.session_state.textbook_data = TextbookInfo()
|
| 104 |
+
|
| 105 |
+
else:
|
| 106 |
+
st.error("Не удалось загрузить изображение")
|
| 107 |
+
|
| 108 |
+
# Поля для редактирования
|
| 109 |
+
if st.session_state.image_url:
|
| 110 |
+
st.subheader("Данные учебника")
|
| 111 |
+
subject = st.text_input("Предмет", value=st.session_state.textbook_data.subject)
|
| 112 |
+
textbook_name = st.text_input("Название учебника", value=st.session_state.textbook_data.textbook_name)
|
| 113 |
+
|
| 114 |
+
# Обновление состояния при ручном вводе
|
| 115 |
+
st.session_state.textbook_data.subject = subject
|
| 116 |
+
st.session_state.textbook_data.textbook_name = textbook_name
|
| 117 |
+
|
| 118 |
+
# Настройки
|
| 119 |
+
num_students = st.slider("Количество учеников", 1, 40, 10)
|
| 120 |
+
generate_disabled = not (
|
| 121 |
+
st.session_state.textbook_data.subject.strip() and
|
| 122 |
+
st.session_state.textbook_data.textbook_name.strip()
|
| 123 |
+
)
|
| 124 |
+
|
| 125 |
+
if st.button("Создать план урока", disabled=generate_disabled):
|
| 126 |
+
if not st.session_state.textbook_data.subject or not st.session_state.textbook_data.textbook_name:
|
| 127 |
+
st.error("Пожалуйста, заполните все обязательные поля.")
|
| 128 |
+
else:
|
| 129 |
+
with st.spinner("Генерация плана..."):
|
| 130 |
+
try:
|
| 131 |
+
response = client.chat.completions.create(
|
| 132 |
+
model="gpt-4o-mini",
|
| 133 |
+
messages=[
|
| 134 |
+
{"role": "system",
|
| 135 |
+
"content": "Ты опытный учитель. Создай детальный план урока на русском языке."},
|
| 136 |
+
{"role": "user", "content": [
|
| 137 |
+
{"type": "image_url", "image_url": {"url": st.session_state.image_url}},
|
| 138 |
+
{"type": "text", "text": f"""
|
| 139 |
+
Создай план урока для:
|
| 140 |
+
- Предмет: {st.session_state.textbook_data.subject}
|
| 141 |
+
- Учебник: {st.session_state.textbook_data.textbook_name}
|
| 142 |
+
- Количество учеников: {num_students}
|
| 143 |
+
|
| 144 |
+
Используй материалы с загруженной страницы: укажи номера упражнений, примеры,
|
| 145 |
+
ключевые темы и методические рекомендации.
|
| 146 |
+
"""}
|
| 147 |
+
]}
|
| 148 |
+
]
|
| 149 |
+
)
|
| 150 |
+
lesson_plan = response.choices[0].message.content
|
| 151 |
+
right_col.write(lesson_plan)
|
| 152 |
+
except Exception as e:
|
| 153 |
+
logger.error(f"Ошибка при генерации плана урока: {e}")
|
| 154 |
+
st.error("Не удалось создать план урока. Попробуйте снова.")
|
| 155 |
+
|
| 156 |
+
|
| 157 |
+
with right_col:
|
| 158 |
+
st.header("План урока")
|
| 159 |
+
if not st.session_state.textbook_data.subject or not st.session_state.textbook_data.textbook_name:
|
| 160 |
+
st.info("Загрузите изображение и укажите данные учебника")
|
docs/architecture.md
CHANGED
|
@@ -1,19 +1,79 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
|
|
|
|
|
|
| 6 |
|
| 7 |
|
|
|
|
| 8 |
|
| 9 |
|
|
|
|
|
|
|
| 10 |
|
|
|
|
|
|
|
|
|
|
| 11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
мне нужно сделать простое приложение по генерации планов уроков на базе предоставленной фотографии страницы учебника.
|
| 2 |
+
Для интерфейса используем streamlit. Логика такая - экран делится не левую и правую части. В левой части область загрузки
|
| 3 |
+
фотографии страницы учебника + поля заполнения и настройки (они появляются после успешной загрузки).
|
| 4 |
+
При загрузке файла и получения его url, url первый раз передается в LLM (gpt-4o-mini) через chat.completions.
|
| 5 |
+
Промпт дает модели задание определить предмет (английский, математика и т.п.) и название учебника.
|
| 6 |
+
Я предлагаю использовать structured output для этого. Предмет и название учебника попадают в поля, которые появляются под областью загрузки (в области слева).
|
| 7 |
+
Если модель не смогла определить предмет и/или учебник - поля просто остаются пустыми и являются обязательнми для заполнения учителем.
|
| 8 |
+
Это первый шаг. Второй шаг - это настройки. Учитель определяет количество детей в классе от 1 до 40 (ползунок) и нажимает кнопку "создать план урока",
|
| 9 |
+
которая становится активна только после заполнения полей предмета и учебника. Ползунок количества детей изначально стоит на значении 10.
|
| 10 |
+
Эти данные (предмет, учебник, количество детей в классе) передаются на второй запрос к chat.completions вместе с url страницы учебника.
|
| 11 |
+
Этот второй запрос должен создать план урока по промпту. В промпте мы просим модель создать план урока на основании предоставленного изображения
|
| 12 |
+
страницы учебника и на основании переданных данных (предмет, учебник, количество детей в классе) План урока должен обязательно опираться на
|
| 13 |
+
предоставленный материал - где нужно указываются номера упражнений, примеры и так далее.
|
| 14 |
|
| 15 |
+
Модель gpt-4o-mini поддержкивает input image.
|
| 16 |
+
Длительное хранение загруженных изображений не требуется, поэтому решение tmpfiles.org подходит.
|
| 17 |
|
| 18 |
|
| 19 |
+
Structured Outputs через response_format с JSON Schema , так как:
|
| 20 |
|
| 21 |
|
| 22 |
+
from pydantic import BaseModel
|
| 23 |
+
from openai import OpenAI
|
| 24 |
|
| 25 |
+
class TextbookInfo(BaseModel):
|
| 26 |
+
subject: str # Предмет (например, "Английский язык")
|
| 27 |
+
textbook_name: str # Название учебника (например, "Spotlight 5")
|
| 28 |
|
| 29 |
+
client = OpenAI()
|
| 30 |
+
completion = client.beta.chat.completions.parse(
|
| 31 |
+
model="gpt-4o-mini-2024-07-18", # Убедитесь, что модель поддерживает Structured Outputs
|
| 32 |
+
messages=[
|
| 33 |
+
{"role": "system", "content": "Определи предмет и название учебника по изображению страницы. Если не уверен — оставь поля пустыми."},
|
| 34 |
+
{"role": "user", "content": [
|
| 35 |
+
{"type": "image_url", "image_url": {"url": uploaded_image_url}},
|
| 36 |
+
{"type": "text", "text": "Что это за учебник? Определи предмет и точное название."}
|
| 37 |
+
]}
|
| 38 |
+
],
|
| 39 |
+
response_format=TextbookInfo # Автоматически генерирует JSON Schema
|
| 40 |
+
)
|
| 41 |
+
textbook_data = completion.choices[0].message.parsed
|
| 42 |
|
| 43 |
+
Image input:
|
| 44 |
+
|
| 45 |
+
Analyze the content of an image
|
| 46 |
+
|
| 47 |
+
response = client.chat.completions.create(
|
| 48 |
+
model="gpt-4o-mini",
|
| 49 |
+
messages=[{
|
| 50 |
+
"role": "user",
|
| 51 |
+
"content": [
|
| 52 |
+
{"type": "text", "text": "What's in this image?"},
|
| 53 |
+
{
|
| 54 |
+
"type": "image_url",
|
| 55 |
+
"image_url": {
|
| 56 |
+
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
|
| 57 |
+
},
|
| 58 |
+
},
|
| 59 |
+
],
|
| 60 |
+
}],
|
| 61 |
+
)
|
| 62 |
+
|
| 63 |
+
print(response.choices[0].message.content)
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
Вот так мы получаем url:
|
| 67 |
+
|
| 68 |
+
def upload_image(image_bytes):
|
| 69 |
+
"""Загрузка изображения"""
|
| 70 |
+
try:
|
| 71 |
+
response = requests.post(
|
| 72 |
+
"https://tmpfiles.org/api/v1/upload",
|
| 73 |
+
files={"file": image_bytes},
|
| 74 |
+
timeout=10
|
| 75 |
+
)
|
| 76 |
+
return response.json()["url"].replace("tmpfiles.org/", "tmpfiles.org/dl/")
|
| 77 |
+
except Exception as e:
|
| 78 |
+
st.error(f"Ошибка загрузки: {e}")
|
| 79 |
+
return None
|
docs/scheme.mmd
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
graph TD
|
| 2 |
+
A[Пользователь загружает изображение] --> B[Загрузка на Catbox.moe]
|
| 3 |
+
B --> C[Запрос к GPT-4o-mini для анализа]
|
| 4 |
+
C --> D{Определены subject/textbook?}
|
| 5 |
+
D -->|Да| E[Автозаполнение полей]
|
| 6 |
+
D -->|Нет| F[Ручной ввод]
|
| 7 |
+
E --> G[Настройки урока]
|
| 8 |
+
F --> G
|
| 9 |
+
G --> H[Генерация промпта]
|
| 10 |
+
H --> I[Запрос к GPT-4o-mini]
|
| 11 |
+
I --> J[Отображение плана урока]
|
| 12 |
+
J --> K[Скачивание DOCX]
|
requirements
CHANGED
|
@@ -2,7 +2,7 @@ streamlit
|
|
| 2 |
python-dotenv
|
| 3 |
python-docx
|
| 4 |
openai
|
| 5 |
-
|
| 6 |
|
| 7 |
|
| 8 |
|
|
|
|
| 2 |
python-dotenv
|
| 3 |
python-docx
|
| 4 |
openai
|
| 5 |
+
|
| 6 |
|
| 7 |
|
| 8 |
|
test_url.py
CHANGED
|
@@ -1,78 +1,22 @@
|
|
| 1 |
-
import
|
| 2 |
-
from botocore.exceptions import ClientError
|
| 3 |
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
"endpoint": "https://s3.timeweb.cloud", # или https://s3.twcstorage.ru
|
| 7 |
-
"bucket": "47ebf6c8-b07131f2-a7c5-45b2-9db0-9b0a86ad3cca", # ваш bucket ID
|
| 8 |
-
"access_key": "SCJC187UUO758WCR6BGV", # ваш ключ (начинается на SCJ)
|
| 9 |
-
"secret_key": "Rd9LmpU1F2KErPA7aEQvDwDDIzQ8FD8YzymiBQEt", # длинная строка из TimeWeb S3 API
|
| 10 |
-
"file_path": "Materials/small.txt" # путь к тестовому файлу
|
| 11 |
-
}
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
def test_upload():
|
| 15 |
-
"""Тест загрузки файла с максимально простой конфигурацией"""
|
| 16 |
try:
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
aws_secret_access_key=CONFIG['secret_key'],
|
| 23 |
-
region_name='ru-1',
|
| 24 |
-
config=boto3.session.Config(
|
| 25 |
-
signature_version='s3v4',
|
| 26 |
-
s3={'addressing_style': 'path'}
|
| 27 |
)
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
# 2. Проверка доступа к бакету
|
| 31 |
-
print("\n1. Проверка доступа к бакету...")
|
| 32 |
-
s3.head_bucket(Bucket=CONFIG['bucket'])
|
| 33 |
-
print(f"✅ Бакет '{CONFIG['bucket']}' доступен")
|
| 34 |
-
|
| 35 |
-
# 3. Чтение файла
|
| 36 |
-
print("\n2. Чтение файла...")
|
| 37 |
-
with open(CONFIG['file_path'], 'rb') as f:
|
| 38 |
-
file_data = f.read()
|
| 39 |
-
print(f"✅ Файл прочитан ({len(file_data)} байт)")
|
| 40 |
-
|
| 41 |
-
# 4. Загрузка файла
|
| 42 |
-
print("\n3. Загрузка файла...")
|
| 43 |
-
# Вместо put_object используем upload_file
|
| 44 |
-
s3.upload_file(
|
| 45 |
-
CONFIG['file_path'],
|
| 46 |
-
CONFIG['bucket'],
|
| 47 |
-
"test_upload.png",
|
| 48 |
-
ExtraArgs={
|
| 49 |
-
'ACL': 'public-read',
|
| 50 |
-
'ContentType': 'image/png'
|
| 51 |
-
}
|
| 52 |
-
)
|
| 53 |
-
print("✅ Файл успешно загружен")
|
| 54 |
-
|
| 55 |
-
# 5. Проверка доступности
|
| 56 |
-
print("\n4. Проверка доступности...")
|
| 57 |
-
url = f"{CONFIG['endpoint']}/{CONFIG['bucket']}/test_upload.png"
|
| 58 |
-
print(f"URL файла: {url}")
|
| 59 |
-
|
| 60 |
-
# Проверка через head_object
|
| 61 |
-
response = s3.head_object(Bucket=CONFIG['bucket'], Key="test_upload.png")
|
| 62 |
-
print(f"Статус: {response['ResponseMetadata']['HTTPStatusCode']}")
|
| 63 |
-
print(f"Размер: {response['ContentLength']} байт")
|
| 64 |
-
|
| 65 |
-
except ClientError as e:
|
| 66 |
-
print("\n❌ Критическая ошибка:")
|
| 67 |
-
print(f"Тип: {type(e).__name__}")
|
| 68 |
-
print(f"Код: {e.response['Error']['Code']}")
|
| 69 |
-
print(f"Сообщение: {e.response['Error']['Message']}")
|
| 70 |
-
print(f"Детали: {e.response}")
|
| 71 |
-
|
| 72 |
except Exception as e:
|
| 73 |
-
print(f"
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
|
|
|
|
|
|
|
|
| 1 |
+
import requests
|
|
|
|
| 2 |
|
| 3 |
+
def upload_to_catbox(file_path):
|
| 4 |
+
"""Загружает файл на catbox.moe и возвращает прямую ссылку"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
try:
|
| 6 |
+
with open(file_path, "rb") as f:
|
| 7 |
+
response = requests.post(
|
| 8 |
+
"https://catbox.moe/user/api.php",
|
| 9 |
+
files={"fileToUpload": f},
|
| 10 |
+
data={"reqtype": "fileupload"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
)
|
| 12 |
+
response.raise_for_status()
|
| 13 |
+
return response.text.strip() # Пример: https://files.catbox.moe/abc123.png
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
except Exception as e:
|
| 15 |
+
print(f"❌ Ошибка: {e}")
|
| 16 |
+
return None
|
| 17 |
+
|
| 18 |
+
url = upload_to_catbox("Materials/test.png")
|
| 19 |
+
if url:
|
| 20 |
+
print(f"✅ Прямая ссылка на файл: {url}")
|
| 21 |
+
else:
|
| 22 |
+
print("Не удалось загрузить файл")
|