import logging from typing import Optional import yaml from typing_extensions import Annotated import typer import uvicorn import os import webbrowser from chromadb.cli.utils import set_log_file_path app = typer.Typer() _logo = """ \033[38;5;069m((((((((( \033[38;5;203m(((((\033[38;5;220m#### \033[38;5;069m(((((((((((((\033[38;5;203m(((((((((\033[38;5;220m######### \033[38;5;069m(((((((((((((\033[38;5;203m(((((((((((\033[38;5;220m########### \033[38;5;069m((((((((((((((\033[38;5;203m((((((((((((\033[38;5;220m############ \033[38;5;069m(((((((((((((\033[38;5;203m((((((((((((((\033[38;5;220m############# \033[38;5;069m(((((((((((((\033[38;5;203m((((((((((((((\033[38;5;220m############# \033[38;5;069m((((((((((((\033[38;5;203m(((((((((((((\033[38;5;220m############## \033[38;5;069m((((((((((((\033[38;5;203m((((((((((((\033[38;5;220m############## \033[38;5;069m((((((((((\033[38;5;203m(((((((((((\033[38;5;220m############# \033[38;5;069m((((((((\033[38;5;203m((((((((\033[38;5;220m############## \033[38;5;069m(((((\033[38;5;203m(((( \033[38;5;220m#########\033[0m """ @app.command() # type: ignore def run( path: str = typer.Option( "./chroma_data", help="The path to the file or directory." ), host: Annotated[ Optional[str], typer.Option(help="The host to listen to. Default: localhost") ] = "localhost", log_path: Annotated[ Optional[str], typer.Option(help="The path to the log file.") ] = "chroma.log", port: int = typer.Option(8000, help="The port to run the server on."), test: bool = typer.Option(False, help="Test mode.", show_envvar=False, hidden=True), ) -> None: """Run a chroma server""" print("\033[1m") # Bold logo print(_logo) print("\033[1m") # Bold print("Running Chroma") print("\033[0m") # Reset typer.echo(f"\033[1mSaving data to\033[0m: \033[32m{path}\033[0m") typer.echo( f"\033[1mConnect to chroma at\033[0m: \033[32mhttp://{host}:{port}\033[0m" ) typer.echo( "\033[1mGetting started guide\033[0m: https://docs.trychroma.com/getting-started\n\n" ) # set ENV variable for PERSIST_DIRECTORY to path os.environ["IS_PERSISTENT"] = "True" os.environ["PERSIST_DIRECTORY"] = path os.environ["CHROMA_SERVER_NOFILE"] = "65535" # get the path where chromadb is installed chromadb_path = os.path.dirname(os.path.realpath(__file__)) # this is the path of the CLI, we want to move up one directory chromadb_path = os.path.dirname(chromadb_path) log_config = set_log_file_path(f"{chromadb_path}/log_config.yml", f"{log_path}") config = { "app": "chromadb.app:app", "host": host, "port": port, "workers": 1, "log_config": log_config, # Pass the modified log_config dictionary "timeout_keep_alive": 30, } if test: return uvicorn.run(**config) @app.command() # type: ignore def help() -> None: """Opens help url in your browser""" webbrowser.open("https://discord.gg/MMeYNTmh3x") @app.command() # type: ignore def docs() -> None: """Opens docs url in your browser""" webbrowser.open("https://docs.trychroma.com") if __name__ == "__main__": app()