import streamlit as st import os import json from datetime import datetime, timedelta import base64 import pandas as pd import pydeck as pdk from paper import ( literature_research_task, outline_task, draft_writing_task, citation_task, editing_task, chatbot_task, run_task ) # st.set_page_config() st.set_page_config( page_title="AI Agent for Academic Research", page_icon="📚", layout="wide", initial_sidebar_state="expanded" ) # ------------------------------------------ # # ------------------------------------------ translations = { "id": { "page_title": "Agen AI untuk Penelitian Akademis", "header": "Agen AI untuk Penelitian Akademis", "create_itinerary": "Membuat Laporan Penelitian", "trip_details": "Penelitian rinci", "origin": "Research Topic", "destination": "Judul penelitian", "travel_dates": "Tanggal selesai", "duration": "Jumlah halaman (pages)", "preferences": "Keywords/Focus", "special_requirements": "Additional Instructions", "submit": "🚀 Buatkan Laporan Penelitian", "request_details": "Your Research Request", "from": "Topic", "when": "Due Date", "budget": "Paper Type", "travel_style": "Writing Style", "live_agent_outputs": "Live Agent Outputs", "full_itinerary": "Full Paper", "details": "Details", "download_share": "Download & Share", "save_itinerary": "Save Your Paper", "plan_another_trip": "🔄 Generate Another Paper", "about": "About", "how_it_works": "How it works", "travel_agents": "Research Agents", "share_itinerary": "Share Your Paper", "save_for_mobile": "Save for Mobile", "built_with": "Built with âĪïļ for you", "itinerary_ready": "Your Research Paper is Ready! 🎉", "personalized_experience": "Kami telah membuat makalah akademis yang dipersonalisasi berdasarkan masukan Anda. Lihat makalah Anda di bawah ini.", "agent_activity": "Agent Activity", "error_origin_destination": "Harap masukkan topik penelitian dan judul makalah", "your_itinerary_file": "Your Paper File", "text_format": "Text format - Can be opened in any text editor" }, "en": { "page_title": "AI Agent for Academic Research", "header": "AI Agent for Academic Research", "create_itinerary": "Generate Your Research Paper", "trip_details": "Research Details", "origin": "Research Topic", "destination": "Paper Title", "travel_dates": "Due Date", "duration": "Paper Length (pages)", "preferences": "Keywords/Focus", "special_requirements": "Additional Instructions", "submit": "🚀 Generate My Research Paper", "request_details": "Your Research Request", "from": "Topic", "when": "Due Date", "budget": "Paper Type", "travel_style": "Writing Style", "live_agent_outputs": "Live Agent Outputs", "full_itinerary": "Full Paper", "details": "Details", "download_share": "Download & Share", "save_itinerary": "Save Your Paper", "plan_another_trip": "🔄 Generate Another Paper", "about": "About", "how_it_works": "How it works", "travel_agents": "Research Agents", "share_itinerary": "Share Your Paper", "save_for_mobile": "Save for Mobile", "built_with": "Built with âĪïļ for you", "itinerary_ready": "Your Research Paper is Ready! 🎉", "personalized_experience": "We've created a personalized academic paper based on your inputs. Explore your paper below.", "agent_activity": "Agent Activity", "error_origin_destination": "Please enter both the research topic and paper title.", "your_itinerary_file": "Your Paper File", "text_format": "Text format - Can be opened in any text editor" } } def t(key): lang = st.session_state.get("selected_language", "id") return translations[lang].get(key, key) # --------------------------- # # --------------------------- if 'selected_language' not in st.session_state: st.session_state.selected_language = "id" # ------------------------------------------ # # ------------------------------------------ with st.sidebar: language = st.selectbox( "Language / Bahasa", ["Indonesia","English"] ) lang_map = { "Indonesia": "id", "English": "en" } st.session_state.selected_language = lang_map.get(language, "id") # ------------------------------------------ # # ------------------------------------------ st.markdown(""" """, unsafe_allow_html=True) def get_download_link(text_content, filename): b64 = base64.b64encode(text_content.encode()).decode() href = f'ðŸ“Ĩ {t("save_itinerary")}' return href def display_modern_progress(current_step, total_steps=5): if 'progress_steps' not in st.session_state: st.session_state.progress_steps = { 0: {'status': 'pending', 'name': t("trip_details")}, 1: {'status': 'pending', 'name': t("about")}, 2: {'status': 'pending', 'name': t("live_agent_outputs")}, 3: {'status': 'pending', 'name': t("download_share")}, 4: {'status': 'pending', 'name': t("full_itinerary")} } for i in range(total_steps): if i < current_step: st.session_state.progress_steps[i]['status'] = 'complete' elif i == current_step: st.session_state.progress_steps[i]['status'] = 'active' else: st.session_state.progress_steps[i]['status'] = 'pending' progress_percentage = (current_step / total_steps) * 100 st.progress(progress_percentage / 100) st.markdown("
Progress: " + str(progress_percentage) + "% completed.
") return progress_percentage def update_step_status(step_index, status): if 'progress_steps' in st.session_state and step_index in st.session_state.progress_steps: st.session_state.progress_steps[step_index]['status'] = status def run_task_with_logs(task, input_text, log_container, output_container, results_key=None): log_message = f"ðŸĪ– Starting {task.agent.role}..." st.session_state.log_messages.append(log_message) with log_container: st.markdown("### " + t("agent_activity")) for msg in st.session_state.log_messages: st.markdown(msg) result = run_task(task, input_text) if results_key: st.session_state.results[results_key] = result log_message = f"✅ {task.agent.role} completed!" st.session_state.log_messages.append(log_message) with log_container: st.markdown("### " + t("agent_activity")) for msg in st.session_state.log_messages: st.markdown(msg) with output_container: st.markdown(f"### {task.agent.role} Output") st.markdown("
" + result + "
", unsafe_allow_html=True) return result if 'generated_itinerary' not in st.session_state: st.session_state.generated_itinerary = None if 'generation_complete' not in st.session_state: st.session_state.generation_complete = False if 'current_step' not in st.session_state: st.session_state.current_step = 0 if 'results' not in st.session_state: st.session_state.results = { "literature_review": "", "outline": "", "draft": "", "citations": "", "edited": "" } if 'log_messages' not in st.session_state: st.session_state.log_messages = [] if 'form_submitted' not in st.session_state: st.session_state.form_submitted = False st.markdown(f"""

{t("header")}

Hasilkan makalah penelitian pribadi Anda dengan agen yang berbasis AI.

""", unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) with st.sidebar: st.markdown("""

Asisten AI untuk Penelitian Akademik

Pembuatan laporan dibantu AI

""", unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) st.markdown("### " + t("about")) st.info("Alat ini menghasilkan makalah penelitian akademis yang dipersonalisasi berdasarkan masukan Anda. Isi formulir dan biarkan agen spesialis kami menyusun makalah Anda!") st.markdown('
', unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) st.markdown("### " + t("how_it_works")) st.markdown("""
  1. Masukkan detail penelitian Anda
  2. AI melakukan penelitian literatur
  3. Membuat kerangka makalah
  4. Buat draf dan edit makalah Anda
  5. Unduh makalah akhir Anda
""", unsafe_allow_html=True) st.markdown('
', unsafe_allow_html=True) if not st.session_state.generation_complete: st.markdown('
', unsafe_allow_html=True) st.markdown("

" + t("create_itinerary") + "

", unsafe_allow_html=True) st.markdown("

Isi rincian di bawah ini

", unsafe_allow_html=True) with st.form("research_form"): col1, col2 = st.columns(2) with col1: research_topic = st.text_input(t("origin"), placeholder="e.g., Manfaat Teh untuk kesehatan manusia") paper_title = st.text_input(t("destination"), placeholder="e.g., Hasil penelitian terbaru tentang manfaat teh untuk kesehatan manusia") due_date = st.date_input(t("travel_dates"), min_value=datetime.now()) with col2: paper_length = st.slider(t("duration"), min_value=5, max_value=50, value=10) paper_type_options = ["Journal", "Conference", "Thesis", "Review"] paper_type = st.selectbox(t("budget"), paper_type_options, help="Select the type of paper") writing_style = st.multiselect(t("travel_style"), options=["Formal", "Technical", "Creative"], default=["Formal"]) additional_instructions = st.text_area(t("special_requirements"), placeholder="Instruksi atau persyaratan tambahan apa pun...") keywords = st.text_area(t("preferences"), placeholder="Masukkan kata kunci atau area fokus, dipisahkan dengan koma") submit_button = st.form_submit_button(t("submit")) st.markdown('
', unsafe_allow_html=True) if submit_button: if not research_topic or not paper_title: st.error(t("error_origin_destination")) else: st.session_state.form_submitted = True st.session_state.research_topic = research_topic user_input = { "research_topic": research_topic, "paper_title": paper_title, "due_date": due_date.strftime("%Y-%m-%d"), "paper_length": str(paper_length), "paper_type": paper_type, "writing_style": ", ".join(writing_style), "keywords": keywords, "additional_instructions": additional_instructions } st.session_state.user_input = user_input input_context = f"""Research Request Details: Research Topic: {user_input['research_topic']} Paper Title: {user_input['paper_title']} Due Date: {user_input['due_date']} Paper Length: {user_input['paper_length']} pages Paper Type: {user_input['paper_type']} Writing Style: {user_input['writing_style']} Keywords/Focus: {user_input['keywords']} Additional Instructions: {user_input['additional_instructions']} """ llm_language_instructions = { "en": "Please output the response in English.", "id": "Please output the response in Bahasa Indonesia." } selected_lang = st.session_state.get("selected_language", "id") language_instruction = llm_language_instructions.get(selected_lang, "Please output the response in Bahasa Indonesia.") modified_input_context = language_instruction + "\n" + input_context st.markdown("
Sedang memproses...
", unsafe_allow_html=True) st.session_state.current_step = 0 update_step_status(0, 'active') progress_placeholder = st.empty() with progress_placeholder.container(): display_modern_progress(st.session_state.current_step) log_container = st.container() st.session_state.log_messages = [] output_container = st.container() st.session_state.results = {} # Step 1: Literature Research literature_review = run_task_with_logs( literature_research_task, modified_input_context.format(topic=user_input['research_topic'], keywords=user_input['keywords']), log_container, output_container, "literature_review" ) update_step_status(0, 'complete') st.session_state.current_step = 1 update_step_status(1, 'active') with progress_placeholder.container(): display_modern_progress(st.session_state.current_step) # Step 2: Generate Outline outline = run_task_with_logs( outline_task, modified_input_context.format(topic=user_input['research_topic']), log_container, output_container, "outline" ) update_step_status(1, 'complete') st.session_state.current_step = 2 update_step_status(2, 'active') with progress_placeholder.container(): display_modern_progress(st.session_state.current_step) # Step 3: Draft Writing draft = run_task_with_logs( draft_writing_task, modified_input_context.format(topic=user_input['research_topic']), log_container, output_container, "draft" ) update_step_status(2, 'complete') st.session_state.current_step = 3 update_step_status(3, 'active') with progress_placeholder.container(): display_modern_progress(st.session_state.current_step) # Step 4: Citation Generation citations = run_task_with_logs( citation_task, modified_input_context.format(topic=user_input['research_topic']), log_container, output_container, "citations" ) update_step_status(3, 'complete') st.session_state.current_step = 4 update_step_status(4, 'active') with progress_placeholder.container(): display_modern_progress(st.session_state.current_step) # Step 5: Editing and Polishing edited = run_task_with_logs( editing_task, modified_input_context.format(topic=user_input['research_topic']), log_container, output_container, "edited" ) update_step_status(4, 'complete') st.session_state.current_step = 5 with progress_placeholder.container(): display_modern_progress(st.session_state.current_step) full_paper = f"""Research Paper: {input_context} Literature Review: {literature_review} Outline: {outline} Draft: {draft} Citations: {citations} Edited Version: {edited} """ st.session_state.generated_itinerary = full_paper st.session_state.generation_complete = True date_str = datetime.now().strftime("%Y-%m-%d") st.session_state.filename = f"{user_input['paper_title'].replace(' ', '_')}_{date_str}_paper.txt" if st.session_state.generation_complete: st.markdown(f"""

{t("itinerary_ready")}

{t("personalized_experience")}

""", unsafe_allow_html=True) # full_paper_tab, details_tab, download_tab, visualization_tab, chatbot_tab = st.tabs([ "🗒ïļ " + t("full_itinerary"), "💞 " + t("details"), "ðŸ’ū " + t("download_share"), "📊 Visualization", "ðŸĪ– Chatbot" ]) with full_paper_tab: st.text_area("Your Research Paper", st.session_state.generated_itinerary, height=600) with details_tab: agent_tabs = st.tabs(["📚 Literature Review", "📝 Outline", "✍ïļ Draft", "🔗 Citations", "🖋ïļ Edited Version"]) with agent_tabs[0]: st.markdown("### Literature Review") st.markdown(st.session_state.results.get("literature_review", "")) with agent_tabs[1]: st.markdown("### Outline") st.markdown(st.session_state.results.get("outline", "")) with agent_tabs[2]: st.markdown("### Draft") st.markdown(st.session_state.results.get("draft", "")) with agent_tabs[3]: st.markdown("### Citations") st.markdown(st.session_state.results.get("citations", "")) with agent_tabs[4]: st.markdown("### Edited Version") st.markdown(st.session_state.results.get("edited", "")) with download_tab: col1, col2 = st.columns([2, 1]) with col1: st.markdown("### " + t("save_itinerary")) st.markdown("Download your research paper to access it offline or share with your colleagues.") st.markdown(f"""

{t("your_itinerary_file")}

{t("text_format")}

""", unsafe_allow_html=True) st.markdown("
" + get_download_link(st.session_state.generated_itinerary, st.session_state.filename) + "
", unsafe_allow_html=True) st.markdown("### " + t("share_itinerary")) st.markdown("*Coming soon: Email your paper or share via social media.*") with col2: st.markdown("### " + t("save_for_mobile")) st.markdown("*Coming soon: QR code for easy access on your phone*") with visualization_tab: st.markdown("### Visualization") st.markdown("A conceptual diagram or visualization related to your research paper can be displayed here. (Feature under development)") with chatbot_tab: st.markdown("### AI Chat") if "chat_history" not in st.session_state: st.session_state.chat_history = [] user_message = st.text_input("Input:", key="chat_input") if st.button("Kirim", key="send_button"): if user_message: response = run_task(chatbot_task, user_message) st.session_state.chat_history.append({ "speaker": "ė‚ŽėšĐėž", "message": user_message, "time": datetime.now() }) st.session_state.chat_history.append({ "speaker": "AI", "message": response, "time": datetime.now() }) st.markdown("
", unsafe_allow_html=True) for chat in st.session_state.chat_history: time_str = chat["time"].strftime("%H:%M:%S") st.markdown(f"**{chat['speaker']}** ({time_str}): {chat['message']}") st.markdown("
", unsafe_allow_html=True) st.markdown("""

""" + t("built_with") + """

""", unsafe_allow_html=True)