Skip to main content

An intelligent research assistant for Kenyan educators to create localized, contextual educational content that bridges the context deficit in education.

Project description

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:

  1. Reasons about what to search and in what order
  2. Executes web searches via Serper.dev, biased toward .ke and East African domains
  3. Scrapes and cleans source pages for relevant content
  4. Iterates (up to 12 reasoning steps by default) until it can synthesize a cited, structured educational artefact
  5. 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:

  1. Build a prompt: system instructions + tool descriptions + task + prior steps
  2. Call LLM → parse Thought, Action, Action Input, or Final Answer
  3. If action: dispatch to SearchTool or ScrapeTool, collect observation
  4. Append step to trace; repeat
  5. On Final Answer or 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:

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

elimu_research_assistant-1.2.8.tar.gz (56.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

elimu_research_assistant-1.2.8-py3-none-any.whl (51.8 kB view details)

Uploaded Python 3

File details

Details for the file elimu_research_assistant-1.2.8.tar.gz.

File metadata

  • Download URL: elimu_research_assistant-1.2.8.tar.gz
  • Upload date:
  • Size: 56.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for elimu_research_assistant-1.2.8.tar.gz
Algorithm Hash digest
SHA256 92d473aa51b74846ccae98d47004f5aa2b23a995117b049dd3f3c7968d3b6f8d
MD5 6adb67f55b5e7d2611309bbc7dcb0607
BLAKE2b-256 0d4adee7b024e73c34eade746ab81bbeada709d2c4338f7b08a75cbce646ee6e

See more details on using hashes here.

Provenance

The following attestation bundles were made for elimu_research_assistant-1.2.8.tar.gz:

Publisher: publish.yml on ashioyajotham/Elimu-Research-Assistant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file elimu_research_assistant-1.2.8-py3-none-any.whl.

File metadata

File hashes

Hashes for elimu_research_assistant-1.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 daf8c312814dd784bec10c3c9fef112f53c6d642efbecca0ff2acaac9753af96
MD5 ddcb2a9f722c895349a7b16005fe3e71
BLAKE2b-256 f288cad0ae3ef1f68345f7203ce57c9c2e763e9d199a5653bfaa58d3858c5c19

See more details on using hashes here.

Provenance

The following attestation bundles were made for elimu_research_assistant-1.2.8-py3-none-any.whl:

Publisher: publish.yml on ashioyajotham/Elimu-Research-Assistant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page