ai-rest-api-generator / pipeline.py
harshadh01's picture
Initial deployment of AI REST API Generator
e540463 verified
# pipeline.py
import os
from additional_function import get_llm
from generator import generate_full_project, generate_django_model_prompt
from spec_validator import generate_valid_json_spec
from settings_generator import update_settings_py
def run_pipeline(
spec: dict,
run_dir: str,
llm_provider: str,
api_key: str,
log_callback=None,
progress_callback=None,
retries: int = 3,
):
"""
Orchestrates full backend generation pipeline.
"""
def log(msg: str):
if log_callback:
log_callback(msg)
def progress(val: int):
if progress_callback:
progress_callback(val)
# -------------------------------------------------
# STEP 0 β€” Init
# -------------------------------------------------
progress(0)
log("πŸš€ Starting generation pipeline")
# -------------------------------------------------
# STEP 1 β€” Create LLM
# -------------------------------------------------
try:
progress(10)
log("πŸ”‘ Initializing LLM")
llm = get_llm(llm_provider, api_key)
log("βœ… LLM initialized successfully")
except Exception as e:
raise RuntimeError("LLM initialization failed") from e
# -------------------------------------------------
# STEP 2 β€” Build user prompt
# -------------------------------------------------
try:
progress(25)
log("🧠 Preparing user prompt")
if spec.get("use_ai_models", True):
log("Using AI to generate models")
user_prompt = generate_django_model_prompt(
project_name=spec.get("project_name"),
description=spec.get("description"),
llm=llm
)
else:
log("Using manually defined models")
model_summary = []
for model_name, model_def in spec["apps"]["core"]["models"].items():
fields = ", ".join(model_def["fields"].keys())
model_summary.append(f"{model_name}({fields})")
user_prompt = f"""
Project Name: {spec.get("project_name")}
Description: {spec.get("description")}
Models:
{', '.join(model_summary)}
"""
log("βœ… User prompt prepared")
except Exception as e:
raise RuntimeError("User prompt generation failed") from e
# -------------------------------------------------
# STEP 3 β€” Generate JSON Spec
# -------------------------------------------------
try:
progress(45)
log("πŸ“„ Generating JSON specification")
cleaned_spec = generate_valid_json_spec(
user_prompt=user_prompt,
llm=llm,
retries=retries
)
log("βœ… JSON spec generated successfully")
except Exception as e:
raise RuntimeError("JSON spec generation failed") from e
# -------------------------------------------------
# STEP 4 β€” Generate Django Project
# -------------------------------------------------
try:
progress(75)
project_name = spec.get("project_name")
log("πŸ›  Generating Django project")
generate_full_project(
spec_json=cleaned_spec,
output_dir=run_dir,
llm=llm,
project_name =project_name
)
log("βœ… Django project created")
except Exception as e:
log("❌ INTERNAL ERROR during Django project generation:")
log(repr(e)) # <-- THIS IS CRITICAL
raise RuntimeError("Django project generation failed") from e
# -------------------------------------------------
# STEP 5 β€” Update settings.py
# -------------------------------------------------
try:
progress(90)
log("βš™ Updating Django settings")
settings_path = os.path.join(
run_dir,
cleaned_spec["project_name"],
cleaned_spec["project_name"],
"settings.py"
)
update_settings_py(
settings_path=settings_path,
db_spec=cleaned_spec.get("database", {})
)
log("βœ… settings.py updated")
except Exception as e:
raise RuntimeError("Django settings update failed") from e
# -------------------------------------------------
# DONE
# -------------------------------------------------
progress(100)
log("πŸŽ‰ Generation completed successfully")
return run_dir