Spaces:
Sleeping
Sleeping
from typing import Dict | |
import logging | |
import sqlite3 | |
import chromadb.config | |
from chromadb.telemetry.events import ClientStartEvent | |
from chromadb.telemetry import Telemetry | |
from chromadb.config import Settings, System | |
from chromadb.api import API | |
logger = logging.getLogger(__name__) | |
__settings = Settings() | |
__version__ = "0.4.4" | |
# Workaround to deal with Colab's old sqlite3 version | |
try: | |
import google.colab # noqa: F401 | |
IN_COLAB = True | |
except ImportError: | |
IN_COLAB = False | |
if sqlite3.sqlite_version_info < (3, 35, 0): | |
if IN_COLAB: | |
# In Colab, hotswap to pysqlite-binary if it's too old | |
import subprocess | |
import sys | |
subprocess.check_call( | |
[sys.executable, "-m", "pip", "install", "pysqlite3-binary"] | |
) | |
__import__("pysqlite3") | |
sys.modules["sqlite3"] = sys.modules.pop("pysqlite3") | |
else: | |
raise RuntimeError( | |
"\033[91mYour system has an unsupported version of sqlite3. Chroma requires sqlite3 >= 3.35.0.\033[0m\n" | |
"\033[94mPlease visit https://docs.trychroma.com/troubleshooting#sqlite to learn how to upgrade.\033[0m" | |
) | |
def configure(**kwargs) -> None: # type: ignore | |
"""Override Chroma's default settings, environment variables or .env files""" | |
global __settings | |
__settings = chromadb.config.Settings(**kwargs) | |
def get_settings() -> Settings: | |
return __settings | |
def EphemeralClient(settings: Settings = Settings()) -> API: | |
""" | |
Creates an in-memory instance of Chroma. This is useful for testing and | |
development, but not recommended for production use. | |
""" | |
settings.is_persistent = False | |
return Client(settings) | |
def PersistentClient(path: str = "./chroma", settings: Settings = Settings()) -> API: | |
""" | |
Creates a persistent instance of Chroma that saves to disk. This is useful for | |
testing and development, but not recommended for production use. | |
Args: | |
path: The directory to save Chroma's data to. Defaults to "./chroma". | |
""" | |
settings.persist_directory = path | |
settings.is_persistent = True | |
return Client(settings) | |
def HttpClient( | |
host: str = "localhost", | |
port: str = "8000", | |
ssl: bool = False, | |
headers: Dict[str, str] = {}, | |
settings: Settings = Settings(), | |
) -> API: | |
""" | |
Creates a client that connects to a remote Chroma server. This supports | |
many clients connecting to the same server, and is the recommended way to | |
use Chroma in production. | |
Args: | |
host: The hostname of the Chroma server. Defaults to "localhost". | |
port: The port of the Chroma server. Defaults to "8000". | |
ssl: Whether to use SSL to connect to the Chroma server. Defaults to False. | |
headers: A dictionary of headers to send to the Chroma server. Defaults to {}. | |
""" | |
settings.chroma_api_impl = "chromadb.api.fastapi.FastAPI" | |
settings.chroma_server_host = host | |
settings.chroma_server_http_port = port | |
settings.chroma_server_ssl_enabled = ssl | |
settings.chroma_server_headers = headers | |
return Client(settings) | |
def Client(settings: Settings = __settings) -> API: | |
"""Return a running chroma.API instance""" | |
system = System(settings) | |
telemetry_client = system.instance(Telemetry) | |
api = system.instance(API) | |
system.start() | |
# Submit event for client start | |
telemetry_client.capture(ClientStartEvent()) | |
return api | |