A deterministic, multimodal pipeline that converts structured text into synchronized educational artifacts (slides, diagrams, audio) with validation between modalities.
remote_gpu), or Together AI (together)https://<id>-8000.proxy.runpod.net)/infer endpointPython: 3.10+
pip install -r requirements.txt
# For local inference (Mistral 7B)
echo "LLM_PROVIDER=local" > .env
# For API inference (Llama 3.3 70B)
echo "LLM_PROVIDER=together" > .env
echo "TOGETHER_API_KEY=your_key_here" >> .env
# For RunPod-hosted Mistral inference
echo "LLM_PROVIDER=remote_gpu" > .env
echo "REMOTE_GPU_URL=https://<your-runpod-endpoint>" >> .env
echo "REMOTE_GPU_API_KEY=<your-runpod-api-key>" >> .env
python main.py
python test_api_client.py
For detailed LLM provider configuration, see QUICK_START_LLM.md.
topic (string): What lesson to generate, e.g. "Gradient Descent"audience (string): beginner (default), intermediate, advancedrender_formats (array[string]): any of slides, diagrams, audiollm_provider (string): local, remote_gpu, together (default is together)llm_provider: "together"
together_api_key in request body (or configure env and pass it in request flow you use)llm_provider: "remote_gpu"
REMOTE_GPU_URL and REMOTE_GPU_API_KEY environment variables set{
"topic": "Gradient Descent",
"audience": "beginner",
"max_duration_sec": 180,
"example_count": null,
"render_formats": ["slides", "diagrams"],
"slide_format": "html",
"optimize_for_format": true,
"include_few_shot": false,
"llm_provider": "remote_gpu",
"together_api_key": null
}
remote_gpu)POST /infer{ "prompt": string, "max_tokens": int, "temperature": float }x-api-keyREMOTE_GPU_URL=https://<your-runpod-endpoint>
REMOTE_GPU_API_KEY=<your-runpod-api-key>
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Gradient Descent",
"audience": "beginner",
"render_formats": ["slides", "diagrams"],
"llm_provider": "remote_gpu"
}'
together)curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Neural Networks Fundamentals",
"audience": "intermediate",
"render_formats": ["slides", "diagrams", "audio"],
"llm_provider": "together",
"together_api_key": "YOUR_API_KEY_HERE"
}'
Get key: https://api.together.xyz/
generated_files, for example:
"slides": "/outputs/20260423_041646/slides.html"http://localhost:8000/outputs/<session_id>/<filename>https://<your-service-url>/outputs/<session_id>/<filename>GET /sessionsNote: in Cloud Run, local container storage is ephemeral; use object storage (for example GCS) for persistence.
# 1. Configure environment
cp .env.example .env
# Edit .env and add your API keys
# 2. Start with Docker Compose
docker-compose up -d
# 3. Test the deployment
python test_docker_deployment.py
# 4. View logs
docker-compose logs -f
# 5. Stop services
docker-compose down
# Build image
docker build -t eduforge:latest .
# Run container
docker run -d \
--name eduforge \
-p 8000:7860 \
--env-file .env \
-v $(pwd)/generated_outputs:/app/generated_outputs \
eduforge:latest
# View logs
docker logs -f eduforge
main.py - FastAPI server with content generation endpointsllm_client.py - Unified LLM client with provider abstractionllm_providers/ - Local and API provider implementations
local_provider.py - Mistral 7B via Transformersremote_gpu_provider.py - RunPod-hosted inference via /infertogether_provider.py - Llama 3.3 70B via Together AIcontent_generator.py - Orchestrates LLM generation with validationmedia_renderers/ - Slide, diagram, and audio rendering modulesprompt_templates.py - Prompt engineering with schema injectioninput_schema.py / output_schema.py - Pydantic models for validationUse the built-in Mistral 7B model:
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Binary Search Algorithm",
"audience": "beginner",
"render_formats": ["slides", "diagrams"],
"llm_provider": "local"
}'
Provide your API key in the request:
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Neural Networks Fundamentals",
"audience": "intermediate",
"render_formats": ["slides", "diagrams", "audio"],
"llm_provider": "together",
"together_api_key": "YOUR_API_KEY_HERE"
}'
Get your key: https://api.together.xyz/
Outputs are saved to generated_outputs/SESSION_ID/.
30 commits
Python
88.6%
PowerShell
4.6%
Shell
3.3%
Jinja
3.0%
A deterministic, multimodal pipeline that converts structured text into synchronized educational artifacts (slides, diagrams, audio) with validation between modalities.
remote_gpu), or Together AI (together)https://<id>-8000.proxy.runpod.net)/infer endpointPython: 3.10+
pip install -r requirements.txt
# For local inference (Mistral 7B)
echo "LLM_PROVIDER=local" > .env
# For API inference (Llama 3.3 70B)
echo "LLM_PROVIDER=together" > .env
echo "TOGETHER_API_KEY=your_key_here" >> .env
# For RunPod-hosted Mistral inference
echo "LLM_PROVIDER=remote_gpu" > .env
echo "REMOTE_GPU_URL=https://<your-runpod-endpoint>" >> .env
echo "REMOTE_GPU_API_KEY=<your-runpod-api-key>" >> .env
python main.py
python test_api_client.py
For detailed LLM provider configuration, see QUICK_START_LLM.md.
topic (string): What lesson to generate, e.g. "Gradient Descent"audience (string): beginner (default), intermediate, advancedrender_formats (array[string]): any of slides, diagrams, audiollm_provider (string): local, remote_gpu, together (default is together)llm_provider: "together"
together_api_key in request body (or configure env and pass it in request flow you use)llm_provider: "remote_gpu"
REMOTE_GPU_URL and REMOTE_GPU_API_KEY environment variables set{
"topic": "Gradient Descent",
"audience": "beginner",
"max_duration_sec": 180,
"example_count": null,
"render_formats": ["slides", "diagrams"],
"slide_format": "html",
"optimize_for_format": true,
"include_few_shot": false,
"llm_provider": "remote_gpu",
"together_api_key": null
}
remote_gpu)POST /infer{ "prompt": string, "max_tokens": int, "temperature": float }x-api-keyREMOTE_GPU_URL=https://<your-runpod-endpoint>
REMOTE_GPU_API_KEY=<your-runpod-api-key>
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Gradient Descent",
"audience": "beginner",
"render_formats": ["slides", "diagrams"],
"llm_provider": "remote_gpu"
}'
together)curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Neural Networks Fundamentals",
"audience": "intermediate",
"render_formats": ["slides", "diagrams", "audio"],
"llm_provider": "together",
"together_api_key": "YOUR_API_KEY_HERE"
}'
Get key: https://api.together.xyz/
generated_files, for example:
"slides": "/outputs/20260423_041646/slides.html"http://localhost:8000/outputs/<session_id>/<filename>https://<your-service-url>/outputs/<session_id>/<filename>GET /sessionsNote: in Cloud Run, local container storage is ephemeral; use object storage (for example GCS) for persistence.
# 1. Configure environment
cp .env.example .env
# Edit .env and add your API keys
# 2. Start with Docker Compose
docker-compose up -d
# 3. Test the deployment
python test_docker_deployment.py
# 4. View logs
docker-compose logs -f
# 5. Stop services
docker-compose down
# Build image
docker build -t eduforge:latest .
# Run container
docker run -d \
--name eduforge \
-p 8000:7860 \
--env-file .env \
-v $(pwd)/generated_outputs:/app/generated_outputs \
eduforge:latest
# View logs
docker logs -f eduforge
main.py - FastAPI server with content generation endpointsllm_client.py - Unified LLM client with provider abstractionllm_providers/ - Local and API provider implementations
local_provider.py - Mistral 7B via Transformersremote_gpu_provider.py - RunPod-hosted inference via /infertogether_provider.py - Llama 3.3 70B via Together AIcontent_generator.py - Orchestrates LLM generation with validationmedia_renderers/ - Slide, diagram, and audio rendering modulesprompt_templates.py - Prompt engineering with schema injectioninput_schema.py / output_schema.py - Pydantic models for validationUse the built-in Mistral 7B model:
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Binary Search Algorithm",
"audience": "beginner",
"render_formats": ["slides", "diagrams"],
"llm_provider": "local"
}'
Provide your API key in the request:
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{
"topic": "Neural Networks Fundamentals",
"audience": "intermediate",
"render_formats": ["slides", "diagrams", "audio"],
"llm_provider": "together",
"together_api_key": "YOUR_API_KEY_HERE"
}'
Get your key: https://api.together.xyz/
Outputs are saved to generated_outputs/SESSION_ID/.
30 commits
Python
88.6%
PowerShell
4.6%
Shell
3.3%
Jinja
3.0%