Elimu Research Assistant
An AI research agent for Kenyan educators that generates locally-grounded educational content using a ReAct (Reasoning + Acting) loop over live web search.
What It Does
Given a teaching request such as "Create a Form 3 Business Studies lesson on M-Pesa's impact on small enterprises", the agent:
- Reasons about what to search and in what order
- Executes web searches via Serper.dev, biased toward
.keand East African domains - Scrapes and cleans source pages for relevant content
- Iterates (up to 12 reasoning steps by default) until it can synthesize a cited, structured educational artefact
- Returns classroom-ready output: lesson plan, case study, handout, or assessment, depending on the request
Architecture
CLI / Streamlit
│
▼
build_elimu_agent() ← elimu_react/__init__.py
│
├── LLMInterface ← Google Gemini 2.x (primary: gemini-2.0-flash)
│ └── model fallback chain (2.0-flash → 2.5-flash → 2.5-pro)
│
├── ToolManager
│ ├── SearchTool ← Serper.dev (Google Search API)
│ │ └── Kenya bias: appends "Kenya", prioritises .ke / .ac.ke
│ └── ScrapeTool ← requests + BeautifulSoup, 6 000 char limit
│
└── ReActAgent ← elimu_react/agent.py
└── run(task) → ReAct loop (max 15 iters)
Thought → Action → Observation → … → Final Answer
ReAct Loop (elimu_react/agent.py)
Each iteration:
- Build a prompt: system instructions + tool descriptions + task + prior steps
- Call LLM → parse
Thought,Action,Action Input, orFinal Answer - If action: dispatch to
SearchToolorScrapeTool, collect observation - Append step to trace; repeat
- On
Final Answeror exhausted iterations → return synthesis
The system prompt instructs the model to produce classroom-ready artefacts with Kenyan examples and cited sources, and to never fabricate URLs or statistics.
Configuration (config/config.py)
Credentials and settings are resolved in priority order: .env → environment variables → system keyring. Non-sensitive settings persist in ~/.elimu_research_assistant/config.json.
| Key | Default | Description |
|---|---|---|
gemini_api_key |
— | Required. Google Gemini API key |
serper_api_key |
— | Required. Serper.dev API key |
model_name |
gemini-2.0-flash |
Primary LLM model |
model_fallback |
gemini-2.5-flash |
Fallback on 404/quota |
model_temperature |
0.15 |
Low temperature for factual output |
max_iterations |
12 |
ReAct loop cap |
max_tool_output_length |
6000 |
Observation truncation (chars) |
educational_focus |
True |
Adds "classroom" to education queries |
prioritize_kenyan_sources |
True |
Biases search toward .ke domains |
Installation
git clone https://github.com/ashioyajotham/elimu_research_assistant.git
cd elimu_research_assistant
pip install -e .
API Keys
You need two keys:
- Google Gemini: aistudio.google.com — free tier available
- Serper.dev: serper.dev — 2 500 free searches/month
elimu config --api-key YOUR_GEMINI_KEY
elimu config --serper-key YOUR_SERPER_KEY
Keys are stored in the Windows system keyring by default, or in .env if keyring is unavailable.
CLI Usage
# Single research task
elimu research "Create a Form 3 lesson on M-Pesa's impact on small enterprises"
# Batch from file (one task per line or blank-line-separated blocks)
elimu batch-research tasks.txt --output results/
# Interactive shell with history and autocomplete
elimu shell
# Configuration
elimu config --show
elimu config --model gemini-2.5-pro
elimu config --format markdown # markdown | json | html
Output files are saved to results/result_<sanitized-query>.md by default.
Streamlit Webapp
pip install streamlit
streamlit run streamlit_app.py
The webapp exposes the same research agent with a browser UI: sidebar configuration, research input, expandable ReAct trace, and inline result rendering.
Project Structure
elimu_research_assistant/
├── elimu_react/ # ReAct agent engine
│ ├── agent.py # ReActAgent: reasoning loop
│ ├── llm.py # LLMInterface: Gemini wrapper with fallback
│ └── tools/
│ ├── search.py # SearchTool (Serper.dev)
│ └── scrape.py # ScrapeTool (requests + BS4)
├── config/
│ ├── config.py # ElimuConfigManager: env / keyring / file
│ └── config_manager.py # BaseConfigManager
├── utils/
│ ├── console_ui.py # Rich theme, panels, progress
│ ├── react_output.py # Markdown serialiser for ReAct traces
│ └── task_parser.py # Multi-line task file parser
├── cli.py # Click CLI entry point
├── streamlit_app.py # Streamlit webapp
└── pyproject.toml
Development
pip install -r requirements.txt
python -m pytest
Logs are written to logs/agent.log. Set --verbose on any CLI command for INFO-level output.
License
MIT — see LICENSE.
Author
Ashioya Jotham · victorashioya960@gmail.com
Metadata
Release files for elimu-research-assistant 1.2.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| elimu_research_assistant-1.2.8.tar.gz | 56.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| elimu_research_assistant-1.2.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 108.4 kB
Release files / elimu_research_assistant-1.2.8.tar.gz
| Download URL | elimu_research_assistant-1.2.8.tar.gz |
|---|---|
| Size | 56.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
92d473aa51b74846ccae98d47004f5aa2b23a995117b049dd3f3c7968d3b6f8d
|
|
BLAKE2b-256 checksum How to use checksums |
0d4adee7b024e73c34eade746ab81bbeada709d2c4338f7b08a75cbce646ee6e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 12, 2026.
Transparency logRelease files / elimu_research_assistant-1.2.8-py3-none-any.whl
| Download URL | elimu_research_assistant-1.2.8-py3-none-any.whl |
|---|---|
| Size | 51.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
daf8c312814dd784bec10c3c9fef112f53c6d642efbecca0ff2acaac9753af96
|
|
BLAKE2b-256 checksum How to use checksums |
f288cad0ae3ef1f68345f7203ce57c9c2e763e9d199a5653bfaa58d3858c5c19
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 12, 2026.
Transparency log