Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1.2.0 breaks Custom Data Layer #1390

Closed
marketneutral opened this issue Oct 1, 2024 · 4 comments
Closed

1.2.0 breaks Custom Data Layer #1390

marketneutral opened this issue Oct 1, 2024 · 4 comments
Labels
bug Something isn't working data layer Pertains to data layers. needs-triage

Comments

@marketneutral
Copy link

Describe the bug
Release 1.2.0 breaks the example(s) in https://docs.chainlit.io/data-persistence/custom

To Reproduce

This is the code that works prior to 1.2.0

storage_client = S3StorageClient(bucket=bucket_name)
cl_data._data_layer = SQLAlchemyDataLayer(conninfo=db, storage_provider=storage_client)

After 1.2.0, on startup, I get the TypeError

2024-10-01 14:26:12 - S3StorageClient initialized
Traceback (most recent call last):
  File "/home/jlarkin/.conda/envs/chatimc/bin/chainlit", line 8, in <module>
    sys.exit(cli())
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/chainlit/cli/__init__.py", line 199, in chainlit_run
    run_chainlit(target)
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/chainlit/cli/__init__.py", line 64, in run_chainlit
    load_module(config.run.module_name)
  File "/home/jlarkin/.conda/envs/chatimc/lib/python3.10/site-packages/chainlit/config.py", line 446, in load_module
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/jlarkin/chatimc/app.py", line 45, in <module>
    cl_data._data_layer = SQLAlchemyDataLayer(conninfo=db, storage_provider=storage_client)
TypeError: Can't instantiate abstract class SQLAlchemyDataLayer with abstract method get_element

Could you adivse on a new example for 1.2.0?

Copy link

dosubot bot commented Oct 1, 2024

Hey @marketneutral! I'm here to help you with any bugs, questions, or contributions. Let's tackle this together!

In version 1.2.0, the SQLAlchemyDataLayer class requires the implementation of certain abstract methods, such as get_element. This is likely causing the TypeError you're encountering.

To resolve this, you need to ensure that all required abstract methods are implemented in your custom data layer. Here's a basic example of how you might implement the get_element method:

from typing import Optional, Dict, Any, List, Union
import chainlit.data as cl_data
from chainlit.data.sql_alchemy import SQLAlchemyDataLayer
from chainlit.data.storage_clients import S3StorageClient

class CustomSQLAlchemyDataLayer(SQLAlchemyDataLayer):
    async def get_element(self, thread_id: str, element_id: str) -> Optional["ElementDict"]:
        # Implement the method logic here
        query = """SELECT * FROM elements WHERE "threadId" = :thread_id AND "id" = :element_id"""
        parameters = {"thread_id": thread_id, "element_id": element_id}
        element: Union[List[Dict[str, Any]], int, None] = await self.execute_sql(
            query=query, parameters=parameters
        )
        if isinstance(element, list) and element:
            element_dict: Dict[str, Any] = element[0]
            return ElementDict(
                id=element_dict["id"],
                threadId=element_dict.get("threadId"),
                type=element_dict["type"],
                chainlitKey=element_dict.get("chainlitKey"),
                url=element_dict.get("url"),
                objectKey=element_dict.get("objectKey"),
                name=element_dict["name"],
                display=element_dict["display"],
                size=element_dict.get("size"),
                language=element_dict.get("language"),
                page=element_dict.get("page"),
                autoPlay=element_dict.get("autoPlay"),
                playerConfig=element_dict.get("playerConfig"),
                forId=element_dict.get("forId"),
                mime=element_dict.get("mime"),
            )
        else:
            return None

# Usage
storage_client = S3StorageClient(bucket="your_bucket_name")
cl_data._data_layer = CustomSQLAlchemyDataLayer(conninfo="your_conninfo", storage_provider=storage_client)

Make sure to replace "your_bucket_name" and "your_conninfo" with your actual S3 bucket name and database connection information. This should help you get started with the updated version.

To continue talking to Dosu, mention @dosu.

@dosubot dosubot bot added bug Something isn't working data layer Pertains to data layers. labels Oct 1, 2024
@hayescode
Copy link
Contributor

Fixed in #1346 a couple weeks ago but they haven't made a new release to include it

@LeonKalt
Copy link

LeonKalt commented Oct 8, 2024

Please make a new release, this blocks the update for us.

@dokterbob
Copy link
Collaborator

@LeonKalt @hayescode Fix is part of 1.3.0rc0. Would love feedback on that. We'll probably release 1.3.0 start of next week.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working data layer Pertains to data layers. needs-triage
Projects
None yet
Development

No branches or pull requests

4 participants