refactor(cache): move cache-related functions to base.py module

feat(cache): add support for pandas and PIL Image objects caching
fix(interface): import cache-related functions from base.py module
test(cache): update import statements in cache-related test file
This commit is contained in:
Gabriel Almeida 2023-04-19 11:02:32 -03:00
commit d978ae5438
6 changed files with 44 additions and 5 deletions

View file

@ -3,6 +3,10 @@ from pydantic import BaseModel, validator
from langflow.graph.utils import extract_input_variables_from_prompt from langflow.graph.utils import extract_input_variables_from_prompt
class CacheResponse(BaseModel):
data: dict
class Code(BaseModel): class Code(BaseModel):
code: str code: str

View file

@ -0,0 +1 @@
from langflow.cache.base import add_pandas, add_image, get # noqa

View file

@ -1,14 +1,18 @@
import base64
import contextlib import contextlib
import functools import functools
import hashlib import hashlib
import json import json
import os import os
import tempfile import tempfile
from collections import OrderedDict from collections import OrderedDict
from pathlib import Path from pathlib import Path
from typing import Any
from PIL import Image
import dill
import pandas as pd # type: ignore
import dill # type: ignore CACHE = {}
def create_cache_folder(func): def create_cache_folder(func):
@ -147,3 +151,33 @@ def load_cache(hash_val):
with cache_path.open("rb") as cache_file: with cache_path.open("rb") as cache_file:
return dill.load(cache_file) return dill.load(cache_file)
return None return None
def add_pandas(name: str, obj: Any):
if isinstance(obj, (pd.DataFrame, pd.Series)):
CACHE[name] = {"obj": obj, "type": "pandas"}
else:
raise ValueError("Object is not a pandas DataFrame or Series")
def add_image(name: str, obj: Any):
if isinstance(obj, Image.Image):
CACHE[name] = {"obj": obj, "type": "image"}
else:
raise ValueError("Object is not a PIL Image")
def get(name: str):
return CACHE.get(name, {}).get("obj", None)
# get last added item
def get_last():
obj_dict = list(CACHE.values())[-1]
if obj_dict["type"] == "pandas":
# return a csv string
return obj_dict["obj"].to_csv()
elif obj_dict["type"] == "image":
# return a base64 encoded string
return base64.b64encode(obj_dict["obj"].tobytes()).decode("utf-8")
return obj_dict["obj"]

View file

@ -9,7 +9,7 @@ import warnings
from copy import deepcopy from copy import deepcopy
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from langflow.cache import utils as cache_utils from langflow.cache import base as cache_utils
from langflow.graph.constants import DIRECT_TYPES from langflow.graph.constants import DIRECT_TYPES
from langflow.interface import loading from langflow.interface import loading
from langflow.interface.listing import ALL_TYPES_DICT from langflow.interface.listing import ALL_TYPES_DICT

View file

@ -2,7 +2,7 @@ import contextlib
import io import io
from typing import Any, Dict from typing import Any, Dict
from langflow.cache.utils import compute_dict_hash, load_cache, memoize_dict from langflow.cache.base import compute_dict_hash, load_cache, memoize_dict
from langflow.graph.graph import Graph from langflow.graph.graph import Graph
from langflow.interface import loading from langflow.interface import loading
from langflow.utils.logger import logger from langflow.utils.logger import logger

View file

@ -3,7 +3,7 @@ import tempfile
from pathlib import Path from pathlib import Path
import pytest import pytest
from langflow.cache.utils import PREFIX, save_cache from langflow.cache.base import PREFIX, save_cache
from langflow.interface.run import load_langchain_object from langflow.interface.run import load_langchain_object