/
vitbur
/
ai_agents
Обзор
Документация
Войти
/
vitbur
/
ai_agents
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
agent_second/ui_components.py
155 строк
7 KB
Vitaly B
ui decomposition
09 июл 2026, 11:40
09 июл 2026, 11:40
39d7e40
Код
Авторство
О чём код?
import os import streamlit as st from streamlit_paste_button import paste_image_button as pbutton from graph import grammar_agent from ui_state import callback_generate_quiz, callback_regenerate_more, callback_reset_all def render_input_block(): """Блок ввода текста или изображений.""" st.title("🇩🇪 Проверка немецкой грамматики") st.write("Введите текст вручную или загрузите изображение.") input_method = st.radio("Выберите способ ввода:", ("Текст", "Изображение (Файл / Скриншот)")) if input_method == "Текст": user_text = st.text_area("Введите текст на немецком языке:", placeholder="Например: Ich gehen nach Hause...") if st.button("Проверить текст", type="primary"): if user_text.strip(): with st.spinner("🤖 Агент анализирует текст..."): st.session_state.quiz_questions = [] st.session_state.quiz_submitted = False st.session_state.last_result = grammar_agent.invoke({"text_content": user_text, "image_path": None}) else: st.warning("Пожалуйста, введите текст.") elif input_method == "Изображение (Файл / Скриншот)": uploaded_file = st.file_uploader("Загрузить или вставить изображение:", type=["png", "jpg", "jpeg"]) if uploaded_file is not None: st.image(uploaded_file, caption="Выбранное изображение", width=350) if st.button("Распознать и проверить ИИ", type="primary"): with st.spinner("📥 Обработка изображения агентом..."): os.makedirs("temp_downloads", exist_ok=True) temp_path = os.path.join("temp_downloads", uploaded_file.name) with open(temp_path, "wb") as f: f.write(uploaded_file.getbuffer()) st.session_state.quiz_questions = [] st.session_state.quiz_submitted = False st.session_state.last_result = grammar_agent.invoke({"text_content": None, "image_path": temp_path}) if os.path.exists(temp_path): os.remove(temp_path) def render_analysis_result(): """Вывод результатов грамматического разбора.""" if st.session_state.last_result is None: return res = st.session_state.last_result st.markdown("---") st.subheader("🔍 Анализ исходного текста") score = res["score"] if score >= 4: st.success(f"### 📊 Оценка: {score}/5") elif score == 3: st.warning(f"### 📊 Оценка: {score}/5") else: st.error(f"### 📊 Оценка: {score}/5") if res["has_errors"]: st.markdown("### ❌ Найденные ошибки") for err in res["errors_list"]: st.markdown(f"- {err}") st.markdown("### 📖 Правила") st.info(res["rules"]) st.markdown("### ✅ Исправления") st.write(res["corrections"]) if not st.session_state.quiz_questions: st.markdown("---") st.markdown("💡 **Хотите закрепить материал?** Выберите количество вопросов для теста.") st.session_state.quiz_topic = ", ".join(res["errors_list"]) col_btn1, col_btn2 = st.columns(2) with col_btn1: st.button("🎯 Сгенерировать 5 вопросов", use_container_width=True, on_click=callback_generate_quiz, args=(5,)) with col_btn2: st.button("🔥 Сгенерировать 10 вопросов", use_container_width=True, on_click=callback_generate_quiz, args=(10,)) else: st.balloons() st.success("🎉 Ошибок не обнаружено!") def render_quiz_block(): """Вывод интерактивного теста и результатов его проверки.""" if not st.session_state.quiz_questions: return st.markdown("---") st.subheader("📝 Практический тест на исправление ошибок") st.write(f"Закрепление тем: *{st.session_state.quiz_topic}*") user_selections = {} is_disabled = st.session_state.quiz_submitted for i, q in enumerate(st.session_state.quiz_questions): st.markdown(f"**Вопрос {i + 1}:** {q['question']}") chosen_option = st.radio( f"Варианты для q_{i}:", q['options'], key=f"user_radio_q_{i}_{st.session_state.quiz_seed}", index=None, disabled=is_disabled, label_visibility="collapsed" ) user_selections[i] = chosen_option st.markdown(" ") if not st.session_state.quiz_submitted: if st.button("📊 Проверить тест", type="primary", use_container_width=True): if any(ans is None for ans in user_selections.values()): st.warning("⚠️ Пожалуйста, ответьте на все вопросы теста перед проверкой.") else: st.session_state.quiz_submitted = True st.rerun() if st.session_state.quiz_submitted: st.markdown("---") st.markdown("### 🏁 Результаты теста:") correct_count = 0 for i, q in enumerate(st.session_state.quiz_questions): chosen_str = user_selections[i] correct_idx = q['correct_option_index'] correct_str = q['options'][correct_idx] st.markdown(f"**Вопрос {i + 1}:** {q['question']}") if chosen_str and chosen_str.strip() == correct_str.strip(): st.success(f"✅ **Правильно!**") st.markdown(f"* **Ваш ответ:** `{chosen_str}`") correct_count += 1 else: st.error(f"❌ **Ошибка в вопросе**") st.markdown(f"* **Ваш ответ:** `{chosen_str if chosen_str else 'Не выбрано'}`") st.markdown(f"* **Правильный ответ:** `{correct_str}`") st.info(f"💡 *Объяснение грамматики:* {q['explanation']}") st.markdown("---") total_q = len(st.session_state.quiz_questions) st.metric(label="Итоговый result", value=f"{correct_count} / {total_q}") if correct_count == total_q: st.balloons() st.markdown("### 🚀 Что делаем дальше?") col_nav1, col_nav2 = st.columns(2) with col_nav1: st.button("🔄 Сгенерировать еще вопросов", use_container_width=True, on_click=callback_regenerate_more) with col_nav2: st.button("📥 Проверить новое предложение", type="primary", use_container_width=True, on_click=callback_reset_all)