Step 1 — User Request Arrives
FastAPI receives a request like:
{
"title":"Customer Churn",
"difficulty":"Medium",
"dataset_id":"123",
"notebook_type":"AIML"
}
This is converted into
GenerateNotebookRequest
(Pydantic Model)
Step 2 — Create Service Object
service = NotebookGenerationService(request)
Constructor executes
__init__()
Stores
self.request
Nothing is generated yet.
Step 3 — generate_notebook()
Main method starts.
generate_notebook()
This is the master controller.
It calls everything else.
Step 4 — Initialize LLM
initialize_llm()
Internally
Model().get_initialized_llm()
Returns
GPT
Claude
Gemini
(whichever configured)
Stored as
llm
Step 5 — Initialize Database
initialize_database()
Runs
Base.metadata.create_all(engine)
Creates tables if missing.
Step 6 — generate_notebook_draft()
Now service decides which pipeline to execute.
if notebook_type == PYTHON:
↓
Python Pipeline
OR
AIML Pipeline
AIML Pipeline (Detailed)
This is the longer flow.
Step 7 — generate_dataset()
Called first.
generate_dataset()
Inside this method
7.1 Build DataSpec Prompt
build_dataspec_prompt()
Loads
prompts/data_spec_prompt.txt
Combines
Template
+
User Request
Creates one large prompt.
7.2 Invoke LLM
invoke_llm()
LLM generates
DataSpec
7.3 Save JSON
save_json()
Stores
data_spec.json
Useful for debugging.
7.4 Hash Dataset
DataSpecDedup(spec).hash()
Creates
Unique Hash
Example
A93D2B11
7.5 Database Lookup
Session(engine)
Runs
SELECT
Checks
Already generated?
If Found
Returns immediately
Existing CSV
Existing Dataset Overview
Hash
No regeneration.
If Not Found
Continue.
7.6 Build Dataset Prompt
build_dataset_prompt()
Uses
DataSpec
+
Prompt Template
7.7 Invoke LLM Again
Generates
Dataset Overview
Contains
Dataset Name
Columns
Description
Purpose
7.8 Create CSV
Calls
DataSpecMapper()
↓
make_csv()
Creates
customer.csv
7.9 Store Database
Stores
Hash
CSV Path
Overview
Specification
7.10 Upload Dataset
If
aip_client
exists
↓
Uploads dataset
Returns
GeneratedDataset
Containing
DataSpec
DatasetOverview
CSV Path
Hash
Step 8 — Generate Notebook Plan
generate_notebook_plan()
Inside
Loads
notebook_plan_prompt.txt
↓
Creates Prompt
↓
LLM
↓
Returns
NotebookPlan
Contains
Sections
Topics
Flow
Exercises
Notebook Structure
Step 9 — Build Assessment Prompt
build_assessment_prompt()
Combines
Notebook Plan
+
Dataset Overview
+
DataSpec
+
User Request
+
Example Notebook
Creates one huge prompt.
Step 10 — Invoke LLM
Again
invoke_llm()
Generates
Assessment Units
Like
Markdown
Code Cells
Questions
Hints
Solutions
Step 11 — Mapper Layer
LLM output is not directly usable.
Mapper converts
Assessment Units
↓
NotebookDraft
using
AssessmentsMapper
Step 12 — Export Notebook
export_notebook()
Calls
NotebookFormatter.render()
Creates
Notebook Object
Then
nbformat.write()
Generates
Customer_Churn.ipynb
Step 13 — Return Response
Finally returns
Notebook File Name
Notebook Metadata
Download Path
Status
↓
FastAPI
↓
JSON Response
↓
Frontend
Overall Backend Flow
Client Request
│
▼
FastAPI Router
│
▼
GenerateNotebookRequest
│
▼
NotebookGenerationService
│
├── Initialize LLM
├── Initialize Database
├── Generate Dataset
│ ├── Build Prompt
│ ├── LLM
│ ├── Hash
│ ├── Check DB
│ ├── Generate CSV
│ └── Save DB
│
├── Generate Notebook Plan
│ └── LLM
│
├── Build Assessment Prompt
│
├── Generate Assessment Units
│ └── LLM
│
├── Mapper
│ └── NotebookDraft
│
├── NotebookFormatter
│ └── .ipynb File
│
▼
Return Response