Show a desktop notification when the AI TA finishes replying
Notify me when classmates post messages in the forum
Play an alert sound whenever there is a new notification
For complex questions, students activate the ReAct multi-step research mode: gathering evidence across tools, self-reflection, and integrating it into a complete answer with citations. It includes a closed-loop design of planning / action / observation / reflection / integration, together with five layers of cost and safety safeguards.
Deep Research is a research mode on the Uedu platform for learning questions that need 'cross-referencing multiple data sources and multi-step reasoning'. When a student asks a question involving course material integration, cross-disciplinary comparison, literature search, course planning, or other issues that are hard to answer in one sentence, AI automatically enters a ReAct (Reasoning + Acting) cycle, first planning, then calling tools step by step to gather evidence, continuously reflecting on whether the evidence is sufficient, and finally integrating it into a complete answer with citations.
This design addresses two limitations of ordinary LLM conversations:
ClassroomGPT is a single-turn Q&A TA set up by the Instructor; Aida is a Socratic guiding companion under the AIDA framework; Deep Research is a 'researcher' role for complex problems, capable of autonomously completing research tasks across multiple steps and tools. The three share the same chat_tools.py tool registry, but their process patterns are entirely different: the TA and Aida are real-time back-and-forth conversations, whereas Deep Research is a long-running, multi-turn, task-based workflow that can run in the background.
Deep Research is off by default. Only after the teacher enables it via the switch in section 6 of Channel Settings, 'Deep Research', will the student chat box show a teal magnifying-glass button.
Each research task follows the Plan → (Action → Observation → Reflect)* → Synthesize cycle until the LLM determines that sufficient data has been collected, or a system limit is reached.
| Stage | Output | Role responsible |
|---|---|---|
| Plan | Assess complexity (simple / moderate / complex), break it down into 2~6 sub-questions, and estimate the tools to be used | Planner LLM(GPT-5.4-mini) |
| Action | Select the next tool to call from the tool registry and generate parameters | Action LLM with function calling |
| Observation | Logs tool returns results (summary of the first N characters + full data for later LLM use) | Engine |
| Reflect | Assess whether the observations collected are sufficient to answer the original question; if not, return to Action; if sufficient, proceed to Synthesize | Reflection LLM |
| Synthesize | Integrate all observations, produce the final answer, assemble the citation list | Synthesizer LLM with structured output |
Planner splits the original question into 2–6 sub-questions that can be researched independently, and suggests possible tools for each sub-question. The complexity judgement affects the number of subsequent execution steps and the overall token budget:
| Complexity | Typical number of sub-questions | Typical number of tool calls |
|---|---|---|
| simple | 2~3 | 2~5 |
| moderate | 3~4 | 5~10 |
| complex | 4~6 | 10~20 |
All stages are pushed to the front end via Server-Sent Events. Event types include connected, task_created, status_change, plan_complete, action_thinking, action_dispatch, action_complete, reflection_done, limit_hit, cancelled, completed, failed and the heartbeat sent every 15 seconds. The front end can display steps, tokens and tool-call status in real time.
Research may run for several minutes; the engine pushes a heartbeat event every 15 seconds to ensure the SSE long connection is not interrupted while waiting for tool responses, and the Student-side progress display continues to update.
Once Deep Research is activated, it consumes 30-60 seconds and tens of thousands of tokens, so it is not worth enabling for every question. The system provides two trigger paths:
After a Student explicitly clicks the magnifying-glass button and submits a question, the engine is triggered directly with trigger_mode='forced'.
When a student enters a question in the general input box, the front end uses a lightweight LLM to determine whether it is worth activating. The auto-judge examines the following features:
| Features suitable for Deep Research | Unsuitable features |
|---|---|
| Requires integration across multiple data sources | A single factual query can be answered in one sentence |
| Involving paper / textbook / syllabus comparison | Pure arithmetic, single-concept definitions |
| Academic response with citations required | Chit-chat, emotional response |
| Planning-type questions (teaching sequence / learning path) | Single-step problem solvable by a tool call |
The classifier also returns a confidence score (0~1). When the confidence score is above the threshold, the front end shows a card saying "This question is suitable for Deep Research"; the Student can decide whether to upgrade to DR mode or keep the general conversation.
The per-use cost of Deep Research is about 30 to 100 times that of a normal conversation. To avoid students accidentally consuming quota, Auto mode only 'suggests' and does not 'automatically start' — research only runs after the student gives clear confirmation. This threshold is intentionally designed to preserve students' decision-making rights and to prompt them to think before pressing the button: 'Is this question worth researching in depth?'
The Action stage of Deep Research shares the chat_tools.py tool registry used by ClassroomGPT / Aida, but the subset actually called is dynamically adjusted according to the question context. Common tool-orchestration combinations:
| Issue Type | Typical tool sequence |
|---|---|
| Course material integration | get_course_overview → search_channel_materials → list_uedu_team_papers |
| Discipline-based teaching sequence planning | get_hs_curriculum → search_channel_materials → search_advisor_papers |
| Research field exploration | list_research_clusters → get_cluster_advisors → search_external_papers(OpenAlex) |
| Cross-course comparison | get_course_overview (multiple times) → search_channel_materials → list_uedu_universities |
search_channel_materials This is the tool most often called in course contexts for Deep Research. It uses semantic retrieval (cosine similarity) on the RAG materials for this channel uploaded by the Instructor (PDF / DOCX / PPTX) to identify relevant passages, and returns the file name, page number and original passage for Synthesizer citation. See detailsRAG Methodology。
search_external_papers uses the OpenAlex public API to query academic papers from institutions in five countries: Taiwan, Singapore, Japan, South Korea and China. The engine strictly separates the Synthesize stage:
search_advisor_papers): can label author and provide an advisor profile linkUp to 30 steps per research task (each step may call 1~N tools), a cumulative 200,000 tokens, and 10 minutes of execution time. When any limit is reached, the process enters the Synthesize stage (an answer will still be produced, but limit_hit will be pushed via SSE to explain the reason).
Observations from all Action stages are sent together with the original question to the Synthesizer LLM, which outputs structured JSON (answer + citations). The Synthesizer uses response_format={"type":"json_object"} to enforce JSON output, and instructs the LLM to cite sources in the answer with labels such as [1] and [2].
| Field | Content |
|---|---|
answer | Answer text in Markdown format, with [N] labels embedded |
citations[] | Each entry includes id, title, url, source_tool, snippet |
The Synthesiser is the most error-prone stage in the entire process, because it has to integrate a large amount of observations within a fixed token budget. In practice, two pitfalls have been encountered:
reasoning_effort='medium' will consume most of the max_completion_tokens, leaving too little space for the output and resulting in an empty stringmax_completion_tokens set too low (e.g. 6,000) easily causes truncation part-way through the outputAt present, the production environment is configured as reasoning_effort='low' + max_completion_tokens=12000, and finish_reason is checked for length to detect truncation.
Each citation is accompanied by source_tool (the tool that generated the citation) and snippet (the original paragraph or the first N characters). Students can expand the citation list below the answer to view the original content, and the research results page also retains the full plan_json / observations for later audit.
Deep Research is the platform's most expensive single feature. To avoid misuse, abuse or loss of control leading to runaway costs, the engine has built five layers of defence:
| Layer | Mechanism | Trigger condition |
|---|---|---|
| 1. Built-in engine limit | 30 steps / 200K tokens / 10 minutes per research task | Any upper limit reached → enter Synthesize (still produce an answer) |
| 2. Personal quota | Students: 20 times/day, TAs: 40 times/day, Instructors and administrators: unlimited | When the cumulative total for the day reaches the limit → refuse to start directly |
| 3. Rate limiting | Flask-Limiter (per user per minute) | Frequent requests in a short period → 429 Too Many Requests |
| 4. Cost alert cron | scripts/deep_research_cost_alert.py runs daily |
When the cumulative cost for the day is > UEDU_DEEP_RESEARCH_ALERT_USD (default $20) → send an alert email |
| 5. Daily hard limit for the platform | Platform-wide accumulated cost cap | Trigger → Pause all new research initiations |
A single layer of defence is not enough to cope with all kinds of runaway scenarios. For example: individual quotas cannot prevent a single research task from causing token explosions because an LLM recursively calls tools (engine-level caps are needed); engine-level caps cannot prevent the entire school's students from flooding in at once (platform daily caps are needed); hard caps cannot immediately tell administrators that a problem is happening (an alert cron is needed). Multiple independent layers of defence provide a fault-tolerance guarantee that "even if one layer fails, the others can still block the damage".
At startup, the engine determines the user role according to the following priority order and sets today's quota accordingly:
classroomgpt_teacher) → Unlimited (teacher)classroomgpt_ta) → 40 times / day (ta)Uses a rolling 24-hour window, counted 24 hours forward from the time of first activation. Each successful activation deducts 1.0 use (deductions on cancellation follow the rules).
POST /api/deep_research/start — Start research (SSE stream)POST /api/deep_research/cancel — Cancel an in-progress research taskGET /api/deep_research/quota — Check current remaining quotaGET /api/deep_research/my_tasks — Personal history listGET /api/deep_research/task/<uuid> — Single task details| Layer | Save location | Content |
|---|---|---|
| 1. Task master table | deep_research_tasks |
task_uuid、user_question、status、plan_json、final_answer、citations_json、tokens_used、duration_seconds |
| 2. Step details | deep_research_steps |
Every step's tool_name, args, result_preview, duration_ms |
| 3. Chat records | classroomgpt_my_log |
request rows (student questions) + response rows (DR answers, type='deep_research'), with deep_research_task_uuid foreign key |
The dual-row design of Chat logs serves two purposes: (1) answers appear in the dialogue history and remain visible after refreshing the page; (2) the LLM context of subsequent conversations carries over the research findings, so students can continue to ask in-depth questions based on the results.
When research starts, the engine first writes the request log to classroomgpt_my_log (and triggers Bloom cognitive level analysis), then pushes request_log_id via SSE to the front end, after which the front end polls the Bloom badge for that question bubble. At the end of the research, it writes the response log and replaces the inline progress card in the conversation history in place with the answer bubble. After refreshing the page, it reloads from chat history, and the visual result matches the live rendering.
The results page for each research task is at /deep_research/task/<uuid>, and can be shared with peers or instructors. Access is restricted: only the owner, channel owner, Super TA, and platform admin can view it, to prevent sensitive research content (including students' personal questions) from leaking.
/deep_research/my Lists all research records of the user themself (including completed, cancelled, and failed), filterable by status and number of items; each item can be opened to review the full answer.
The student usage data for Deep Research (task, steps, answer) are all covered by Uedu's existing IRB approval (NTU-REC 202507EM058). When teachers enable the DR switch on the channel, the default is to follow that informed-consent framework — using the channel is treated as consent for conversation data to be included in research analysis.
The DR toolkit strictly follows Uedu platform data boundary rules:
search_channel_materials is limited to the current channel)The disclaimer for Deep Research answers is written directly into each answer bubble: 'This answer was assembled by AI from multiple data sources. Please verify the cited content yourself; do not submit it directly as coursework'. If teachers are concerned about misuse by students, they can disable the DR switch at channel level, or state the usage rules in the system prompt.
Data generated by Deep Research can span multiple dimensions of the EO framework, and is one of the few features that can provide cognitive, language, and social learning-behaviour signals at the same time:
| Omics dimension | Data provided by Deep Research |
|---|---|
| Cognomics (cognitive processes) | Bloom cognitive level of the question, sub-question decomposition pattern, depth of ReAct reflection |
| Linguomics | The linguistic complexity of the Student's original question and the patterns in how the answer is further followed up |
| Sociomics | Share link click counts; the spread of research findings being discussed within the channel |
| Ethicomics (Ethical Norms) | Student response to the disclaimer, whether the results were misused in assignment submission |
Researchers may follow Uedu's existing data governance process (sign the researcher responsibility form, export the consent form, super TA NDA) to apply to export DR-related data. SeeData export and data governance methodology。
If this system is mentioned in an academic paper, the recommended citation format is:
Chang, C.-K. (2026). Uedu Deep Research: A ReAct-based multi-step research mode for university learners. Uedu Platform.