langgenius / dify

Dify is an open-source LLM app development platform. Dify's intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production.
https://dify.ai
Other
47.72k stars 6.79k forks source link

support huawei cloud obs storage #7980

Closed hwzhuhao closed 1 month ago

hwzhuhao commented 1 month ago

Self Checks

1. Is this request related to a challenge you're experiencing? Tell me about your story.

support huawei cloud obs storage

2. Additional context or comments

No response

3. Can you help us with this feature?

dosubot[bot] commented 1 month ago

To add support for Huawei Cloud OBS storage, you can create a new class similar to AliyunStorage but using the Huawei Cloud OBS SDK. Below is an example implementation:

from collections.abc import Generator
from contextlib import closing

import huaweicloudsdkobs.v3 as huawei_obs
from flask import Flask

from extensions.storage.base_storage import BaseStorage

class HuaweiOBSStorage(BaseStorage):
    """Implementation for Huawei Cloud OBS storage."""

    def __init__(self, app: Flask):
        super().__init__(app)

        app_config = self.app.config
        self.bucket_name = app_config.get("HUAWEI_OBS_BUCKET_NAME")
        self.folder = app.config.get("HUAWEI_OBS_PATH")
        self.client = huawei_obs.ObsClient(
            access_key_id=app_config.get("HUAWEI_OBS_ACCESS_KEY"),
            secret_access_key=app_config.get("HUAWEI_OBS_SECRET_KEY"),
            server=app_config.get("HUAWEI_OBS_ENDPOINT")
        )

    def save(self, filename, data):
        if not self.folder or self.folder.endswith("/"):
            filename = self.folder + filename
        else:
            filename = self.folder + "/" + filename
        self.client.putContent(self.bucket_name, filename, data)

    def load_once(self, filename: str) -> bytes:
        if not self.folder or self.folder.endswith("/"):
            filename = self.folder + filename
        else:
            filename = self.folder + "/" + filename

        response = self.client.getObject(self.bucket_name, filename)
        with closing(response.body) as obj:
            data = obj.read()
        return data

    def load_stream(self, filename: str) -> Generator:
        def generate(filename: str = filename) -> Generator:
            if not self.folder or self.folder.endswith("/"):
                filename = self.folder + filename
            else:
                filename = self.folder + "/" + filename

            response = self.client.getObject(self.bucket_name, filename)
            with closing(response.body) as obj:
                while chunk := obj.read(4096):
                    yield chunk

        return generate()

    def download(self, filename, target_filepath):
        if not self.folder or self.folder.endswith("/"):
            filename = self.folder + filename
        else:
            filename = self.folder + "/" + filename

        self.client.getObject(self.bucket_name, filename, target_filepath)

    def exists(self, filename):
        if not self.folder or self.folder.endswith("/"):
            filename = self.folder + filename
        else:
            filename = self.folder + "/" + filename

        response = self.client.getObjectMetadata(self.bucket_name, filename)
        return response.status < 300

    def delete(self, filename):
        if not self.folder or self.folder.endswith("/"):
            filename = self.folder + filename
        else:
            filename = self.folder + "/" + filename
        self.client.deleteObject(self.bucket_name, filename)

This implementation assumes you have the Huawei Cloud OBS SDK installed and configured. You will need to adjust the configuration keys (HUAWEI_OBS_BUCKET_NAME, HUAWEI_OBS_ACCESS_KEY, etc.) according to your application's configuration [1].

To continue talking to Dosu, mention @dosu.