File size: 7,476 Bytes
58a9b80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import asyncio
from dotenv import load_dotenv
from openai import OpenAI
import streamlit as st

# Загрузка переменных окружения
load_dotenv()
api_key = os.getenv("API_KEY_openai")


def generate_lesson_plan(params):
    client = OpenAI(api_key=api_key)

    prompt = f"""
    Ты — эксперт в области логопедии, специализирующийся на разработке занятий для детей с речевыми нарушениями. На вход ты получаешь следующие параметры:
    - **Основное нарушение:** {params['нарушение']}
    - **Возраст ребенка:** {params['возраст_ребенка']}
    - **Цель занятия:** {params['цель_занятия']}
    - **Тематика:** {params['тематика']}
    - **Формат занятия:** {params['формат_занятия']} ({params['количество_детей']} детей)
    - **Инвентарь:** {params['инвентарь']}
    - **Особые условия:** {params['особые_условия']}
    - **Длительность занятия:** {params['длительность_занятия']} минут
    - **Наличие домашнего задания:** {params['наличие_ДЗ']}
    - **Разрешен web search:** {params['разрешен_web_search']}

    На основе этих параметров составь конспект занятия, который должен включать:
    1. **Тема занятия, цель и задачи** 
    2. **Необходимые материалы**
    3. **Ход занятия**. Разбей занятие на логически последовательные этапы.
    В каждый этап встрой конкретные упражнения с достаточным количеством примеров.
    ВАЖНО: если разрешен web search: True, подбери примеры для упражнений из релевантных источников. 
    Обязательно интегрируй ссылки на найденные источники в текст ответа.
    5. **Домашнее задание** (если параметр "наличие домашнего задания: True")
    6. **Рекомендации по особым условиям** (если указан параметр "Особые условия")
    """

    tools = []
    tool_choice = None

    if params['разрешен_web_search']:
        tools.append({
            "type": "web_search_preview",
            "search_context_size": "medium",
            "user_location": {
                "type": "approximate",
                "country": "RU"
            }
        })
        tool_choice = {"type": "web_search_preview"}

    response = client.responses.create(
        model="gpt-4o-mini",
        input=prompt,
        tools=tools if tools else None,
        tool_choice=tool_choice,
        max_output_tokens=2000
    )
    return response.output_text


# Интерфейс Streamlit
st.title("Генератор логопедических занятий")

# Левая часть с настройками
with st.sidebar:
    st.header("Настройки занятия")

    # Обязательные поля
    нарушение = st.text_input(
        "Основное нарушение*",
        placeholder="Пример: Дислалия (свистящие), ОНР II уровня"
    )

    возраст_ребенка = st.text_input(
        "Возраст ребенка*",
        placeholder="Пример: 5 лет, 6-7 лет"
    )

    цель_занятия = st.text_input(
        "Цель занятия*",
        placeholder="Пример: Автоматизация звука [Р] в слогах"
    )

    # Переключатель формата занятия
    формат_занятия = st.radio(
        "Формат занятия*",
        options=["Индивидуальное", "Групповое"],
        index=0,
        horizontal=True
    )

    количество_детей = 1  # Значение по умолчанию

    if формат_занятия == "Групповое":
        количество_детей = st.number_input(
            "Количество детей в группе*",
            min_value=2,
            max_value=10,
            value=3
        )

    # Дополнительные параметры
    тематика = st.text_input(
        "Тематика занятия",
        placeholder="Пример: Животные, Транспорт"
    )

    особые_условия = st.text_input(
        "Особые условия",
        placeholder="Пример: гиперактивность, РАС"
    )

    # Инвентарь
    st.subheader("Инвентарь")
    инвентарь_чекбоксы = {
        "Зеркало": st.checkbox("Зеркало"),
        "Карточки": st.checkbox("Карточки"),
        "Игрушки": st.checkbox("Игрушки")
    }
    дополнительный_инвентарь = st.text_input("Другое")

    инвентарь = ", ".join([k for k, v in инвентарь_чекбоксы.items() if v])
    if дополнительный_инвентарь:
        инвентарь += f", {дополнительный_инвентарь}"

    # Другие настройки
    длительность_занятия = st.slider(
        "Длительность (минут)",
        min_value=15,
        max_value=60,
        value=30,
        step=5
    )

    наличие_ДЗ = st.checkbox("Домашнее задание")
    разрешен_web_search = st.checkbox("Поиск материалов в интернете")

    # Кнопка генерации
    сгенерировать = st.button("Создать конспект")

# Правая часть с результатом
if сгенерировать:
    if not нарушение or not возраст_ребенка or not цель_занятия:
        st.error("Заполните обязательные поля!")
    else:
        params = {
            "нарушение": нарушение,
            "возраст_ребенка": возраст_ребенка,
            "цель_занятия": цель_занятия,
            "тематика": тематика,
            "формат_занятия": формат_занятия,
            "количество_детей": количество_детей,
            "инвентарь": инвентарь,
            "особые_условия": особые_условия,
            "длительность_занятия": длительность_занятия,
            "наличие_ДЗ": наличие_ДЗ,
            "разрешен_web_search": разрешен_web_search
        }

        with st.spinner("Создаем конспект..."):
            try:
                результат = generate_lesson_plan(params)
                st.success("Готово!")
                st.markdown(результат)
            except Exception as e:
                st.error(f"Ошибка: {e}")