DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Chroma 报 http-only client mode,PersistentClient 用的是哪份包

chromadb-client 是远程精简客户端,不能承担本地持久化服务。检查同一解释器的分发包和模块路径,在新环境选择完整包或 HttpClient,用测试集合验证而不触碰生产目录。

构造 PersistentClient 时出现:

Chroma is running in http-only client mode

这个错误要求先核对 Python 包。Chroma 的官方使用说明区分完整 chromadb 和精简 chromadb-client:后者用于连接远程服务。它们的导入名称都可能是 chromadb,所以“import 成功”不足以认定安装了完整本地组件。

下面的客户端形态按历史 0.5.7 核对,相关包用途仍需对照项目实际发行版本;没有精确版本的旧日志,不补造发生版本。

先查当前解释器和两个分发包

python -m pip show chromadb chromadb-client
python -m pip check
python -c 'import sys,chromadb; print(sys.executable); print(chromadb.__version__); print(chromadb.__file__)'

如果环境同时装了两者,它们可能覆盖同一导入目录。删除其中一个包也可能影响共享文件,因此优先在新虚拟环境重建,而不是反复修补当前 site-packages。

依赖管理器中明确选择本地嵌入式或远程服务方案,锁定相容版本。不要把完整包只安装到另一个终端解释器,然后继续用原 Notebook 内核验证。

本地数据,使用完整包和独立测试目录

完整环境准备好后,用两个先后退出的子进程检查写入与读取。父进程拥有临时目录,等两次调用都结束后再清理;不打开生产数据。将下面保存为 Python 脚本,使用目标项目的解释器运行:

import subprocess
import sys
from tempfile import TemporaryDirectory

CHILD = r"""
import sys
import chromadb
from chromadb.config import Settings

mode, directory = sys.argv[1:]
client = chromadb.PersistentClient(
    path=directory,
    settings=Settings(anonymized_telemetry=False),
)
if mode == "write":
    collection = client.create_collection(
        name="package-check",
        embedding_function=None,
    )
    collection.add(ids=["one"], embeddings=[[1.0, 0.0]])
else:
    collection = client.get_collection(
        name="package-check",
        embedding_function=None,
    )
    if collection.count() != 1:
        raise RuntimeError("unexpected persisted count")
    if collection.get(ids=["one"])["ids"] != ["one"]:
        raise RuntimeError("persisted ID was not found")
print(mode + " complete")
"""

def main():
    with TemporaryDirectory(prefix="chroma-package-check-") as directory:
        for mode in ("write", "read"):
            subprocess.run(
                [sys.executable, "-c", CHILD, mode, directory],
                check=True,
                timeout=60,
            )
    print("test directory removed")

if __name__ == "__main__":
    main()

示例采用 0.5.7 API,关闭产品遥测并显式提供向量,避免包检查额外下载 embedding 模型。它会写入专用临时目录;子进程出错会停止后续步骤,超时则由父进程结束并等待该子进程,再退出临时目录。二维向量只是测试数据,不能用于证明真实检索质量。固定版本客户端定义提供了对应构造接口。

0.5.7 的共享 System 实现按持久化目录缓存实例。同一进程创建第二个客户端可能复用原来的 System,因此不能靠它证明数据已从磁盘重载。这里让写入进程退出后,才启动读取进程;两次命令都成功并找到原 ID,再核对备份副本中的真实集合。

远程数据,保留精简包并使用 HttpClient

连接远程服务时,应采用 HttpClient,而不是把服务地址当本地路径。先用已有配置创建客户端,再调用 heartbeat() 检查连接;远程 HTTPS 和认证继续沿用正常配置。

精简包不包含默认 embedding 依赖。用 documents 添加或用文本查询时,还需要明确的 embedding function,或由应用提供已有向量。包冲突修复成功以后出现“需要 embedding function”,属于下一步配置,不应把所有依赖又混装回来。

验收看原应用选定的模式:本地测试集合能创建、保存并由新进程读取;远程服务则能通过正常身份访问目标集合。检查实际地址和集合后,再恢复业务流量。