[Bug]: 由于缺少redis依赖,无法导入gptcache,

dvtswwa3  于 2个月前  发布在  Redis
关注(0)|答案(6)|浏览(43)

当前行为

在没有安装redis的环境中导入gptcache会失败(因为它没有被声明为必需的依赖项),并且无法安装(例如,只读文件系统的环境,如AWS lambda)。

import guidance
  File "/var/task/guidance/__init__.py", line 7, in <module>
    from ._program import Program
  File "/var/task/guidance/_program.py", line 17, in <module>
    from .llms import _openai
  File "/var/task/guidance/llms/__init__.py", line 1, in <module>
    from ._openai import OpenAI, MSALOpenAI, AzureOpenAI
  File "/var/task/guidance/llms/_openai.py", line 15, in <module>
    from ._llm import LLM, LLMSession, SyncSession
  File "/var/task/guidance/llms/_llm.py", line 5, in <module>
    from .caches import Cache, DiskCache
  File "/var/task/guidance/llms/caches/__init__.py", line 3, in <module>
    from ._gptcache import GPTCache
  File "/var/task/guidance/llms/caches/_gptcache.py", line 8, in <module>
    from gptcache.adapter.api import get, put, init_similar_cache
  File "/var/task/gptcache/__init__.py", line 5, in <module>
    from gptcache.core import Cache
  File "/var/task/gptcache/core.py", line 7, in <module>
    from gptcache.manager import get_data_manager
  File "/var/task/gptcache/manager/__init__.py", line 4, in <module>
    from gptcache.manager.factory import get_data_manager, manager_factory
  File "/var/task/gptcache/manager/factory.py", line 6, in <module>
    from gptcache.manager.data_manager import SSDataManager, MapDataManager
  File "/var/task/gptcache/manager/data_manager.py", line 10, in <module>
    from gptcache.manager.eviction.distributed_cache import NoOpEviction
  File "/var/task/gptcache/manager/eviction/distributed_cache.py", line 8, in <module>
    import_redis()
  File "/var/task/gptcache/utils/__init__.py", line 260, in import_redis
    _check_library("redis")
  File "/var/task/gptcache/utils/__init__.py", line 59, in _check_library
    prompt_install(package if package else libname)
  File "/var/task/gptcache/utils/dependency_control.py", line 20, in prompt_install
    raise PipInstallError(package) from e
Could not install packages due to an OSError: [Errno 30] Read-only file system: '/home/sbx_user1051'

预期行为

gptcache不应该代表用户安装软件包。
强制性软件包应该在requirements.txt/setup.py中声明,可选功能只有在这些软件包可用时才启用,如果在没有所需软件包的情况下尝试使用该功能,将在运行时引发错误。

重现步骤

Create an AWS lambda function that declares gptcache as a dependency.
In the handler import gptcache.
Trigger the lamdba.

环境

AWS Lambda

其他事项?

  • 无响应*
gdx19jrr

gdx19jrr1#

@a9raag 有机会合并 @leio10 的 pr 来修复这个问题吗?

afdcj2ne

afdcj2ne2#

@marioluan 我已经将其合并到开发分支。

p1tboqfb

p1tboqfb3#

感谢@SimFG!❤️
为了彻底解决这个问题,我们需要发布这个更改。你计划近期发布一个新版本吗?😬

uujelgoq

uujelgoq4#

这是因为NoOpEviction类是从具有RedisEviction实现的distributed_cahe模块中导入的。为了避免这种情况,我已经创建了一个PR,将RedisEviction放入一个单独的模块中。

r1zk6ea1

r1zk6ea15#

你好@a9raag!
我在这里寻找解决这个问题的方法,所以我猜它仍然没有解决。😞
我对这个项目没有太多的上下文,但是检查代码后,我认为问题出在这一行,我们导入了RedisCacheStorage类,同时也加载了模块并尝试安装redis。
由于类只是为了检查一个条件而被加载,是否有可能改变这个条件以避免在最顶层导入类?我不知道是否可以找到另一种方法来决定条件是否为真,或者先检查eviction_manager == "redis",然后再导入类来检查条件中的其他部分。
谢谢!

d5vmydt9

d5vmydt96#

@a9raag 我已经创建了这个PR,试图解决这个问题。因为scalar是给CacheBase类分配的名称,以决定它应该示例化哪个类,我认为检查它是等效的,但在不加载类的情况下。但是我无法测试它,你认为呢?它能工作吗?

相关问题