diff --git a/.devcontainer.json b/.devcontainer.json new file mode 100755 index 000000000..db8bfafff --- /dev/null +++ b/.devcontainer.json @@ -0,0 +1,76 @@ +{ + // Set container runtime user + "remoteUser": "work", + "build": { + "dockerfile": ".devcontainer/Dockerfile.dev", + "context": "./", + "args": { + "USER_UID": "${localEnv:UID:1001}", + "USER_GID": "${localEnv:GID:1001}", + "USER_NAME":"${localEnv:USER:work}" + }, + "options": ["--no-cache"] + + }, + "name": "dbgpt", + "workspaceFolder": "/app", + "workspaceMount": "source=${localWorkspaceFolder},target=/app,type=bind", + "runArgs": [ + "--network", + "host", + "--runtime=nvidia", + "--gpus", + "all", + "-e", + "LOCAL_DB_HOST=${localEnv:LOCAL_DB_HOST}", + "-e", + "LOCAL_DB_PASSWORD=${localEnv:LOCAL_DB_PASSWORD}", + "-e", + "MYSQL_ROOT_PASSWORD=${localEnv:MYSQL_ROOT_PASSWORD}", + "-e", + "LLM_MODEL=${localEnv:LLM_MODEL}", + "-e", + "LANGUAGE=${localEnv:LANGUAGE}", + "-e", + "PROXY_SERVER_URL=${localEnv:PROXY_SERVER_URL}", + "-e", + "HF_HOME=/app/models" + ], + "mounts": [ + // sharing-git-credentials see https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials + "source=${localEnv:SSH_AUTH_SOCK},target=/run/host-services/ssh-auth.sock,type=bind", + // mount to local models + "source=${localWorkspaceFolder}/models/text2vec-large-chinese,target=/app/models/text2vec-large-chinese,type=bind" + ], + "containerEnv": { + "SSH_AUTH_SOCK": "/run/host-services/ssh-auth.sock" + }, + "postCreateCommand": "chmod +x /app/.devcontainer/post-create.sh && /app/.devcontainer/post-create.sh", + "customizations": { + "vscode": { + "settings": { + "extensions.verifySignature": false, + "http.proxyStrictSSL": false, + "python.linting.flake8Enabled": true, + "python.languageServer": "Pylance", + "python.linting.enabled": true, + "terminal.integrated.defaultProfile.linux": "zsh", + "terminal.integrated.shell.linux": "/bin/zsh", + "python.linting.mypyEnabled": true, + "python.linting.provider": "ruff", + "python.formatting.provider": "ruff" + }, + "extensions": [ + "ms-python.python", + "ms-python.isort", + "ms-python.vscode-pylance", + "ms-python.autopep8", + "ms-vscode.makefile-tools", + "ms-python.flake8", + "ms-azuretools.vscode-docker", + "ms-python.mypy-type-checker", + "charliermarsh.ruff" + ] + } + } +} diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 000000000..486490797 --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -0,0 +1,40 @@ +FROM eosphorosai/dbgpt:latest +ARG EXTRAS="proxy_openai,rag,storage_chromadb,quant_bnb,graph_rag" +ARG PYTHON_VERSION=3.10 +ARG USER_UID=1001 +ARG USER_GID=1001 +ARG USER=work +ARG PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple" + +WORKDIR /app +COPY . . +USER root +# Set the GID and UID of the container and +# add a user to prevent permission mismatches +# between the container user (root) and the host user, +# and to resolve the issue of the host user lacking write permissions. +RUN groupadd -g $USER_GID $USER && \ + useradd -u $USER_UID -g $USER_GID -m $USER && \ + chown -R $USER_UID:$USER_GID /app + +RUN apt-get update && apt-get install -y \ + git \ + curl \ + wget \ + ssh zsh autojump curl git-flow vim sudo \ + && python${PYTHON_VERSION} -m pip install --upgrade pip \ + && python${PYTHON_VERSION} -m pip install --upgrade pipx \ + && pipx install uv --global \ + && chown -R $USER:$USER /opt/.uv.venv \ + && echo "$USER ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USER \ + && chmod 0440 /etc/sudoers.d/$USER +USER $USER +ENV UV_LINK_MODE=copy +RUN /opt/.uv.venv/bin/python3 -m pip install uv -i https://mirrors.aliyun.com/pypi/simple/ && \ + extras=$(echo $EXTRAS | tr ',' '\n' | while read extra; do echo "--extra $extra"; done | tr '\n' ' ') && \ + echo $extras && \ + /opt/.uv.venv/bin/uv pip install -r pyproject.toml --all-extras && \ + /opt/.uv.venv/bin/uv pip install -r requirements/dev-requirements.txt && \ + /opt/.uv.venv/bin/uv pip install -r requirements/lint-requirements.txt && \ + cp .devcontainer/dbgpt.pth /opt/.uv.venv/lib/python3.10/site-packages/dbgpt.pth && \ + python -c "import dbgpt; print(dbgpt.__version__)" \ No newline at end of file diff --git a/.devcontainer/dbgpt.pth b/.devcontainer/dbgpt.pth new file mode 100644 index 000000000..b4f79cbee --- /dev/null +++ b/.devcontainer/dbgpt.pth @@ -0,0 +1,8 @@ +/app/packages/dbgpt-app/src +/app/packages/dbgpt-accelerator +/app/packages/dbgpt-accelerator/src +/app/packages/dbgpt-core/src +/app/packages/dbgpt-client/src +/app/packages/dbgpt-ext/src +/app/packages/dbgpt-serve/src +/app/packages/dbgpt-app/src \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 000000000..d85b414f8 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,54 @@ +#!/bin/bash +set -e +cd /app +# Install Oh My Zsh +if [ ! -d ~/.oh-my-zsh ]; then + sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended +fi + +# Install plugins +plugins=( + "zsh-users/zsh-autosuggestions" + "zsh-users/zsh-syntax-highlighting" +) + +for plugin in "${plugins[@]}"; do + repo_name=$(basename $plugin) + if [ ! -d ~/.oh-my-zsh/custom/plugins/$repo_name ]; then + git clone --depth=1 https://github.com/$plugin.git ~/.oh-my-zsh/custom/plugins/$repo_name + fi +done + +# Install theme +if [ ! -d ~/.oh-my-zsh/custom/themes/powerlevel10k ]; then + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/.oh-my-zsh/custom/themes/powerlevel10k +fi + +# Apply custom configuration +if [ -f /workspace/.devcontainer/zshrc-config ]; then + cp /workspace/.devcontainer/zshrc-config ~/.zshrc +else + # Generate basic .zshrc if no custom configuration exists + cat << EOF > ~/.zshrc +export ZSH="\$HOME/.oh-my-zsh" +ZSH_THEME="robbyrussell" +plugins=(git zsh-autosuggestions zsh-syntax-highlighting autojump) +source \$ZSH/oh-my-zsh.sh + +# Enable autojump +[[ -s /usr/share/autojump/autojump.sh ]] && source /usr/share/autojump/autojump.sh +EOF +fi + +# Ensure autojump configuration is applied (even if custom configuration exists) +if ! grep -q "autojump.sh" ~/.zshrc; then + echo '[[ -s /usr/share/autojump/autojump.sh ]] && source /usr/share/autojump/autojump.sh' >> ~/.zshrc +fi +cat << EOF >> ~/.zshrc +# Add the following to ~/.zshrc +if [ -f /app/.env ]; then + export $(grep -vE '^#|^$' /app/.env | xargs) +fi +EOF +rm -rf .venv.make +echo "Post-create setup completed!" \ No newline at end of file diff --git a/Makefile b/Makefile index 51399cf26..184b743c8 100644 --- a/Makefile +++ b/Makefile @@ -24,13 +24,14 @@ $(VENV)/.venv-timestamp: uv.lock testenv: $(VENV)/.testenv $(VENV)/.testenv: $(VENV)/bin/activate - uv sync --all-packages \ + . $(VENV_BIN)/activate && uv sync --active --all-packages \ --extra "base" \ --extra "proxy_openai" \ --extra "rag" \ --extra "storage_chromadb" \ --extra "dbgpts" \ --link-mode=copy + cp .devcontainer/dbgpt.pth $(VENV)/lib/python3.11/site-packages touch $(VENV)/.testenv @@ -69,7 +70,7 @@ fmt-check: setup ## Check Python code formatting and style without making change pre-commit: fmt-check test test-doc mypy ## Run formatting and unit tests before committing test: $(VENV)/.testenv ## Run unit tests - $(VENV_BIN)/pytest dbgpt + $(VENV_BIN)/pytest --pyargs dbgpt .PHONY: test-doc test-doc: $(VENV)/.testenv ## Run doctests @@ -88,7 +89,7 @@ mypy: $(VENV)/.testenv ## Run mypy checks .PHONY: coverage coverage: setup ## Run tests and report coverage - $(VENV_BIN)/pytest dbgpt --cov=dbgpt + $(VENV_BIN)/pytest --pyargs dbgpt --cov=dbgpt .PHONY: clean clean: ## Clean up the environment diff --git a/pyproject.toml b/pyproject.toml index 74878e886..6bfa5bf49 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ members = [ "packages/dbgpt-core", "packages/dbgpt-ext", "packages/dbgpt-serve", - "packages/dbgpt-accelerator/*" + "packages/dbgpt-accelerator/dbgpt-acc*" ] [tool.uv]