Skip to content

Commit

Permalink
Merge branch 'main' into fix-cache
Browse files Browse the repository at this point in the history
  • Loading branch information
cbornet authored Oct 26, 2024
2 parents dd04158 + 2880f58 commit e72f8ab
Show file tree
Hide file tree
Showing 18 changed files with 779 additions and 481 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ dependencies = [
"yfinance>=0.2.40",
"langchain-google-community~=2.0.1",
"wolframalpha>=5.1.3",
"astra-assistants~=2.2.2",
"astra-assistants[tools]~=2.2.5",
"composio-langchain==0.5.9",
"spider-client>=0.0.27",
"nltk>=3.9.1",
Expand Down
2 changes: 2 additions & 0 deletions src/backend/base/langflow/base/tools/component_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ def build_description(component: Component, output: Output) -> str:

def _build_output_function(component: Component, output_method: Callable):
def output_function(*args, **kwargs):
# set the component with the arguments
# set functionality was updatedto handle list of components and other values separately
component.set(*args, **kwargs)
return output_method()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def add_inputs_to_build_config(self, inputs_vertex: list[Vertex], build_config:
async def generate_results(self) -> list[Data]:
tweaks: dict = {}
for field in self._attributes:
if field != "flow_name":
if field != "flow_name" and "|" in field:
[node, name] = field.split("|")
if node not in tweaks:
tweaks[node] = {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,8 @@ def _process_connection_or_parameter(self, key, value) -> None:

def _process_connection_or_parameters(self, key, value) -> None:
# if value is a list of components, we need to process each component
if isinstance(value, list):
# Note this update make sure it is not a list str | int | float | bool | type(None)
if isinstance(value, list) and not any(isinstance(val, str | int | float | bool | type(None)) for val in value):
for val in value:
self._process_connection_or_parameter(key, val)
else:
Expand Down
2 changes: 1 addition & 1 deletion src/backend/base/langflow/schema/artifact.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from langflow.schema.data import Data
from langflow.schema.message import Message
from langflow.schema.schema import recursive_serialize_or_str
from langflow.schema.serialize import recursive_serialize_or_str


class ArtifactType(str, Enum):
Expand Down
2 changes: 2 additions & 0 deletions src/backend/base/langflow/schema/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from loguru import logger
from pydantic import BaseModel, model_serializer, model_validator

from langflow.schema.serialize import recursive_serialize_or_str
from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER

if TYPE_CHECKING:
Expand Down Expand Up @@ -199,6 +200,7 @@ def __str__(self) -> str:
# return a JSON string representation of the Data atributes
try:
data = {k: v.to_json() if hasattr(v, "to_json") else v for k, v in self.data.items()}
data = recursive_serialize_or_str(data)
return json.dumps(data, indent=4)
except Exception: # noqa: BLE001
logger.opt(exception=True).debug("Error converting Data to JSON")
Expand Down
40 changes: 2 additions & 38 deletions src/backend/base/langflow/schema/schema.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from collections.abc import AsyncIterator, Generator, Iterator
from collections.abc import Generator
from enum import Enum
from typing import Literal

from loguru import logger
from pydantic import BaseModel
from pydantic.v1 import BaseModel as BaseModelV1
from typing_extensions import TypedDict

from langflow.schema.data import Data
from langflow.schema.message import Message
from langflow.schema.serialize import recursive_serialize_or_str

INPUT_FIELD_NAME = "input_value"

Expand Down Expand Up @@ -113,38 +112,3 @@ def build_output_logs(vertex, result) -> dict:
outputs |= {name: OutputValue(message=message, type=_type).model_dump()}

return outputs


def recursive_serialize_or_str(obj):
try:
if isinstance(obj, str):
return obj
if isinstance(obj, dict):
return {k: recursive_serialize_or_str(v) for k, v in obj.items()}
if isinstance(obj, list):
return [recursive_serialize_or_str(v) for v in obj]
if isinstance(obj, BaseModel | BaseModelV1):
if hasattr(obj, "model_dump"):
obj_dict = obj.model_dump()
elif hasattr(obj, "dict"):
obj_dict = obj.dict()
return {k: recursive_serialize_or_str(v) for k, v in obj_dict.items()}

if isinstance(obj, AsyncIterator | Generator | Iterator):
# contain memory addresses
# without consuming the iterator
# return list(obj) consumes the iterator
# return f"{obj}" this generates '<generator object BaseChatModel.stream at 0x33e9ec770>'
# it is not useful
return "Unconsumed Stream"
if hasattr(obj, "dict"):
return {k: recursive_serialize_or_str(v) for k, v in obj.dict().items()}
if hasattr(obj, "model_dump"):
return {k: recursive_serialize_or_str(v) for k, v in obj.model_dump().items()}
if isinstance(obj, type) and issubclass(obj, BaseModel):
# This a type BaseModel and not an instance of it
return repr(obj)
return str(obj)
except Exception: # noqa: BLE001
logger.debug(f"Cannot serialize object {obj}")
return str(obj)
43 changes: 43 additions & 0 deletions src/backend/base/langflow/schema/serialize.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from collections.abc import AsyncIterator, Generator, Iterator
from datetime import datetime

from loguru import logger
from pydantic import BaseModel
from pydantic.v1 import BaseModel as BaseModelV1


def recursive_serialize_or_str(obj):
try:
if isinstance(obj, str):
return obj
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, dict):
return {k: recursive_serialize_or_str(v) for k, v in obj.items()}
if isinstance(obj, list):
return [recursive_serialize_or_str(v) for v in obj]
if isinstance(obj, BaseModel | BaseModelV1):
if hasattr(obj, "model_dump"):
obj_dict = obj.model_dump()
elif hasattr(obj, "dict"):
obj_dict = obj.dict()
return {k: recursive_serialize_or_str(v) for k, v in obj_dict.items()}

if isinstance(obj, AsyncIterator | Generator | Iterator):
# contain memory addresses
# without consuming the iterator
# return list(obj) consumes the iterator
# return f"{obj}" this generates '<generator object BaseChatModel.stream at 0x33e9ec770>'
# it is not useful
return "Unconsumed Stream"
if hasattr(obj, "dict"):
return {k: recursive_serialize_or_str(v) for k, v in obj.dict().items()}
if hasattr(obj, "model_dump"):
return {k: recursive_serialize_or_str(v) for k, v in obj.model_dump().items()}
if isinstance(obj, type) and issubclass(obj, BaseModel):
# This a type BaseModel and not an instance of it
return repr(obj)
return str(obj)
except Exception: # noqa: BLE001
logger.debug(f"Cannot serialize object {obj}")
return str(obj)
Loading

0 comments on commit e72f8ab

Please sign in to comment.