diff --git a/.gitignore b/.gitignore index 9f5f7314d..cf259ad42 100644 --- a/.gitignore +++ b/.gitignore @@ -255,4 +255,5 @@ langflow.db /tmp/* src/backend/langflow/frontend/ -.docker \ No newline at end of file +.docker +scratchpad* \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index f5ed4b23e..17c9098db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.6.1" +version = "0.6.2" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ diff --git a/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py b/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py new file mode 100644 index 000000000..cfdd10578 --- /dev/null +++ b/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py @@ -0,0 +1,45 @@ +"""Add unique constraints + +Revision ID: 006b3990db50 +Revises: 1ef9c4f3765d +Create Date: 2023-12-13 18:55:52.587360 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa # noqa: F401 +import sqlmodel # noqa: F401 +# revision identifiers, used by Alembic. +revision: str = '006b3990db50' +down_revision: Union[str, None] = '1ef9c4f3765d' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('apikey', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_apikey_id', ['id']) + + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_flow_id', ['id']) + + with op.batch_alter_table('user', schema=None) as batch_op: + batch_op.create_unique_constraint('uq_user_id', ['id']) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('user', schema=None) as batch_op: + batch_op.drop_constraint('uq_user_id', type_='unique') + + with op.batch_alter_table('flow', schema=None) as batch_op: + batch_op.drop_constraint('uq_flow_id', type_='unique') + + with op.batch_alter_table('apikey', schema=None) as batch_op: + batch_op.drop_constraint('uq_apikey_id', type_='unique') + + # ### end Alembic commands ### diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index c034c2676..059ad23b6 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -178,7 +178,6 @@ async def stream_build( time_elapsed = format_elapsed_time(time.perf_counter() - start_time) update_build_status(cache_service, flow_id, BuildStatus.FAILURE) - vertex_id = vertex.parent_node_id if vertex.parent_is_top_level else vertex.id if vertex_id in graph.top_level_vertices: response = { diff --git a/src/backend/langflow/services/cache/factory.py b/src/backend/langflow/services/cache/factory.py index 10e657bc5..32f726c6b 100644 --- a/src/backend/langflow/services/cache/factory.py +++ b/src/backend/langflow/services/cache/factory.py @@ -1,7 +1,8 @@ -from langflow.services.cache.service import InMemoryCache, RedisCache, BaseCacheService +from typing import TYPE_CHECKING + +from langflow.services.cache.service import BaseCacheService, InMemoryCache, RedisCache from langflow.services.factory import ServiceFactory from langflow.utils.logger import logger -from typing import TYPE_CHECKING if TYPE_CHECKING: from langflow.services.settings.service import SettingsService diff --git a/src/backend/langflow/services/database/service.py b/src/backend/langflow/services/database/service.py index 3610f0dea..9765d858f 100644 --- a/src/backend/langflow/services/database/service.py +++ b/src/backend/langflow/services/database/service.py @@ -5,16 +5,17 @@ from typing import TYPE_CHECKING import sqlalchemy as sa from alembic import command, util from alembic.config import Config +from loguru import logger +from sqlalchemy import inspect +from sqlalchemy.exc import OperationalError +from sqlmodel import Session, SQLModel, create_engine, select, text + from langflow.services.base import Service from langflow.services.database import models # noqa from langflow.services.database.models.user.crud import get_user_by_username from langflow.services.database.utils import Result, TableResults from langflow.services.deps import get_settings_service from langflow.services.utils import teardown_superuser -from loguru import logger -from sqlalchemy import inspect -from sqlalchemy.exc import OperationalError -from sqlmodel import Session, SQLModel, create_engine, select, text if TYPE_CHECKING: from sqlalchemy.engine import Engine @@ -147,16 +148,18 @@ class DatabaseService(Service): try: command.check(alembic_cfg) except Exception as exc: - if isinstance(exc, util.exc.CommandError) or isinstance(exc, util.exc.AutogenerateDiffsDetected): + if isinstance(exc, (util.exc.CommandError, util.exc.AutogenerateDiffsDetected)): command.upgrade(alembic_cfg, "head") time.sleep(3) try: command.check(alembic_cfg) - except util.exc.AutogenerateDiffsDetected: + except util.exc.AutogenerateDiffsDetected as e: logger.exception("AutogenerateDiffsDetected: {exc}") if not fix: - raise RuntimeError("Something went wrong running migrations. Please, run `langflow migration --fix`") + raise RuntimeError( + "Something went wrong running migrations. Please, run `langflow migration --fix`" + ) from e if fix: self.try_downgrade_upgrade_until_success(alembic_cfg) diff --git a/src/backend/langflow/template/field/base.py b/src/backend/langflow/template/field/base.py index d59aaa68f..021c0104d 100644 --- a/src/backend/langflow/template/field/base.py +++ b/src/backend/langflow/template/field/base.py @@ -69,14 +69,10 @@ class TemplateField(BaseModel): @field_serializer("file_path") def serialize_file_path(self, value): - if self.field_type == "file": - return value - return "" + return value if self.field_type == "file" else "" @field_serializer("field_type") def serialize_field_type(self, value, _info): - if value == "float": - # check if range_spec is set - if self.range_spec is None: - self.range_spec = RangeSpec() + if value == "float" and self.range_spec is None: + self.range_spec = RangeSpec() return value