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.5.tar.gz (57.2 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.5-py3-none-any.whl (51.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: elimu_research_assistant-1.2.5.tar.gz
  • Upload date:
  • Size: 57.2 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.5.tar.gz
Algorithm Hash digest
SHA256 f02fa277a228b78f97ce2749debe5456473aea711dbb14d9e1ace85721c5fa61
MD5 9aaf6b13a61eb7ed2b38d41966112420
BLAKE2b-256 d359e8b77ae77f54d443dd22eec83bea52c5fa455477efb1e63790f96fdbddab

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for elimu_research_assistant-1.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 f1f8106d62e431c9c3a1bc499eabaf72decd2d52ae0b744e77c58b2728a110b8
MD5 6c05333a51e24c76b3ccc4932bb03141
BLAKE2b-256 e0b1cda8177a69984db008c0039557fdcb1a445efa547056884df3a765369072

See more details on using hashes here.

Provenance

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