Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
02d8260
feat: add error handling and job name methods to pipeline nodes
pip3alfar0 Feb 16, 2026
515f421
fix: add missing 'self' parameter to run method in BaseJob class
pip3alfar0 Feb 16, 2026
72152f2
feat: enhance pipeline prediction summary to differentiate between cl…
pip3alfar0 Feb 16, 2026
0ee70cd
feat: add load_preview and infer_datatypes endpoints for backward com…
pip3alfar0 Feb 16, 2026
9eda843
feat: add error handling for unexpected validation errors and improve…
pip3alfar0 Feb 16, 2026
ee77e7b
feat: enhance dataset upload process by creating dataset record befor…
pip3alfar0 Feb 16, 2026
c4038f7
refactor: apply pre-commit formatting
pip3alfar0 Feb 16, 2026
a4b02d7
refactor: remove unnecessary whitespace in TrainNode component
pip3alfar0 Feb 16, 2026
c571c61
refactor: apply prettier formatting
pip3alfar0 Feb 16, 2026
d3ae9e2
fix: update import from DPTFeatureExtractor to DPTImageProcessor in d…
pip3alfar0 Feb 16, 2026
934089c
fix: reorder import statements for consistency in stable_diffusion_v1…
pip3alfar0 Feb 16, 2026
9c5a5dd
Merge branch 'develop' of https://github.com/DashAISoftware/DashAI in…
pip3alfar0 Feb 17, 2026
1fc93df
feat: add logging parameters for training and validation in save() an…
pip3alfar0 Feb 22, 2026
e68dc0d
fix: improve formatting of logging parameters in DistilBertTransforme…
pip3alfar0 Feb 22, 2026
9a431c9
feat: add setuptools to requirements
pip3alfar0 Feb 22, 2026
6ff3428
fix: ensure setuptools is reinstalled for hyperopt compatibility
pip3alfar0 Feb 22, 2026
96f28a0
fix: pre-commit modification for build-test.yaml
pip3alfar0 Feb 22, 2026
bbead4d
fix: remove setuptools from requirements files and change imports in …
pip3alfar0 Feb 22, 2026
b5c8204
feat: implement light and dark canvas modes across pipeline components
pip3alfar0 Feb 23, 2026
6d84520
fix: prettier pre-commit modification for NewPipeline.jsx and CustomN…
pip3alfar0 Feb 23, 2026
c01b3bb
Merge remote-tracking branch 'origin/develop' into dag-pipelines
pip3alfar0 Feb 24, 2026
227521b
feat: add polling for dataset processing and improve result fetching …
pip3alfar0 Feb 24, 2026
b39c7c0
fix: prettier pre-commit modification for Results.jsx
pip3alfar0 Feb 24, 2026
eaea7c5
Merge remote-tracking branch 'origin/develop' into dag-pipelines
pip3alfar0 Mar 3, 2026
85e0564
feat: Add new pipeline nodes and update configurations for frontend d…
pip3alfar0 Mar 30, 2026
300a7ff
feat: Enhance PipelineResults and ResultsGraphs components for improv…
pip3alfar0 Mar 30, 2026
7e1ed55
feat: Atomize train node into split, task, and metrics tables in data…
pip3alfar0 Mar 30, 2026
0c89ca1
feat: Add MetricsEval, SplitData, and TaskAndModel nodes
pip3alfar0 Mar 30, 2026
b62d136
feat: Add split_data, task_and_model, and metrics_result fields to pi…
pip3alfar0 Mar 30, 2026
8e507ce
feat: Add validators for SplitData, TaskAndModel, and MetricsEval nodes
pip3alfar0 Mar 30, 2026
2072588
feat: Add SplitData, TaskAndModel, and MetricsEval nodes with corresp…
pip3alfar0 Mar 30, 2026
fbfbb68
fix: Clean up formatting and improve readability in various node comp…
pip3alfar0 Mar 30, 2026
32282bd
fix: Improve message formatting for ruff-format
pip3alfar0 Mar 30, 2026
3437c8a
fix: Update expected input types in tabular class task metadata test
pip3alfar0 Mar 30, 2026
ee84657
Merge branch 'develop' of https://github.com/DashAISoftware/DashAI in…
pip3alfar0 Mar 30, 2026
e6fee74
feat: Enhance pipeline functionality with new nodes and improve type …
pip3alfar0 Apr 2, 2026
eba5124
feat: Add error handling and job name methods to pipeline nodes
pip3alfar0 Apr 2, 2026
97b5ff5
feat: Add pipelines navigation and button to home page
pip3alfar0 Apr 2, 2026
21fd041
Merge remote-tracking branch 'origin/develop' into dag-pipelines
pip3alfar0 Apr 2, 2026
66f7150
feat: Implement dynamic argument handling for save_notebook in DataEx…
pip3alfar0 Apr 3, 2026
0f2125a
feat: Add migration script to merge dag-pipelines and develop heads
pip3alfar0 Apr 3, 2026
31a8109
feat: Update created and last_modified columns to be non-nullable in …
pip3alfar0 Apr 4, 2026
89dab86
refactor: Remove unused imports across multiple files
pip3alfar0 Apr 4, 2026
a4c629b
refactor: Reorder import statements for consistency in migrate.py and…
pip3alfar0 Apr 6, 2026
d293f48
refactor: Reorder import statements for clarity in migrate.py
pip3alfar0 Apr 6, 2026
46e0c06
refactor: Move import statement for create_engine to improve organiza…
pip3alfar0 Apr 6, 2026
6e38d39
refactor: Reorder import statements for consistency in migrate.py and…
pip3alfar0 Apr 6, 2026
d6c3322
refactor: Reorder import statements for clarity in migrate.py
pip3alfar0 Apr 6, 2026
5151537
refactor: branch-aware execution and per-node outputs
pip3alfar0 May 8, 2026
c71a6e6
refactor: update NodeDefinition to include sourceHandles and maxOutpu…
pip3alfar0 May 8, 2026
149b53c
refactor: enhance result normalization and grouping in Results compon…
pip3alfar0 May 8, 2026
3d6e349
refactor: add sourceHandles and targetHandles to node properties; nor…
pip3alfar0 May 8, 2026
f0561d2
refactor: enhance layout and styling of MetricsEvalNode and TaskAndMo…
pip3alfar0 May 8, 2026
7cd6dac
feat: implement new pipeline sidebar components and enhance NewPipeli…
pip3alfar0 May 8, 2026
bd75f2d
Merge branch 'develop' of https://github.com/DashAISoftware/DashAI in…
pip3alfar0 May 8, 2026
d9ecf90
feat: add node contract system with backend-side edge validation
pip3alfar0 Jun 22, 2026
c1938a3
feat: track pipeline and node executions in the database
pip3alfar0 Jun 22, 2026
a8127c0
feat: turn PipelineJob into a per-node execution orchestrator
pip3alfar0 Jun 22, 2026
da7be6e
feat: support branched flows with multiple node output handles
pip3alfar0 Jun 22, 2026
4a5209b
feat: move node configuration into right-side panel
pip3alfar0 Jun 22, 2026
38b7387
fix: correct dataset column validation for explorers
pip3alfar0 Jun 22, 2026
3eaf23b
style: resolve pre-commit ruff and prettier violations
pip3alfar0 Jun 22, 2026
d4e8abd
style: fix ruff-format issues in models and metrics node
pip3alfar0 Jun 24, 2026
11497d4
style: fix ruff-format issue
pip3alfar0 Jun 24, 2026
289454d
build: pin alembic as third-party for deterministic import sorting
pip3alfar0 Jun 24, 2026
8a07333
Merge remote-tracking branch 'origin/develop' into dag-pipelines
pip3alfar0 Jun 26, 2026
68e9301
fix: add alembic merge migration to unify pipeline-tracking and folde…
pip3alfar0 Jun 26, 2026
b029cfa
fix: resolve develop-merge conflicts in pipeline UI (duplicate theme,…
pip3alfar0 Jun 26, 2026
29ad4a2
style: add missing newline at end of status.py
pip3alfar0 Jun 26, 2026
34c1214
fix: repair dataset upload flow after merge (dataloader params and de…
pip3alfar0 Jul 2, 2026
e3a680f
fix: serialize plotly explorer figures containing bytes from text col…
pip3alfar0 Jul 2, 2026
948956a
feat: support TaskAndModel-trained models in Retrieve Model node
pip3alfar0 Jul 2, 2026
658b57d
fix: repair pipeline UI regressions after merge (theming, canvas, res…
pip3alfar0 Jul 2, 2026
6645ad3
style: improve Data Exploration node config layout
pip3alfar0 Jul 2, 2026
3cc74fa
feat: add Pipelines module card to home page
pip3alfar0 Jul 2, 2026
0b23dc5
refactor: derive node compatibility from port types
pip3alfar0 Jul 8, 2026
1d9c1ff
fix: let the orchestrator own NodeRun tracking
pip3alfar0 Jul 8, 2026
58d07f7
feat: expose the latest pipeline run status via the API
pip3alfar0 Jul 8, 2026
c0fffeb
feat: color nodes on the canvas during execution
pip3alfar0 Jul 8, 2026
b80e40f
feat: add Pipelines to the navigation bar
pip3alfar0 Jul 8, 2026
079ccd6
style: apply pinned ruff and prettier formatting
pip3alfar0 Jul 8, 2026
b378c95
feat: show outputs of all nodes in the pipeline results view
pip3alfar0 Jul 10, 2026
45a822d
refactor: remove legacy Train Model node from back
pip3alfar0 Jul 10, 2026
e86df3b
refactor: remove Train Model node from the palette of nodes
pip3alfar0 Jul 10, 2026
abb66ff
feat: add contextual node-palette highlighting to guide pipeline cons…
pip3alfar0 Jul 23, 2026
9da62f4
feat: display comparison metrics per branch in pipeline results
pip3alfar0 Jul 23, 2026
621973c
fix: reshape multi-column ECDF plots to long-form for mixed-dtype ove…
pip3alfar0 Jul 23, 2026
3b97074
fix: apply pre-commit formatting (ruff-format, prettier)
pip3alfar0 Jul 23, 2026
b38e9b6
Merge remote-tracking branch 'origin/develop' into dag-pipelines
pip3alfar0 Sep 21, 2026
0c9ba09
fix: point /app/pipelines to NewPipelineWrapper after develop merge
pip3alfar0 Sep 21, 2026
4d93a35
style: ruff check for model_factory.py
pip3alfar0 Sep 21, 2026
12c26e7
fix: merge migration heads
pip3alfar0 Sep 21, 2026
d3c6881
fix: update pipeline history grid to x-data-grid v8
pip3alfar0 Sep 28, 2026
19eba5c
chore: remove pipelines from home and navbar
pip3alfar0 Sep 28, 2026
64fd297
Merge remote-tracking branch 'origin/develop' into dag-pipelines
pip3alfar0 Sep 28, 2026
ecc678d
fix: merge alembic heads after develop merge
pip3alfar0 Sep 29, 2026
812d02b
fix: make preprocessing migration test downgrade unambiguous
pip3alfar0 Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""merge dag-pipelines and develop heads

Revision ID: 0dc6fd4637a3
Revises: b4f9e70098e7, c4f7a8b2d1e3
Create Date: 2026-04-02 19:32:55.182155

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '0dc6fd4637a3'
down_revision: Union[str, None] = ('b4f9e70098e7', 'c4f7a8b2d1e3')
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
pass


def downgrade() -> None:
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""merge develop and dag-pipelines heads

Revision ID: 50e54749a557
Revises: a5f2c71e9d40, b1cf2532fbbf
Create Date: 2026-09-21 14:00:00.000000

"""

from typing import Sequence, Union

# revision identifiers, used by Alembic.
revision: str = "50e54749a557"
down_revision: Union[str, None] = ("a5f2c71e9d40", "b1cf2532fbbf")
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
pass


def downgrade() -> None:
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""merge develop and dag-pipelines heads

Revision ID: 66a67b766b49
Revises: 50e54749a557, f4a91c62d8e7
Create Date: 2026-09-29 12:00:00.000000

"""

from typing import Sequence, Union

# revision identifiers, used by Alembic.
revision: str = "66a67b766b49"
down_revision: Union[str, None] = ("50e54749a557", "f4a91c62d8e7")
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
pass


def downgrade() -> None:
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""merge pipeline tracking and folder system heads

Revision ID: b1cf2532fbbf
Revises: d9c8f2a1b7e4, f1a2b3c4d5e6
Create Date: 2026-06-25 00:13:45.379060

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


revision: str = 'b1cf2532fbbf'
down_revision: Union[str, None] = ('d9c8f2a1b7e4', 'f1a2b3c4d5e6')
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
pass


def downgrade() -> None:
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
"""Atomize train node into split/task/metrics tables.

Revision ID: c4f7a8b2d1e3
Revises: 98791b9df4f0
Create Date: 2026-03-25 00:00:00.000000
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = "c4f7a8b2d1e3"
down_revision: Union[str, None] = "98791b9df4f0"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def _table_exists(table_name: str) -> bool:
inspector = sa.inspect(op.get_bind())
return table_name in inspector.get_table_names()


def _column_exists(table_name: str, column_name: str) -> bool:
inspector = sa.inspect(op.get_bind())
return any(
column["name"] == column_name
for column in inspector.get_columns(table_name)
)


def upgrade() -> None:
if _table_exists("pipeline"):
if not _column_exists("pipeline", "split_data"):
op.add_column("pipeline", sa.Column("split_data", sa.JSON(), nullable=True))
if not _column_exists("pipeline", "task_and_model"):
op.add_column(
"pipeline", sa.Column("task_and_model", sa.JSON(), nullable=True)
)
if not _column_exists("pipeline", "metrics_result"):
op.add_column(
"pipeline", sa.Column("metrics_result", sa.JSON(), nullable=True)
)

if not _table_exists("split_data_node"):
op.create_table(
"split_data_node",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("pipeline_id", sa.Integer(), nullable=False),
sa.Column("input_columns", sa.JSON(), nullable=False),
sa.Column("output_columns", sa.JSON(), nullable=False),
sa.Column("splits", sa.JSON(), nullable=False),
sa.Column("created", sa.DateTime(), nullable=False),
sa.Column("last_modified", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["pipeline_id"], ["pipeline.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)

if not _table_exists("task_and_model_node"):
op.create_table(
"task_and_model_node",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("pipeline_id", sa.Integer(), nullable=False),
sa.Column("task_name", sa.String(), nullable=False),
sa.Column("model_name", sa.String(), nullable=False),
sa.Column("parameters", sa.JSON(), nullable=True),
sa.Column("model_path", sa.String(), nullable=True),
sa.Column("created", sa.DateTime(), nullable=False),
sa.Column("last_modified", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["pipeline_id"], ["pipeline.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)

if not _table_exists("metrics_node"):
op.create_table(
"metrics_node",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("pipeline_id", sa.Integer(), nullable=False),
sa.Column("metric_names", sa.JSON(), nullable=False),
sa.Column("results", sa.JSON(), nullable=True),
sa.Column("created", sa.DateTime(), nullable=False),
sa.Column("last_modified", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["pipeline_id"], ["pipeline.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)


def downgrade() -> None:
if _table_exists("metrics_node"):
op.drop_table("metrics_node")

if _table_exists("task_and_model_node"):
op.drop_table("task_and_model_node")

if _table_exists("split_data_node"):
op.drop_table("split_data_node")

if _table_exists("pipeline"):
with op.batch_alter_table("pipeline", schema=None) as batch_op:
if _column_exists("pipeline", "metrics_result"):
batch_op.drop_column("metrics_result")
if _column_exists("pipeline", "task_and_model"):
batch_op.drop_column("task_and_model")
if _column_exists("pipeline", "split_data"):
batch_op.drop_column("split_data")
108 changes: 108 additions & 0 deletions DashAI/alembic/versions/d9c8f2a1b7e4_add_pipeline_run_tracking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
"""Add pipeline run tracking tables.

Revision ID: d9c8f2a1b7e4
Revises: 0dc6fd4637a3
Create Date: 2026-04-10 00:00:00.000000
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa

revision: str = "d9c8f2a1b7e4"
down_revision: Union[str, None] = "0dc6fd4637a3"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None

def _table_exists(table_name: str) -> bool:
inspector = sa.inspect(op.get_bind())
return table_name in inspector.get_table_names()

def upgrade() -> None:
if not _table_exists("pipeline_run"):
op.create_table(
"pipeline_run",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("pipeline_id", sa.Integer(), nullable=False),
sa.Column("steps", sa.JSON(), nullable=True),
sa.Column("edges", sa.JSON(), nullable=True),
sa.Column("created", sa.DateTime(), nullable=False),
sa.Column("last_modified", sa.DateTime(), nullable=False),
sa.Column("delivery_time", sa.DateTime(), nullable=True),
sa.Column("start_time", sa.DateTime(), nullable=True),
sa.Column("end_time", sa.DateTime(), nullable=True),
sa.Column(
"status",
sa.Enum(
"NOT_STARTED",
"DELIVERED",
"STARTED",
"FINISHED",
"ERROR",
name="pipelinerunstatus",
),
nullable=False,
),
sa.Column("error_message", sa.String(), nullable=True),
sa.ForeignKeyConstraint(["pipeline_id"], ["pipeline.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)

if not _table_exists("pipeline_node_run"):
op.create_table(
"pipeline_node_run",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("pipeline_run_id", sa.Integer(), nullable=False),
sa.Column("node_id", sa.String(), nullable=False),
sa.Column("node_type", sa.String(), nullable=False),
sa.Column("config", sa.JSON(), nullable=True),
sa.Column("input", sa.JSON(), nullable=True),
sa.Column("output", sa.JSON(), nullable=True),
sa.Column("created", sa.DateTime(), nullable=False),
sa.Column("last_modified", sa.DateTime(), nullable=False),
sa.Column("delivery_time", sa.DateTime(), nullable=True),
sa.Column("start_time", sa.DateTime(), nullable=True),
sa.Column("end_time", sa.DateTime(), nullable=True),
sa.Column(
"status",
sa.Enum(
"NOT_STARTED",
"DELIVERED",
"STARTED",
"FINISHED",
"ERROR",
name="noderunstatus",
),
nullable=False,
),
sa.Column("error_message", sa.String(), nullable=True),
sa.ForeignKeyConstraint(
["pipeline_run_id"], ["pipeline_run.id"], ondelete="CASCADE"
),
sa.PrimaryKeyConstraint("id"),
)

if not _table_exists("pipeline_node_artifact"):
op.create_table(
"pipeline_node_artifact",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("node_run_id", sa.Integer(), nullable=False),
sa.Column("key", sa.String(), nullable=False),
sa.Column("value", sa.JSON(), nullable=True),
sa.Column("created", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(
["node_run_id"], ["pipeline_node_run.id"], ondelete="CASCADE"
),
sa.PrimaryKeyConstraint("id"),
)

def downgrade() -> None:
if _table_exists("pipeline_node_artifact"):
op.drop_table("pipeline_node_artifact")

if _table_exists("pipeline_node_run"):
op.drop_table("pipeline_node_run")

if _table_exists("pipeline_run"):
op.drop_table("pipeline_run")
Loading
Loading