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}")