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.3.tar.gz (54.5 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.3-py3-none-any.whl (49.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for elimu_research_assistant-1.2.3.tar.gz
Algorithm Hash digest
SHA256 17da9719e65714e5f22c2b390512c8f1de3f28d53f0ed4bf3ba42d716ac56287
MD5 99452cf3a0ee15b44755b95de54f0c34
BLAKE2b-256 db531844db14ac02962f5f5490ec4a66e0f38da1b43f52de7bc579ed25fbcff9

See more details on using hashes here.

Provenance

The following attestation bundles were made for elimu_research_assistant-1.2.3.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.3-py3-none-any.whl.

File metadata

File hashes

Hashes for elimu_research_assistant-1.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 045c47eec885bfef94f0b580861edc06932cd3af6cf71a0484a423332d9f213f
MD5 e979723bad4f420d17cbcbb1e12582a5
BLAKE2b-256 139d1d30730b1d8d7cb4bf0c4089e9235ac379a831140ca682740601ecb064a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for elimu_research_assistant-1.2.3-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