diff --git a/src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py b/src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py index df59c4e9f..efb4c5321 100644 --- a/src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py +++ b/src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py @@ -8,6 +8,7 @@ Create Date: 2023-12-13 18:55:52.587360 from typing import Sequence, Union +import sqlalchemy as sa from alembic import op from sqlalchemy.engine.reflection import Inspector @@ -21,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore api_key_constraints = inspector.get_unique_constraints("apikey") flow_constraints = inspector.get_unique_constraints("flow") user_constraints = inspector.get_unique_constraints("user") @@ -45,7 +46,7 @@ def upgrade() -> None: def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore api_key_constraints = inspector.get_unique_constraints("apikey") flow_constraints = inspector.get_unique_constraints("flow") user_constraints = inspector.get_unique_constraints("user") diff --git a/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py b/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py index a9b9b6c00..8000ce237 100644 --- a/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py +++ b/src/backend/base/langflow/alembic/versions/012fb73ac359_add_folder_table.py @@ -22,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "folder" not in table_names: @@ -30,9 +30,9 @@ def upgrade() -> None: "folder", sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.Column("parent_id", sqlmodel.sql.sqltypes.GUID(), nullable=True), - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), + sa.Column("parent_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True), + sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True), sa.ForeignKeyConstraint( ["parent_id"], ["folder.id"], @@ -51,7 +51,7 @@ def upgrade() -> None: column_names = [column["name"] for column in inspector.get_columns("flow")] with op.batch_alter_table("flow", schema=None) as batch_op: if "folder_id" not in column_names: - batch_op.add_column(sa.Column("folder_id", sqlmodel.sql.sqltypes.GUID(), nullable=True)) + batch_op.add_column(sa.Column("folder_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True)) batch_op.create_foreign_key("flow_folder_id_fkey", "folder", ["folder_id"], ["id"]) if "folder" in column_names: batch_op.drop_column("folder") @@ -61,7 +61,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("flow")] diff --git a/src/backend/base/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py b/src/backend/base/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py index cc5160a49..ea8eddad7 100644 --- a/src/backend/base/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py +++ b/src/backend/base/langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py @@ -7,12 +7,13 @@ Create Date: 2024-10-04 17:30:12.924809 """ from typing import Sequence, Union -from alembic import op import sqlalchemy as sa import sqlmodel -from sqlalchemy.engine.reflection import Inspector -from langflow.utils import migration +from alembic import op from sqlalchemy.dialects import sqlite +from sqlalchemy.engine.reflection import Inspector + +from langflow.utils import migration # revision identifiers, used by Alembic. revision: str = '0ae3a2674f32' @@ -23,7 +24,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("vertex_build", schema=None) as batch_op: if migration.column_exists(table_name="vertex_build", column_name="params", conn=conn): @@ -49,7 +50,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("message", schema=None) as batch_op: if migration.column_exists(table_name="message", column_name="text", conn=conn): columns = inspector.get_columns("message") @@ -67,4 +68,4 @@ def downgrade() -> None: batch_op.alter_column( "params", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=True ) - # ### end Alembic commands ### \ No newline at end of file + # ### end Alembic commands ### diff --git a/src/backend/base/langflow/alembic/versions/0b8757876a7c_.py b/src/backend/base/langflow/alembic/versions/0b8757876a7c_.py index da9e612f8..e53b61c87 100644 --- a/src/backend/base/langflow/alembic/versions/0b8757876a7c_.py +++ b/src/backend/base/langflow/alembic/versions/0b8757876a7c_.py @@ -8,6 +8,9 @@ Create Date: 2024-01-17 10:32:56.686287 from typing import Sequence, Union +import sqlalchemy as sa +from alembic import op + # revision identifiers, used by Alembic. revision: str = "0b8757876a7c" down_revision: Union[str, None] = "006b3990db50" diff --git a/src/backend/base/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py b/src/backend/base/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py index 8394e0ef8..db1329428 100644 --- a/src/backend/base/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py +++ b/src/backend/base/langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py @@ -8,11 +8,11 @@ Create Date: 2024-07-26 11:41:31.274271 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa import sqlmodel -from langflow.utils import migration +from alembic import op +from langflow.utils import migration # revision identifiers, used by Alembic. revision: str = "0d60fcbd4e8e" @@ -31,8 +31,8 @@ def upgrade() -> None: sa.Column("data", sa.JSON(), nullable=True), sa.Column("artifacts", sa.JSON(), nullable=True), sa.Column("params", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column("build_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.Column("flow_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("build_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), + sa.Column("flow_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.Column("valid", sa.BOOLEAN(), nullable=False), sa.ForeignKeyConstraint( ["flow_id"], diff --git a/src/backend/base/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py b/src/backend/base/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py index 48d12ac30..3443d2ba9 100644 --- a/src/backend/base/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py +++ b/src/backend/base/langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py @@ -22,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "variable" not in table_names: @@ -31,10 +31,10 @@ def upgrade() -> None: sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("value", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("type", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), sa.Column("updated_at", sa.DateTime(), nullable=True), - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.ForeignKeyConstraint(["user_id"], ["user.id"], name="fk_variable_user_id"), sa.PrimaryKeyConstraint("id"), ) @@ -45,7 +45,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "credential" not in table_names: diff --git a/src/backend/base/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py b/src/backend/base/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py index 0feec1b8b..c1ddf82e3 100644 --- a/src/backend/base/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py +++ b/src/backend/base/langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py @@ -8,6 +8,7 @@ Create Date: 2024-05-29 23:12:09.146880 from typing import Sequence, Union +import sqlalchemy as sa from alembic import op from sqlalchemy.engine.reflection import Inspector @@ -20,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore constraints_names = [constraint["name"] for constraint in inspector.get_unique_constraints("folder")] # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("folder", schema=None) as batch_op: @@ -32,7 +33,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore constraints_names = [constraint["name"] for constraint in inspector.get_unique_constraints("folder")] # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("folder", schema=None) as batch_op: diff --git a/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py b/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py index 1f9426a5b..dc32c97d3 100644 --- a/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py +++ b/src/backend/base/langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py @@ -10,9 +10,10 @@ from typing import Sequence, Union import sqlalchemy as sa from alembic import op -from langflow.utils import migration from sqlalchemy.engine.reflection import Inspector +from langflow.utils import migration + # revision identifiers, used by Alembic. revision: str = "4522eb831f5c" down_revision: Union[str, None] = "0d60fcbd4e8e" @@ -23,7 +24,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("flow", schema=None) as batch_op: if migration.column_exists(table_name="flow", column_name="description", conn=conn): @@ -49,7 +50,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("folder", schema=None) as batch_op: if migration.column_exists(table_name="folder", column_name="description", conn=conn): columns = inspector.get_columns("folder") diff --git a/src/backend/base/langflow/alembic/versions/1eab2c3eb45e_event_error.py b/src/backend/base/langflow/alembic/versions/1eab2c3eb45e_event_error.py index 7647a7173..6a711552c 100644 --- a/src/backend/base/langflow/alembic/versions/1eab2c3eb45e_event_error.py +++ b/src/backend/base/langflow/alembic/versions/1eab2c3eb45e_event_error.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("message")] # ### commands auto generated by Alembic - please adjust! ### @@ -38,7 +38,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("message")] # ### commands auto generated by Alembic - please adjust! ### diff --git a/src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py b/src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py index 8d7a84669..5607df8d3 100644 --- a/src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py +++ b/src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py @@ -26,7 +26,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("apikey", schema=None) as batch_op: @@ -42,7 +42,7 @@ def upgrade() -> None: def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("apikey", schema=None) as batch_op: if migration.column_exists(table_name="apikey", column_name="name", conn=conn): diff --git a/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py index e47d68702..f2617463b 100644 --- a/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +++ b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("variable")] with op.batch_alter_table("variable", schema=None) as batch_op: @@ -33,7 +33,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("variable")] with op.batch_alter_table("variable", schema=None) as batch_op: diff --git a/src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py b/src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py index 01db957fe..9a3275d7c 100644 --- a/src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py +++ b/src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py @@ -24,7 +24,7 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # List existing tables existing_tables = inspector.get_table_names() # Drop 'flowstyle' table if it exists @@ -48,7 +48,7 @@ def upgrade() -> None: if "user" not in existing_tables: op.create_table( "user", - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.Column("username", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("password", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("is_active", sa.Boolean(), nullable=False), @@ -70,9 +70,9 @@ def upgrade() -> None: sa.Column("last_used_at", sa.DateTime(), nullable=True), sa.Column("total_uses", sa.Integer(), nullable=False, default=0), sa.Column("is_active", sa.Boolean(), nullable=False, default=True), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.Column("api_key", sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.ForeignKeyConstraint(["user_id"], ["user.id"], name="fk_apikey_user_id_user"), sa.PrimaryKeyConstraint("id", name="pk_apikey"), sa.UniqueConstraint("id", name="uq_apikey_id"), @@ -87,8 +87,8 @@ def upgrade() -> None: sa.Column("data", sa.JSON(), nullable=True), sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), + sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.ForeignKeyConstraint(["user_id"], ["user.id"], name="fk_flow_user_id_user"), sa.PrimaryKeyConstraint("id", name="pk_flow"), sa.UniqueConstraint("id", name="uq_flow_id"), @@ -105,7 +105,7 @@ def upgrade() -> None: batch_op.add_column( sa.Column( "user_id", - sqlmodel.sql.sqltypes.GUID(), + sqlmodel.sql.sqltypes.types.Uuid(), nullable=True, # This should be False, but we need to allow NULL values for now ) ) @@ -126,7 +126,7 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # List existing tables existing_tables = inspector.get_table_names() if "flow" in existing_tables: diff --git a/src/backend/base/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py b/src/backend/base/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py index 9a2518df2..5d1024749 100644 --- a/src/backend/base/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py +++ b/src/backend/base/langflow/alembic/versions/29fe8f1f806b_add_missing_index.py @@ -8,6 +8,7 @@ Create Date: 2024-05-21 09:23:48.772367 from typing import Sequence, Union +import sqlalchemy as sa from alembic import op from sqlalchemy.engine.reflection import Inspector @@ -19,7 +20,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### indexes = inspector.get_indexes("flow") with op.batch_alter_table("flow", schema=None) as batch_op: @@ -32,7 +33,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### indexes = inspector.get_indexes("flow") with op.batch_alter_table("flow", schema=None) as batch_op: diff --git a/src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py b/src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py index 2250a8b8c..baf792201 100644 --- a/src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +++ b/src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py @@ -23,7 +23,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore tables = inspector.get_table_names() try: if "credential" not in tables: @@ -32,8 +32,8 @@ def upgrade() -> None: sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("value", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("provider", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), sa.Column("updated_at", sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint("id"), diff --git a/src/backend/base/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py b/src/backend/base/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py index 699df1437..944f27c88 100644 --- a/src/backend/base/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py +++ b/src/backend/base/langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py @@ -8,6 +8,7 @@ Create Date: 2024-05-29 23:08:43.935040 from typing import Sequence, Union +import sqlalchemy as sa from alembic import op from sqlalchemy.engine.reflection import Inspector @@ -20,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### indexes_names = [index["name"] for index in inspector.get_indexes("flow")] constraints_names = [constraint["name"] for constraint in inspector.get_unique_constraints("flow")] @@ -38,7 +39,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### indexes_names = [index["name"] for index in inspector.get_indexes("flow")] constraints_names = [constraint["name"] for constraint in inspector.get_unique_constraints("flow")] diff --git a/src/backend/base/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py b/src/backend/base/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py index dc3e985ed..089949e30 100644 --- a/src/backend/base/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +++ b/src/backend/base/langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py @@ -23,7 +23,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "apikey" in table_names: @@ -77,7 +77,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "variable" in table_names: diff --git a/src/backend/base/langflow/alembic/versions/58b28437a398_modify_nullable.py b/src/backend/base/langflow/alembic/versions/58b28437a398_modify_nullable.py index ead1ca30a..564f778fc 100644 --- a/src/backend/base/langflow/alembic/versions/58b28437a398_modify_nullable.py +++ b/src/backend/base/langflow/alembic/versions/58b28437a398_modify_nullable.py @@ -26,7 +26,7 @@ depends_on = None def upgrade(): conn = op.get_bind() - inspector = Inspector.from_engine(conn) + inspector = sa.inspect(conn) tables = ["apikey", "variable"] # List of tables to modify for table_name in tables: @@ -35,7 +35,7 @@ def upgrade(): def downgrade(): conn = op.get_bind() - inspector = Inspector.from_engine(conn) + inspector = sa.inspect(conn) tables = ["apikey", "variable"] # List of tables to revert for table_name in tables: diff --git a/src/backend/base/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py b/src/backend/base/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py index 379fba17c..8f90648ef 100644 --- a/src/backend/base/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py +++ b/src/backend/base/langflow/alembic/versions/631faacf5da2_add_webhook_columns.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("flow")] @@ -34,7 +34,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("flow")] diff --git a/src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py b/src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py index c6d6893e3..3b4822d10 100644 --- a/src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +++ b/src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py @@ -22,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("flow")] # ### commands auto generated by Alembic - please adjust! ### @@ -37,7 +37,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("flow")] # ### commands auto generated by Alembic - please adjust! ### diff --git a/src/backend/base/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py b/src/backend/base/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py index 0d97df314..e7ae54f7c 100644 --- a/src/backend/base/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py +++ b/src/backend/base/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py @@ -24,7 +24,7 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore if "user" in inspector.get_table_names() and "profile_image" not in [ column["name"] for column in inspector.get_columns("user") ]: @@ -45,7 +45,7 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore if "user" in inspector.get_table_names() and "profile_image" in [ column["name"] for column in inspector.get_columns("user") ]: diff --git a/src/backend/base/langflow/alembic/versions/6e7b581b5648_fix_nullable.py b/src/backend/base/langflow/alembic/versions/6e7b581b5648_fix_nullable.py index f9e9cc5e9..a60ddf728 100644 --- a/src/backend/base/langflow/alembic/versions/6e7b581b5648_fix_nullable.py +++ b/src/backend/base/langflow/alembic/versions/6e7b581b5648_fix_nullable.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### columns = inspector.get_columns("apikey") @@ -41,7 +41,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # table_names = inspector.get_table_names() columns = inspector.get_columns("apikey") column_names = {column["name"]: column for column in columns} diff --git a/src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py b/src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py index d2a576410..d58ceef11 100644 --- a/src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py +++ b/src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py @@ -23,7 +23,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore flow_columns = [column["name"] for column in inspector.get_columns("flow")] user_columns = [column["name"] for column in inspector.get_columns("user")] try: diff --git a/src/backend/base/langflow/alembic/versions/79e675cb6752_change_datetime_type.py b/src/backend/base/langflow/alembic/versions/79e675cb6752_change_datetime_type.py index 0b6bc9218..b71706c22 100644 --- a/src/backend/base/langflow/alembic/versions/79e675cb6752_change_datetime_type.py +++ b/src/backend/base/langflow/alembic/versions/79e675cb6752_change_datetime_type.py @@ -10,9 +10,9 @@ from typing import Sequence, Union import sqlalchemy as sa from alembic import op +from loguru import logger from sqlalchemy.dialects import postgresql from sqlalchemy.engine.reflection import Inspector -from loguru import logger # revision identifiers, used by Alembic. revision: str = "79e675cb6752" @@ -23,7 +23,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "apikey" in table_names: @@ -77,7 +77,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "variable" in table_names: diff --git a/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py b/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py index 7499b32ae..743d6a2ea 100644 --- a/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +++ b/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py @@ -23,7 +23,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore api_key_columns = [column["name"] for column in inspector.get_columns("apikey")] flow_columns = [column["name"] for column in inspector.get_columns("flow")] @@ -53,7 +53,7 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore column_names = [column["name"] for column in inspector.get_columns("flow")] with op.batch_alter_table("flow", schema=None) as batch_op: if "folder" in column_names: diff --git a/src/backend/base/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py b/src/backend/base/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py index c7eff439b..1c3edd877 100644 --- a/src/backend/base/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py +++ b/src/backend/base/langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py @@ -8,11 +8,11 @@ Create Date: 2024-07-24 11:37:48.532933 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa import sqlmodel -from langflow.utils import migration +from alembic import op +from langflow.utils import migration # revision identifiers, used by Alembic. revision: str = "90be8e2ed91e" @@ -32,8 +32,8 @@ def upgrade() -> None: sa.Column("inputs", sa.JSON(), nullable=True), sa.Column("outputs", sa.JSON(), nullable=True), sa.Column("status", sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.Column("flow_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), + sa.Column("flow_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.Column("error", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.ForeignKeyConstraint( ["flow_id"], diff --git a/src/backend/base/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py b/src/backend/base/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py index 3d6dd604c..ee34c0756 100644 --- a/src/backend/base/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py +++ b/src/backend/base/langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py @@ -22,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("flow")] indexes = inspector.get_indexes("flow") @@ -38,7 +38,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("flow")] indexes = inspector.get_indexes("flow") diff --git a/src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py b/src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py index 11ba1a113..0b0e58a45 100644 --- a/src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +++ b/src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py @@ -24,7 +24,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore tables = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### try: @@ -39,7 +39,7 @@ def upgrade() -> None: if "folder" not in flow_columns: batch_op.add_column(sa.Column("folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) if "user_id" not in flow_columns: - batch_op.add_column(sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True)) + batch_op.add_column(sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True)) indices = inspector.get_indexes("flow") indices_names = [index["name"] for index in indices] if "ix_flow_user_id" not in indices_names: @@ -54,7 +54,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore try: # Re-create the dropped table 'flowstyle' if it was previously dropped in upgrade if "flowstyle" not in inspector.get_table_names(): @@ -62,8 +62,8 @@ def downgrade() -> None: "flowstyle", sa.Column("color", sa.String(), nullable=False), sa.Column("emoji", sa.String(), nullable=False), - sa.Column("flow_id", sqlmodel.sql.sqltypes.GUID(), nullable=True), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), + sa.Column("flow_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), sa.ForeignKeyConstraint(["flow_id"], ["flow.id"]), sa.PrimaryKeyConstraint("id"), sa.UniqueConstraint("id"), diff --git a/src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py b/src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py index e0fa1add8..baed5543f 100644 --- a/src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +++ b/src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py @@ -22,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore flow_columns = {column["name"] for column in inspector.get_columns("flow")} flow_indexes = {index["name"] for index in inspector.get_indexes("flow")} flow_fks = {fk["name"] for fk in inspector.get_foreign_keys("flow")} @@ -35,7 +35,7 @@ def upgrade() -> None: if "folder" not in flow_columns: batch_op.add_column(sa.Column("folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) if "user_id" not in flow_columns: - batch_op.add_column(sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True)) + batch_op.add_column(sa.Column("user_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True)) if "ix_flow_user_id" not in flow_indexes: batch_op.create_index(batch_op.f("ix_flow_user_id"), ["user_id"], unique=False) if "flow_user_id_fkey" not in flow_fks: @@ -44,7 +44,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore flow_columns = {column["name"] for column in inspector.get_columns("flow")} flow_indexes = {index["name"] for index in inspector.get_indexes("flow")} flow_fks = {fk["name"] for fk in inspector.get_foreign_keys("flow")} diff --git a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py index cec3f6081..d41e494e0 100644 --- a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +++ b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore # ### commands auto generated by Alembic - please adjust! ### columns = inspector.get_columns("variable") with op.batch_alter_table("variable", schema=None) as batch_op: @@ -38,7 +38,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore columns = inspector.get_columns("variable") # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("variable", schema=None) as batch_op: diff --git a/src/backend/base/langflow/alembic/versions/d066bfd22890_add_message_table.py b/src/backend/base/langflow/alembic/versions/d066bfd22890_add_message_table.py index dd63398b7..e985a7b40 100644 --- a/src/backend/base/langflow/alembic/versions/d066bfd22890_add_message_table.py +++ b/src/backend/base/langflow/alembic/versions/d066bfd22890_add_message_table.py @@ -32,8 +32,8 @@ def upgrade() -> None: sa.Column("sender_name", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("session_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("text", sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.Column("flow_id", sqlmodel.sql.sqltypes.GUID(), nullable=True), + sa.Column("id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=False), + sa.Column("flow_id", sqlmodel.sql.sqltypes.types.Uuid(), nullable=True), sa.Column("files", sa.JSON(), nullable=True), sa.ForeignKeyConstraint( ["flow_id"], diff --git a/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py b/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py index bfcd8e60b..2d806acf5 100644 --- a/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py +++ b/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "variable" not in table_names: @@ -47,7 +47,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### if "variable" not in table_names: diff --git a/src/backend/base/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py b/src/backend/base/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py index 099361256..b22ee1cb0 100644 --- a/src/backend/base/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py +++ b/src/backend/base/langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py @@ -24,7 +24,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("vertex_build", schema=None) as batch_op: if migration.column_exists(table_name="vertex_build", column_name="id", conn=conn): columns = inspector.get_columns("vertex_build") @@ -38,7 +38,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() # ### commands auto generated by Alembic - please adjust! ### - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore with op.batch_alter_table("vertex_build", schema=None) as batch_op: if migration.column_exists(table_name="vertex_build", column_name="id", conn=conn): columns = inspector.get_columns("vertex_build") diff --git a/src/backend/base/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py b/src/backend/base/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py index 1939cd049..496ab2a6a 100644 --- a/src/backend/base/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py +++ b/src/backend/base/langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py @@ -21,7 +21,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("message")] # ### commands auto generated by Alembic - please adjust! ### @@ -36,7 +36,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("message")] # ### commands auto generated by Alembic - please adjust! ### diff --git a/src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py b/src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py index de69b491d..e180b713c 100644 --- a/src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +++ b/src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py @@ -8,6 +8,7 @@ Create Date: 2023-11-24 15:07:37.566516 from typing import Optional, Sequence, Union +import sqlalchemy as sa from alembic import op from sqlalchemy.engine.reflection import Inspector @@ -21,7 +22,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore tables = inspector.get_table_names() foreign_keys_names = [] if "credential" in tables: @@ -42,7 +43,7 @@ def upgrade() -> None: def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### conn = op.get_bind() - inspector = Inspector.from_engine(conn) # type: ignore + inspector = sa.inspect(conn) # type: ignore tables = inspector.get_table_names() foreign_keys_names: list[Optional[str]] = [] if "credential" in tables: diff --git a/src/backend/base/langflow/api/utils.py b/src/backend/base/langflow/api/utils.py index 7f3d98a01..61912ae1f 100644 --- a/src/backend/base/langflow/api/utils.py +++ b/src/backend/base/langflow/api/utils.py @@ -140,7 +140,7 @@ def format_elapsed_time(elapsed_time: float) -> str: return f"{minutes} {minutes_unit}, {seconds} {seconds_unit}" -async def _get_flow_name(flow_id: str) -> str: +async def _get_flow_name(flow_id: uuid.UUID) -> str: async with async_session_scope() as session: flow = await session.get(Flow, flow_id) if flow is None: @@ -149,20 +149,21 @@ async def _get_flow_name(flow_id: str) -> str: return flow.name -async def build_graph_from_data(flow_id: str, payload: dict, **kwargs): +async def build_graph_from_data(flow_id: uuid.UUID | str, payload: dict, **kwargs): """Build and cache the graph.""" # Get flow name if "flow_name" not in kwargs: - flow_name = await _get_flow_name(flow_id) + flow_name = await _get_flow_name(flow_id if isinstance(flow_id, uuid.UUID) else uuid.UUID(flow_id)) kwargs["flow_name"] = flow_name - graph = Graph.from_payload(payload, flow_id, **kwargs) + str_flow_id = str(flow_id) + graph = Graph.from_payload(payload, str_flow_id, **kwargs) for vertex_id in graph.has_session_id_vertices: vertex = graph.get_vertex(vertex_id) if vertex is None: msg = f"Vertex {vertex_id} not found" raise ValueError(msg) if not vertex.raw_params.get("session_id"): - vertex.update_raw_params({"session_id": flow_id}, overwrite=True) + vertex.update_raw_params({"session_id": str_flow_id}, overwrite=True) run_id = uuid.uuid4() graph.set_run_id(run_id) @@ -171,7 +172,7 @@ async def build_graph_from_data(flow_id: str, payload: dict, **kwargs): return graph -async def build_graph_from_db_no_cache(flow_id: str, session: AsyncSession): +async def build_graph_from_db_no_cache(flow_id: uuid.UUID, session: AsyncSession): """Build and cache the graph.""" flow: Flow | None = await session.get(Flow, flow_id) if not flow or not flow.data: @@ -180,20 +181,22 @@ async def build_graph_from_db_no_cache(flow_id: str, session: AsyncSession): return await build_graph_from_data(flow_id, flow.data, flow_name=flow.name, user_id=str(flow.user_id)) -async def build_graph_from_db(flow_id: str, session: AsyncSession, chat_service: ChatService): - graph = await build_graph_from_db_no_cache(flow_id, session) - await chat_service.set_cache(flow_id, graph) +async def build_graph_from_db(flow_id: uuid.UUID, session: AsyncSession, chat_service: ChatService): + graph = await build_graph_from_db_no_cache(flow_id=flow_id, session=session) + await chat_service.set_cache(str(flow_id), graph) return graph async def build_and_cache_graph_from_data( - flow_id: str, + flow_id: uuid.UUID | str, chat_service: ChatService, graph_data: dict, ): # -> Graph | Any: """Build and cache the graph.""" - graph = Graph.from_payload(graph_data, flow_id) - await chat_service.set_cache(flow_id, graph) + # Convert flow_id to str if it's UUID + str_flow_id = str(flow_id) if isinstance(flow_id, uuid.UUID) else flow_id + graph = Graph.from_payload(graph_data, str_flow_id) + await chat_service.set_cache(str_flow_id, graph) return graph diff --git a/src/backend/base/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py index 7604a9e5f..587161c31 100644 --- a/src/backend/base/langflow/api/v1/chat.py +++ b/src/backend/base/langflow/api/v1/chat.py @@ -22,7 +22,6 @@ from langflow.api.utils import ( build_and_cache_graph_from_data, build_graph_from_data, build_graph_from_db, - build_graph_from_db_no_cache, format_elapsed_time, format_exception_message, get_top_level_vertices, @@ -100,13 +99,12 @@ async def retrieve_vertices_order( start_time = time.perf_counter() components_count = None try: - flow_id_str = str(flow_id) # First, we need to check if the flow_id is in the cache if not data: - graph = await build_graph_from_db(flow_id=flow_id_str, session=session, chat_service=chat_service) + graph = await build_graph_from_db(flow_id=flow_id, session=session, chat_service=chat_service) else: graph = await build_and_cache_graph_from_data( - flow_id=flow_id_str, graph_data=data.model_dump(), chat_service=chat_service + flow_id=flow_id, graph_data=data.model_dump(), chat_service=chat_service ) graph = graph.prepare(stop_component_id, start_component_id) @@ -166,13 +164,13 @@ async def build_flow( try: flow_id_str = str(flow_id) if not data: - graph = await build_graph_from_db_no_cache(flow_id=flow_id_str, session=session) + graph = await build_graph_from_db(flow_id=flow_id, session=session, chat_service=chat_service) else: async with async_session_scope() as new_session: - result = await new_session.exec(select(Flow.name).where(Flow.id == flow_id_str)) + result = await new_session.exec(select(Flow.name).where(Flow.id == flow_id)) flow_name = result.first() graph = await build_graph_from_data( - flow_id_str, data.model_dump(), user_id=str(current_user.id), flow_name=flow_name + flow_id=flow_id_str, payload=data.model_dump(), user_id=str(current_user.id), flow_name=flow_name ) graph.validate_stream() if stop_component_id or start_component_id: @@ -195,6 +193,7 @@ async def build_flow( # and return the same structure but only with the ids components_count = len(graph.vertices) vertices_to_run = list(graph.vertices_to_run.union(get_top_level_vertices(graph, graph.vertices_to_run))) + await chat_service.set_cache(flow_id_str, graph) background_tasks.add_task( telemetry_service.log_package_playground, PlaygroundPayload( @@ -217,12 +216,10 @@ async def build_flow( raise HTTPException(status_code=400, detail=str(exc)) from exc logger.exception("Error checking build status") raise HTTPException(status_code=500, detail=str(exc)) from exc - return first_layer, vertices_to_run, graph async def _build_vertex(vertex_id: str, graph: Graph, event_manager: EventManager) -> VertexBuildResponse: flow_id_str = str(flow_id) - next_runnable_vertices = [] top_level_vertices = [] start_time = time.perf_counter() @@ -506,13 +503,18 @@ async def build_vertex( top_level_vertices = [] start_time = time.perf_counter() error_message = None + try: + graph: Graph = await chat_service.get_cache(flow_id_str) + except KeyError as exc: + raise HTTPException(status_code=404, detail="Graph not found") from exc + try: cache = await chat_service.get_cache(flow_id_str) if isinstance(cache, CacheMiss): # If there's no cache logger.warning(f"No cache found for {flow_id_str}. Building graph starting at {vertex_id}") - graph: Graph = await build_graph_from_db( - flow_id=flow_id_str, session=await anext(get_session()), chat_service=chat_service + graph = await build_graph_from_db( + flow_id=flow_id, session=await anext(get_session()), chat_service=chat_service ) else: graph = cache.get("result") diff --git a/src/backend/base/langflow/api/v1/files.py b/src/backend/base/langflow/api/v1/files.py index 27ec75116..041329492 100644 --- a/src/backend/base/langflow/api/v1/files.py +++ b/src/backend/base/langflow/api/v1/files.py @@ -12,7 +12,8 @@ from fastapi.responses import StreamingResponse from langflow.api.utils import CurrentActiveUser, DbSession from langflow.api.v1.schemas import UploadFileResponse from langflow.services.database.models.flow import Flow -from langflow.services.deps import get_storage_service +from langflow.services.deps import get_settings_service, get_storage_service +from langflow.services.settings.service import SettingsService from langflow.services.storage.service import StorageService from langflow.services.storage.utils import build_content_type_from_extension @@ -22,36 +23,39 @@ router = APIRouter(tags=["Files"], prefix="/files") # Create dep that gets the flow_id from the request # then finds it in the database and returns it while # using the current user as the owner -async def get_flow_id( +async def get_flow( flow_id: UUID, current_user: CurrentActiveUser, session: DbSession, ): - flow_id_str = str(flow_id) # AttributeError: 'SelectOfScalar' object has no attribute 'first' - flow = await session.get(Flow, flow_id_str) + flow = await session.get(Flow, flow_id) if not flow: raise HTTPException(status_code=404, detail="Flow not found") if flow.user_id != current_user.id: raise HTTPException(status_code=403, detail="You don't have access to this flow") - return flow_id_str + return flow @router.post("/upload/{flow_id}", status_code=HTTPStatus.CREATED) async def upload_file( *, file: UploadFile, - flow_id: Annotated[UUID, Depends(get_flow_id)], + flow: Annotated[Flow, Depends(get_flow)], current_user: CurrentActiveUser, - session: DbSession, storage_service: Annotated[StorageService, Depends(get_storage_service)], + settings_service: Annotated[SettingsService, Depends(get_settings_service)], ) -> UploadFileResponse: try: - flow_id_str = str(flow_id) - flow = await session.get(Flow, flow_id_str) + max_file_size_upload = settings_service.settings.max_file_size_upload except Exception as e: raise HTTPException(status_code=500, detail=str(e)) from e + if file.size > max_file_size_upload * 1024 * 1024: + raise HTTPException( + status_code=413, detail=f"File size is larger than the maximum file size {max_file_size_upload}MB." + ) + if flow.user_id != current_user.id: raise HTTPException(status_code=403, detail="You don't have access to this flow") @@ -60,9 +64,9 @@ async def upload_file( timestamp = datetime.now(tz=timezone.utc).astimezone().strftime("%Y-%m-%d_%H-%M-%S") file_name = file.filename or hashlib.sha256(file_content).hexdigest() full_file_name = f"{timestamp}_{file_name}" - folder = flow_id_str + folder = str(flow.id) await storage_service.save_file(flow_id=folder, file_name=full_file_name, data=file_content) - return UploadFileResponse(flow_id=flow_id_str, file_path=f"{folder}/{full_file_name}") + return UploadFileResponse(flow_id=str(flow.id), file_path=f"{folder}/{full_file_name}") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) from e @@ -164,12 +168,11 @@ async def list_profile_pictures(): @router.get("/list/{flow_id}") async def list_files( - flow_id: Annotated[UUID, Depends(get_flow_id)], + flow: Annotated[Flow, Depends(get_flow)], storage_service: Annotated[StorageService, Depends(get_storage_service)], ): try: - flow_id_str = str(flow_id) - files = await storage_service.list_files(flow_id=flow_id_str) + files = await storage_service.list_files(flow_id=str(flow.id)) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) from e @@ -179,12 +182,11 @@ async def list_files( @router.delete("/delete/{flow_id}/{file_name}") async def delete_file( file_name: str, - flow_id: Annotated[UUID, Depends(get_flow_id)], + flow: Annotated[Flow, Depends(get_flow)], storage_service: Annotated[StorageService, Depends(get_storage_service)], ): try: - flow_id_str = str(flow_id) - await storage_service.delete_file(flow_id=flow_id_str, file_name=file_name) + await storage_service.delete_file(flow_id=str(flow.id), file_name=file_name) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) from e diff --git a/src/backend/base/langflow/api/v1/folders.py b/src/backend/base/langflow/api/v1/folders.py index df3eae00a..324a720b8 100644 --- a/src/backend/base/langflow/api/v1/folders.py +++ b/src/backend/base/langflow/api/v1/folders.py @@ -3,6 +3,7 @@ import json import zipfile from datetime import datetime, timezone from typing import Annotated +from uuid import UUID import orjson from fastapi import APIRouter, Depends, File, HTTPException, Response, UploadFile, status @@ -114,7 +115,7 @@ async def read_folders( async def read_folder( *, session: DbSession, - folder_id: str, + folder_id: UUID, current_user: CurrentActiveUser, params: Annotated[Params | None, Depends(custom_params)], is_component: bool = False, @@ -165,7 +166,7 @@ async def read_folder( async def update_folder( *, session: DbSession, - folder_id: str, + folder_id: UUID, folder: FolderUpdate, # Assuming FolderUpdate is a Pydantic model defining updatable fields current_user: CurrentActiveUser, ): @@ -226,7 +227,7 @@ async def update_folder( async def delete_folder( *, session: DbSession, - folder_id: str, + folder_id: UUID, current_user: CurrentActiveUser, ): try: @@ -258,7 +259,7 @@ async def delete_folder( async def download_file( *, session: DbSession, - folder_id: str, + folder_id: UUID, current_user: CurrentActiveUser, ): """Download all flows from folder as a zip file.""" diff --git a/src/backend/base/langflow/custom/custom_component/component.py b/src/backend/base/langflow/custom/custom_component/component.py index 050a26ead..ef6d5e1d6 100644 --- a/src/backend/base/langflow/custom/custom_component/component.py +++ b/src/backend/base/langflow/custom/custom_component/component.py @@ -7,6 +7,7 @@ from collections.abc import AsyncIterator, Iterator from copy import deepcopy from textwrap import dedent from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, get_type_hints +from uuid import UUID import nanoid import yaml @@ -1006,7 +1007,10 @@ class Component(CustomComponent): async def send_message(self, message: Message, id_: str | None = None): if (hasattr(self, "graph") and self.graph.session_id) and (message is not None and not message.session_id): - message.session_id = self.graph.session_id + session_id = ( + UUID(self.graph.session_id) if isinstance(self.graph.session_id, str) else self.graph.session_id + ) + message.session_id = session_id stored_message = await self._store_message(message) self._stored_message_id = stored_message.id @@ -1031,13 +1035,16 @@ class Component(CustomComponent): return stored_message async def _store_message(self, message: Message) -> Message: - flow_id = self.graph.flow_id if hasattr(self, "graph") else None - messages = await astore_message(message, flow_id=flow_id) - if len(messages) != 1: + flow_id: str | None = None + if hasattr(self, "graph"): + # Convert UUID to str if needed + flow_id = str(self.graph.flow_id) if self.graph.flow_id else None + stored_messages = await astore_message(message, flow_id=flow_id) + if len(stored_messages) != 1: msg = "Only one message can be stored at a time." raise ValueError(msg) - - return messages[0] + stored_message = stored_messages[0] + return await Message.create(**stored_message.model_dump()) async def _send_message_event(self, message: Message, id_: str | None = None, category: str | None = None) -> None: if hasattr(self, "_event_manager") and self._event_manager: @@ -1065,10 +1072,20 @@ class Component(CustomComponent): and not isinstance(original_message.text, str) ) - async def _update_stored_message(self, stored_message: Message) -> Message: - message_tables = await aupdate_messages(stored_message) - if len(message_tables) != 1: - msg = "Only one message can be updated at a time." + async def _update_stored_message(self, message: Message) -> Message: + """Update the stored message.""" + if hasattr(self, "_vertex") and self._vertex is not None and hasattr(self._vertex, "graph"): + flow_id = ( + UUID(self._vertex.graph.flow_id) + if isinstance(self._vertex.graph.flow_id, str) + else self._vertex.graph.flow_id + ) + + message.flow_id = flow_id + + message_tables = await aupdate_messages(message) + if not message_tables: + msg = "Failed to update message" raise ValueError(msg) message_table = message_tables[0] return await Message.create(**message_table.model_dump()) diff --git a/src/backend/base/langflow/helpers/flow.py b/src/backend/base/langflow/helpers/flow.py index bc2baed07..d3b3e5ffa 100644 --- a/src/backend/base/langflow/helpers/flow.py +++ b/src/backend/base/langflow/helpers/flow.py @@ -33,8 +33,9 @@ def list_flows(*, user_id: str | None = None) -> list[Data]: raise ValueError(msg) try: with session_scope() as session: + uuid_user_id = UUID(user_id) if isinstance(user_id, str) else user_id flows = session.exec( - select(Flow).where(Flow.user_id == user_id).where(Flow.is_component == False) # noqa: E712 + select(Flow).where(Flow.user_id == uuid_user_id).where(Flow.is_component == False) # noqa: E712 ).all() return [flow.to_data() for flow in flows] diff --git a/src/backend/base/langflow/memory.py b/src/backend/base/langflow/memory.py index 43d77b439..56790a540 100644 --- a/src/backend/base/langflow/memory.py +++ b/src/backend/base/langflow/memory.py @@ -18,7 +18,7 @@ from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER def _get_variable_query( sender: str | None = None, sender_name: str | None = None, - session_id: str | None = None, + session_id: str | UUID | None = None, order_by: str | None = "timestamp", order: str | None = "DESC", flow_id: UUID | None = None, @@ -44,7 +44,7 @@ def _get_variable_query( def get_messages( sender: str | None = None, sender_name: str | None = None, - session_id: str | None = None, + session_id: str | UUID | None = None, order_by: str | None = "timestamp", order: str | None = "DESC", flow_id: UUID | None = None, @@ -73,7 +73,7 @@ def get_messages( async def aget_messages( sender: str | None = None, sender_name: str | None = None, - session_id: str | None = None, + session_id: str | UUID | None = None, order_by: str | None = "timestamp", order: str | None = "DESC", flow_id: UUID | None = None, @@ -99,7 +99,7 @@ async def aget_messages( return [await Message.create(**d.model_dump()) for d in messages] -def add_messages(messages: Message | list[Message], flow_id: str | None = None): +def add_messages(messages: Message | list[Message], flow_id: str | UUID | None = None): """Add a message to the monitor service.""" if not isinstance(messages, list): messages = [messages] @@ -110,6 +110,10 @@ def add_messages(messages: Message | list[Message], flow_id: str | None = None): raise ValueError(msg) try: + # Convert flow_id to UUID if it's a string + if isinstance(flow_id, str): + flow_id = UUID(flow_id) + messages_models = [MessageTable.from_message(msg, flow_id=flow_id) for msg in messages] with session_scope() as session: messages_models = add_messagetables(messages_models, session) @@ -119,7 +123,7 @@ def add_messages(messages: Message | list[Message], flow_id: str | None = None): raise -async def aadd_messages(messages: Message | list[Message], flow_id: str | None = None): +async def aadd_messages(messages: Message | list[Message], flow_id: str | UUID | None = None): """Add a message to the monitor service.""" if not isinstance(messages, list): messages = [messages] @@ -146,9 +150,15 @@ def update_messages(messages: Message | list[Message]) -> list[Message]: with session_scope() as session: updated_messages: list[MessageTable] = [] for message in messages: - msg = session.get(MessageTable, message.id) + message_id = UUID(message.id) if isinstance(message.id, str) else message.id + msg = session.get(MessageTable, message_id) if msg: - msg.sqlmodel_update(message.model_dump(exclude_unset=True, exclude_none=True)) + if hasattr(message, "data"): + msg = msg.sqlmodel_update(message.data) + else: + msg = msg.sqlmodel_update(message.model_dump(exclude_unset=True, exclude_none=True)) + if isinstance(msg.flow_id, str): + msg.flow_id = UUID(msg.flow_id) session.add(msg) session.commit() session.refresh(msg) @@ -167,7 +177,10 @@ async def aupdate_messages(messages: Message | list[Message]) -> list[Message]: for message in messages: msg = await session.get(MessageTable, message.id) if msg: - msg.sqlmodel_update(message.model_dump(exclude_unset=True, exclude_none=True)) + if hasattr(message, "data"): + msg = msg.sqlmodel_update(message.data) + else: + msg = msg.sqlmodel_update(message.model_dump(exclude_unset=True, exclude_none=True)) session.add(msg) await session.commit() await session.refresh(msg) @@ -262,13 +275,13 @@ async def delete_message(id_: str) -> None: def store_message( message: Message, - flow_id: str | None = None, + flow_id: str | UUID | None = None, ) -> list[Message]: """Stores a message in the memory. Args: message (Message): The message to store. - flow_id (Optional[str]): The flow ID associated with the message. + flow_id (Optional[str | UUID]): The flow ID associated with the message. When running from the CustomComponent you can access this using `self.graph.flow_id`. Returns: @@ -281,6 +294,10 @@ def store_message( logger.warning("No message provided.") return [] + # Convert flow_id to UUID if it's a string + if isinstance(flow_id, str): + flow_id = UUID(flow_id) + required_fields = ["session_id", "sender", "sender_name"] missing_fields = [field for field in required_fields if not getattr(message, field)] if missing_fields: @@ -302,7 +319,7 @@ def store_message( async def astore_message( message: Message, - flow_id: str | None = None, + flow_id: str | UUID | None = None, ) -> list[Message]: """Stores a message in the memory. diff --git a/src/backend/base/langflow/schema/message.py b/src/backend/base/langflow/schema/message.py index 82e3bf401..f966fae8e 100644 --- a/src/backend/base/langflow/schema/message.py +++ b/src/backend/base/langflow/schema/message.py @@ -40,7 +40,7 @@ class Message(Data): sender: str | None = None sender_name: str | None = None files: list[str | Image] | None = Field(default=[]) - session_id: str | None = Field(default="") + session_id: str | UUID | None = Field(default="") timestamp: Annotated[str, timestamp_to_str_validator] = Field( default_factory=lambda: datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z") ) diff --git a/src/backend/base/langflow/schema/serialize.py b/src/backend/base/langflow/schema/serialize.py index d441fe686..d3f98053d 100644 --- a/src/backend/base/langflow/schema/serialize.py +++ b/src/backend/base/langflow/schema/serialize.py @@ -1,11 +1,22 @@ from collections.abc import AsyncIterator, Generator, Iterator from datetime import datetime +from typing import Annotated +from uuid import UUID from loguru import logger -from pydantic import BaseModel +from pydantic import BaseModel, BeforeValidator from pydantic.v1 import BaseModel as BaseModelV1 +def str_to_uuid(v: str | UUID) -> UUID: + if isinstance(v, str): + return UUID(v) + return v + + +UUIDstr = Annotated[UUID, BeforeValidator(str_to_uuid)] + + def recursive_serialize_or_str(obj): try: if isinstance(obj, type) and issubclass(obj, BaseModel | BaseModelV1): diff --git a/src/backend/base/langflow/services/database/models/api_key/model.py b/src/backend/base/langflow/services/database/models/api_key/model.py index 82c7d4ec6..473187b18 100644 --- a/src/backend/base/langflow/services/database/models/api_key/model.py +++ b/src/backend/base/langflow/services/database/models/api_key/model.py @@ -1,10 +1,12 @@ from datetime import datetime, timezone from typing import TYPE_CHECKING -from uuid import UUID, uuid4 +from uuid import uuid4 from pydantic import field_validator from sqlmodel import Column, DateTime, Field, Relationship, SQLModel, func +from langflow.schema.serialize import UUIDstr + if TYPE_CHECKING: from langflow.services.database.models.user import User @@ -21,14 +23,14 @@ class ApiKeyBase(SQLModel): class ApiKey(ApiKeyBase, table=True): # type: ignore[call-arg] - id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True) + id: UUIDstr = Field(default_factory=uuid4, primary_key=True, unique=True) created_at: datetime | None = Field( default=None, sa_column=Column(DateTime(timezone=True), server_default=func.now(), nullable=False) ) api_key: str = Field(index=True, unique=True) # User relationship # Delete API keys when user is deleted - user_id: UUID = Field(index=True, foreign_key="user.id") + user_id: UUIDstr = Field(index=True, foreign_key="user.id") user: "User" = Relationship( back_populates="api_keys", ) @@ -36,7 +38,7 @@ class ApiKey(ApiKeyBase, table=True): # type: ignore[call-arg] class ApiKeyCreate(ApiKeyBase): api_key: str | None = None - user_id: UUID | None = None + user_id: UUIDstr | None = None created_at: datetime | None = Field(default_factory=utc_now) @field_validator("created_at", mode="before") @@ -46,15 +48,15 @@ class ApiKeyCreate(ApiKeyBase): class UnmaskedApiKeyRead(ApiKeyBase): - id: UUID + id: UUIDstr api_key: str = Field() - user_id: UUID = Field() + user_id: UUIDstr = Field() class ApiKeyRead(ApiKeyBase): - id: UUID + id: UUIDstr api_key: str = Field(schema_extra={"validate_default": True}) - user_id: UUID = Field() + user_id: UUIDstr = Field() created_at: datetime = Field() @field_validator("api_key") diff --git a/src/backend/base/langflow/services/database/models/message/model.py b/src/backend/base/langflow/services/database/models/message/model.py index 6c3008c14..73f715bbc 100644 --- a/src/backend/base/langflow/services/database/models/message/model.py +++ b/src/backend/base/langflow/services/database/models/message/model.py @@ -47,7 +47,10 @@ class MessageBase(SQLModel): for file in message.files: if hasattr(file, "path") and hasattr(file, "url") and file.path: session_id = message.session_id - image_paths.append(f"{session_id}{file.path.split(session_id)[1]}") + if session_id: + image_paths.append(f"{session_id}{file.path.split(str(session_id))[1]}") + else: + image_paths.append(file.path) if image_paths: message.files = image_paths @@ -76,6 +79,13 @@ class MessageBase(SQLModel): content = content_block.model_dump_json() if hasattr(content_block, "model_dump_json") else content_block content_blocks.append(content) + if isinstance(flow_id, str): + try: + flow_id = UUID(flow_id) + except ValueError as exc: + msg = f"Flow ID {flow_id} is not a valid UUID" + raise ValueError(msg) from exc + return cls( sender=message.sender, sender_name=message.sender_name, diff --git a/src/backend/base/langflow/services/database/models/user/crud.py b/src/backend/base/langflow/services/database/models/user/crud.py index db6d78988..f65f1b395 100644 --- a/src/backend/base/langflow/services/database/models/user/crud.py +++ b/src/backend/base/langflow/services/database/models/user/crud.py @@ -17,6 +17,8 @@ async def get_user_by_username(db: AsyncSession, username: str) -> User | None: async def get_user_by_id(db: AsyncSession, user_id: UUID) -> User | None: + if isinstance(user_id, str): + user_id = UUID(user_id) stmt = select(User).where(User.id == user_id) return (await db.exec(stmt)).first() diff --git a/src/backend/base/langflow/services/database/models/user/model.py b/src/backend/base/langflow/services/database/models/user/model.py index ea2fea8a7..2f420d882 100644 --- a/src/backend/base/langflow/services/database/models/user/model.py +++ b/src/backend/base/langflow/services/database/models/user/model.py @@ -4,6 +4,8 @@ from uuid import UUID, uuid4 from sqlmodel import Field, Relationship, SQLModel +from langflow.schema.serialize import UUIDstr + if TYPE_CHECKING: from langflow.services.database.models.api_key import ApiKey from langflow.services.database.models.flow import Flow @@ -12,7 +14,7 @@ if TYPE_CHECKING: class User(SQLModel, table=True): # type: ignore[call-arg] - id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True) + id: UUIDstr = Field(default_factory=uuid4, primary_key=True, unique=True) username: str = Field(index=True, unique=True) password: str = Field() profile_image: str | None = Field(default=None, nullable=True) diff --git a/src/backend/base/langflow/services/storage/local.py b/src/backend/base/langflow/services/storage/local.py index 7467aefe7..befbe2198 100644 --- a/src/backend/base/langflow/services/storage/local.py +++ b/src/backend/base/langflow/services/storage/local.py @@ -67,6 +67,8 @@ class LocalStorageService(StorageService): :return: A list of file names. :raises FileNotFoundError: If the flow directory does not exist. """ + if not isinstance(flow_id, str): + flow_id = str(flow_id) folder_path = self.data_dir / flow_id if not await folder_path.exists() or not await folder_path.is_dir(): logger.warning(f"Flow {flow_id} directory does not exist.") diff --git a/src/backend/base/langflow/utils/migration.py b/src/backend/base/langflow/utils/migration.py index 47fe88957..b8e682f73 100644 --- a/src/backend/base/langflow/utils/migration.py +++ b/src/backend/base/langflow/utils/migration.py @@ -1,4 +1,4 @@ -from sqlalchemy.engine.reflection import Inspector +import sqlalchemy as sa def table_exists(name, conn): @@ -11,7 +11,7 @@ def table_exists(name, conn): Returns: bool: True if the table exists, False otherwise. """ - inspector = Inspector.from_engine(conn) + inspector = sa.inspect(conn) return name in inspector.get_table_names() @@ -26,7 +26,7 @@ def column_exists(table_name, column_name, conn): Returns: bool: True if the column exists, False otherwise. """ - inspector = Inspector.from_engine(conn) + inspector = sa.inspect(conn) return column_name in [column["name"] for column in inspector.get_columns(table_name)] @@ -41,7 +41,7 @@ def foreign_key_exists(table_name, fk_name, conn): Returns: bool: True if the foreign key exists, False otherwise. """ - inspector = Inspector.from_engine(conn) + inspector = sa.inspect(conn) return fk_name in [fk["name"] for fk in inspector.get_foreign_keys(table_name)] @@ -56,6 +56,6 @@ def constraint_exists(table_name, constraint_name, conn): Returns: bool: True if the constraint exists, False otherwise. """ - inspector = Inspector.from_engine(conn) + inspector = sa.inspect(conn) constraints = inspector.get_unique_constraints(table_name) return constraint_name in [constraint["name"] for constraint in constraints] diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index adf4a7e2a..23551c250 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -114,10 +114,10 @@ dependencies = [ "langchain~=0.3.3", "langchain-core~=0.3.15", "langchainhub~=0.1.15", - "sqlmodel==0.0.18", "loguru>=0.7.1,<1.0.0", "rich>=13.7.0,<14.0.0", "langchain-experimental>=0.0.61,<1.0.0", + "sqlmodel==0.0.22", "pydantic~=2.7.0", "pydantic-settings>=2.2.0,<3.0.0", "typer>=0.13.0,<1.0.0", diff --git a/src/backend/tests/.test_durations b/src/backend/tests/.test_durations index 67d867e18..96f20c716 100644 --- a/src/backend/tests/.test_durations +++ b/src/backend/tests/.test_durations @@ -72,81 +72,96 @@ "src/backend/tests/unit/api/v1/test_api_key.py::test_create_api_key_route": 2.5889793329988606, "src/backend/tests/unit/api/v1/test_api_key.py::test_create_folder": 5.879420668003149, "src/backend/tests/unit/api/v1/test_api_key.py::test_delete_api_key_route": 5.08323762496002, - "src/backend/tests/unit/api/v1/test_api_key.py::test_save_store_api_key": 2.5483837079955265, - "src/backend/tests/unit/api/v1/test_endpoints.py::test_get_config": 1.8300487080705352, - "src/backend/tests/unit/api/v1/test_endpoints.py::test_get_version": 15.56689295801334, - "src/backend/tests/unit/api/v1/test_endpoints.py::test_update_component_outputs": 2.663210333965253, - "src/backend/tests/unit/api/v1/test_flows.py::test_create_flow": 4.495548666047398, - "src/backend/tests/unit/api/v1/test_flows.py::test_create_flows": 3.1307485009310767, - "src/backend/tests/unit/api/v1/test_flows.py::test_read_basic_examples": 2.3698979579494335, - "src/backend/tests/unit/api/v1/test_flows.py::test_read_flow": 2.789128624019213, - "src/backend/tests/unit/api/v1/test_flows.py::test_read_flows": 4.866618833038956, - "src/backend/tests/unit/api/v1/test_flows.py::test_update_flow": 2.358723249984905, - "src/backend/tests/unit/api/v1/test_folders.py::test_create_folder": 4.585997875023168, - "src/backend/tests/unit/api/v1/test_folders.py::test_read_folder": 2.081491626042407, - "src/backend/tests/unit/api/v1/test_folders.py::test_read_folders": 2.056147459021304, - "src/backend/tests/unit/api/v1/test_folders.py::test_update_folder": 13.467484833963681, - "src/backend/tests/unit/api/v1/test_starter_projects.py::test_get_starter_projects": 5.260392207012046, - "src/backend/tests/unit/api/v1/test_store.py::test_check_if_store_is_enabled": 1.7977962500299327, - "src/backend/tests/unit/api/v1/test_users.py::test_add_user": 2.418213166005444, - "src/backend/tests/unit/api/v1/test_users.py::test_delete_user": 5.889092375058681, - "src/backend/tests/unit/api/v1/test_users.py::test_patch_user": 2.9018829600536264, - "src/backend/tests/unit/api/v1/test_users.py::test_read_all_users": 2.8212402089848183, - "src/backend/tests/unit/api/v1/test_users.py::test_read_current_user": 2.27289370901417, - "src/backend/tests/unit/api/v1/test_users.py::test_reset_password": 2.837956835050136, - "src/backend/tests/unit/api/v1/test_validate.py::test_post_validate_code": 3.654669084062334, - "src/backend/tests/unit/api/v1/test_validate.py::test_post_validate_prompt": 3.0125097080599517, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable": 1.7783849989646114, + "src/backend/tests/unit/api/v1/test_api_key.py::test_save_store_api_key": 18.685212292009965, + "src/backend/tests/unit/api/v1/test_endpoints.py::test_get_config": 2.9917057070415467, + "src/backend/tests/unit/api/v1/test_endpoints.py::test_get_version": 7.580820667091757, + "src/backend/tests/unit/api/v1/test_endpoints.py::test_update_component_outputs": 5.34444566606544, + "src/backend/tests/unit/api/v1/test_flows.py::test_create_flow": 5.660299708019011, + "src/backend/tests/unit/api/v1/test_flows.py::test_create_flows": 16.183370249986183, + "src/backend/tests/unit/api/v1/test_flows.py::test_read_basic_examples": 9.33872674999293, + "src/backend/tests/unit/api/v1/test_flows.py::test_read_flow": 7.029860542039387, + "src/backend/tests/unit/api/v1/test_flows.py::test_read_flows": 5.9399968750658445, + "src/backend/tests/unit/api/v1/test_flows.py::test_update_flow": 13.487587207986508, + "src/backend/tests/unit/api/v1/test_folders.py::test_create_folder": 10.632291541958693, + "src/backend/tests/unit/api/v1/test_folders.py::test_read_folder": 7.530599833000451, + "src/backend/tests/unit/api/v1/test_folders.py::test_read_folders": 8.985063250991516, + "src/backend/tests/unit/api/v1/test_folders.py::test_update_folder": 18.673885500989854, + "src/backend/tests/unit/api/v1/test_starter_projects.py::test_get_starter_projects": 15.994745332980528, + "src/backend/tests/unit/api/v1/test_store.py::test_check_if_store_is_enabled": 2.7539579580770805, + "src/backend/tests/unit/api/v1/test_users.py::test_add_user": 3.375446125981398, + "src/backend/tests/unit/api/v1/test_users.py::test_delete_user": 10.198052583087701, + "src/backend/tests/unit/api/v1/test_users.py::test_patch_user": 8.652439667028375, + "src/backend/tests/unit/api/v1/test_users.py::test_read_all_users": 11.195519583008718, + "src/backend/tests/unit/api/v1/test_users.py::test_read_current_user": 5.5382680839975365, + "src/backend/tests/unit/api/v1/test_users.py::test_reset_password": 10.242465749906842, + "src/backend/tests/unit/api/v1/test_validate.py::test_post_validate_code": 4.213813498907257, + "src/backend/tests/unit/api/v1/test_validate.py::test_post_validate_prompt": 3.6564091249601915, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable": 7.6400237930356525, "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__Exception": 5.891528583015315, "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__HTTPException": 2.8841335409670137, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__exception": 4.416810167022049, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__httpexception": 2.779732874012552, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__exception": 5.508144042978529, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__httpexception": 5.243577708955854, "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_alread_exists": 3.690157334029209, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_already_exists": 13.62650291697355, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_and_value_cannot_be_empty": 2.4213992079603486, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_cannot_be_empty": 2.686067708011251, - "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_value_cannot_be_empty": 2.3703256670269184, - "src/backend/tests/unit/api/v1/test_variable.py::test_delete_variable": 1.8349529590341263, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_already_exists": 9.523341415973846, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_and_value_cannot_be_empty": 18.439957875059918, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_name_cannot_be_empty": 6.581812874937896, + "src/backend/tests/unit/api/v1/test_variable.py::test_create_variable__variable_value_cannot_be_empty": 5.08958170801634, + "src/backend/tests/unit/api/v1/test_variable.py::test_delete_variable": 13.12395379098598, "src/backend/tests/unit/api/v1/test_variable.py::test_delete_variable__Exception": 3.1565893749939278, - "src/backend/tests/unit/api/v1/test_variable.py::test_delete_variable__exception": 13.154085125017446, - "src/backend/tests/unit/api/v1/test_variable.py::test_read_variables": 2.757411584025249, - "src/backend/tests/unit/api/v1/test_variable.py::test_read_variables__": 3.637667417060584, - "src/backend/tests/unit/api/v1/test_variable.py::test_read_variables__empty": 3.7034704579855315, - "src/backend/tests/unit/api/v1/test_variable.py::test_update_variable": 2.858990293054376, + "src/backend/tests/unit/api/v1/test_variable.py::test_delete_variable__exception": 7.070807457959745, + "src/backend/tests/unit/api/v1/test_variable.py::test_read_variables": 6.992716542968992, + "src/backend/tests/unit/api/v1/test_variable.py::test_read_variables__": 7.703052208002191, + "src/backend/tests/unit/api/v1/test_variable.py::test_read_variables__empty": 8.513403624936473, + "src/backend/tests/unit/api/v1/test_variable.py::test_update_variable": 9.412867625011131, "src/backend/tests/unit/api/v1/test_variable.py::test_update_variable__Exception": 3.202228542009834, - "src/backend/tests/unit/api/v1/test_variable.py::test_update_variable__exception": 4.347305501054507, - "src/backend/tests/unit/base/load/test_load.py::test_run_flow_from_json_params": 0.0014367500552907586, + "src/backend/tests/unit/api/v1/test_variable.py::test_update_variable__exception": 8.779379958985373, + "src/backend/tests/unit/base/load/test_load.py::test_run_flow_from_json_params": 0.001104209921322763, "src/backend/tests/unit/base/models/test_model_constants.py::test_provider_names": 0.024663168034749106, "src/backend/tests/unit/base/tools/test_component_tool.py::test_component_tool": 0.04467487393412739, - "src/backend/tests/unit/base/tools/test_component_toolkit.py::test_component_tool": 0.1196131250471808, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_chain_end_event": 0.0031461670296266675, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_chain_start_event": 0.41959074995247647, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_chain_stream_event": 0.003502250008750707, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_empty_data": 0.003317043010611087, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_no_output": 0.0031987499678507447, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_with_empty_return_values": 0.0031257080263458192, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_with_output": 0.002732874942012131, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_start_no_input": 0.0035242490121163428, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_start_with_input": 0.01647449895972386, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_stream_no_output": 0.004321499960497022, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_stream_with_output": 0.0033161240280605853, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_tool_end": 0.0034351240028627217, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_tool_error": 0.0045179169974289834, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_tool_start": 0.004680416022893041, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_multiple_events": 0.003887208004016429, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_tool_end_event": 0.002465625002514571, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_tool_error_event": 0.00482704205205664, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_tool_start_event": 0.005946709017734975, - "src/backend/tests/unit/components/agents/test_agent_events.py::test_unknown_event": 0.002935541037004441, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_correctly_builds_output_model": 0.0057195828994736075, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_empty_output_schema": 0.0016070419223979115, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_handles_multiple_outputs": 0.003055208013392985, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_invalid_llm_config": 0.0011500419932417572, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_invalid_output_schema_type": 0.0012654169695451856, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_large_input_value": 0.0019090840360149741, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_nested_output_schema": 0.0024119180161505938, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_raises_value_error_for_unsupported_language_model": 0.0017231259844265878, - "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_successful_structured_output_generation_with_patch_with_config": 0.009122917021159083, + "src/backend/tests/unit/base/tools/test_component_toolkit.py::test_component_tool": 0.2721530419657938, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_chain_end_event": 0.003993541933596134, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_chain_start_event": 0.3248960829805583, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_chain_stream_event": 0.0025620009982958436, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_empty_data": 0.01059220900060609, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_no_output": 0.002384292078204453, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_with_empty_return_values": 0.003105833020526916, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_end_with_output": 0.0011961670243181288, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_start_no_input": 0.000955582014285028, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_start_with_input": 0.0018145000794902444, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_stream_no_output": 0.004022708046250045, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_chain_stream_with_output": 0.007465375063475221, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_tool_end": 0.3892010410199873, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_tool_error": 0.00856854097219184, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_handle_on_tool_start": 0.004705625062342733, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_multiple_events": 0.0022659170208498836, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_tool_end_event": 0.002557125990279019, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_tool_error_event": 0.0017416659975424409, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_tool_start_event": 0.003035415953490883, + "src/backend/tests/unit/components/agents/test_agent_events.py::test_unknown_event": 0.0021061249426566064, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_correctly_builds_output_model": 0.006605333008337766, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_empty_output_schema": 0.0018744580447673798, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_handles_multiple_outputs": 0.003787333960644901, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_invalid_llm_config": 0.42860454198671505, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_invalid_output_schema_type": 0.0015874580130912364, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_large_input_value": 0.07119795901235193, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_nested_output_schema": 0.002635083976201713, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_raises_value_error_for_unsupported_language_model": 0.005167708033695817, + "src/backend/tests/unit/components/helpers/test_structured_output_component.py::TestStructuredOutputComponent::test_successful_structured_output_generation_with_patch_with_config": 0.048270041996147484, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_all_versions_have_a_file_name_defined": 4.68325641710544, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_component_versions[1.0.17]": 4.332370791060384, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_component_versions[1.0.18]": 3.6762167080305517, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_component_versions[1.0.19]": 14.638537125021685, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_latest_version": 13.593114709074143, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_message_response": 4.271493208943866, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_message_response_ai_sender": 4.163087957946118, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_message_response_with_files": 2.956699290953111, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_message_response_without_session": 6.493668459006585, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestChatInput::test_message_storage_disabled": 3.173080001026392, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestTextInputComponent::test_all_versions_have_a_file_name_defined": 0.0006126250373199582, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestTextInputComponent::test_component_versions[1.0.17]": 0.26945149997482076, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestTextInputComponent::test_component_versions[1.0.18]": 0.28087970800697803, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestTextInputComponent::test_component_versions[1.0.19]": 0.3164794570184313, + "src/backend/tests/unit/components/inputs/test_input_components.py::TestTextInputComponent::test_latest_version": 0.004135833005420864, "src/backend/tests/unit/components/models/test_ChatOllama_component.py::test_build_model": 0.0020211669616401196, "src/backend/tests/unit/components/models/test_ChatOllama_component.py::test_get_model_failure": 0.0068002091138623655, "src/backend/tests/unit/components/models/test_ChatOllama_component.py::test_get_model_success": 0.015780292043928057, @@ -154,602 +169,640 @@ "src/backend/tests/unit/components/models/test_ChatOllama_component.py::test_update_build_config_mirostat_disabled": 0.0013394170091487467, "src/backend/tests/unit/components/models/test_ChatOllama_component.py::test_update_build_config_mirostat_enabled": 0.0016756660188548267, "src/backend/tests/unit/components/models/test_ChatOllama_component.py::test_update_build_config_model_name": 0.0062951669679023325, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_build_model": 0.05815512494882569, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_get_model_failure": 0.023584623995702714, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_get_model_success": 0.021688584005460143, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_keep_alive": 0.003615666995756328, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_mirostat_disabled": 0.0030736250337213278, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_mirostat_enabled": 0.0017204579780809581, - "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_model_name": 0.018433375051245093, - "src/backend/tests/unit/components/models/test_huggingface.py::test_huggingface_inputs": 0.001714667014311999, - "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_post_code_processing": 0.0015109580126591027, - "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_build_data": 0.0016140410443767905, - "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_get_data": 0.0008367500267922878, - "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_update_build_config": 0.001162625034339726, - "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_update_build_config_exceed_limit": 0.005139043089002371, - "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_validate_text_key_invalid": 0.0006456660339608788, - "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_validate_text_key_valid": 0.0006595409940928221, - "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_build_data": 0.006239999027457088, - "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_get_data": 0.0011950000771321356, - "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_update_build_config": 0.0019992499728687108, - "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_update_build_config_exceed_limit": 0.002255084051284939, - "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_validate_text_key_invalid": 0.000936791009735316, - "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_validate_text_key_valid": 0.0009394589578732848, - "src/backend/tests/unit/components/tools/test_python_repl_tool.py::test_python_repl_tool_template": 0.011357625015079975, - "src/backend/tests/unit/components/tools/test_yfinance_tool.py::test_yfinance_tool_template": 0.011375251051504165, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_build_model": 0.5424456250621006, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_get_model_failure": 0.02869520796230063, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_get_model_success": 0.03772675001528114, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_keep_alive": 0.003645332937594503, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_mirostat_disabled": 0.0068652910413220525, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_mirostat_enabled": 0.002280915970914066, + "src/backend/tests/unit/components/models/test_chatollama_component.py::test_update_build_config_model_name": 0.027383459033444524, + "src/backend/tests/unit/components/models/test_huggingface.py::test_huggingface_inputs": 0.0036795829655602574, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestChatOutput::test_all_versions_have_a_file_name_defined": 4.929010958992876, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestChatOutput::test_component_versions[1.0.17]": 3.6106157921021804, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestChatOutput::test_component_versions[1.0.18]": 3.6919090420706198, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestChatOutput::test_component_versions[1.0.19]": 6.205068957002368, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestChatOutput::test_latest_version": 15.59224450099282, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestTextOutputComponent::test_all_versions_have_a_file_name_defined": 0.0006804580334573984, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestTextOutputComponent::test_component_versions[1.0.17]": 0.27941045799525455, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestTextOutputComponent::test_component_versions[1.0.18]": 0.24612879107007757, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestTextOutputComponent::test_component_versions[1.0.19]": 0.2520155839738436, + "src/backend/tests/unit/components/outputs/test_output_components.py::TestTextOutputComponent::test_latest_version": 0.004372042021714151, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_all_versions_have_a_file_name_defined": 6.5992512500379235, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_component_versions[1.0.17]": 15.071019583090674, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_component_versions[1.0.18]": 5.277748624968808, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_component_versions[1.0.19]": 3.7366805419442244, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_latest_version": 3.048528416955378, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_post_code_processing": 2.9444095420767553, + "src/backend/tests/unit/components/prompts/test_prompt_component.py::TestPromptComponent::test_prompt_component_latest": 3.2254391679889522, + "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_build_data": 0.00809974892763421, + "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_get_data": 0.0010328330099582672, + "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_update_build_config": 0.0025881679612211883, + "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_update_build_config_exceed_limit": 0.002204833028372377, + "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_validate_text_key_invalid": 0.40779066702816635, + "src/backend/tests/unit/components/prototypes/test_create_data_component.py::test_validate_text_key_valid": 0.0007839579484425485, + "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_build_data": 0.006052583048585802, + "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_get_data": 0.002145332924555987, + "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_update_build_config": 0.0029222500161267817, + "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_update_build_config_exceed_limit": 0.0013998749782331288, + "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_validate_text_key_invalid": 0.0031065840157680213, + "src/backend/tests/unit/components/prototypes/test_update_data_component.py::test_validate_text_key_valid": 0.0014885000418871641, + "src/backend/tests/unit/components/tools/test_python_repl_tool.py::test_python_repl_tool_template": 0.012524250021670014, + "src/backend/tests/unit/components/tools/test_yfinance_tool.py::test_yfinance_tool_template": 0.052305375051219016, "src/backend/tests/unit/custom/component/test_component_to_tool.py::test_component_to_tool": 0.019733334018383175, "src/backend/tests/unit/custom/component/test_component_to_tool.py::test_component_to_tool_has_no_component_as_tool": 0.0017144169833045453, - "src/backend/tests/unit/custom/component/test_component_to_tool.py::test_component_to_toolkit": 0.004081916995346546, - "src/backend/tests/unit/custom/component/test_componet_set_functionality.py::test_set_with_message_text_input_list": 0.0017268330557271838, - "src/backend/tests/unit/custom/component/test_componet_set_functionality.py::test_set_with_mixed_list_input": 0.004446917038876563, - "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_component": 0.0015936249983496964, - "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_invalid_output": 0.0032142079435288906, - "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_required_inputs": 0.0009162090136669576, - "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_required_inputs_various_components": 0.009080707968678325, - "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_build_results": 1.522718749998603, - "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_error_handling": 4.2030872499453835, - "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_logging": 1.9351595000480302, - "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_message_sending": 11.93795562494779, - "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_streaming_message": 1.8019379999605007, - "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_tool_output": 1.8185450420132838, - "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_custom_update": 0.0008805410470813513, - "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_invalid_output": 0.000512125960085541, - "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_output_validation": 0.002503083029296249, - "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_tool_mode": 0.0013509579584933817, - "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_with_existing_tool_output": 0.0017645410262048244, - "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_with_multiple_outputs": 0.0005928330938331783, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_accessing_non_registered_callback": 0.00044916599290445447, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_accessing_non_registered_event_callback_with_recommended_fix": 0.0003390010679140687, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_accessing_registered_event_callback": 0.00024991598911583424, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_event_id_uniqueness_with_await": 0.0026247500209137797, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_handling_large_number_of_events": 0.0006205420941114426, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_performance_impact_frequent_registrations": 0.0012078340514563024, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_queue_receives_correct_event_data_format": 0.00462833303026855, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_empty_name": 0.00041325093479827046, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_invalid_name_fixed": 0.00030162499751895666, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_valid_name_and_callback_with_mock_callback": 0.0013502090005204082, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_valid_name_and_no_callback": 0.0002652100520208478, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_without_event_type_argument_fixed": 0.002235958003439009, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_sending_event_with_complex_data": 0.004761000047437847, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_sending_event_with_none_data": 0.0002628749352879822, + "src/backend/tests/unit/custom/component/test_component_to_tool.py::test_component_to_toolkit": 0.00459049892378971, + "src/backend/tests/unit/custom/component/test_componet_set_functionality.py::test_set_with_message_text_input_list": 0.0006322080153040588, + "src/backend/tests/unit/custom/component/test_componet_set_functionality.py::test_set_with_mixed_list_input": 0.0017400420038029552, + "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_component": 0.0031778750708326697, + "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_invalid_output": 0.0024893319932743907, + "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_required_inputs": 0.0012606249656528234, + "src/backend/tests/unit/custom/custom_component/test_component.py::test_set_required_inputs_various_components": 0.00524666701676324, + "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_build_results": 14.507268832006957, + "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_error_handling": 7.061123582941946, + "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_logging": 4.752659916994162, + "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_message_sending": 13.630752041004598, + "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_streaming_message": 3.42311791802058, + "src/backend/tests/unit/custom/custom_component/test_component_events.py::test_component_tool_output": 4.239101541053969, + "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_custom_update": 0.0010772899840958416, + "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_invalid_output": 0.0015433739754371345, + "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_output_validation": 0.0006789580220356584, + "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_tool_mode": 0.0023050420568324625, + "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_with_existing_tool_output": 0.0006414580275304615, + "src/backend/tests/unit/custom/custom_component/test_update_outputs.py::TestComponentOutputs::test_run_and_validate_update_outputs_with_multiple_outputs": 0.0005602079909294844, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_accessing_non_registered_callback": 0.000849166011903435, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_accessing_non_registered_event_callback_with_recommended_fix": 0.0033352079917676747, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_accessing_registered_event_callback": 0.002013664983678609, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_event_id_uniqueness_with_await": 0.0027653760043904185, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_handling_large_number_of_events": 0.002990083070471883, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_performance_impact_frequent_registrations": 0.0016739160055294633, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_queue_receives_correct_event_data_format": 0.0021674169111065567, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_empty_name": 0.0007164580165408552, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_invalid_name_fixed": 0.000819833017885685, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_valid_name_and_callback_with_mock_callback": 0.0010640010004863143, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_with_valid_name_and_no_callback": 0.0005781679647043347, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_register_event_without_event_type_argument_fixed": 0.0010473329457454383, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_sending_event_with_complex_data": 0.001738749968353659, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_sending_event_with_none_data": 0.0010254569933749735, "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_sending_event_with_valid_type_and_data_asyncio_plugin": 0.007096707937307656, - "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_thread_safety_accessing_events_dictionary": 0.008751457964535803, - "src/backend/tests/unit/exceptions/test_api.py::test_api_exception": 0.004037750011775643, - "src/backend/tests/unit/exceptions/test_api.py::test_api_exception_no_flow": 0.0003051239182241261, - "src/backend/tests/unit/graph/edge/test_edge_base.py::test_edge_raises_error_on_invalid_target_handle": 0.028969040955416858, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_and_assign_values_fails": 0.002509708981961012, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_with_fields_from_kwargs": 0.0015128339873626828, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_with_invalid_callable": 0.001136915001552552, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_with_valid_return_type_annotations": 0.003671207930892706, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_with_multiple_components": 0.0030033339862711728, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_with_pydantic_field": 0.0027249569538980722, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_default_model_name_to_state": 0.0006715419585816562, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_graph_functional_start_state_update": 0.0040702500264160335, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_handle_empty_kwargs_gracefully": 0.0004774159751832485, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_raise_typeerror_for_invalid_field_type_in_tuple": 0.0004116260097362101, + "src/backend/tests/unit/events/test_event_manager.py::TestEventManager::test_thread_safety_accessing_events_dictionary": 0.007714917010162026, + "src/backend/tests/unit/exceptions/test_api.py::test_api_exception": 0.0023352080024778843, + "src/backend/tests/unit/exceptions/test_api.py::test_api_exception_no_flow": 0.0005717500462196767, + "src/backend/tests/unit/graph/edge/test_edge_base.py::test_edge_raises_error_on_invalid_target_handle": 0.05438312498154119, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_and_assign_values_fails": 0.006554040999617428, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_with_fields_from_kwargs": 0.0010872500133700669, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_with_invalid_callable": 0.0005308749969117343, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_model_with_valid_return_type_annotations": 0.0038657920085825026, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_with_multiple_components": 0.486858208081685, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_create_with_pydantic_field": 0.008767083985731006, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_default_model_name_to_state": 0.002092998940497637, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_graph_functional_start_state_update": 0.0002719170297496021, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_handle_empty_kwargs_gracefully": 0.000787625031080097, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_raise_typeerror_for_invalid_field_type_in_tuple": 0.0009870820795185864, "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_raise_valueerror_for_invalid_field_type_in_tuple": 0.00342700001783669, - "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_raise_valueerror_for_unsupported_value_types": 0.00034600100480020046, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph": 1.8664495000848547, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional": 0.07218241697410122, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional_async_start": 0.11505883297650144, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional_start": 1.4226566250436008, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional_start_end": 0.030356583010870963, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_not_prepared": 0.037500042002648115, + "src/backend/tests/unit/graph/graph/state/test_state_model.py::TestCreateStateModel::test_raise_valueerror_for_unsupported_value_types": 0.0030094989924691617, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph": 0.299653833033517, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional": 0.057052624004427344, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional_async_start": 0.15922020800644532, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional_start": 0.018586749967653304, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_functional_start_end": 0.0257710840087384, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_not_prepared": 0.013017875084187835, "src/backend/tests/unit/graph/graph/test_base.py::test_graph_set_with_invalid_component": 0.0009155830484814942, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_set_with_valid_component": 0.00019387598149478436, - "src/backend/tests/unit/graph/graph/test_base.py::test_graph_with_edge": 0.1054259579977952, - "src/backend/tests/unit/graph/graph/test_callback_graph.py::test_callback_graph": 0.00015587499365210533, - "src/backend/tests/unit/graph/graph/test_cycles.py::test_conditional_router_max_iterations": 0.041235500015318394, - "src/backend/tests/unit/graph/graph/test_cycles.py::test_cycle_in_graph": 0.000267457973677665, - "src/backend/tests/unit/graph/graph/test_cycles.py::test_cycle_in_graph_max_iterations": 0.037366332951933146, - "src/backend/tests/unit/graph/graph/test_cycles.py::test_that_outputs_cache_is_set_to_false_in_cycle": 0.010305042087566108, - "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_functional_start_graph_state_update": 0.018378626031335443, - "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_state_model": 0.02349175198469311, - "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_state_model_json_schema": 0.00039483298314735293, - "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_state_model_serialization": 0.018142791057471186, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_add_to_vertices_being_run": 0.0002476670197211206, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_are_all_predecessors_fulfilled": 0.0011267910012975335, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_are_all_predecessors_fulfilled__wrong": 0.0003554169670678675, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_build_run_map": 0.00026812596479430795, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict": 0.000963873986620456, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_run_map__bad_case": 0.001472541014663875, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_run_predecessors__bad_case": 0.0010348749347031116, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_vertices_being_run__bad_case": 0.001993166981264949, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_vertices_to_run__bad_case": 0.0003054160042665899, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable": 0.0002876249491237104, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable__wrong_is_active": 0.00024312501773238182, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable__wrong_run_predecessors": 0.0005400410736910999, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable__wrong_vertices_to_run": 0.0014861250529065728, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_pickle": 0.0011441680253483355, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_remove_from_predecessors": 0.00044087396236136556, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_remove_vertex_from_runnables": 0.0005044579738751054, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_to_dict": 0.0017160000279545784, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_update_run_state": 0.0003283339901827276, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_update_vertex_run_state": 0.0005591660155914724, - "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_update_vertex_run_state__bad_case": 0.0004551669699139893, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_detects_cycles_in_simple_graph": 0.00026724993949756026, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_disconnected_components": 0.0002821669913828373, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_duplicate_edges": 0.00021912500960752368, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_identifies_multiple_cycles": 0.00025812501553446054, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_large_graphs_efficiency": 0.0007382910698652267, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_mixed_data_types_in_edges": 0.00021845696028321981, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_multiple_edges_between_same_nodes": 0.0002460830728523433, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_no_cycles_present": 0.0002756660105660558, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_nodes_with_no_incoming_edges": 0.00021979294251650572, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_nodes_with_no_outgoing_edges": 0.0003090410609729588, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_self_loops": 0.000253000995144248, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_single_node_no_edges": 0.00026000093203037977, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_detects_cycle_in_simple_graph": 0.00045262498315423727, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_disconnected_components": 0.00022062496282160282, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_duplicate_edges": 0.0007739180000498891, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_empty_edges_list": 0.0002501250128261745, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_identifies_first_cycle": 0.000237041967920959, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_large_graph_efficiency": 0.0009104579803533852, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_multiple_cycles": 0.0002475010114721954, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_multiple_edges_between_same_nodes": 0.00023878994397819042, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_nodes_with_no_outgoing_edges": 0.00029970903415232897, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_returns_none_when_no_cycle": 0.00024695793399587274, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_self_loop_cycle": 0.000244333001319319, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_single_node_no_edges": 0.00023858301574364305, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_correctly_identify_and_return_vertices_in_single_cycle": 0.00028429104713723063, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_detect_cycles_simple_graph": 0.0007923329831101, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_duplicate_edges_fixed_fixed": 0.000366666994523257, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_empty_edges": 0.00023050099844112992, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_large_graphs_efficiently": 0.0004664169973693788, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_no_outgoing_edges": 0.0002648750669322908, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_self_loops": 0.0009492079843766987, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_single_cycle": 0.0002994999522343278, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[0]": 0.00038199900882318616, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[1]": 0.0008092499920167029, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[2]": 0.0015593329444527626, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[3]": 0.0006993749993853271, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[4]": 0.00036212499253451824, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_no_cycles_empty_list": 0.00025908404495567083, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_no_modification_of_input_edges_list": 0.0003286660648882389, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_non_string_vertex_ids": 0.00036191800609230995, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_process_disconnected_components": 0.0005638339789584279, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_return_vertices_involved_in_multiple_cycles": 0.0003491259994916618, - "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_single_vertex_no_edges": 0.00023916596546769142, - "src/backend/tests/unit/graph/graph/test_utils.py::test_get_successors_a": 0.0002698740572668612, - "src/backend/tests/unit/graph/graph/test_utils.py::test_get_successors_z": 0.0019688329775817692, - "src/backend/tests/unit/graph/graph/test_utils.py::test_has_cycle": 0.0003182920045219362, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_a": 0.0008160430006682873, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_g": 0.001312917040195316, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_h": 0.000272500969003886, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_invalid_vertex": 0.0019030409748665988, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_m": 0.0005449170130304992, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_n_is_start": 0.0005516259698197246, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_t": 0.0007446670206263661, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_x": 0.00027004204457625747, - "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_z": 0.00029762403573840857, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_set_with_valid_component": 0.0008794159512035549, + "src/backend/tests/unit/graph/graph/test_base.py::test_graph_with_edge": 0.1841340420069173, + "src/backend/tests/unit/graph/graph/test_callback_graph.py::test_callback_graph": 0.00022670807084068656, + "src/backend/tests/unit/graph/graph/test_cycles.py::test_conditional_router_max_iterations": 0.07288191694533452, + "src/backend/tests/unit/graph/graph/test_cycles.py::test_cycle_in_graph": 0.0009222920052707195, + "src/backend/tests/unit/graph/graph/test_cycles.py::test_cycle_in_graph_max_iterations": 0.0365961660281755, + "src/backend/tests/unit/graph/graph/test_cycles.py::test_that_outputs_cache_is_set_to_false_in_cycle": 0.01557679200777784, + "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_functional_start_graph_state_update": 0.019557916035410017, + "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_state_model": 0.06679470901144668, + "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_state_model_json_schema": 0.0008476660004816949, + "src/backend/tests/unit/graph/graph/test_graph_state_model.py::test_graph_state_model_serialization": 0.025244541990105063, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_add_to_vertices_being_run": 0.00043816695688292384, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_are_all_predecessors_fulfilled": 0.00046012498205527663, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_are_all_predecessors_fulfilled__wrong": 0.00042987492633983493, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_build_run_map": 0.0005316240713000298, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict": 0.001453207980375737, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_run_map__bad_case": 0.0005254180287010968, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_run_predecessors__bad_case": 0.00048383395187556744, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_vertices_being_run__bad_case": 0.00043433194514364004, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_from_dict_without_vertices_to_run__bad_case": 0.00045412604231387377, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable": 0.0014701670152135193, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable__wrong_is_active": 0.0010682920110411942, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable__wrong_run_predecessors": 0.0006670420407317579, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_is_vertex_runnable__wrong_vertices_to_run": 0.003944666008464992, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_pickle": 0.0018798750243149698, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_remove_from_predecessors": 0.00042870896868407726, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_remove_vertex_from_runnables": 0.0007312500383704901, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_to_dict": 0.001418291067238897, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_update_run_state": 0.0005861670942977071, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_update_vertex_run_state": 0.0005457920487970114, + "src/backend/tests/unit/graph/graph/test_runnable_vertices_manager.py::test_update_vertex_run_state__bad_case": 0.0009959579911082983, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_detects_cycles_in_simple_graph": 0.0017166239558719099, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_disconnected_components": 0.0004872079589404166, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_duplicate_edges": 0.000622499966993928, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_identifies_multiple_cycles": 0.0011768330004997551, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_large_graphs_efficiency": 0.41015291603980586, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_mixed_data_types_in_edges": 0.0013857499579899013, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_multiple_edges_between_same_nodes": 0.0004641660489141941, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_no_cycles_present": 0.0008597910637035966, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_nodes_with_no_incoming_edges": 0.0006504569901153445, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_nodes_with_no_outgoing_edges": 0.0003861250006593764, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_self_loops": 0.004291499906685203, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindAllCycleEdges::test_single_node_no_edges": 0.0004667909233830869, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_detects_cycle_in_simple_graph": 0.0005702919443137944, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_disconnected_components": 0.013516959035769105, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_duplicate_edges": 0.0004960830556228757, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_empty_edges_list": 0.0019840430468320847, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_identifies_first_cycle": 0.00475525000365451, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_large_graph_efficiency": 0.455076041049324, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_multiple_cycles": 0.0004070419818162918, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_multiple_edges_between_same_nodes": 0.000870124960783869, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_nodes_with_no_outgoing_edges": 0.00046762399142608047, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_returns_none_when_no_cycle": 0.00039566599298268557, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_self_loop_cycle": 0.0004055409808643162, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleEdge::test_single_node_no_edges": 0.0004566248971968889, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_correctly_identify_and_return_vertices_in_single_cycle": 0.0007215000223368406, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_detect_cycles_simple_graph": 0.0015605830121785402, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_duplicate_edges_fixed_fixed": 0.0005099999834783375, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_empty_edges": 0.0005222500185482204, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_large_graphs_efficiently": 0.0017760000191628933, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_no_outgoing_edges": 0.00047324999468401074, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_self_loops": 0.00355187599780038, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_single_cycle": 0.0005596659611910582, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[0]": 0.0004993749898858368, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[1]": 0.0005120409769006073, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[2]": 0.0004965430707670748, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[3]": 0.0005004170234315097, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_handle_two_inputs_in_cycle[4]": 0.001561833021696657, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_no_cycles_empty_list": 0.0005340829957276583, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_no_modification_of_input_edges_list": 0.0005342499352991581, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_non_string_vertex_ids": 0.0005282079800963402, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_process_disconnected_components": 0.0010307510383427143, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_return_vertices_involved_in_multiple_cycles": 0.0015681669465266168, + "src/backend/tests/unit/graph/graph/test_utils.py::TestFindCycleVertices::test_single_vertex_no_edges": 0.0004049980198033154, + "src/backend/tests/unit/graph/graph/test_utils.py::test_get_successors_a": 0.0008094579097814858, + "src/backend/tests/unit/graph/graph/test_utils.py::test_get_successors_z": 0.0004540829686447978, + "src/backend/tests/unit/graph/graph/test_utils.py::test_has_cycle": 0.0004121669917367399, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_a": 0.00047070899745449424, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_g": 0.0005278329481370747, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_h": 0.0005092909559607506, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_invalid_vertex": 0.0005278749740682542, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_m": 0.0005315819871611893, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_n_is_start": 0.0012841239804401994, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_t": 0.0018424569861963391, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_x": 0.0004580839886330068, + "src/backend/tests/unit/graph/graph/test_utils.py::test_sort_up_to_vertex_z": 0.000774251006077975, "src/backend/tests/unit/graph/test_graph.py::test_build_edges": 0.001086625037714839, "src/backend/tests/unit/graph/test_graph.py::test_build_nodes": 0.0012113330303691328, "src/backend/tests/unit/graph/test_graph.py::test_build_params": 0.00745550001738593, "src/backend/tests/unit/graph/test_graph.py::test_circular_dependencies": 0.0011518750106915832, - "src/backend/tests/unit/graph/test_graph.py::test_find_last_node": 0.002307749993633479, + "src/backend/tests/unit/graph/test_graph.py::test_find_last_node": 0.0011072929482907057, "src/backend/tests/unit/graph/test_graph.py::test_get_node": 3.6276886249543168, "src/backend/tests/unit/graph/test_graph.py::test_get_node_neighbors_basic": 0.0015942919999361038, "src/backend/tests/unit/graph/test_graph.py::test_get_root_vertex": 0.00336533400695771, "src/backend/tests/unit/graph/test_graph.py::test_get_vertices_with_target": 0.0015001240535639226, "src/backend/tests/unit/graph/test_graph.py::test_graph_structure": 3.660518125980161, - "src/backend/tests/unit/graph/test_graph.py::test_invalid_node_types": 0.026237833022605628, + "src/backend/tests/unit/graph/test_graph.py::test_invalid_node_types": 0.052840624877717346, "src/backend/tests/unit/graph/test_graph.py::test_matched_type": 0.0011828330461867154, "src/backend/tests/unit/graph/test_graph.py::test_pickle_graph": 0.025576499931048602, - "src/backend/tests/unit/graph/test_graph.py::test_process_flow": 0.001180750085040927, - "src/backend/tests/unit/graph/test_graph.py::test_process_flow_one_group": 0.00234074896434322, - "src/backend/tests/unit/graph/test_graph.py::test_process_flow_vector_store_grouped": 0.0031264160061255097, - "src/backend/tests/unit/graph/test_graph.py::test_serialize_graph": 0.034727626014500856, - "src/backend/tests/unit/graph/test_graph.py::test_set_new_target_handle": 0.0003109159297309816, - "src/backend/tests/unit/graph/test_graph.py::test_ungroup_node": 0.0010227089514955878, - "src/backend/tests/unit/graph/test_graph.py::test_update_source_handle": 0.00022512488067150116, - "src/backend/tests/unit/graph/test_graph.py::test_update_target_handle_proxy": 0.0004344579647295177, - "src/backend/tests/unit/graph/test_graph.py::test_update_template": 0.0004319589934311807, + "src/backend/tests/unit/graph/test_graph.py::test_process_flow": 0.0011989589547738433, + "src/backend/tests/unit/graph/test_graph.py::test_process_flow_one_group": 0.0048834989429451525, + "src/backend/tests/unit/graph/test_graph.py::test_process_flow_vector_store_grouped": 0.005389251047745347, + "src/backend/tests/unit/graph/test_graph.py::test_serialize_graph": 0.19784116704249755, + "src/backend/tests/unit/graph/test_graph.py::test_set_new_target_handle": 0.000650125031825155, + "src/backend/tests/unit/graph/test_graph.py::test_ungroup_node": 0.001186540990602225, + "src/backend/tests/unit/graph/test_graph.py::test_update_source_handle": 0.0009858329431153834, + "src/backend/tests/unit/graph/test_graph.py::test_update_target_handle_proxy": 0.0006855418905615807, + "src/backend/tests/unit/graph/test_graph.py::test_update_template": 0.0019641260732896626, "src/backend/tests/unit/graph/test_graph.py::test_validate_edges": 0.0010510420543141663, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_correctly_accesses_descriptions_recommended_fix": 0.0006701659876853228, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_create_model_from_valid_schema": 0.0010890840785577893, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_handle_empty_schema": 0.00046241702511906624, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_handle_large_schemas_efficiently": 0.0006454579415731132, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_handles_multiple_fields_fixed_with_instance_check": 0.0007467090617865324, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_manages_unknown_field_types": 0.0004999999073334038, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_nested_list_and_dict_types_handling": 0.000673624046612531, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_no_duplicate_field_names_fixed_fixed": 0.001717083971016109, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_process_schema_missing_optional_keys_updated": 0.0008960830164141953, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_raises_error_for_invalid_input_different_exception_with_specific_exception": 0.0002627489739097655, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_returns_valid_model_class": 0.0005503349239006639, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_schema_fields_with_none_default": 0.00063270702958107, - "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_supports_single_and_multiple_type_annotations": 0.0007200430845841765, - "src/backend/tests/unit/initial_setup/starter_projects/test_memory_chatbot.py::test_memory_chatbot": 12.820865958055947, - "src/backend/tests/unit/initial_setup/starter_projects/test_memory_chatbot.py::test_memory_chatbot_dump_components_and_edges": 0.012427791021764278, - "src/backend/tests/unit/initial_setup/starter_projects/test_memory_chatbot.py::test_memory_chatbot_dump_structure": 0.02846895798575133, - "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag": 1.9493195419781841, - "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag_add": 0.06917400000384077, - "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag_dump": 0.037611624982673675, - "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag_dump_components_and_edges": 0.03499108296819031, - "src/backend/tests/unit/inputs/test_inputs.py::test_bool_input_invalid": 0.0002666670479811728, - "src/backend/tests/unit/inputs/test_inputs.py::test_bool_input_valid": 0.0002622499596327543, - "src/backend/tests/unit/inputs/test_inputs.py::test_code_input_valid": 0.00045866600703448057, - "src/backend/tests/unit/inputs/test_inputs.py::test_data_input_valid": 0.0002644999767653644, - "src/backend/tests/unit/inputs/test_inputs.py::test_dict_input_invalid": 0.00023766793310642242, - "src/backend/tests/unit/inputs/test_inputs.py::test_dict_input_valid": 0.0002497490495443344, - "src/backend/tests/unit/inputs/test_inputs.py::test_dropdown_input_invalid": 0.0005181650049053133, - "src/backend/tests/unit/inputs/test_inputs.py::test_dropdown_input_valid": 0.0004622919950634241, - "src/backend/tests/unit/inputs/test_inputs.py::test_file_input_valid": 0.00024066702462732792, - "src/backend/tests/unit/inputs/test_inputs.py::test_float_input_invalid": 0.00033175002317875624, - "src/backend/tests/unit/inputs/test_inputs.py::test_float_input_valid": 0.0013439589529298246, - "src/backend/tests/unit/inputs/test_inputs.py::test_handle_input_invalid": 0.000246831972617656, - "src/backend/tests/unit/inputs/test_inputs.py::test_handle_input_valid": 0.0002542920410633087, - "src/backend/tests/unit/inputs/test_inputs.py::test_instantiate_input_comprehensive": 0.00035108200972899795, - "src/backend/tests/unit/inputs/test_inputs.py::test_instantiate_input_invalid": 0.00032504100818187, - "src/backend/tests/unit/inputs/test_inputs.py::test_instantiate_input_valid": 0.000264250033069402, - "src/backend/tests/unit/inputs/test_inputs.py::test_int_input_invalid": 0.0005710420082323253, - "src/backend/tests/unit/inputs/test_inputs.py::test_int_input_valid": 0.00026408396661281586, - "src/backend/tests/unit/inputs/test_inputs.py::test_message_text_input_invalid": 0.0003577919560484588, - "src/backend/tests/unit/inputs/test_inputs.py::test_message_text_input_valid": 0.00043400004506111145, - "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_input_invalid": 0.00033308297861367464, - "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_input_valid": 0.0003004170721396804, - "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_secret_input_invalid": 0.00037404202157631516, - "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_secret_input_valid": 0.00028283405117690563, - "src/backend/tests/unit/inputs/test_inputs.py::test_multiselect_input_invalid": 0.0002282499335706234, - "src/backend/tests/unit/inputs/test_inputs.py::test_multiselect_input_valid": 0.0002297920291312039, - "src/backend/tests/unit/inputs/test_inputs.py::test_nested_dict_input_invalid": 0.0003780000261031091, - "src/backend/tests/unit/inputs/test_inputs.py::test_nested_dict_input_valid": 0.0003223739913664758, - "src/backend/tests/unit/inputs/test_inputs.py::test_prompt_input_valid": 0.0006935019628144801, - "src/backend/tests/unit/inputs/test_inputs.py::test_secret_str_input_invalid": 0.00028462399495765567, - "src/backend/tests/unit/inputs/test_inputs.py::test_secret_str_input_valid": 0.00033654196886345744, - "src/backend/tests/unit/inputs/test_inputs.py::test_str_input_invalid": 0.0011346670216880739, - "src/backend/tests/unit/inputs/test_inputs.py::test_str_input_valid": 0.000880667008459568, - "src/backend/tests/unit/inputs/test_inputs.py::test_table_input_invalid": 0.00380275008501485, - "src/backend/tests/unit/inputs/test_inputs.py::test_table_input_valid": 0.001983581983949989, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_complex_nested_structures_handling": 0.0030952919623814523, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_default_values_assignment": 0.0005185420159250498, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_default_values_for_non_required_fields": 0.0007797080907039344, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_empty_list_of_inputs": 0.00041016493923962116, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_field_types_conversion": 0.0004856659797951579, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_fields_creation_with_correct_types_and_attributes": 0.000862583052366972, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_correctly_accesses_descriptions_recommended_fix": 0.001402207009959966, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_create_model_from_valid_schema": 0.0014792080037295818, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_handle_empty_schema": 0.0006853329832665622, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_handle_large_schemas_efficiently": 0.0038714580005034804, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_handles_multiple_fields_fixed_with_instance_check": 0.002737708971835673, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_manages_unknown_field_types": 0.000572166929487139, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_nested_list_and_dict_types_handling": 0.0010774589609354734, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_no_duplicate_field_names_fixed_fixed": 0.0009575420408509672, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_process_schema_missing_optional_keys_updated": 0.004373126022983342, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_raises_error_for_invalid_input_different_exception_with_specific_exception": 0.0006838740082457662, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_returns_valid_model_class": 0.0009906660416163504, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_schema_fields_with_none_default": 0.00677454104879871, + "src/backend/tests/unit/helpers/test_base_model_from_schema.py::TestBuildModelFromSchema::test_supports_single_and_multiple_type_annotations": 0.0013037090539000928, + "src/backend/tests/unit/initial_setup/starter_projects/test_memory_chatbot.py::test_memory_chatbot": 14.12408670905279, + "src/backend/tests/unit/initial_setup/starter_projects/test_memory_chatbot.py::test_memory_chatbot_dump_components_and_edges": 0.03351516596740112, + "src/backend/tests/unit/initial_setup/starter_projects/test_memory_chatbot.py::test_memory_chatbot_dump_structure": 0.17144795804051682, + "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag": 0.3473405829863623, + "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag_add": 0.8381384160020389, + "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag_dump": 0.06309883296489716, + "src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py::test_vector_store_rag_dump_components_and_edges": 0.07999312499305233, + "src/backend/tests/unit/inputs/test_inputs.py::test_bool_input_invalid": 0.000536374980583787, + "src/backend/tests/unit/inputs/test_inputs.py::test_bool_input_valid": 0.0006104999338276684, + "src/backend/tests/unit/inputs/test_inputs.py::test_code_input_valid": 0.0005208330112509429, + "src/backend/tests/unit/inputs/test_inputs.py::test_data_input_valid": 0.0005444589769467711, + "src/backend/tests/unit/inputs/test_inputs.py::test_dict_input_invalid": 0.00102133397012949, + "src/backend/tests/unit/inputs/test_inputs.py::test_dict_input_valid": 0.00038458401104435325, + "src/backend/tests/unit/inputs/test_inputs.py::test_dropdown_input_invalid": 0.0004951669834554195, + "src/backend/tests/unit/inputs/test_inputs.py::test_dropdown_input_valid": 0.0005388340214267373, + "src/backend/tests/unit/inputs/test_inputs.py::test_file_input_valid": 0.00044541602255776525, + "src/backend/tests/unit/inputs/test_inputs.py::test_float_input_invalid": 0.0003820420824922621, + "src/backend/tests/unit/inputs/test_inputs.py::test_float_input_valid": 0.0003817079705186188, + "src/backend/tests/unit/inputs/test_inputs.py::test_handle_input_invalid": 0.0016397080034948885, + "src/backend/tests/unit/inputs/test_inputs.py::test_handle_input_valid": 0.00042795896297320724, + "src/backend/tests/unit/inputs/test_inputs.py::test_instantiate_input_comprehensive": 0.0016204999992623925, + "src/backend/tests/unit/inputs/test_inputs.py::test_instantiate_input_invalid": 0.0004854589933529496, + "src/backend/tests/unit/inputs/test_inputs.py::test_instantiate_input_valid": 0.00041658402187749743, + "src/backend/tests/unit/inputs/test_inputs.py::test_int_input_invalid": 0.00038591696647927165, + "src/backend/tests/unit/inputs/test_inputs.py::test_int_input_valid": 0.00037670903839170933, + "src/backend/tests/unit/inputs/test_inputs.py::test_message_text_input_invalid": 0.0004557499778456986, + "src/backend/tests/unit/inputs/test_inputs.py::test_message_text_input_valid": 0.0004900419735349715, + "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_input_invalid": 0.0016861659823916852, + "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_input_valid": 0.00043870898662135005, + "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_secret_input_invalid": 0.0009606259409338236, + "src/backend/tests/unit/inputs/test_inputs.py::test_multiline_secret_input_valid": 0.0004552499740384519, + "src/backend/tests/unit/inputs/test_inputs.py::test_multiselect_input_invalid": 0.0005560839781537652, + "src/backend/tests/unit/inputs/test_inputs.py::test_multiselect_input_valid": 0.0006183339864946902, + "src/backend/tests/unit/inputs/test_inputs.py::test_nested_dict_input_invalid": 0.0006381240673363209, + "src/backend/tests/unit/inputs/test_inputs.py::test_nested_dict_input_valid": 0.0004671659553423524, + "src/backend/tests/unit/inputs/test_inputs.py::test_prompt_input_valid": 0.0004509580321609974, + "src/backend/tests/unit/inputs/test_inputs.py::test_secret_str_input_invalid": 0.00040929100941866636, + "src/backend/tests/unit/inputs/test_inputs.py::test_secret_str_input_valid": 0.00040845799958333373, + "src/backend/tests/unit/inputs/test_inputs.py::test_str_input_invalid": 0.0004486670368351042, + "src/backend/tests/unit/inputs/test_inputs.py::test_str_input_valid": 0.0006440419238060713, + "src/backend/tests/unit/inputs/test_inputs.py::test_table_input_invalid": 0.004844917915761471, + "src/backend/tests/unit/inputs/test_inputs.py::test_table_input_valid": 0.0007128759752959013, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_complex_nested_structures_handling": 0.0009185409871861339, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_default_values_assignment": 0.000979083008132875, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_default_values_for_non_required_fields": 0.0012265839613974094, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_empty_list_of_inputs": 0.0007537919445894659, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_field_types_conversion": 0.0007598749944008887, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_fields_creation_with_correct_types_and_attributes": 0.000744916032999754, "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_invalid_field_types_handling": 0.0005195839912630618, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_is_list_attribute_processing": 0.0005015420028939843, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_is_list_handling": 0.0006114579737186432, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_missing_attributes_handling": 0.0008052079356275499, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_missing_optional_attributes": 0.000468374986667186, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_mixed_required_optional_fields_processing": 0.002099290897604078, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_multiple_input_types": 0.0024241250357590616, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_non_standard_field_types_handling": 0.008301167981699109, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_none_default_value_handling": 0.0005369589780457318, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_options_attribute_processing": 0.0006440419820137322, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_options_handling": 0.0006011250079609454, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_passing_input_type_directly": 0.00027875008527189493, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_schema_model_creation": 0.0005466659786179662, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_single_input_type_conversion": 0.0004978319630026817, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_single_input_type_replica": 0.0006945840432308614, - "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_special_characters_in_names_handling": 0.0006890429649502039, - "src/backend/tests/unit/io/test_io_schema.py::test_create_input_schema": 0.001329874969087541, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_create_column_with_valid_formatter": 0.00028562499210238457, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_create_column_without_display_name": 0.0002880429965443909, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_create_with_type_instead_of_formatter": 0.00029345706570893526, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_default_sortable_filterable": 0.0007682930445298553, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_description_and_default": 0.0002763750380836427, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_formatter_explicitly_set_to_enum": 0.00034366699401289225, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_formatter_none_when_not_provided": 0.00028391601517796516, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_formatter_set_based_on_value": 0.00027029094053432345, - "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_invalid_formatter_raises_value_error": 0.0004301670123822987, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_allow_markdown_override": 0.0002733329893089831, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_initialize_with_empty_contents": 0.00028624996775761247, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_initialize_with_valid_title_and_contents": 0.0007044579833745956, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_invalid_contents_type": 0.0004489150596782565, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_media_url_handling": 0.0002673749695532024, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_serialize_contents": 0.0003351250197738409, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_single_content_conversion": 0.0008065829752013087, - "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_validate_different_content_types": 0.00029950099997222424, - "src/backend/tests/unit/schema/test_content_types.py::TestBaseContent::test_base_content_serialization": 0.0002906660665757954, - "src/backend/tests/unit/schema/test_content_types.py::TestBaseContent::test_base_content_with_duration": 0.00024025002494454384, - "src/backend/tests/unit/schema/test_content_types.py::TestBaseContent::test_base_content_with_header": 0.000263167021330446, - "src/backend/tests/unit/schema/test_content_types.py::TestCodeContent::test_code_content_creation": 0.0003462510067038238, - "src/backend/tests/unit/schema/test_content_types.py::TestCodeContent::test_code_content_without_title": 0.0004203749122098088, - "src/backend/tests/unit/schema/test_content_types.py::TestErrorContent::test_error_content_creation": 0.0007512079901061952, - "src/backend/tests/unit/schema/test_content_types.py::TestErrorContent::test_error_content_optional_fields": 0.0004739170544780791, - "src/backend/tests/unit/schema/test_content_types.py::TestJSONContent::test_json_content_complex_data": 0.00026983401039615273, - "src/backend/tests/unit/schema/test_content_types.py::TestJSONContent::test_json_content_creation": 0.0002479159738868475, - "src/backend/tests/unit/schema/test_content_types.py::TestMediaContent::test_media_content_creation": 0.0003469169605523348, - "src/backend/tests/unit/schema/test_content_types.py::TestMediaContent::test_media_content_without_caption": 0.0003001249278895557, - "src/backend/tests/unit/schema/test_content_types.py::TestTextContent::test_text_content_creation": 0.00026616599643602967, - "src/backend/tests/unit/schema/test_content_types.py::TestTextContent::test_text_content_with_duration": 0.0002679169992916286, - "src/backend/tests/unit/schema/test_content_types.py::TestToolContent::test_tool_content_creation": 0.001486831926740706, - "src/backend/tests/unit/schema/test_content_types.py::TestToolContent::test_tool_content_minimal": 0.00028129201382398605, - "src/backend/tests/unit/schema/test_content_types.py::TestToolContent::test_tool_content_with_error": 0.0016390830860473216, - "src/backend/tests/unit/schema/test_content_types.py::test_content_type_discrimination": 0.00027854100335389376, - "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_ai_response": 0.0002786249970085919, - "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_invalid_image_path": 0.0025373749085702, - "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_missing_required_keys": 0.0003245419356971979, - "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_with_image": 0.0013750839862041175, - "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_with_multiple_images": 0.001365667034406215, - "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_with_text_only": 0.00027658400358632207, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_is_list_attribute_processing": 0.0018215419840998948, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_is_list_handling": 0.0014141249703243375, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_missing_attributes_handling": 0.001391083002090454, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_missing_optional_attributes": 0.0011449579615145922, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_mixed_required_optional_fields_processing": 0.0009117089794017375, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_multiple_input_types": 0.0009237909689545631, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_non_standard_field_types_handling": 0.0008201660821214318, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_none_default_value_handling": 0.007394165964797139, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_options_attribute_processing": 0.0010842919582501054, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_options_handling": 0.0028388750506564975, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_passing_input_type_directly": 0.0004716250114142895, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_schema_model_creation": 0.0010370829259045422, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_single_input_type_conversion": 0.000817666994407773, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_single_input_type_replica": 0.0009272910538129508, + "src/backend/tests/unit/io/test_io_schema.py::TestCreateInputSchema::test_special_characters_in_names_handling": 0.0008028750889934599, + "src/backend/tests/unit/io/test_io_schema.py::test_create_input_schema": 0.0018281240481883287, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_create_column_with_valid_formatter": 0.00043487403308972716, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_create_column_without_display_name": 0.00044108304427936673, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_create_with_type_instead_of_formatter": 0.00042825000127777457, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_default_sortable_filterable": 0.0004893330042250454, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_description_and_default": 0.000436208036262542, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_formatter_explicitly_set_to_enum": 0.00042512593790888786, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_formatter_none_when_not_provided": 0.0004319160361774266, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_formatter_set_based_on_value": 0.0032795420265756547, + "src/backend/tests/unit/io/test_table_schema.py::TestColumn::test_invalid_formatter_raises_value_error": 0.0005619160365313292, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_allow_markdown_override": 0.0007385420030914247, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_initialize_with_empty_contents": 0.00043995899613946676, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_initialize_with_valid_title_and_contents": 0.0006906659691594541, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_invalid_contents_type": 0.0035303760087117553, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_media_url_handling": 0.00044174998765811324, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_serialize_contents": 0.0005166669725440443, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_single_content_conversion": 0.0004748329520225525, + "src/backend/tests/unit/schema/test_content_block.py::TestContentBlock::test_validate_different_content_types": 0.0005019590025767684, + "src/backend/tests/unit/schema/test_content_types.py::TestBaseContent::test_base_content_serialization": 0.0005225009517744184, + "src/backend/tests/unit/schema/test_content_types.py::TestBaseContent::test_base_content_with_duration": 0.0004538750508800149, + "src/backend/tests/unit/schema/test_content_types.py::TestBaseContent::test_base_content_with_header": 0.00046370801283046603, + "src/backend/tests/unit/schema/test_content_types.py::TestCodeContent::test_code_content_creation": 0.0014464589767158031, + "src/backend/tests/unit/schema/test_content_types.py::TestCodeContent::test_code_content_without_title": 0.0005543749430216849, + "src/backend/tests/unit/schema/test_content_types.py::TestErrorContent::test_error_content_creation": 0.009187582996673882, + "src/backend/tests/unit/schema/test_content_types.py::TestErrorContent::test_error_content_optional_fields": 0.0005242909537628293, + "src/backend/tests/unit/schema/test_content_types.py::TestJSONContent::test_json_content_complex_data": 0.0006029160576872528, + "src/backend/tests/unit/schema/test_content_types.py::TestJSONContent::test_json_content_creation": 0.003501500003039837, + "src/backend/tests/unit/schema/test_content_types.py::TestMediaContent::test_media_content_creation": 0.00045978999696671963, + "src/backend/tests/unit/schema/test_content_types.py::TestMediaContent::test_media_content_without_caption": 0.0012475420953705907, + "src/backend/tests/unit/schema/test_content_types.py::TestTextContent::test_text_content_creation": 0.0005805840482935309, + "src/backend/tests/unit/schema/test_content_types.py::TestTextContent::test_text_content_with_duration": 0.00043599994387477636, + "src/backend/tests/unit/schema/test_content_types.py::TestToolContent::test_tool_content_creation": 0.0060425419942475855, + "src/backend/tests/unit/schema/test_content_types.py::TestToolContent::test_tool_content_minimal": 0.0004899160121567547, + "src/backend/tests/unit/schema/test_content_types.py::TestToolContent::test_tool_content_with_error": 0.0006006248877383769, + "src/backend/tests/unit/schema/test_content_types.py::test_content_type_discrimination": 0.0004707080079242587, + "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_ai_response": 0.0007553750183433294, + "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_invalid_image_path": 0.0020117509411647916, + "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_missing_required_keys": 0.003872083965688944, + "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_with_image": 0.005397000000812113, + "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_with_multiple_images": 0.00231858401093632, + "src/backend/tests/unit/schema/test_schema_data.py::TestDataSchema::test_data_to_message_with_text_only": 0.000457082933280617, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_add_row_with_data_object": 0.0009851669892668724, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_add_row_with_dict": 0.0011295830481685698, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_add_rows_mixed_types": 0.0010345829650759697, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_add_rows_with_data_objects": 0.0013936659670434892, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_add_rows_with_dicts": 0.0009222090593539178, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_dataset_pandas_operations": 0.0056541659869253635, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_dataset_type_preservation": 0.0010897080646827817, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_dataset_with_null_values": 0.006292041973210871, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_from_data_list_basic": 0.0011627500061877072, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_from_data_list_empty": 0.000769167032558471, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_from_data_list_missing_fields": 0.0013791679521091282, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_from_data_list_nested_data": 0.0006946669891476631, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_data_objects": 0.0008566239848732948, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_dict_of_lists": 0.0006391669739969075, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_dicts": 0.0006488750223070383, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_invalid_list": 0.0005517911049537361, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_kwargs": 0.0006707079592160881, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_none": 0.0005569590139202774, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_init_with_pandas_dataframe": 0.0006148329703137279, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_to_data_list_basic": 0.0012798329698853195, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_to_data_list_empty": 0.0006355409859679639, + "src/backend/tests/unit/schema/test_schema_data_set.py::test_to_data_list_modified_data": 0.005120832996908575, "src/backend/tests/unit/schema/test_schema_message.py::test_message_async_prompt_serialization": 0.00209424999775365, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_from_ai_text": 0.00034754094667732716, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_from_human_text": 0.0012164590298198164, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_prompt_serialization": 1.9019360410165973, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_serialization": 0.0019001259934157133, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_to_lc_without_sender": 0.0017389999702572823, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_with_invalid_image_path": 0.0007534589967690408, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_with_multiple_images": 0.016659082961268723, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_with_single_image": 0.025450084009207785, - "src/backend/tests/unit/schema/test_schema_message.py::test_message_without_sender": 0.0003494169795885682, - "src/backend/tests/unit/services/variable/test_service.py::test_create_variable": 0.02396712393965572, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_from_ai_text": 0.000717707967851311, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_from_human_text": 0.01981404301477596, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_prompt_serialization": 0.010659291059710085, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_serialization": 0.005603916011750698, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_to_lc_without_sender": 0.0012116259895265102, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_with_invalid_image_path": 0.012249124993104488, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_with_multiple_images": 0.008984541927929968, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_with_single_image": 0.0050322499591857195, + "src/backend/tests/unit/schema/test_schema_message.py::test_message_without_sender": 0.017147415957879275, + "src/backend/tests/unit/services/variable/test_service.py::test_create_variable": 0.12367058300878853, "src/backend/tests/unit/services/variable/test_service.py::test_delete_varaible_by_id": 0.0060262500192038715, - "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable": 0.00510391709394753, + "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable": 0.13852529099676758, "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable__ValueError": 0.0035743750049732625, - "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable__valueerror": 0.0073865000158548355, - "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable_by_id": 0.005353167012799531, + "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable__valueerror": 0.13389224896673113, + "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable_by_id": 0.23882683302508667, "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable_by_id__ValueError": 0.27340612601256, - "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable_by_id__valueerror": 0.0034554169978946447, - "src/backend/tests/unit/services/variable/test_service.py::test_get_variable": 0.006138333003036678, + "src/backend/tests/unit/services/variable/test_service.py::test_delete_variable_by_id__valueerror": 0.08551437593996525, + "src/backend/tests/unit/services/variable/test_service.py::test_get_variable": 1.639018958027009, "src/backend/tests/unit/services/variable/test_service.py::test_get_variable__TypeError": 0.00458791694836691, "src/backend/tests/unit/services/variable/test_service.py::test_get_variable__ValueError": 0.003811584028881043, - "src/backend/tests/unit/services/variable/test_service.py::test_get_variable__typeerror": 0.008321874018292874, - "src/backend/tests/unit/services/variable/test_service.py::test_get_variable__valueerror": 0.006569876044522971, - "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__create_and_update": 0.0552749169874005, + "src/backend/tests/unit/services/variable/test_service.py::test_get_variable__typeerror": 0.06269808299839497, + "src/backend/tests/unit/services/variable/test_service.py::test_get_variable__valueerror": 0.05618170800153166, + "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__create_and_update": 3.3843642909196205, "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__donkey": 0.0002315010060556233, - "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__not_found_variable": 0.04962304187938571, - "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__skipping_environment_variable_storage": 0.0034132919972762465, - "src/backend/tests/unit/services/variable/test_service.py::test_list_variables": 0.008342625049408525, - "src/backend/tests/unit/services/variable/test_service.py::test_list_variables__empty": 0.0035083330585621297, - "src/backend/tests/unit/services/variable/test_service.py::test_update_variable": 0.03663441602839157, + "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__not_found_variable": 0.3952357500093058, + "src/backend/tests/unit/services/variable/test_service.py::test_initialize_user_variables__skipping_environment_variable_storage": 0.12352133297827095, + "src/backend/tests/unit/services/variable/test_service.py::test_list_variables": 0.03446671005804092, + "src/backend/tests/unit/services/variable/test_service.py::test_list_variables__empty": 0.0306314590270631, + "src/backend/tests/unit/services/variable/test_service.py::test_update_variable": 0.09110800107009709, "src/backend/tests/unit/services/variable/test_service.py::test_update_variable__ValueError": 0.0036237920285202563, - "src/backend/tests/unit/services/variable/test_service.py::test_update_variable__valueerror": 0.004020916006993502, - "src/backend/tests/unit/services/variable/test_service.py::test_update_variable_fields": 0.005824209074489772, - "src/backend/tests/unit/test_api_key.py::test_create_api_key": 2.760331876052078, - "src/backend/tests/unit/test_api_key.py::test_delete_api_key": 4.250179124006536, - "src/backend/tests/unit/test_api_key.py::test_get_api_keys": 11.92522079194896, + "src/backend/tests/unit/services/variable/test_service.py::test_update_variable__valueerror": 0.10927133297082037, + "src/backend/tests/unit/services/variable/test_service.py::test_update_variable_fields": 0.17550370702520013, + "src/backend/tests/unit/test_api_key.py::test_create_api_key": 18.83938020799542, + "src/backend/tests/unit/test_api_key.py::test_delete_api_key": 6.137278207985219, + "src/backend/tests/unit/test_api_key.py::test_get_api_keys": 20.69655299995793, "src/backend/tests/unit/test_cache.py::test_build_graph": 1.1988659180001378, - "src/backend/tests/unit/test_chat_endpoint.py::test_build_flow": 8.551071708032396, - "src/backend/tests/unit/test_chat_endpoint.py::test_build_flow_from_request_data": 5.552124626003206, - "src/backend/tests/unit/test_chat_endpoint.py::test_build_flow_with_frozen_path": 5.318790583114605, + "src/backend/tests/unit/test_chat_endpoint.py::test_build_flow": 14.65466554107843, + "src/backend/tests/unit/test_chat_endpoint.py::test_build_flow_from_request_data": 16.908311041013803, + "src/backend/tests/unit/test_chat_endpoint.py::test_build_flow_with_frozen_path": 11.523595459060743, "src/backend/tests/unit/test_cli.py::test_components_path": 0.1909987919498235, - "src/backend/tests/unit/test_cli.py::test_superuser": 0.10571425000671297, - "src/backend/tests/unit/test_custom_component.py::test_build_config_field_keys": 0.0003112919512204826, - "src/backend/tests/unit/test_custom_component.py::test_build_config_field_value_keys": 0.00025070906849578023, - "src/backend/tests/unit/test_custom_component.py::test_build_config_field_values_dict": 0.0002822090173140168, - "src/backend/tests/unit/test_custom_component.py::test_build_config_fields_dict": 0.0007648749742656946, - "src/backend/tests/unit/test_custom_component.py::test_build_config_has_fields": 0.00025216699577867985, - "src/backend/tests/unit/test_custom_component.py::test_build_config_no_code": 0.00024991604732349515, - "src/backend/tests/unit/test_custom_component.py::test_build_config_return_type": 0.00036433403147384524, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_get_tree": 0.0003267080173827708, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_init": 0.00029012502636760473, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_ann_assign": 0.00023275002604350448, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_arg_no_annotation": 0.00024983298499137163, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_arg_with_annotation": 0.0003472079406492412, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_assign": 0.0002852080506272614, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_callable_details_no_args": 0.0002649589441716671, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_classes": 0.0004057500045746565, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_classes_raises": 0.0002842499525286257, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_function_def_init": 0.00023675098782405257, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_function_def_not_init": 0.0002423340338282287, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_functions": 0.0003364600124768913, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_global_vars": 0.0002477499656379223, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_imports_import": 0.0003402500879019499, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_imports_importfrom": 0.0003161249333061278, - "src/backend/tests/unit/test_custom_component.py::test_code_parser_syntax_error": 0.0005928329774178565, - "src/backend/tests/unit/test_custom_component.py::test_component_code_null_error": 0.00034683302510529757, - "src/backend/tests/unit/test_custom_component.py::test_component_get_code_tree": 0.002789582998957485, - "src/backend/tests/unit/test_custom_component.py::test_component_get_code_tree_syntax_error": 0.0016098330379463732, - "src/backend/tests/unit/test_custom_component.py::test_component_get_function_valid": 0.0002673339331522584, - "src/backend/tests/unit/test_custom_component.py::test_component_init": 0.0002568330382928252, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_build_not_implemented": 0.0002595419646240771, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_build_template_config": 0.002081999904476106, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_class_template_validation_no_code": 0.0007612079498358071, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_code_tree_syntax_error": 0.0007237909594550729, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function": 0.001917583984322846, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_args": 0.000828583026304841, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_args_no_args": 0.0004628330352716148, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_return_type": 0.0007794589619152248, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_return_type_no_return_type": 0.0003956669825129211, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_valid": 0.0002475408837199211, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_main_class_name": 0.0006563340430147946, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_main_class_name_no_main_class": 0.00037370907375589013, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_init": 0.00027370802126824856, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_multiple_outputs": 0.00709158304380253, - "src/backend/tests/unit/test_custom_component.py::test_custom_component_subclass_from_lctoolcomponent": 0.0016188329900614917, + "src/backend/tests/unit/test_cli.py::test_superuser": 16.08649112598505, + "src/backend/tests/unit/test_custom_component.py::test_build_config_field_keys": 0.0005954569787718356, + "src/backend/tests/unit/test_custom_component.py::test_build_config_field_value_keys": 0.0005511239869520068, + "src/backend/tests/unit/test_custom_component.py::test_build_config_field_values_dict": 0.0011603750172071159, + "src/backend/tests/unit/test_custom_component.py::test_build_config_fields_dict": 0.0004557910142466426, + "src/backend/tests/unit/test_custom_component.py::test_build_config_has_fields": 0.0004163330886512995, + "src/backend/tests/unit/test_custom_component.py::test_build_config_no_code": 0.0005781250656582415, + "src/backend/tests/unit/test_custom_component.py::test_build_config_return_type": 0.00044308294309303164, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_get_tree": 0.0025172900641337037, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_init": 0.0008536260575056076, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_ann_assign": 0.000400999968405813, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_arg_no_annotation": 0.0010041670175269246, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_arg_with_annotation": 0.0006823750445619226, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_assign": 0.00043108296813443303, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_callable_details_no_args": 0.00047937396448105574, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_classes": 0.0005863329279236495, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_classes_raises": 0.0004338740254752338, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_function_def_init": 0.0006284999544732273, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_function_def_not_init": 0.0013642489211633801, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_functions": 0.0005214998964220285, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_global_vars": 0.0004331250092945993, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_imports_import": 0.0004867909592576325, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_parse_imports_importfrom": 0.0004110420122742653, + "src/backend/tests/unit/test_custom_component.py::test_code_parser_syntax_error": 0.0027130829985253513, + "src/backend/tests/unit/test_custom_component.py::test_component_code_null_error": 0.0006367079331539571, + "src/backend/tests/unit/test_custom_component.py::test_component_get_code_tree": 0.0025520839262753725, + "src/backend/tests/unit/test_custom_component.py::test_component_get_code_tree_syntax_error": 0.0007841669721528888, + "src/backend/tests/unit/test_custom_component.py::test_component_get_function_valid": 0.0006077919970266521, + "src/backend/tests/unit/test_custom_component.py::test_component_init": 0.0004697510157711804, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_build_not_implemented": 0.0018008740153163671, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_build_template_config": 0.0007920830394141376, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_class_template_validation_no_code": 0.0004356249119155109, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_code_tree_syntax_error": 0.0005107089527882636, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function": 0.0004903330118395388, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_args": 0.0009476670529693365, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_args_no_args": 0.0006492490065284073, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_return_type": 0.0014982910361140966, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_entrypoint_return_type_no_return_type": 0.0008545010350644588, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_function_valid": 0.001193791045807302, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_main_class_name": 0.0011499999673105776, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_get_main_class_name_no_main_class": 0.0004610830219462514, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_init": 0.0005609579384326935, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_multiple_outputs": 0.00494950101710856, + "src/backend/tests/unit/test_custom_component.py::test_custom_component_subclass_from_lctoolcomponent": 0.0023540419642813504, "src/backend/tests/unit/test_custom_component.py::test_list_flows_flow_objects": 1.981454541994026, "src/backend/tests/unit/test_custom_component.py::test_list_flows_return_type": 0.36947908403817564, "src/backend/tests/unit/test_custom_component_with_client.py::test_feature_flags_add_toolkit_output": 2.7484489580092486, - "src/backend/tests/unit/test_custom_component_with_client.py::test_list_flows_flow_objects": 15.2948470840347, - "src/backend/tests/unit/test_custom_component_with_client.py::test_list_flows_return_type": 2.0909082910511643, - "src/backend/tests/unit/test_data_class.py::test_add_method_for_integers": 0.00032416597241535783, - "src/backend/tests/unit/test_data_class.py::test_add_method_for_strings": 0.00024437595857307315, - "src/backend/tests/unit/test_data_class.py::test_add_method_with_non_overlapping_keys": 0.0015005830209702253, - "src/backend/tests/unit/test_data_class.py::test_conversion_from_document": 0.0002870820462703705, - "src/backend/tests/unit/test_data_class.py::test_conversion_to_document": 0.006023500929586589, - "src/backend/tests/unit/test_data_class.py::test_custom_attribute_get_set_del": 0.00029191700741648674, - "src/backend/tests/unit/test_data_class.py::test_custom_attribute_setting_and_getting": 0.0002585409674793482, - "src/backend/tests/unit/test_data_class.py::test_data_initialization": 0.0036302070366218686, - "src/backend/tests/unit/test_data_class.py::test_deep_copy": 0.0005384170217439532, - "src/backend/tests/unit/test_data_class.py::test_dir_includes_data_keys": 0.0003018759307451546, - "src/backend/tests/unit/test_data_class.py::test_dir_reflects_attribute_deletion": 0.00028354296227917075, - "src/backend/tests/unit/test_data_class.py::test_get_text_with_empty_data": 0.0002786670229397714, - "src/backend/tests/unit/test_data_class.py::test_get_text_with_none_data": 0.000253666948992759, - "src/backend/tests/unit/test_data_class.py::test_get_text_with_text_key": 0.00026395899476483464, - "src/backend/tests/unit/test_data_class.py::test_get_text_without_text_key": 0.0003883759491145611, - "src/backend/tests/unit/test_data_class.py::test_str_and_dir_methods": 0.00035749899689108133, - "src/backend/tests/unit/test_data_class.py::test_validate_data_with_extra_keys": 0.00032462505623698235, - "src/backend/tests/unit/test_data_components.py::test_build_with_multiple_urls": 0.3398302910500206, - "src/backend/tests/unit/test_data_components.py::test_directory_component_build_with_multithreading": 0.0018548330408520997, - "src/backend/tests/unit/test_data_components.py::test_directory_without_mocks": 0.22499099909327924, - "src/backend/tests/unit/test_data_components.py::test_failed_request": 2.583180084009655, - "src/backend/tests/unit/test_data_components.py::test_parse_curl": 0.0027002080460079014, - "src/backend/tests/unit/test_data_components.py::test_successful_get_request": 0.018577999027911574, - "src/backend/tests/unit/test_data_components.py::test_timeout": 0.022905833029653877, - "src/backend/tests/unit/test_data_components.py::test_url_component": 0.16144524893024936, - "src/backend/tests/unit/test_database.py::test_create_flow": 12.229048417066224, - "src/backend/tests/unit/test_database.py::test_create_flow_with_invalid_data": 2.6868192089605145, - "src/backend/tests/unit/test_database.py::test_create_flows": 4.125035000033677, - "src/backend/tests/unit/test_database.py::test_delete_flow": 2.5442660829867236, - "src/backend/tests/unit/test_database.py::test_delete_flows": 3.0459045830066316, - "src/backend/tests/unit/test_database.py::test_delete_flows_with_transaction_and_build": 4.557027917006053, - "src/backend/tests/unit/test_database.py::test_delete_folder_with_flows_with_transaction_and_build": 5.18562575004762, - "src/backend/tests/unit/test_database.py::test_delete_nonexistent_flow": 2.7361094990046695, - "src/backend/tests/unit/test_database.py::test_download_file": 2.763290834031068, - "src/backend/tests/unit/test_database.py::test_get_flows_from_folder_pagination": 11.799599416030105, - "src/backend/tests/unit/test_database.py::test_get_flows_from_folder_pagination_with_params": 2.5585727910511196, - "src/backend/tests/unit/test_database.py::test_get_nonexistent_flow": 2.387806957005523, + "src/backend/tests/unit/test_custom_component_with_client.py::test_list_flows_flow_objects": 17.66144891694421, + "src/backend/tests/unit/test_custom_component_with_client.py::test_list_flows_return_type": 3.6895808330737054, + "src/backend/tests/unit/test_data_class.py::test_add_method_for_integers": 0.0007197080412879586, + "src/backend/tests/unit/test_data_class.py::test_add_method_for_strings": 0.0004326250054873526, + "src/backend/tests/unit/test_data_class.py::test_add_method_with_non_overlapping_keys": 0.000820498971734196, + "src/backend/tests/unit/test_data_class.py::test_conversion_from_document": 0.00043512595584616065, + "src/backend/tests/unit/test_data_class.py::test_conversion_to_document": 0.0004772910033352673, + "src/backend/tests/unit/test_data_class.py::test_custom_attribute_get_set_del": 0.0005340419593267143, + "src/backend/tests/unit/test_data_class.py::test_custom_attribute_setting_and_getting": 0.000432959059253335, + "src/backend/tests/unit/test_data_class.py::test_data_initialization": 0.005194209050387144, + "src/backend/tests/unit/test_data_class.py::test_deep_copy": 0.0005101669230498374, + "src/backend/tests/unit/test_data_class.py::test_dir_includes_data_keys": 0.0004924590466544032, + "src/backend/tests/unit/test_data_class.py::test_dir_reflects_attribute_deletion": 0.0017790410201996565, + "src/backend/tests/unit/test_data_class.py::test_get_text_with_empty_data": 0.00217037508264184, + "src/backend/tests/unit/test_data_class.py::test_get_text_with_none_data": 0.0004432919668033719, + "src/backend/tests/unit/test_data_class.py::test_get_text_with_text_key": 0.0005417089560069144, + "src/backend/tests/unit/test_data_class.py::test_get_text_without_text_key": 0.0004322909517213702, + "src/backend/tests/unit/test_data_class.py::test_str_and_dir_methods": 0.0005785410176031291, + "src/backend/tests/unit/test_data_class.py::test_validate_data_with_extra_keys": 0.0005357069312594831, + "src/backend/tests/unit/test_data_components.py::test_build_with_multiple_urls": 2.1151568749919534, + "src/backend/tests/unit/test_data_components.py::test_directory_component_build_with_multithreading": 0.011123959033284336, + "src/backend/tests/unit/test_data_components.py::test_directory_without_mocks": 0.17772862600395456, + "src/backend/tests/unit/test_data_components.py::test_failed_request": 0.029582915944047272, + "src/backend/tests/unit/test_data_components.py::test_parse_curl": 0.003926167031750083, + "src/backend/tests/unit/test_data_components.py::test_successful_get_request": 0.04254975001094863, + "src/backend/tests/unit/test_data_components.py::test_timeout": 0.023703540966380388, + "src/backend/tests/unit/test_data_components.py::test_url_component": 2.0934785840217955, + "src/backend/tests/unit/test_database.py::test_create_flow": 9.63336912408704, + "src/backend/tests/unit/test_database.py::test_create_flow_with_invalid_data": 7.99890254199272, + "src/backend/tests/unit/test_database.py::test_create_flows": 6.6335652499692515, + "src/backend/tests/unit/test_database.py::test_delete_flow": 5.569406708993483, + "src/backend/tests/unit/test_database.py::test_delete_flows": 8.339419332973193, + "src/backend/tests/unit/test_database.py::test_delete_flows_with_transaction_and_build": 17.341612750082277, + "src/backend/tests/unit/test_database.py::test_delete_folder_with_flows_with_transaction_and_build": 18.712165542005096, + "src/backend/tests/unit/test_database.py::test_delete_nonexistent_flow": 5.561927457049023, + "src/backend/tests/unit/test_database.py::test_download_file": 8.309931666066404, + "src/backend/tests/unit/test_database.py::test_get_flows_from_folder_pagination": 8.433258625969756, + "src/backend/tests/unit/test_database.py::test_get_flows_from_folder_pagination_with_params": 6.076884167036042, + "src/backend/tests/unit/test_database.py::test_get_nonexistent_flow": 5.643563375982922, "src/backend/tests/unit/test_database.py::test_load_flows": 2.0784470409998903, "src/backend/tests/unit/test_database.py::test_migrate_transactions": 3.3142859160434455, "src/backend/tests/unit/test_database.py::test_migrate_transactions_no_duckdb": 4.5406213329406455, - "src/backend/tests/unit/test_database.py::test_read_flow": 2.6734563740319572, - "src/backend/tests/unit/test_database.py::test_read_flows": 11.382159418077208, - "src/backend/tests/unit/test_database.py::test_read_flows_components_only": 4.525152957008686, - "src/backend/tests/unit/test_database.py::test_read_flows_components_only_paginated": 5.195073916052934, - "src/backend/tests/unit/test_database.py::test_read_flows_custom_page_size": 3.262816000089515, - "src/backend/tests/unit/test_database.py::test_read_flows_invalid_page": 5.801138084032573, - "src/backend/tests/unit/test_database.py::test_read_flows_invalid_size": 11.92538437602343, - "src/backend/tests/unit/test_database.py::test_read_flows_no_pagination_params": 3.4370020409696735, - "src/backend/tests/unit/test_database.py::test_read_flows_pagination_with_flows": 3.6235305840382352, - "src/backend/tests/unit/test_database.py::test_read_flows_pagination_with_params": 4.564620042045135, + "src/backend/tests/unit/test_database.py::test_read_flow": 5.464680167031474, + "src/backend/tests/unit/test_database.py::test_read_flows": 5.605339083005674, + "src/backend/tests/unit/test_database.py::test_read_flows_components_only": 13.164865917002317, + "src/backend/tests/unit/test_database.py::test_read_flows_components_only_paginated": 14.011638292053249, + "src/backend/tests/unit/test_database.py::test_read_flows_custom_page_size": 29.08755066600861, + "src/backend/tests/unit/test_database.py::test_read_flows_invalid_page": 21.271162707940675, + "src/backend/tests/unit/test_database.py::test_read_flows_invalid_size": 21.29230487596942, + "src/backend/tests/unit/test_database.py::test_read_flows_no_pagination_params": 30.243587833014317, + "src/backend/tests/unit/test_database.py::test_read_flows_pagination_with_flows": 23.71149004198378, + "src/backend/tests/unit/test_database.py::test_read_flows_pagination_with_params": 4.948266376042739, "src/backend/tests/unit/test_database.py::test_read_flows_pagination_without_params": 2.8355551669956185, - "src/backend/tests/unit/test_database.py::test_read_folder": 2.6198389580240473, - "src/backend/tests/unit/test_database.py::test_read_folder_with_component_filter": 2.297788125986699, - "src/backend/tests/unit/test_database.py::test_read_folder_with_flows": 3.7233133749687113, - "src/backend/tests/unit/test_database.py::test_read_folder_with_pagination": 2.360611206968315, - "src/backend/tests/unit/test_database.py::test_read_folder_with_search": 2.791071208019275, - "src/backend/tests/unit/test_database.py::test_read_nonexistent_folder": 3.172841250023339, - "src/backend/tests/unit/test_database.py::test_read_only_starter_projects": 2.7734275410766713, - "src/backend/tests/unit/test_database.py::test_sqlite_pragmas": 0.01063333306228742, - "src/backend/tests/unit/test_database.py::test_update_flow": 11.933393624029122, - "src/backend/tests/unit/test_database.py::test_update_flow_idempotency": 2.8060469159972854, - "src/backend/tests/unit/test_database.py::test_update_nonexistent_flow": 5.407779291970655, - "src/backend/tests/unit/test_database.py::test_upload_file": 2.4626421239809133, - "src/backend/tests/unit/test_endpoints.py::test_build_vertex_invalid_flow_id": 3.5158219590666704, - "src/backend/tests/unit/test_endpoints.py::test_build_vertex_invalid_vertex_id": 3.11827108298894, - "src/backend/tests/unit/test_endpoints.py::test_get_all": 2.8379626250825822, - "src/backend/tests/unit/test_endpoints.py::test_get_vertices": 6.432511791004799, - "src/backend/tests/unit/test_endpoints.py::test_get_vertices_flow_not_found": 3.0379495000233874, - "src/backend/tests/unit/test_endpoints.py::test_invalid_flow_id": 4.83262683294015, - "src/backend/tests/unit/test_endpoints.py::test_invalid_prompt": 1.6217343760072254, - "src/backend/tests/unit/test_endpoints.py::test_invalid_run_with_input_type_chat": 1.796533625049051, - "src/backend/tests/unit/test_endpoints.py::test_post_validate_code": 7.020954290986992, - "src/backend/tests/unit/test_endpoints.py::test_starter_projects": 4.749609249003697, - "src/backend/tests/unit/test_endpoints.py::test_successful_run_no_payload": 3.4047674169996753, - "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_input_type_any": 2.6764538330608048, + "src/backend/tests/unit/test_database.py::test_read_folder": 8.87356387602631, + "src/backend/tests/unit/test_database.py::test_read_folder_with_component_filter": 7.6166022079996765, + "src/backend/tests/unit/test_database.py::test_read_folder_with_flows": 8.014717498968821, + "src/backend/tests/unit/test_database.py::test_read_folder_with_pagination": 6.387903250055388, + "src/backend/tests/unit/test_database.py::test_read_folder_with_search": 8.899765333044343, + "src/backend/tests/unit/test_database.py::test_read_nonexistent_folder": 8.377731916960329, + "src/backend/tests/unit/test_database.py::test_read_only_starter_projects": 6.465184875007253, + "src/backend/tests/unit/test_database.py::test_sqlite_pragmas": 0.014676248945761472, + "src/backend/tests/unit/test_database.py::test_update_flow": 6.941831958014518, + "src/backend/tests/unit/test_database.py::test_update_flow_idempotency": 5.098478916916065, + "src/backend/tests/unit/test_database.py::test_update_nonexistent_flow": 4.800336458021775, + "src/backend/tests/unit/test_database.py::test_upload_file": 9.30472183303209, + "src/backend/tests/unit/test_endpoints.py::test_build_vertex_invalid_flow_id": 12.75055258302018, + "src/backend/tests/unit/test_endpoints.py::test_build_vertex_invalid_vertex_id": 13.752501833019778, + "src/backend/tests/unit/test_endpoints.py::test_get_all": 9.147186750022229, + "src/backend/tests/unit/test_endpoints.py::test_get_vertices": 16.73458308307454, + "src/backend/tests/unit/test_endpoints.py::test_get_vertices_flow_not_found": 9.540424707985949, + "src/backend/tests/unit/test_endpoints.py::test_invalid_flow_id": 6.438308874960057, + "src/backend/tests/unit/test_endpoints.py::test_invalid_prompt": 4.173667999973986, + "src/backend/tests/unit/test_endpoints.py::test_invalid_run_with_input_type_chat": 9.671880959009286, + "src/backend/tests/unit/test_endpoints.py::test_post_validate_code": 3.8482801250065677, + "src/backend/tests/unit/test_endpoints.py::test_starter_projects": 6.3880739160231315, + "src/backend/tests/unit/test_endpoints.py::test_successful_run_no_payload": 13.115492123994045, + "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_input_type_any": 11.004677499935497, "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_input_type_chat": 6.699964084022213, - "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_input_type_text": 5.525574458006304, - "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_output_type_any": 4.655565874942113, - "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_output_type_debug": 7.888722543022595, - "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_output_type_text": 8.635741250065621, - "src/backend/tests/unit/test_endpoints.py::test_valid_prompt": 2.3432591260643676, - "src/backend/tests/unit/test_endpoints.py::test_various_prompts[The weather is {weather} today.-expected_input_variables1]": 1.8489304580143653, - "src/backend/tests/unit/test_endpoints.py::test_various_prompts[This prompt has no variables.-expected_input_variables2]": 2.6452161250053905, - "src/backend/tests/unit/test_endpoints.py::test_various_prompts[{a}, {b}, and {c} are variables.-expected_input_variables3]": 4.222045834001619, - "src/backend/tests/unit/test_endpoints.py::test_various_prompts[{color} is my favorite color.-expected_input_variables0]": 3.909155082947109, - "src/backend/tests/unit/test_experimental_components.py::test_python_function_component": 0.004152042034547776, - "src/backend/tests/unit/test_files.py::test_delete_file": 5.177216041018255, - "src/backend/tests/unit/test_files.py::test_download_file": 6.059420874982607, - "src/backend/tests/unit/test_files.py::test_file_operations": 2.4048440000624396, - "src/backend/tests/unit/test_files.py::test_list_files": 5.881258791021537, - "src/backend/tests/unit/test_files.py::test_upload_file": 4.043703542964067, - "src/backend/tests/unit/test_frontend_nodes.py::test_frontend_node_to_dict": 0.0005665839998982847, - "src/backend/tests/unit/test_frontend_nodes.py::test_template_field_defaults": 0.0004388759261928499, - "src/backend/tests/unit/test_frontend_nodes.py::test_template_to_dict": 0.0014697909355163574, - "src/backend/tests/unit/test_helper_components.py::test_data_as_text_component": 0.001189751026686281, - "src/backend/tests/unit/test_helper_components.py::test_uuid_generator_component": 0.006734457972925156, - "src/backend/tests/unit/test_initial_setup.py::test_create_or_update_starter_projects": 2.297661916934885, - "src/backend/tests/unit/test_initial_setup.py::test_get_project_data": 0.01816708402475342, - "src/backend/tests/unit/test_initial_setup.py::test_load_starter_projects": 0.01591095793992281, - "src/backend/tests/unit/test_initial_setup.py::test_refresh_starter_projects": 10.713609290949535, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_create_secret": 0.0038709159125573933, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_delete_secret": 0.0016375830164179206, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_email_address": 0.00025904097128659487, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_encode_string": 0.00022795796394348145, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_encode_uuid": 0.000240708002820611, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_ends_with_non_alphanumeric": 0.001827583007980138, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_get_secret": 0.001762000028975308, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_long_string": 0.00023833394516259432, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_starts_with_non_alphanumeric": 0.0012475419789552689, - "src/backend/tests/unit/test_kubernetes_secrets.py::test_uuid_case_insensitivity": 0.00028887594817206264, + "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_input_type_text": 13.15230270801112, + "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_output_type_any": 8.805241706955712, + "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_output_type_debug": 22.682321542000864, + "src/backend/tests/unit/test_endpoints.py::test_successful_run_with_output_type_text": 17.39235183299752, + "src/backend/tests/unit/test_endpoints.py::test_valid_prompt": 6.256365165987518, + "src/backend/tests/unit/test_endpoints.py::test_various_prompts[The weather is {weather} today.-expected_input_variables1]": 3.7075269159977324, + "src/backend/tests/unit/test_endpoints.py::test_various_prompts[This prompt has no variables.-expected_input_variables2]": 3.9946173329954036, + "src/backend/tests/unit/test_endpoints.py::test_various_prompts[{a}, {b}, and {c} are variables.-expected_input_variables3]": 4.0693868329399265, + "src/backend/tests/unit/test_endpoints.py::test_various_prompts[{color} is my favorite color.-expected_input_variables0]": 3.0902233740198426, + "src/backend/tests/unit/test_experimental_components.py::test_python_function_component": 0.0042732079746201634, + "src/backend/tests/unit/test_files.py::test_delete_file": 11.937014124996495, + "src/backend/tests/unit/test_files.py::test_download_file": 9.813468083040789, + "src/backend/tests/unit/test_files.py::test_file_operations": 11.151997918030247, + "src/backend/tests/unit/test_files.py::test_list_files": 11.372431917930953, + "src/backend/tests/unit/test_files.py::test_upload_file": 9.378826959000435, + "src/backend/tests/unit/test_frontend_nodes.py::test_frontend_node_to_dict": 0.001889707986265421, + "src/backend/tests/unit/test_frontend_nodes.py::test_template_field_defaults": 0.0011505419970490038, + "src/backend/tests/unit/test_frontend_nodes.py::test_template_to_dict": 0.0012661239597946405, + "src/backend/tests/unit/test_helper_components.py::test_data_as_text_component": 0.0027173339622095227, + "src/backend/tests/unit/test_helper_components.py::test_uuid_generator_component": 0.01785312400897965, + "src/backend/tests/unit/test_initial_setup.py::test_create_or_update_starter_projects": 4.110436458024196, + "src/backend/tests/unit/test_initial_setup.py::test_get_project_data": 0.02601999999023974, + "src/backend/tests/unit/test_initial_setup.py::test_load_starter_projects": 0.04063279094407335, + "src/backend/tests/unit/test_initial_setup.py::test_refresh_starter_projects": 17.660447000002023, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_create_secret": 0.006780167983379215, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_delete_secret": 0.0018824590370059013, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_email_address": 0.0005670840037055314, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_encode_string": 0.001881041971500963, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_encode_uuid": 0.0022820410085842013, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_ends_with_non_alphanumeric": 0.003202166990377009, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_get_secret": 0.0026421259390190244, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_long_string": 0.026574083953164518, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_starts_with_non_alphanumeric": 0.006242457951884717, + "src/backend/tests/unit/test_kubernetes_secrets.py::test_uuid_case_insensitivity": 0.0053153319749981165, "src/backend/tests/unit/test_loading.py::test_load_flow_from_json": 1.2976477909833193, - "src/backend/tests/unit/test_loading.py::test_load_flow_from_json_object": 0.040529041027184576, + "src/backend/tests/unit/test_loading.py::test_load_flow_from_json_object": 0.13816483406117186, "src/backend/tests/unit/test_loading.py::test_load_flow_from_json_with_tweaks": 0.005636290996335447, - "src/backend/tests/unit/test_logger.py::test_enabled": 0.0002785429824143648, - "src/backend/tests/unit/test_logger.py::test_get_after_timestamp": 0.0006505009951069951, - "src/backend/tests/unit/test_logger.py::test_get_before_timestamp": 0.0003599180490709841, - "src/backend/tests/unit/test_logger.py::test_get_last_n": 0.00045024894643574953, - "src/backend/tests/unit/test_logger.py::test_init_default": 0.0005865829880349338, - "src/backend/tests/unit/test_logger.py::test_init_with_env_variable": 0.0005718329921364784, - "src/backend/tests/unit/test_logger.py::test_len": 0.0002712510759010911, - "src/backend/tests/unit/test_logger.py::test_max_size": 0.0002471670741215348, - "src/backend/tests/unit/test_logger.py::test_write": 0.0003470420488156378, - "src/backend/tests/unit/test_logger.py::test_write_overflow": 0.0005332900327630341, - "src/backend/tests/unit/test_login.py::test_login_successful": 1.5611454580212012, - "src/backend/tests/unit/test_login.py::test_login_unsuccessful_wrong_password": 4.032776457956061, - "src/backend/tests/unit/test_login.py::test_login_unsuccessful_wrong_username": 0.879311416996643, - "src/backend/tests/unit/test_messages.py::test_add_messages": 3.309187417034991, - "src/backend/tests/unit/test_messages.py::test_add_messagetables": 2.677147793059703, - "src/backend/tests/unit/test_messages.py::test_convert_to_langchain[convert_to_langchain_type]": 0.001319041009992361, - "src/backend/tests/unit/test_messages.py::test_convert_to_langchain[message]": 0.0014611250371672213, - "src/backend/tests/unit/test_messages.py::test_delete_messages": 1.7512655410100706, - "src/backend/tests/unit/test_messages.py::test_get_messages": 2.679642292088829, - "src/backend/tests/unit/test_messages.py::test_store_message": 2.0734372919541784, - "src/backend/tests/unit/test_messages.py::test_update_message_with_content_blocks": 2.0395035409601405, - "src/backend/tests/unit/test_messages.py::test_update_message_with_nested_properties": 1.6801010410417803, - "src/backend/tests/unit/test_messages.py::test_update_message_with_timestamp": 1.7369747090269811, - "src/backend/tests/unit/test_messages.py::test_update_mixed_messages": 0.7533785830019042, - "src/backend/tests/unit/test_messages.py::test_update_multiple_messages": 0.7652632489916869, - "src/backend/tests/unit/test_messages.py::test_update_multiple_messages_with_timestamps": 1.7809107069624588, - "src/backend/tests/unit/test_messages.py::test_update_nonexistent_message": 0.9113652509986423, - "src/backend/tests/unit/test_messages.py::test_update_single_message": 0.8359092500177212, + "src/backend/tests/unit/test_logger.py::test_enabled": 0.0005764579982496798, + "src/backend/tests/unit/test_logger.py::test_get_after_timestamp": 0.0004975839983671904, + "src/backend/tests/unit/test_logger.py::test_get_before_timestamp": 0.0014172079390846193, + "src/backend/tests/unit/test_logger.py::test_get_last_n": 0.0016023330972529948, + "src/backend/tests/unit/test_logger.py::test_init_default": 0.000544751004781574, + "src/backend/tests/unit/test_logger.py::test_init_with_env_variable": 0.00517920806305483, + "src/backend/tests/unit/test_logger.py::test_len": 0.0005525410524569452, + "src/backend/tests/unit/test_logger.py::test_max_size": 0.0004330830415710807, + "src/backend/tests/unit/test_logger.py::test_write": 0.0019940000493079424, + "src/backend/tests/unit/test_logger.py::test_write_overflow": 0.0048784169484861195, + "src/backend/tests/unit/test_login.py::test_login_successful": 1.8535884590819478, + "src/backend/tests/unit/test_login.py::test_login_unsuccessful_wrong_password": 2.805236915999558, + "src/backend/tests/unit/test_login.py::test_login_unsuccessful_wrong_username": 1.1342184170498513, + "src/backend/tests/unit/test_messages.py::test_add_messages": 1.0837021250044927, + "src/backend/tests/unit/test_messages.py::test_add_messagetables": 0.05725845799315721, + "src/backend/tests/unit/test_messages.py::test_convert_to_langchain[convert_to_langchain_type]": 0.004605708934832364, + "src/backend/tests/unit/test_messages.py::test_convert_to_langchain[message]": 0.0010825420613400638, + "src/backend/tests/unit/test_messages.py::test_delete_messages": 6.333445124968421, + "src/backend/tests/unit/test_messages.py::test_get_messages": 1.7074809999903664, + "src/backend/tests/unit/test_messages.py::test_store_message": 6.219785042048898, + "src/backend/tests/unit/test_messages.py::test_update_message_with_content_blocks": 5.128578291973099, + "src/backend/tests/unit/test_messages.py::test_update_message_with_nested_properties": 1.5983659149496816, + "src/backend/tests/unit/test_messages.py::test_update_message_with_timestamp": 4.5035865410463884, + "src/backend/tests/unit/test_messages.py::test_update_mixed_messages": 4.780824999965262, + "src/backend/tests/unit/test_messages.py::test_update_multiple_messages": 3.9809147500200197, + "src/backend/tests/unit/test_messages.py::test_update_multiple_messages_with_timestamps": 4.659952084010001, + "src/backend/tests/unit/test_messages.py::test_update_nonexistent_message": 4.162011249980424, + "src/backend/tests/unit/test_messages.py::test_update_single_message": 8.01532608200796, "src/backend/tests/unit/test_messages_endpoints.py::test_delete_messages": 3.083023541024886, "src/backend/tests/unit/test_messages_endpoints.py::test_delete_messages_session": 2.9022462490247563, - "src/backend/tests/unit/test_messages_endpoints.py::test_no_messages_found_with_given_session_id": 2.7207199159893207, - "src/backend/tests/unit/test_messages_endpoints.py::test_successfully_update_session_id": 2.559589582902845, + "src/backend/tests/unit/test_messages_endpoints.py::test_no_messages_found_with_given_session_id": 2.0005746669485234, + "src/backend/tests/unit/test_messages_endpoints.py::test_successfully_update_session_id": 2.267476499953773, "src/backend/tests/unit/test_messages_endpoints.py::test_update_message": 2.7309321249485947, "src/backend/tests/unit/test_messages_endpoints.py::test_update_message_not_found": 2.71192433295073, - "src/backend/tests/unit/test_process.py::test_load_langchain_object_with_cached_session": 0.009255001961719245, + "src/backend/tests/unit/test_process.py::test_load_langchain_object_with_cached_session": 0.014995582983829081, "src/backend/tests/unit/test_process.py::test_load_langchain_object_with_no_cached_session": 2.9178847920848057, "src/backend/tests/unit/test_process.py::test_load_langchain_object_without_session_id": 2.8941064990358427, - "src/backend/tests/unit/test_process.py::test_multiple_tweaks": 0.00024433404905721545, - "src/backend/tests/unit/test_process.py::test_no_tweaks": 0.0008997919503599405, - "src/backend/tests/unit/test_process.py::test_single_tweak": 0.00036458304384723306, - "src/backend/tests/unit/test_process.py::test_tweak_no_node_id": 0.0010478749754838645, - "src/backend/tests/unit/test_process.py::test_tweak_not_in_template": 0.0002571250079199672, - "src/backend/tests/unit/test_schema.py::TestInput::test_field_type_str": 0.0015098329749889672, - "src/backend/tests/unit/test_schema.py::TestInput::test_field_type_type": 0.0007612500339746475, - "src/backend/tests/unit/test_schema.py::TestInput::test_input_to_dict": 0.0018923740135505795, - "src/backend/tests/unit/test_schema.py::TestInput::test_invalid_field_type": 0.0006862920126877725, - "src/backend/tests/unit/test_schema.py::TestInput::test_post_process_type_function": 0.0023312500561587512, - "src/backend/tests/unit/test_schema.py::TestInput::test_serialize_field_type": 0.004855999955907464, - "src/backend/tests/unit/test_schema.py::TestInput::test_validate_type_class": 0.00027591700199991465, - "src/backend/tests/unit/test_schema.py::TestInput::test_validate_type_string": 0.00278158305445686, - "src/backend/tests/unit/test_schema.py::TestOutput::test_output_add_types": 0.0010019989567808807, - "src/backend/tests/unit/test_schema.py::TestOutput::test_output_default": 0.00032329204259440303, - "src/backend/tests/unit/test_schema.py::TestOutput::test_output_set_selected": 0.0015942909521982074, - "src/backend/tests/unit/test_schema.py::TestOutput::test_output_to_dict": 0.0022627910366281867, - "src/backend/tests/unit/test_schema.py::TestOutput::test_output_validate_display_name": 0.00040600099600851536, - "src/backend/tests/unit/test_schema.py::TestOutput::test_output_validate_model": 0.0002532079815864563, - "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_custom_type": 0.0019193329499103129, - "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_int_type": 0.00021583307534456253, - "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_list_custom_type": 0.0003355839871801436, - "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_list_int_type": 0.0020573349902406335, - "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_union_custom_type": 0.00026191596407443285, - "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_union_type": 0.0024350410094484687, - "src/backend/tests/unit/test_setup_superuser.py::test_teardown_superuser_default_superuser": 0.006652375042904168, - "src/backend/tests/unit/test_setup_superuser.py::test_teardown_superuser_no_default_superuser": 0.006145125022158027, - "src/backend/tests/unit/test_telemetry.py::test_gauge": 0.003054290951695293, - "src/backend/tests/unit/test_telemetry.py::test_gauge_with_counter_method": 0.0023362910142168403, - "src/backend/tests/unit/test_telemetry.py::test_gauge_with_historgram_method": 0.004677250923123211, - "src/backend/tests/unit/test_telemetry.py::test_gauge_with_up_down_counter_method": 0.0018417509854771197, - "src/backend/tests/unit/test_telemetry.py::test_increment_counter": 0.0003165420494042337, - "src/backend/tests/unit/test_telemetry.py::test_increment_counter_empty_label": 0.001291500055231154, - "src/backend/tests/unit/test_telemetry.py::test_increment_counter_missing_mandatory_label": 0.0019142500241287053, - "src/backend/tests/unit/test_telemetry.py::test_increment_counter_unregisted_metric": 0.010540709015913308, - "src/backend/tests/unit/test_telemetry.py::test_init": 0.0003274579648859799, - "src/backend/tests/unit/test_telemetry.py::test_missing_labels": 0.00035625003511086106, - "src/backend/tests/unit/test_telemetry.py::test_multithreaded_singleton": 0.0015401250566355884, - "src/backend/tests/unit/test_telemetry.py::test_multithreaded_singleton_race_condition": 0.020977791980840266, - "src/backend/tests/unit/test_telemetry.py::test_opentelementry_singleton": 0.0002914160140790045, - "src/backend/tests/unit/test_template.py::test_build_template_from_function": 0.0019054170115850866, - "src/backend/tests/unit/test_template.py::test_get_base_classes": 0.00047154095955193043, - "src/backend/tests/unit/test_template.py::test_get_default_factory": 0.0006982500781305134, + "src/backend/tests/unit/test_process.py::test_multiple_tweaks": 0.001609999977517873, + "src/backend/tests/unit/test_process.py::test_no_tweaks": 0.0007107069832272828, + "src/backend/tests/unit/test_process.py::test_single_tweak": 0.0019067510147579014, + "src/backend/tests/unit/test_process.py::test_tweak_no_node_id": 0.0006889999494887888, + "src/backend/tests/unit/test_process.py::test_tweak_not_in_template": 0.0005332909640856087, + "src/backend/tests/unit/test_schema.py::TestInput::test_field_type_str": 0.0019220420508645475, + "src/backend/tests/unit/test_schema.py::TestInput::test_field_type_type": 0.0006004571332596242, + "src/backend/tests/unit/test_schema.py::TestInput::test_input_to_dict": 0.0009379159891977906, + "src/backend/tests/unit/test_schema.py::TestInput::test_invalid_field_type": 0.001552084053400904, + "src/backend/tests/unit/test_schema.py::TestInput::test_post_process_type_function": 0.002296667022164911, + "src/backend/tests/unit/test_schema.py::TestInput::test_serialize_field_type": 0.00044716597767546773, + "src/backend/tests/unit/test_schema.py::TestInput::test_validate_type_class": 0.0012790420441888273, + "src/backend/tests/unit/test_schema.py::TestInput::test_validate_type_string": 0.002348791982512921, + "src/backend/tests/unit/test_schema.py::TestOutput::test_output_add_types": 0.00046150002162903547, + "src/backend/tests/unit/test_schema.py::TestOutput::test_output_default": 0.0007555829943157732, + "src/backend/tests/unit/test_schema.py::TestOutput::test_output_set_selected": 0.0009648340055719018, + "src/backend/tests/unit/test_schema.py::TestOutput::test_output_to_dict": 0.0017227909993380308, + "src/backend/tests/unit/test_schema.py::TestOutput::test_output_validate_display_name": 0.0005206660134717822, + "src/backend/tests/unit/test_schema.py::TestOutput::test_output_validate_model": 0.00047458295011892915, + "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_custom_type": 0.0006864589522592723, + "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_int_type": 0.0020610010251402855, + "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_list_custom_type": 0.0004322489257901907, + "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_list_int_type": 0.0006266679847612977, + "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_union_custom_type": 0.001984875008929521, + "src/backend/tests/unit/test_schema.py::TestPostProcessType::test_union_type": 0.00045487505849450827, + "src/backend/tests/unit/test_setup_superuser.py::test_teardown_superuser_default_superuser": 0.0031912089907564223, + "src/backend/tests/unit/test_setup_superuser.py::test_teardown_superuser_no_default_superuser": 0.06203562399605289, + "src/backend/tests/unit/test_telemetry.py::test_gauge": 0.0010458759497851133, + "src/backend/tests/unit/test_telemetry.py::test_gauge_with_counter_method": 0.001155833073426038, + "src/backend/tests/unit/test_telemetry.py::test_gauge_with_historgram_method": 0.000620083010289818, + "src/backend/tests/unit/test_telemetry.py::test_gauge_with_up_down_counter_method": 0.0004957080236636102, + "src/backend/tests/unit/test_telemetry.py::test_increment_counter": 0.001797167002223432, + "src/backend/tests/unit/test_telemetry.py::test_increment_counter_empty_label": 0.0005866250139661133, + "src/backend/tests/unit/test_telemetry.py::test_increment_counter_missing_mandatory_label": 0.0007815829594619572, + "src/backend/tests/unit/test_telemetry.py::test_increment_counter_unregisted_metric": 0.0020775010343641043, + "src/backend/tests/unit/test_telemetry.py::test_init": 0.002990751003380865, + "src/backend/tests/unit/test_telemetry.py::test_missing_labels": 0.0005269160610623658, + "src/backend/tests/unit/test_telemetry.py::test_multithreaded_singleton": 0.010914665996097028, + "src/backend/tests/unit/test_telemetry.py::test_multithreaded_singleton_race_condition": 0.05346908303909004, + "src/backend/tests/unit/test_telemetry.py::test_opentelementry_singleton": 0.001057707006111741, + "src/backend/tests/unit/test_template.py::test_build_template_from_function": 0.0032988329767249525, + "src/backend/tests/unit/test_template.py::test_get_base_classes": 0.00047066499246284366, + "src/backend/tests/unit/test_template.py::test_get_default_factory": 0.000766709097661078, "src/backend/tests/unit/test_user.py::test_add_user": 3.429326084034983, "src/backend/tests/unit/test_user.py::test_data_consistency_after_delete": 3.084409792034421, "src/backend/tests/unit/test_user.py::test_data_consistency_after_update": 4.112100625992753, - "src/backend/tests/unit/test_user.py::test_deactivated_user_cannot_access": 1.6135848330450244, + "src/backend/tests/unit/test_user.py::test_deactivated_user_cannot_access": 9.994989457947668, "src/backend/tests/unit/test_user.py::test_deactivated_user_cannot_login": 2.550756209064275, "src/backend/tests/unit/test_user.py::test_delete_user": 3.7109769160160795, "src/backend/tests/unit/test_user.py::test_delete_user_wrong_id": 3.291543999046553, @@ -760,93 +813,93 @@ "src/backend/tests/unit/test_user.py::test_patch_user": 3.110160624026321, "src/backend/tests/unit/test_user.py::test_patch_user_wrong_id": 3.0659845010377467, "src/backend/tests/unit/test_user.py::test_read_all_users": 2.8889535000780597, - "src/backend/tests/unit/test_user.py::test_user_waiting_for_approval": 1.0094337909831665, - "src/backend/tests/unit/test_validate_code.py::test_create_class": 0.002269042015541345, - "src/backend/tests/unit/test_validate_code.py::test_create_class_with_external_variables_and_functions": 0.0017634579562582076, - "src/backend/tests/unit/test_validate_code.py::test_create_class_with_multiple_external_classes": 0.002165457990486175, - "src/backend/tests/unit/test_validate_code.py::test_create_function": 0.000596500001847744, - "src/backend/tests/unit/test_validate_code.py::test_execute_function_missing_function": 0.0006714170449413359, - "src/backend/tests/unit/test_validate_code.py::test_execute_function_missing_module": 0.00045245798537507653, - "src/backend/tests/unit/test_validate_code.py::test_execute_function_missing_schema": 0.001392040983773768, - "src/backend/tests/unit/test_validate_code.py::test_execute_function_success": 0.0015526249771937728, - "src/backend/tests/unit/test_validate_code.py::test_validate_code": 0.008368333976250142, - "src/backend/tests/unit/test_version.py::test_compute_main": 0.0010042919893749058, - "src/backend/tests/unit/test_version.py::test_version": 0.001986499992199242, - "src/backend/tests/unit/test_webhook.py::test_webhook_endpoint": 14.715468042064458, - "src/backend/tests/unit/test_webhook.py::test_webhook_flow_on_run_endpoint": 3.046824499964714, - "src/backend/tests/unit/test_webhook.py::test_webhook_with_random_payload": 11.656425916939043, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol::password@host-protocol::password@host]": 0.0016742500010877848, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:pa:ss:word@host-protocol:user:pa:ss:word@host]": 0.0009482500026933849, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:pa@ss@word@host-protocol:user:pa%40ss%40word@host]": 0.0008808330749161541, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:pass@word@host-protocol:user:pass%40word@host]": 0.0029695829143747687, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:password@-protocol:user:password@]": 0.001982749963644892, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:password@host-protocol:user:password@host]": 0.0005745830712839961, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user@host-protocol:user@host]": 0.0007132510654628277, - "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[user:password@host-user:password@host]": 0.0009918760042637587, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[-]": 0.0019683760474435985, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/\\ndocu\\nments/file.txt-/home/user/\\\\ndocu\\\\nments/file.txt]": 0.0036366250133141875, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/docu\\n\\nments/file.txt-/home/user/docu\\\\n\\\\nments/file.txt]": 0.00254416698589921, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/docu\\nments/file.txt-/home/user/docu\\\\nments/file.txt]": 0.0009456239640712738, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/documents/\\n-/home/user/documents/\\\\n]": 0.025744416925590485, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/documents/file.txt-/home/user/documents/file.txt]": 0.0015144990175031126, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/my-\\ndocs/special_file!.pdf-/home/user/my-\\\\ndocs/special_file!.pdf]": 0.001220542995724827, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:/Users\\\\Documents/file.txt-C:/Users\\\\Documents/file.txt]": 0.0012114160344935954, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:\\\\Users\\\\Documents\\\\-C:\\\\Users\\\\Documents\\\\]": 0.0023360829218290746, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:\\\\Users\\\\Documents\\\\file.txt-C:\\\\Users\\\\Documents\\\\file.txt]": 0.0007423330680467188, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:\\\\Users\\\\\\nDocuments\\\\file.txt-C:\\\\Users\\\\\\\\nDocuments\\\\file.txt]": 0.0023515840875916183, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[\\\\\\\\server\\\\share\\\\file.txt-\\\\\\\\server\\\\share\\\\file.txt]": 0.001738708931952715, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[\\n/home/user/documents/-\\\\n/home/user/documents/]": 0.0021785409771837294, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[\\n\\n\\n-\\\\n\\\\n\\\\n]": 0.0007877919706515968, - "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path_type": 0.004260540998075157, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_directory": 0.0007352500106208026, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_empty_path": 0.0010516680194996297, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_nonexistent_file": 0.0009393750224262476, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_success": 0.0010400419705547392, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_invalid_file": 0.0012756659998558462, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_success": 0.00212958303745836, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_unrecognized_extension": 0.0019956670003011823, - "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_with_custom_mime": 0.003665584954433143, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[-]": 0.0006267070421017706, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/\\ndocu\\nments/file.txt-/home/user/\\\\ndocu\\\\nments/file.txt]": 0.0007902910001575947, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/docu\\n\\nments/file.txt-/home/user/docu\\\\n\\\\nments/file.txt]": 0.0003085819771513343, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/docu\\nments/file.txt-/home/user/docu\\\\nments/file.txt]": 0.00034262501867488027, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/documents/\\n-/home/user/documents/\\\\n]": 0.0003343760035932064, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/documents/file.txt-/home/user/documents/file.txt]": 0.0003256250056438148, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/my-\\ndocs/special_file!.pdf-/home/user/my-\\\\ndocs/special_file!.pdf]": 0.0012586249504238367, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[C:\\\\Users\\\\\\nDocuments\\\\file.txt-C:\\\\Users\\\\\\\\nDocuments\\\\file.txt]": 0.0008411250310018659, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[\\n/home/user/documents/-\\\\n/home/user/documents/]": 0.0009818340186029673, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[\\n\\n\\n-\\\\n\\\\n\\\\n]": 0.0006172500434331596, - "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path_type": 0.0002429169835522771, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_negative_max_length": 0.00025949894916266203, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[-5-]": 0.0003167500835843384, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[12345-3-12345]": 0.00030608405359089375, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[3.141592653589793-4-3.141592653589793]": 0.0003646670375019312, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[None-5-None]": 0.0003825009916909039, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[True-2-True]": 0.0005934149958193302, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[\\u3053\\u3093\\u306b\\u3061\\u306f-3-\\u3053\\u3093\\u306b...]": 0.00038300000596791506, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[a-1-a]": 0.0003126669325865805, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-10-aaaaaaaaaa...]": 0.00035062601091340184, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[exact-5-exact]": 0.0002943320432677865, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[long string-7-long st...]": 0.00034562498331069946, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[short string-20-short string]": 0.00034145801328122616, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_none_max_length": 0.0005399579531513155, - "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_zero_max_length": 0.0002442080294713378, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data0-10-expected0]": 0.0003149179392494261, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data1-5-expected1]": 0.0003458330174908042, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data2-7-expected2]": 0.00031883292831480503, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data3-8-expected3]": 0.00030812493059784174, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data4-10-expected4]": 0.00028958305483683944, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data5-10-expected5]": 0.00033783295657485723, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data6-10-expected6]": 0.0004022919456474483, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data7-5-expected7]": 0.0003520839964039624, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data8-3-expected8]": 0.0003352909698151052, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data9-10-expected9]": 0.002482500043697655, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_default_max_length": 0.00047945795813575387, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_in_place_modification": 0.0003923350013792515, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_invalid_input": 0.0008553340448997915, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_negative_max_length": 0.0005078340182080865, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_no_modification": 0.0006442510057240725, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_small_max_length": 0.001186543027870357, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_type_preservation": 0.00046733306953683496, - "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_zero_max_length": 0.0007919160416349769 + "src/backend/tests/unit/test_user.py::test_user_waiting_for_approval": 0.013978040951769799, + "src/backend/tests/unit/test_validate_code.py::test_create_class": 0.0021462500444613397, + "src/backend/tests/unit/test_validate_code.py::test_create_class_with_external_variables_and_functions": 0.003444623958785087, + "src/backend/tests/unit/test_validate_code.py::test_create_class_with_multiple_external_classes": 0.0025265829171985388, + "src/backend/tests/unit/test_validate_code.py::test_create_function": 0.0018167078960686922, + "src/backend/tests/unit/test_validate_code.py::test_execute_function_missing_function": 0.0012206660467199981, + "src/backend/tests/unit/test_validate_code.py::test_execute_function_missing_module": 0.026675915985833853, + "src/backend/tests/unit/test_validate_code.py::test_execute_function_missing_schema": 0.009199000021908432, + "src/backend/tests/unit/test_validate_code.py::test_execute_function_success": 0.0516063739778474, + "src/backend/tests/unit/test_validate_code.py::test_validate_code": 0.002154792018700391, + "src/backend/tests/unit/test_version.py::test_compute_main": 0.0012604990624822676, + "src/backend/tests/unit/test_version.py::test_version": 0.0031747930333949625, + "src/backend/tests/unit/test_webhook.py::test_webhook_endpoint": 6.958169957972132, + "src/backend/tests/unit/test_webhook.py::test_webhook_flow_on_run_endpoint": 2.6644719160394743, + "src/backend/tests/unit/test_webhook.py::test_webhook_with_random_payload": 22.012939708016347, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol::password@host-protocol::password@host]": 0.0011036259238608181, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:pa:ss:word@host-protocol:user:pa:ss:word@host]": 0.0035245000617578626, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:pa@ss@word@host-protocol:user:pa%40ss%40word@host]": 0.0015645829844288528, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:pass@word@host-protocol:user:pass%40word@host]": 0.0019503749790601432, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:password@-protocol:user:password@]": 0.001378917135298252, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user:password@host-protocol:user:password@host]": 0.0011764169903472066, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[protocol:user@host-protocol:user@host]": 0.0015201250207610428, + "src/backend/tests/unit/utils/test_connection_string_parser.py::test_transform_connection_string[user:password@host-user:password@host]": 0.0017376260366290808, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[-]": 0.0006162070203572512, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/\\ndocu\\nments/file.txt-/home/user/\\\\ndocu\\\\nments/file.txt]": 0.0007122920360416174, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/docu\\n\\nments/file.txt-/home/user/docu\\\\n\\\\nments/file.txt]": 0.001084417977835983, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/docu\\nments/file.txt-/home/user/docu\\\\nments/file.txt]": 0.0006536649889312685, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/documents/\\n-/home/user/documents/\\\\n]": 0.0016012910637073219, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/documents/file.txt-/home/user/documents/file.txt]": 0.0006799580296501517, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[/home/user/my-\\ndocs/special_file!.pdf-/home/user/my-\\\\ndocs/special_file!.pdf]": 0.0005504579748958349, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:/Users\\\\Documents/file.txt-C:/Users\\\\Documents/file.txt]": 0.0005779999773949385, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:\\\\Users\\\\Documents\\\\-C:\\\\Users\\\\Documents\\\\]": 0.000738707953132689, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:\\\\Users\\\\Documents\\\\file.txt-C:\\\\Users\\\\Documents\\\\file.txt]": 0.0005959170521236956, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[C:\\\\Users\\\\\\nDocuments\\\\file.txt-C:\\\\Users\\\\\\\\nDocuments\\\\file.txt]": 0.0007891249842941761, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[\\\\\\\\server\\\\share\\\\file.txt-\\\\\\\\server\\\\share\\\\file.txt]": 0.000809666991699487, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[\\n/home/user/documents/-\\\\n/home/user/documents/]": 0.0007795419660396874, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path[\\n\\n\\n-\\\\n\\\\n\\\\n]": 0.0006329159368760884, + "src/backend/tests/unit/utils/test_format_directory_path.py::test_format_directory_path_type": 0.0011783759691752493, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_directory": 0.002373834024183452, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_empty_path": 0.0015134999412111938, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_nonexistent_file": 0.0014794580056332052, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_convert_image_to_base64_success": 0.0013306670589372516, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_invalid_file": 0.006085248955059797, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_success": 0.0014539569965563715, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_unrecognized_extension": 0.0038709990330971777, + "src/backend/tests/unit/utils/test_image_utils.py::TestImageUtils::test_create_data_url_with_custom_mime": 0.0027264999807812274, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[-]": 0.0010925839305855334, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/\\ndocu\\nments/file.txt-/home/user/\\\\ndocu\\\\nments/file.txt]": 0.0006842499715276062, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/docu\\n\\nments/file.txt-/home/user/docu\\\\n\\\\nments/file.txt]": 0.0014515420189127326, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/docu\\nments/file.txt-/home/user/docu\\\\nments/file.txt]": 0.0007735409890301526, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/documents/\\n-/home/user/documents/\\\\n]": 0.000688833009917289, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/documents/file.txt-/home/user/documents/file.txt]": 0.0012501660385169089, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[/home/user/my-\\ndocs/special_file!.pdf-/home/user/my-\\\\ndocs/special_file!.pdf]": 0.0012447499902918935, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[C:\\\\Users\\\\\\nDocuments\\\\file.txt-C:\\\\Users\\\\\\\\nDocuments\\\\file.txt]": 0.0007910419953987002, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[\\n/home/user/documents/-\\\\n/home/user/documents/]": 0.0008116670069284737, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path[\\n\\n\\n-\\\\n\\\\n\\\\n]": 0.0018703750101849437, + "src/backend/tests/unit/utils/test_rewrite_file_path.py::test_format_directory_path_type": 0.001040375034790486, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_negative_max_length": 0.0006347080925479531, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[-5-]": 0.0007126659620553255, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[12345-3-12345]": 0.0006800830014981329, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[3.141592653589793-4-3.141592653589793]": 0.004958375997375697, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[None-5-None]": 0.0006981260376051068, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[True-2-True]": 0.0012039989815093577, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[\\u3053\\u3093\\u306b\\u3061\\u306f-3-\\u3053\\u3093\\u306b...]": 0.001242168014869094, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[a-1-a]": 0.0010821660398505628, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-10-aaaaaaaaaa...]": 0.0009931240347214043, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[exact-5-exact]": 0.0005642089527100325, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[long string-7-long st...]": 0.00069024896947667, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_non_dict_list[short string-20-short string]": 0.0010409160167910159, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_none_max_length": 0.002770041988696903, + "src/backend/tests/unit/utils/test_truncate_long_strings.py::test_truncate_long_strings_zero_max_length": 0.0020084999850951135, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data0-10-expected0]": 0.0018624990480020642, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data1-5-expected1]": 0.005190249008592218, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data2-7-expected2]": 0.0007222919957712293, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data3-8-expected3]": 0.0009226250112988055, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data4-10-expected4]": 0.0006453750538639724, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data5-10-expected5]": 0.0014823329984210432, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data6-10-expected6]": 0.0006393340299837291, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data7-5-expected7]": 0.0006810420891270041, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data8-3-expected8]": 0.001791417016647756, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings[input_data9-10-expected9]": 0.0028397089918144047, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_default_max_length": 0.0020873749745078385, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_in_place_modification": 0.0022316250251606107, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_invalid_input": 0.0006655839970335364, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_negative_max_length": 0.0012835829984396696, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_no_modification": 0.0013513750163838267, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_small_max_length": 0.0019874590216204524, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_type_preservation": 0.002035040990449488, + "src/backend/tests/unit/utils/test_truncate_long_strings_on_objects.py::test_truncate_long_strings_zero_max_length": 0.0011729589896276593 } \ No newline at end of file diff --git a/src/backend/tests/unit/base/tools/test_component_toolkit.py b/src/backend/tests/unit/base/tools/test_component_toolkit.py index fd05f3a4a..41cf6ca46 100644 --- a/src/backend/tests/unit/base/tools/test_component_toolkit.py +++ b/src/backend/tests/unit/base/tools/test_component_toolkit.py @@ -8,17 +8,9 @@ from langflow.components.outputs import ChatOutput from langflow.components.tools.calculator import CalculatorToolComponent from langflow.graph import Graph from langflow.schema.data import Data -from langflow.services.settings.feature_flags import FEATURE_FLAGS from pydantic import BaseModel -@pytest.fixture -def _add_toolkit_output(): - FEATURE_FLAGS.add_toolkit_output = True - yield - FEATURE_FLAGS.add_toolkit_output = False - - async def test_component_tool(): calculator_component = CalculatorToolComponent() component_toolkit = ComponentToolkit(component=calculator_component) @@ -43,7 +35,6 @@ async def test_component_tool(): @pytest.mark.api_key_required -@pytest.mark.usefixtures("_add_toolkit_output") def test_component_tool_with_api_key(): chat_output = ChatOutput() openai_llm = OpenAIModelComponent() diff --git a/src/backend/tests/unit/custom/custom_component/test_component_events.py b/src/backend/tests/unit/custom/custom_component/test_component_events.py index 8b433191a..6947efa70 100644 --- a/src/backend/tests/unit/custom/custom_component/test_component_events.py +++ b/src/backend/tests/unit/custom/custom_component/test_component_events.py @@ -2,6 +2,7 @@ import asyncio import time from typing import Any from unittest.mock import MagicMock +from uuid import uuid4 import pytest from langflow.custom.custom_component.component import Component @@ -9,7 +10,7 @@ from langflow.events.event_manager import EventManager from langflow.schema.content_block import ContentBlock from langflow.schema.content_types import TextContent, ToolContent from langflow.schema.message import Message -from langflow.schema.properties import Source +from langflow.schema.properties import Properties, Source from langflow.template.field.base import Output @@ -52,11 +53,13 @@ async def test_component_message_sending(): component.set_event_manager(event_manager) # Create a message + properties = Properties() message = Message( sender="test_sender", session_id="test_session", sender_name="test_sender_name", content_blocks=[ContentBlock(title="Test Block", contents=[TextContent(type="text", text="Test message")])], + properties=properties, ) # Send the message @@ -80,6 +83,7 @@ async def test_component_tool_output(): component.set_event_manager(event_manager) # Create a message with tool content + properties = Properties() message = Message( sender="test_sender", session_id="test_session", @@ -90,6 +94,7 @@ async def test_component_tool_output(): contents=[ToolContent(type="tool_use", name="test_tool", tool_input={"query": "test input"})], ) ], + properties=properties, ) # Send the message @@ -210,7 +215,7 @@ async def test_component_streaming_message(): # Create a proper mock vertex with graph and flow_id vertex = MagicMock() mock_graph = MagicMock() - mock_graph.flow_id = "12345678-1234-5678-1234-567812345678" # Valid UUID string + mock_graph.flow_id = str(uuid4()) vertex.graph = mock_graph component = ComponentForTesting(_vertex=vertex) @@ -227,11 +232,13 @@ async def test_component_streaming_message(): yield StreamChunk(chunk) # Create a streaming message + properties = Properties() message = Message( sender="test_sender", session_id="test_session", sender_name="test_sender_name", text=text_generator(), + properties=properties, ) # Send the streaming message diff --git a/src/backend/tests/unit/schema/test_schema_message.py b/src/backend/tests/unit/schema/test_schema_message.py index f20eededb..cdf47d670 100644 --- a/src/backend/tests/unit/schema/test_schema_message.py +++ b/src/backend/tests/unit/schema/test_schema_message.py @@ -6,6 +6,7 @@ from langchain_core.messages import AIMessage, HumanMessage from langchain_core.prompts.chat import ChatPromptTemplate from langflow.schema.message import Message from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER +from loguru import logger from platformdirs import user_cache_dir @@ -176,4 +177,7 @@ def cleanup(): # Clean up the real cache directory after tests cache_dir = Path(user_cache_dir("langflow")) if cache_dir.exists(): - shutil.rmtree(str(cache_dir)) + try: + shutil.rmtree(str(cache_dir)) + except OSError as exc: + logger.error(f"Error cleaning up cache directory: {exc}") diff --git a/uv.lock b/uv.lock index 0d2b01bd2..d01114225 100644 --- a/uv.lock +++ b/uv.lock @@ -4048,7 +4048,7 @@ requires-dist = [ { name = "sentry-sdk", extras = ["fastapi", "loguru"], specifier = ">=2.5.1,<3.0.0" }, { name = "setuptools", specifier = ">=70,<76.0.0" }, { name = "spider-client", specifier = ">=0.0.27,<1.0.0" }, - { name = "sqlmodel", specifier = "==0.0.18" }, + { name = "sqlmodel", specifier = "==0.0.22" }, { name = "typer", specifier = ">=0.13.0,<1.0.0" }, { name = "types-google-cloud-ndb", marker = "extra == 'dev'", specifier = ">=2.2.0.0" }, { name = "types-markdown", marker = "extra == 'dev'", specifier = ">=3.7.0.20240822" }, @@ -7421,15 +7421,15 @@ postgresql-psycopgbinary = [ [[package]] name = "sqlmodel" -version = "0.0.18" +version = "0.0.22" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/19/d0b363befa90c168941f4f7826f6a9d7211f4aa2b99660ac0410bf5803f8/sqlmodel-0.0.18.tar.gz", hash = "sha256:2e520efe03810ef2c268a1004cfc5ef8f8a936312232f38d6c8e62c11af2cac3", size = 109419 } +sdist = { url = "https://files.pythonhosted.org/packages/b5/39/8641040ab0d5e1d8a1c2325ae89a01ae659fc96c61a43d158fb71c9a0bf0/sqlmodel-0.0.22.tar.gz", hash = "sha256:7d37c882a30c43464d143e35e9ecaf945d88035e20117bf5ec2834a23cbe505e", size = 116392 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/5f/8838e6b1b6673709e93386d6d42d28030883079b5ebcbdc7a37f2953e993/sqlmodel-0.0.18-py3-none-any.whl", hash = "sha256:d70fdf8fe595e30a918660cf4537b9c5fc2fffdbfcba851a0135de73c3ebcbb7", size = 26507 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/3af5104b716c420e40a6ea1b09886cae3a1b9f4538343875f637755cae5b/sqlmodel-0.0.22-py3-none-any.whl", hash = "sha256:a1ed13e28a1f4057cbf4ff6cdb4fc09e85702621d3259ba17b3c230bfb2f941b", size = 28276 }, ] [[package]]