Last active
December 6, 2023 23:00
-
-
Save loopyd/d0dc5eda53d04fc92017bfa20f97e906 to your computer and use it in GitHub Desktop.
AutoGen Assistant Runner
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash -i | |
# This script runs autogenra UI easily with a folder. Simply create the folder, drop this script into it, and run. | |
# | |
# Notice: Because this script adds groups to your user, for anaconda, python, and node, you'll need to re-run it a few times. | |
# The process isn't fully automated due to a restriction with newgrp command spawning a subshell. | |
# Put your OPENAI API key here. | |
export OPENAI_API_KEY="your_api_key_here" | |
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" | |
PYTHON_VERSION="3.10.13" | |
NODE_VERSION="lts/iron" | |
# @name exit_program | |
# @brief Trap for exiting the program gracefully | |
# @description This is an exit trap for exiting the program gracefully. For example, if the user presses ctrl+c. | |
function exit_program() { | |
cd "${SCRIPT_DIR}" | |
__manage_nvm deactivate version="${NODE_VERSION}" | |
__manage_conda deactivate environment="autogenra" | |
__manage_pyenv deactivate version="${PYTHON_VERSION}" | |
exit 1 | |
} | |
trap exit_program EXIT | |
# @name __safe_cmd | |
# @brief Executes a command and exits if it fails | |
# @description Executes a command and exits if it fails | |
# @arg $1 string cmd: command to execute | |
function __safe_cmd() { | |
local cmd="$*" | |
$cmd | |
local status=$? | |
if [ $status -ne 0 ]; then | |
echo "Command exited with status: $status" | |
exit 1 | |
fi | |
} | |
# @name __manage_pyenv | |
# @brief Manages pyenv installation and activation | |
# @description Manages pyenv installation and activation automatically | |
# @arg $1 string action: install, uninstall, activate, deactivate | |
# @arg $2 string cmd: arguments to parse for version | |
function __manage_pyenv() { | |
local action="$1" | |
shift 1 | |
local cmd="$*" | |
MY_PYTHON_VERSION=$(echo "$cmd" | grep -oP "(?<=version=)[0-9\.]+" | grep -oP "[0-9\.]+") | |
case "$action" in | |
"install") | |
if [[ -n $MY_PYTHON_VERSION ]]; then | |
if ! pyenv versions | grep -q "${MY_PYTHON_VERSION}"; then | |
echo "Installing python ${MY_PYTHON_VERSION}" | |
__safe_cmd "pyenv install ${MY_PYTHON_VERSION}" | |
else | |
echo "Python ${MY_PYTHON_VERSION} already installed" | |
fi | |
return 0 | |
fi | |
if ! grep -q "python" /etc/group; then | |
echo "Adding python group" | |
__safe_cmd sudo groupadd python | |
fi | |
if ! groups | grep -q "python"; then | |
echo "Adding user to python group" | |
__safe_cmd sudo usermod -a -G python $USER | |
newgrp python | |
fi | |
if [[ ! -d /usr/local/pyenv ]] && ! command pyenv versions &>/dev/null; then | |
echo "Installing pyenv" | |
__safe_cmd git clone 'https://github.com/pyenv/pyenv.git' /usr/local/pyenv | |
__safe_cmd sudo chown -R root:python /usr/local/pyenv | |
__safe_cmd sudo chmod -R 770 /usr/local/pyenv | |
pushd /usr/local/pyenv || exit | |
__safe_cmd "src/configure && make -C src" | |
popd || exit | |
fi | |
if ! echo "$PYENV_ROOT/bin" | grep -q "$PATH"; then | |
export PATH="$PYENV_ROOT/bin:$PATH" | |
fi | |
eval "$(pyenv init --path)" | |
eval "$(pyenv init -)" | |
. "$HOME/.bashrc" | |
;; | |
"uninstall") | |
if [[ -n $MY_PYTHON_VERSION ]]; then | |
__manage_pyenv deactivate $cmd | |
if pyenv versions | grep -q "${MY_PYTHON_VERSION}"; then | |
echo "Removing python ${MY_PYTHON_VERSION}" | |
__safe_cmd "pyenv uninstall ${MY_PYTHON_VERSION}" | |
fi | |
return 0 | |
fi | |
if grep -q "pyenv init" ~/.bashrc; then | |
echo "Removing pyenv init from bashrc" | |
# shellcheck disable=SC2001 | |
new_bashrc=$(cat ~/.bashrc | sed -e "s#eval \"\$(pyenv init -)\"##g") | |
echo "$new_bashrc" > ~/.bashrc | |
. "$HOME/.bashrc" | |
fi | |
if echo "$PYENV_ROOT/bin" | grep -q "$PATH"; then | |
# shellcheck disable=SC2001 | |
new_path=$(echo "$PATH" | sed -e "s#$PYENV_ROOT/bin:##g") | |
export PATH="$new_path" | |
fi | |
if groups | grep -q "python"; then | |
echo "Removing user from python group" | |
__safe_cmd sudo gpasswd -d $USER python | |
fi | |
if grep -q "python" /etc/group; then | |
echo "Removing python group" | |
__safe_cmd sudo groupdel python | |
fi | |
if [[ -d /usr/local/pyenv ]]; then | |
echo "Removing pyenv" | |
__safe_cmd sudo rm -rf /usr/local/pyenv | |
fi | |
;; | |
"activate") | |
if [[ -z $MY_PYTHON_VERSION ]]; then | |
echo "No python version specified" | |
return 0 | |
fi | |
if ! python version 2>&1 | grep -q "${MY_PYTHON_VERSION}"; then | |
echo "Activating python ${MY_PYTHON_VERSION}" | |
__safe_cmd "pyenv local ${MY_PYTHON_VERSION}" | |
else | |
echo "Python ${MY_PYTHON_VERSION} already activated" | |
return 0 | |
fi | |
;; | |
"deactivate") | |
if [[ -z $MY_PYTHON_VERSION ]]; then | |
echo "No python version specified" | |
return 0 | |
fi | |
echo "Deactivating python ${MY_PYTHON_VERSION}" | |
__safe_cmd pyenv local system | |
;; | |
*) | |
echo "Unknown action: $action" | |
exit 1 | |
;; | |
esac | |
} | |
# @name __manage_conda | |
# @brief Manages conda installation and activation | |
# @description Manages conda installation and activation automatically | |
# @arg $1 string action: install, uninstall, activate, deactivate | |
# @arg $2 string cmd: arguments to parse for environment | |
function __manage_conda() { | |
local action="$1" | |
shift 1 | |
local cmd="$*" | |
local MY_CONDA_ENV | |
MY_CONDA_ENV=$(echo "$cmd" | grep -oP "(?<=environment=)[0-9\.a-zA-Z\\/\_]+" | grep -oP "[0-9\.a-zA-Z\\/\_]+") | |
local MY_CONDA_ENV_PATH | |
MY_CONDA_ENV_PATH="${SCRIPT_DIR}/.conda/${MY_CONDA_ENV}" | |
case "$action" in | |
"install") | |
if [[ -n $MY_CONDA_ENV ]]; then | |
if ! conda env list | grep -q "${MY_CONDA_ENV_PATH}"; then | |
local ENVIRONMENT_YML | |
ENVIRONMENT_YML=$(find "${SCRIPT_DIR}" -name "*.yml" -exec grep -l "name: ${MY_CONDA_ENV}" {} \; | head -n 1) | |
if [[ -n $ENVIRONMENT_YML ]]; then | |
echo "Creating conda environment ${MY_CONDA_ENV}" | |
__safe_cmd conda env create -f "${ENVIRONMENT_YML}" -p "${MY_CONDA_ENV_PATH}" | |
return 0 | |
else | |
echo "No environment.yml file found for ${MY_CONDA_ENV}" | |
return 1 | |
fi | |
else | |
echo "Conda environment ${MY_CONDA_ENV} already installed" | |
fi | |
return 0 | |
fi | |
if ! grep -q "python" /etc/group; then | |
echo "Adding python group" | |
__safe_cmd sudo groupadd python | |
fi | |
if ! groups | grep -q "python"; then | |
echo "Adding user to python group" | |
__safe_cmd sudo usermod -a -G python $USER | |
fi | |
if ! conda --version &>/dev/null || [[ ! -d /usr/local/anaconda3 ]]; then | |
echo "Installing Anaconda3" | |
__safe_cmd wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh | |
__safe_cmd chmod +x Anaconda3-2023.09-0-Linux-x86_64.sh | |
__safe_cmd sudo bash Anaconda3-2023.09-0-Linux-x86_64.sh -b -p /user/local/anaconda3 | |
__safe_cmd rm Anaconda3-2023.09-0-Linux-x86_64.sh | |
__safe_cmd sudo chown -R root:python /usr/local/anaconda3 | |
__safe_cmd sudo chmod -R 770 /usr/local/anaconda3 | |
if ! grep -q "conda init" ~/.bashrc; then | |
echo "Adding conda init to bashrc" | |
__safe_cmd echo "/usr/local/anaconda3/bin/conda init -path" >> ~/.bashrc | |
fi | |
echo "Anaconda3 installed, please restart your terminal" | |
exit 0 | |
fi | |
;; | |
"uninstall") | |
if [[ -n $MY_CONDA_ENV ]]; then | |
__manage_conda deactivate $cmd | |
if conda env list | grep -q "${MY_CONDA_ENV_PATH}"; then | |
echo "Removing conda environment ${MY_CONDA_ENV}" | |
__safe_cmd conda env remove -p "${MY_CONDA_ENV_PATH}" | |
fi | |
return 0 | |
fi | |
# Remove conda from bashrc | |
if grep -q "conda activate" ~/.bashrc; then | |
echo "Removing conda init from bashrc" | |
# shellcheck disable=SC2001 | |
new_bashrc=$(cat ~/.bashrc | sed -e "s#conda init -path##g") | |
echo "$new_bashrc" > ~/.bashrc | |
. "$HOME/.bashrc" | |
fi | |
if echo $PATH | grep -q "/usr/local/anaconda3/bin"; then | |
# shellcheck disable=SC2001 | |
new_path=$(echo "$PATH" | sed -e "s#/usr/local/anaconda3/bin:##g") | |
export PATH="$new_path" | |
fi | |
if [[ -d /usr/local/anaconda3 ]]; then | |
echo "Removing Anaconda3" | |
__safe_cmd sudo rm -rf /usr/local/anaconda3 | |
fi | |
if groups | grep -q "python"; then | |
echo "Removing user from python group" | |
__safe_cmd sudo gpasswd -d $USER python | |
fi | |
if grep -q "python" /etc/group; then | |
echo "Removing python group" | |
__safe_cmd sudo groupdel python | |
fi | |
;; | |
"activate") | |
if [[ -z $MY_CONDA_ENV ]]; then | |
echo "No conda environment specified" | |
return 0 | |
fi | |
eval "$(conda shell.bash hook)" | |
if ! conda env list | grep -q "${MY_CONDA_ENV_PATH}"; then | |
echo "Local conda environment not installed" | |
return 0 | |
fi | |
if ! conda activate "${MY_CONDA_ENV_PATH}"; then | |
echo "Activating local conda environment" | |
__safe_cmd conda activate "${MY_CONDA_ENV_PATH}" | |
else | |
echo "Local conda environment already activated" | |
fi | |
return 0 | |
;; | |
"deactivate") | |
if [[ -z $MY_CONDA_ENV ]]; then | |
echo "No conda environment specified" | |
return 0 | |
fi | |
eval "$(conda shell.bash hook)" | |
if ! conda env list | grep -q "${MY_CONDA_ENV_PATH}"; then | |
echo "Local conda environment not installed" | |
return 0 | |
fi | |
echo "Deactivating local conda environment" | |
__safe_cmd conda deactivate | |
;; | |
*) | |
echo "Unknown action: $action" | |
exit 1 | |
;; | |
esac | |
} | |
# @name __manage_nvm | |
# @brief Manages nvm installation and activation | |
# @description Manages nvm installation and activation automatically | |
# @arg $1 string action: install, uninstall, activate, deactivate | |
# @arg $2 string cmd: arguments to parse for version | |
function __manage_nvm() { | |
local action="$1" | |
shift 1 | |
local cmd="$*" | |
local MY_NODE_VERSION | |
MY_NODE_VERSION=$(echo "$cmd" | grep -oP "(?<=version=)[0-9\.a-zA-Z\/]+" | grep -oP "[0-9\.a-zA-Z\/]+") | |
case "$action" in | |
"install") | |
if [[ -n $MY_NODE_VERSION ]]; then | |
if ! nvm ls | grep -q "${MY_NODE_VERSION}"; then | |
echo "Installing node ${MY_NODE_VERSION}" | |
__safe_cmd "nvm install ${MY_NODE_VERSION}" | |
else | |
echo "Node ${MY_NODE_VERSION} already installed" | |
fi | |
return 0 | |
fi | |
if ! grep -q "node" /etc/group; then | |
echo "Adding node group" | |
__safe_cmd sudo groupadd node | |
fi | |
if ! groups | grep -q "node"; then | |
echo "Adding user to node group" | |
__safe_cmd sudo usermod -aG node $USER | |
fi | |
export NVM_DIR="/usr/local/nvm" | |
if ! nvm --version &>/dev/null; then | |
echo "Installing nvm" | |
if [[ ! -d /usr/local/nvm ]]; then | |
__safe_cmd sudo mkdir -p /usr/local/nvm | |
fi | |
sudo PROFILE=/dev/null NVM_DIR="/usr/local/nvm" bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash' | |
__safe_cmd sudo chown -R root:node ${NVM_DIR} | |
__safe_cmd sudo chmod -R 770 ${NVM_DIR} | |
if ! grep -q "# >>> nvm init >>>" ~/.bashrc && ! grep -q "# >>> nvm init >>>" ~/.bashrc; then | |
echo "Adding nvm init to bashrc" | |
{ | |
echo "# >>> nvm init >>>" | |
echo "export NVM_DIR=\"/usr/local/nvm\"" | |
echo "[ -s \"\$NVM_DIR/nvm.sh\" ] && . \"\$NVM_DIR/nvm.sh\"" | |
echo "[ -s \"\$NVM_DIR/bash_completion\" ] && . \"\$NVM_DIR/bash_completion\"" | |
echo "# <<< nvm init <<<" | |
} >> ~/.bashrc | |
fi | |
source "$HOME/.bashrc" | |
echo "Node version ${NODE_VERSION} installed, please restart your terminal" | |
exit 0 | |
fi | |
;; | |
"uninstall") | |
if [[ -n $MY_NODE_VERSION ]]; then | |
__manage_nvm deactivate $cmd | |
if nvm ls | grep -q "${MY_NODE_VERSION}"; then | |
echo "Removing node ${MY_NODE_VERSION}" | |
__safe_cmd "nvm uninstall ${MY_NODE_VERSION}" | |
fi | |
return 0 | |
fi | |
if grep -q "# >>> nvm init >>>" ~/.bashrc && grep -q "# >>> nvm init >>>" ~/.bashrc; then | |
echo "Removing nvm from bashrc" | |
sed -i '/# >>> nvm init >>>/,/# <<< nvm init <<<//d' "$HOME/.bashrc" | |
source "$HOME/.bashrc" | |
fi | |
if [[ -d /usr/local/nvm ]]; then | |
echo "Removing nvm installation directory." | |
__safe_cmd sudo rm -rf /usr/local/nvm | |
fi | |
if groups | grep -q "node"; then | |
echo "Removing user from node group" | |
__safe_cmd sudo gpasswd -d $USER node | |
fi | |
if grep -q "node" /etc/group; then | |
echo "Removing node group" | |
__safe_cmd sudo groupdel node | |
fi | |
;; | |
"activate") | |
if [[ -z $MY_NODE_VERSION ]]; then | |
echo "No node version specified" | |
return 0 | |
fi | |
if ! nvm ls | grep -q "${MY_NODE_VERSION}"; then | |
echo "Activating node ${MY_NODE_VERSION}" | |
__safe_cmd "nvm use ${MY_NODE_VERSION}" | |
else | |
echo "Node ${MY_NODE_VERSION} already activated" | |
return 0 | |
fi | |
;; | |
"deactivate") | |
if [[ -z $MY_NODE_VERSION ]]; then | |
echo "No node version specified" | |
return 0 | |
fi | |
echo "Deactivating node ${MY_NODE_VERSION}" | |
__safe_cmd nvm deactivate | |
;; | |
*) | |
echo "Unknown action: $action" | |
exit 1 | |
;; | |
esac | |
} | |
# If repo is not cloned, clone it | |
if [[ ! -d ${SCRIPT_DIR}/AutoGen ]]; then | |
echo "Cloning repo" | |
__safe_cmd "git clone 'https://github.com/microsoft/autogen.git' --recursive ${SCRIPT_DIR}/AutoGen" | |
fi | |
pushd "${SCRIPT_DIR}/AutoGen" | |
__manage_pyenv install | |
__manage_pyenv install version="${PYTHON_VERSION}" | |
__manage_pyenv activate version="${PYTHON_VERSION}" | |
__manage_conda install | |
cat <<EOF > "${SCRIPT_DIR}/environment.yml" | |
name: autogenra | |
channels: | |
- defaults | |
- conda-forge | |
- microsoft | |
dependencies: | |
- bzip2 | |
- ca-certificates | |
- libffi | |
- libgcc-ng | |
- libgomp | |
- libstdcxx-ng | |
- libuuid=1.41.5 | |
- ncurses=6.4 | |
- openssl | |
- pip | |
- python=3.10.13 | |
- readline | |
- setuptools | |
- sqlite | |
- tk | |
- tzdata | |
- wheel | |
- xz | |
- zlib | |
EOF | |
__manage_conda install environment="autogenra" | |
__manage_conda activate environment="autogenra" | |
echo "Installing autogenra" | |
__safe_cmd pip install -e .[samples] | |
__manage_nvm install | |
__manage_nvm install version="${NODE_VERSION}" | |
__manage_nvm activate version="${NODE_VERSION}" | |
pushd "samples/apps/autogen-assistant/frontend" | |
# If yarn is not installed, install it | |
if ! which yarn | grep -q "yarn"; then | |
echo "Installing yarn" | |
__safe_cmd npm install -g yarn | |
fi | |
# if gatsby-cli is not installed, install it | |
if ! which gatsby | grep -q "gatsby"; then | |
echo "Installing gatsby-cli" | |
__safe_cmd npm install -g gatsby-cli | |
fi | |
echo "Installing frontend dependencies..." | |
__safe_cmd yarn install | |
echo "Building frontend..." | |
__safe_cmd yarn build | |
popd | |
pushd "samples/apps/autogen-assistant" | |
echo "Installing backend dependencies..." | |
__safe_cmd pip install -e . | |
autogenra ui --port 6968 | |
popd | |
popd |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment