async def api_create_project(project: APICreateProjectModel, token: bool = Depends(api_auth)):
    """
    Asynchronously creates a new project based on the provided parameters.

    Args:
        project (APICreateProjectModel): The model containing the project details and parameters.
        token (bool, optional): The authentication token. Defaults to Depends(api_auth).

    Returns:
        dict: A dictionary containing a success message, the job ID of the created project, and a success status.

    Raises:
        HTTPException: If there is an error during project creation.

    Notes:
        - The function determines the hardware type based on the project hardware attribute.
        - It logs the provided parameters and column mapping.
        - It sets the appropriate parameters based on the task type.
        - It updates the parameters with the provided ones and creates an AppParams instance.
        - The function then creates an AutoTrainProject instance and initiates the project creation process.
    """
    provided_params = project.params.model_dump()
    if project.hardware == "local":
        hardware = "local-ui"  # local-ui has wait=False
    else:
        hardware = project.hardware

    logger.info(provided_params)
    logger.info(project.column_mapping)

    task = project.task
    if task.startswith("llm"):
        params = PARAMS["llm"]
        trainer = task.split(":")[1]
        params.update({"trainer": trainer})
    elif task.startswith("st:"):
        params = PARAMS["st"]
        trainer = task.split(":")[1]
        params.update({"trainer": trainer})
    elif task.startswith("vlm:"):
        params = PARAMS["vlm"]
        trainer = task.split(":")[1]
        params.update({"trainer": trainer})
    elif task.startswith("tabular"):
        params = PARAMS["tabular"]
    else:
        params = PARAMS[task]

    params.update(provided_params)

    app_params = AppParams(
        job_params_json=json.dumps(params),
        token=token,
        project_name=project.project_name,
        username=project.username,
        task=task,
        data_path=project.hub_dataset,
        base_model=project.base_model,
        column_mapping=project.column_mapping.model_dump() if project.column_mapping else None,
        using_hub_dataset=True,
        train_split=project.train_split,
        valid_split=project.valid_split,
        api=True,
    )
    params = app_params.munge()
    project = AutoTrainProject(params=params, backend=hardware)
    job_id = project.create()
    return {"message": "Project created", "job_id": job_id, "success": True}

    Asynchronously creates a new project based on the provided parameters.

    Args:
        project (APICreateProjectModel): The model containing the project details and parameters.
        token (bool, optional): The authentication token. Defaults to Depends(api_auth).

    Returns:
        dict: A dictionary containing a success message, the job ID of the created project, and a success status.

    Raises:
        HTTPException: If there is an error during project creation.

    Notes:
        - The function determines the hardware type based on the project hardware attribute.
        - It logs the provided parameters and column mapping.
        - It sets the appropriate parameters based on the task type.
        - It updates the parameters with the provided ones and creates an AppParams instance.
        - The function then creates an AutoTrainProject instance and initiates the project creation process.
    
src/autotrain/app/api_routes.py