# kb-dhanush/demo-inkgrader architecture

> Architecture diagram of the GitHub repository kb-dhanush/demo-inkgrader, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/kb-dhanush/demo-inkgrader
- Repository: https://github.com/kb-dhanush/demo-inkgrader

## Overview

InkGrader is a Streamlit app for teachers to upload reference notes, enter a question and teacher/student answers, and receive an AI-generated score with reasoning and evidence. The workflow ingests PDF/TXT materials into a Chroma knowledge base, retrieves relevant chunks during evaluation, and displays the parsed result. The source shows these calls and data transfers; finer details of library internals are not represented.

Main entry points: [`grader.py`](https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py) (Answer Evaluation), [`streamlit_app.py`](https://github.com/kb-dhanush/demo-inkgrader/blob/main/streamlit_app.py) (Streamlit Workflow), [`ingest.py`](https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py) (File Ingestion)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Grading App"]
  node_ui["Streamlit Workflow<br/>[streamlit_app.py]"]
  node_uploaded["Uploaded Notes"]
  node_result["Evaluation Result"]
end

subgraph group_knowledge["Knowledge Base"]
  node_ingest["File Ingestion<br/>[ingest.py]"]
  node_file_loader["PDF/TXT Loader<br/>[ingest.py]"]
  node_splitter["Text Chunking<br/>[ingest.py]"]
  node_embeddings["HuggingFace Embeddings<br/>[ingest.py]"]
  node_chroma[("Chroma Store<br/>[ingest.py]")]
end

subgraph group_evaluation["Evaluation"]
  node_evaluation_entry["Answer Evaluation<br/>[grader.py]"]
  node_db_loader["Knowledge Base Loader<br/>[grader.py]"]
  node_retrieval["Context Retrieval<br/>[grader.py]"]
  node_prompt["Evaluation Prompt<br/>[grader.py]"]
  node_gemini["Gemini Model"]
  node_json_parse["JSON Result Parsing<br/>[grader.py]"]
end

node_user(("Teacher or Student"))

node_user -->|"provides inputs"| node_ui
node_ui -->|"saves upload"| node_uploaded
node_ui -->|"calls ingestion"| node_ingest
node_ingest -->|"selects loader"| node_file_loader
node_file_loader -->|"provides documents"| node_splitter
node_ingest -->|"creates embeddings"| node_embeddings
node_ingest -->|"stores chunks"| node_chroma
node_splitter -->|"provides chunks"| node_chroma
node_ui -->|"calls evaluation"| node_evaluation_entry
node_evaluation_entry -->|"loads store"| node_db_loader
node_db_loader -->|"creates embeddings"| node_embeddings
node_db_loader -->|"opens store"| node_chroma
node_evaluation_entry -->|"searches store"| node_retrieval
node_retrieval -->|"similarity search"| node_chroma
node_retrieval -->|"supplies context"| node_prompt
node_evaluation_entry -->|"supplies answers"| node_prompt
node_evaluation_entry -->|"invokes model"| node_gemini
node_prompt -->|"formats request"| node_gemini
node_evaluation_entry -->|"parses response"| node_json_parse
node_json_parse -->|"returns evaluation"| node_result
node_evaluation_entry -->|"returns parse error"| node_result
node_ui -->|"displays result"| node_result

click node_ui "https://github.com/kb-dhanush/demo-inkgrader/blob/main/streamlit_app.py"
click node_ingest "https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py"
click node_file_loader "https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py"
click node_splitter "https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py"
click node_embeddings "https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py"
click node_chroma "https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py"
click node_evaluation_entry "https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py"
click node_db_loader "https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py"
click node_retrieval "https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py"
click node_prompt "https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py"
click node_json_parse "https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ui,node_uploaded,node_result toneBlue
class node_ingest,node_file_loader,node_splitter,node_embeddings,node_chroma toneAmber
class node_evaluation_entry,node_db_loader,node_retrieval,node_prompt,node_gemini,node_json_parse toneMint
class node_user toneIndigo
```

## Components

### Grading App

- [Streamlit Workflow](https://github.com/kb-dhanush/demo-inkgrader/blob/main/streamlit_app.py): `streamlit_app.py`
- **Uploaded Notes**
- **Evaluation Result**

### Knowledge Base

- [File Ingestion](https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py): `ingest.py`
- [PDF/TXT Loader](https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py): `ingest.py`
- [Text Chunking](https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py): `ingest.py`
- [HuggingFace Embeddings](https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py): `ingest.py`
- [Chroma Store](https://github.com/kb-dhanush/demo-inkgrader/blob/main/ingest.py): `ingest.py`

### Evaluation

- [Answer Evaluation](https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py): `grader.py`
- [Knowledge Base Loader](https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py): `grader.py`
- [Context Retrieval](https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py): `grader.py`
- [Evaluation Prompt](https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py): `grader.py`
- **Gemini Model**
- [JSON Result Parsing](https://github.com/kb-dhanush/demo-inkgrader/blob/main/grader.py): `grader.py`

### Other components

- **Teacher or Student**

## Connections

- Teacher or Student → Streamlit Workflow: provides inputs
- Streamlit Workflow → Uploaded Notes: saves upload
- Streamlit Workflow → File Ingestion: calls ingestion
- File Ingestion → PDF/TXT Loader: selects loader
- PDF/TXT Loader → Text Chunking: provides documents
- File Ingestion → HuggingFace Embeddings: creates embeddings
- File Ingestion → Chroma Store: stores chunks
- Text Chunking → Chroma Store: provides chunks
- Streamlit Workflow → Answer Evaluation: calls evaluation
- Answer Evaluation → Knowledge Base Loader: loads store
- Knowledge Base Loader → HuggingFace Embeddings: creates embeddings
- Knowledge Base Loader → Chroma Store: opens store
- Answer Evaluation → Context Retrieval: searches store
- Context Retrieval → Chroma Store: similarity search
- Context Retrieval → Evaluation Prompt: supplies context
- Answer Evaluation → Evaluation Prompt: supplies answers
- Answer Evaluation → Gemini Model: invokes model
- Evaluation Prompt → Gemini Model: formats request
- Answer Evaluation → JSON Result Parsing: parses response
- JSON Result Parsing → Evaluation Result: returns evaluation
- Answer Evaluation → Evaluation Result: returns parse error
- Streamlit Workflow → Evaluation Result: displays result
