Project Info
TL;DR: we created interactive multimodal AI journeys for neurodivergent learners which can be run entirely on the edge
Inspiration
56% of students in the world do not have internet access at school [1]. Students learn best through multi-sensory, hands-on, structured experiences that are tailored to their interests. Yet, the primary method of learning for them continues to be textbooks. This is even more pertinent to the 129 million students globally who have ADHD [2]. We built in our product with neurodivergent and offline learners in mind. Drawing on bleeding edge research, we proved that multimodal applications can be deployed entirely at the edge using distributed inference using heterogeneous compute [3] [4]. What It Does After students describe what they’d like to learn more about, we create multiple adversarial agents which perform “deep research” (i.e. search the web, synthesize, reflect, and repeat). Think anything from “debate the entirety of modern Tunisian history” to “tell me how the organelles of a plant cell differ from those of an animal”. When these agents finish, they summarize their findings and provide related “branches” the students can look into. If the student is done researching, we generate a podcast with visual aids that shows multiple agents debating each other. At any point in the podcast, a student can double click on a segment to have a new research agent answer questions or clarify topics. How We Built It We needed to create a dynamic and engaging frontend that would be easy-to-use for teachers and students alike. We chose Typescript and spun up an application that could provide live insights into the actions that the agents were taking, and playback the podcast in a lively manner. For our backend, we faced the challenge of orchestrating researchers engaging in Multi-Agent Debates. Despite being first-time users, we chose Rust for its superior concurrent performance and memory safety features, which were crucial for managing shared state across multiple research agents and handling asynchronous web operations safely. To support our cloud implementations, we chose ElevenLabs to generate the voices of our podcast and to create an agent to converse with the student after the podcast to test their understanding using the Feynman technique. We used LumaLabs for the podcast image generation. We also made creative use of the Perplexity Sonar web search API and Mistral via groq. Accomplishments We're Proud Of We were able to get our backend to run locally by sharding full size large language models across multiple hardware devices (i.e. we ran Llama on between a MacBook Pro and 2x MacMinis). Despite never having written code in Rust, we wrote our entire research agent server in a Rust implementation of LangChain. Some cool things we did with Rust: Tokio for async runtime and concurrent processing for multiple agents let (track_one_result, track_two_result) = tokio::join!( self.process_track(state.clone(), "one"), self.process_track(state.clone(), "two") ); Tokio for async runtime and concurrent processing for multiple agents Arc> for thread-safe shared state let state = Arc::new(Mutex::new( SummaryState::with_research_topic(input.research_topic.clone()) )); Arc> for thread-safe shared state What We Learned Building for education is both technologically challenging and highly rewarding. The members of our team were able to learn Rust from the ground up, taking advantage of its supreme efficiency, and learn how to build for the modern Ed-Tech consumer. Sources [1] https://ourworldindata.org/grapher/primary-schools-with-access-to-internet?tab=table [2] https://chadd.org/about-adhd/general-prevalence/ [3] https://arxiv.org/html/2405.14371v1 [4] https://github.com/exo-explore/exo
ZU-LM
A research-driven podcast generator that creates engaging conversations about any topic.
Environment Setup
This project requires several API keys to function properly. Follow these steps to set up your environment:
-
Copy the example environment files:
# Root directory cp .env.example .env # zu-chat directory cd zu-chat cp .env.example .env.local # researcher directory cd ../researcher cp .env.example .env -
Obtain the required API keys:
- ElevenLabs - For text-to-speech
- Groq - For LLM inference
- OpenAI - For AI capabilities
- Luma AI - For image generation
- Perplexity - For search capabilities
-
Fill in your API keys in the respective .env files
Required API Keys
The following API keys are required for full functionality:
ELEVENLABS_API_KEY- For text-to-speech generationGROQ_API_KEY- For LLM inferenceOPENAI_API_KEY- For AI capabilitiesLUMAAI_API_KEY- For image generationPERPLEXITY_API_KEY- For search functionality
Optional Configuration
Some features can be configured through environment variables:
LOCAL_LLM- Specify which local LLM to use (default: "deepseek-r1:8b")MAX_WEB_RESEARCH_LOOPS- Control research depth (default: 1)SEARCH_API- Search provider to use (default: "perplexity")
Run the project
To run the frontend server:
cd zu-chat
npm install
npm run dev
To run the Rust backend:
cd researcher
cargo run
Enjoy!
Analysis
View
Metric
- 31
- 28
- 10
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- JavaScriptIn code
- LangChainIn code
- Next.jsIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- RustIn code
- Tailwind CSSIn code
- TypeScriptIn code
- Vercel AI SDKIn code
- Mistral AIClaimed
11 of 12 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
411 KB
Source files
63
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
zcsabbagh/zu-lm
92 files · 1.2 MB · @ 54d4a26
Structure
Interface
23 files · 25%Screens, components and styles rendered to the user.
API & routing
4 files · 4%Request entry points: routes, handlers and controllers.
Application logic
29 files · 32%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- YAML55%
- TypeScript28%
- Rust12%
- JavaScript3%
- Python1%
- Markdown1%
- Other (1)1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
zu-chat/package.json
npm · 37- @11labs/react
- @ai-sdk/groq
- @ai-sdk/openai
- @radix-ui/react-hover-card
- @radix-ui/react-label
- @radix-ui/react-slot
- @radix-ui/react-switch
- @radix-ui/react-tabs
- @types/d3
- @types/dagre
- @xyflow/react
- ai
- class-variance-authority
- clsx
- crypto
- d3
- dagre
- elevenlabs
- +19 more
researcher/Cargo.toml
cargo · 19- anyhow
- async-stream
- async-trait
- axum
- dotenv
- enum-as-inner
- futures
- http
- langchain
- ollama-rs
- reqwest
- serde
- serde_json
- thiserror
- tokio
- tokio-stream
- tower-http
- tracing
- +1 more
package.json
npm · 8- @ai-sdk/groq
- @ai-sdk/openai
- ai
- dotenv
- elevenlabs
- lumaai
- node-fetch
- tailwindcss-animate
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.