badalsahani's picture
feat: chroma initial deploy
287a0bc
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()