Compare commits

...
6 Commits
Author SHA1 Message Date
Mervin Praison 5699d90894 Merge pull request #368 from MervinPraison/develop
Enhance train.py with Dynamic Stop Token Generation for Ollama Models
2025-02-04 10:33:19 +00:00
MervinPraison 2982e8ea9c Enhance train.py with Dynamic Stop Token Generation for Ollama Models
- Added intelligent stop token inference for various model architectures in train.py
- Implemented dynamic stop token selection based on model name
- Supported models include Phi, LLaVA, Mistral, Qwen, DeepSeek, and default models
- Updated Modelfile generation to include model-specific stop tokens
- Improved Ollama model preparation flexibility
2025-02-04 10:33:05 +00:00
Mervin Praison 9dd2146342 Merge pull request #367 from MervinPraison/develop
Bump version to 2.0.66 and remove TRAIN_AVAILABLE flag
2025-02-04 09:31:20 +00:00
MervinPraison f79184a6ee Bump version to 2.0.66 and remove TRAIN_AVAILABLE flag
- Updated version across multiple files (praisonai.rb, pyproject.toml, uv.lock, Dockerfile, deploy.py, docs)
- Removed TRAIN_AVAILABLE flag from cli.py
- Simplified CLI configuration by removing optional training feature check
2025-02-04 09:31:07 +00:00
Mervin Praison 0985e12ad4 Merge pull request #366 from MervinPraison/develop
Bump version to 2.0.65 and update deployment configurations
2025-02-04 08:05:06 +00:00
MervinPraison 0fbb7972e1 Bump version to 2.0.65 and update deployment configurations
- Updated version across multiple files (praisonai.rb, pyproject.toml, uv.lock, Dockerfile, deploy.py, docs)
- Enhanced Conda environment setup script with Ollama installation check
- Minor improvements to deployment and setup scripts
2025-02-04 08:04:44 +00:00
10 changed files with 76 additions and 48 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install flask praisonai==2.0.64 gunicorn markdown
RUN pip install flask praisonai==2.0.67 gunicorn markdown
EXPOSE 8080
CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]
+1 -1
View File
@@ -110,7 +110,7 @@ Loads environment variables from .env file or system and sets them.</p>
file.write(&#34;FROM python:3.11-slim\n&#34;)
file.write(&#34;WORKDIR /app\n&#34;)
file.write(&#34;COPY . .\n&#34;)
file.write(&#34;RUN pip install flask praisonai==2.0.64 gunicorn markdown\n&#34;)
file.write(&#34;RUN pip install flask praisonai==2.0.67 gunicorn markdown\n&#34;)
file.write(&#34;EXPOSE 8080\n&#34;)
file.write(&#39;CMD [&#34;gunicorn&#34;, &#34;-b&#34;, &#34;0.0.0.0:8080&#34;, &#34;api:app&#34;]\n&#39;)
+11
View File
@@ -20,6 +20,17 @@ icon: "dumbbell"
export HF_TOKEN=xxxxxxxxxxxxxx
```
## Initilise praisonai train
```bash
praisonai train init
```
## Required
1. HF_TOKEN
2. Below config.yaml file in the same directory
## To upload to ollama.com (Linux)
```bash
+1 -1
View File
@@ -3,7 +3,7 @@ class Praisonai < Formula
desc "AI tools for various AI applications"
homepage "https://github.com/MervinPraison/PraisonAI"
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/2.0.64.tar.gz"
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/2.0.67.tar.gz"
sha256 "1828fb9227d10f991522c3f24f061943a254b667196b40b1a3e4a54a8d30ce32" # Replace with actual SHA256 checksum
license "MIT"
-12
View File
@@ -25,7 +25,6 @@ CALL_MODULE_AVAILABLE = False
CREWAI_AVAILABLE = False
AUTOGEN_AVAILABLE = False
PRAISONAI_AVAILABLE = False
TRAIN_AVAILABLE = False
try:
# Create necessary directories and set CHAINLIT_APP_ROOT
if "CHAINLIT_APP_ROOT" not in os.environ:
@@ -72,12 +71,6 @@ try:
except ImportError:
pass
try:
import accelerate
TRAIN_AVAILABLE = True
except ImportError:
pass
logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO'), format='%(asctime)s - %(levelname)s - %(message)s')
logging.getLogger('alembic').setLevel(logging.ERROR)
logging.getLogger('gradio').setLevel(logging.ERROR)
@@ -399,13 +392,8 @@ class PraisonAI:
sys.exit(0)
elif args.command == 'train':
if not TRAIN_AVAILABLE:
print("[red]ERROR: Train feature is not installed. Install with:[/red]")
print("\npip install \"praisonai[train]\"\n")
sys.exit(1)
package_root = os.path.dirname(os.path.abspath(__file__))
config_yaml_destination = os.path.join(os.getcwd(), 'config.yaml')
elif args.command == 'ui':
if not CHAINLIT_AVAILABLE:
+1 -1
View File
@@ -56,7 +56,7 @@ class CloudDeployer:
file.write("FROM python:3.11-slim\n")
file.write("WORKDIR /app\n")
file.write("COPY . .\n")
file.write("RUN pip install flask praisonai==2.0.64 gunicorn markdown\n")
file.write("RUN pip install flask praisonai==2.0.67 gunicorn markdown\n")
file.write("EXPOSE 8080\n")
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
+32 -18
View File
@@ -12,7 +12,7 @@ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux
MINICONDA_URL="https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh"
# Check and install libcurl development package if not present
# Install libcurl development package if not present (Debian based)
if command -v dpkg &> /dev/null; then
if ! dpkg -s libcurl4-openssl-dev &> /dev/null; then
echo "libcurl4-openssl-dev is not installed. Installing..."
@@ -25,6 +25,24 @@ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo "Non-Debian based Linux detected. Please ensure libcurl development libraries are installed."
fi
# Check if ollama is installed and executable; if not, install it
if ! command -v ollama &> /dev/null; then
echo "Ollama is not installed. Installing Ollama..."
curl -fsSL https://ollama.com/install.sh | sh
# Generate SSH key non-interactively only if it doesn't already exist
if [ ! -f ~/.ssh/id_ed25519 ]; then
echo "Generating SSH key for Ollama..."
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 -q
else
echo "SSH key ~/.ssh/id_ed25519 already exists. Skipping generation."
fi
echo "Copying SSH key to /usr/share/ollama/.ollama..."
sudo cp ~/.ssh/id_ed25519 /usr/share/ollama/.ollama
else
echo "Ollama is already installed."
fi
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
# Windows
MINICONDA_URL="https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe"
@@ -35,12 +53,12 @@ else
exit 1
fi
# Check if conda is already installed
# Check if conda is installed
if ! command -v conda &> /dev/null; then
echo "Conda is not installed. Installing Miniconda..."
wget $MINICONDA_URL -O ~/miniconda.sh
bash ~/miniconda.sh -b -p $HOME/miniconda
source $HOME/miniconda/bin/activate
wget "$MINICONDA_URL" -O ~/miniconda.sh
bash ~/miniconda.sh -b -p "$HOME/miniconda"
source "$HOME/miniconda/bin/activate"
conda init
else
echo "Conda is already installed."
@@ -48,38 +66,34 @@ fi
# Create and activate the Conda environment
ENV_NAME="praison_env"
if conda info --envs | grep -q $ENV_NAME; then
if conda info --envs | grep -q "$ENV_NAME"; then
echo "Environment $ENV_NAME already exists. Recreating..."
conda env remove -y -n $ENV_NAME # Remove existing environment
conda env remove -y -n "$ENV_NAME"
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS (both Intel and M1/M2)
conda create --name $ENV_NAME python=3.10 pytorch=2.3.0 -c pytorch -y
conda create --name "$ENV_NAME" python=3.10 pytorch=2.3.0 -c pytorch -y
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux
conda create --name $ENV_NAME python=3.10 pytorch=2.3.0 cudatoolkit=11.8 -c pytorch -c nvidia -y
conda create --name "$ENV_NAME" python=3.10 pytorch=2.3.0 cudatoolkit=11.8 -c pytorch -c nvidia -y
fi
else
echo "Creating new environment $ENV_NAME..."
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS (both Intel and M1/M2)
conda create --name $ENV_NAME python=3.10 pytorch=2.3.0 -c pytorch -y
conda create --name "$ENV_NAME" python=3.10 pytorch=2.3.0 -c pytorch -y
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux
conda create --name $ENV_NAME python=3.10 pytorch=2.3.0 cudatoolkit=11.8 -c pytorch -c nvidia -y
conda create --name "$ENV_NAME" python=3.10 pytorch=2.3.0 cudatoolkit=11.8 -c pytorch -c nvidia -y
fi
fi
# Activate the environment
source $HOME/miniconda/bin/activate $ENV_NAME
source "$HOME/miniconda/bin/activate" "$ENV_NAME"
# Install cmake via conda
echo "Installing cmake..."
conda install -y cmake
# Get full path of pip within the activated environment
PIP_FULL_PATH=$(conda run -n $ENV_NAME which pip)
PIP_FULL_PATH=$(conda run -n "$ENV_NAME" which pip)
# Install other packages within the activated environment using pip
# Install other packages using pip
$PIP_FULL_PATH install --upgrade pip
$PIP_FULL_PATH install "xformers==0.0.26.post1"
$PIP_FULL_PATH install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git@038e6d4c8d40207a87297ab3aaf787c19b1006d1"
+26 -11
View File
@@ -312,26 +312,41 @@ class TrainModel:
def prepare_modelfile_content(self):
output_model = self.config["hf_model_name"]
# Determine stop tokens from config or infer based on model name
model_name = self.config["model_name"].lower()
if "phi" in model_name:
inferred_stop_tokens = ["<|end|>", "<|user|>", "<|assistant|>"]
elif "llava" in model_name:
inferred_stop_tokens = ["</s>", "USER:", "ASSSISTANT:"]
elif "mistral" in model_name:
inferred_stop_tokens = ["[INST]", "[/INST]"]
elif "qwen" in model_name:
inferred_stop_tokens = ["<|endoftext|>"]
elif "deepseek" in model_name:
inferred_stop_tokens = ["<|begin▁of▁sentence|>", "<|end▁of▁sentence|>", "<|User|>", "<|Assistant|>"]
else:
inferred_stop_tokens = ["<|start_header_id|>", "<|end_header_id|>", "<|eot_id|>"]
# Use stop_tokens from config if provided, otherwise use inferred
model_stop_tokens = self.config.get("stop_tokens", inferred_stop_tokens)
gguf_path = f"{output_model}/unsloth.Q4_K_M.gguf"
if not os.path.exists(gguf_path):
self.model, self.hf_tokenizer = self.load_model()
self.save_model_gguf()
stop_parameters = "\n".join([f'PARAMETER stop "{token}"' for token in model_stop_tokens])
return f"""FROM {output_model}/unsloth.Q4_K_M.gguf
TEMPLATE \"\"\"Below are some instructions that describe some tasks. Write responses that appropriately complete each request.{{{{ if .Prompt }}}}
TEMPLATE \"\"\"Below are some instructions that describe some tasks. Write responses that appropriately complete each request.{{{{ if .Prompt }}}}
### Instruction:
{{{{ .Prompt }}}}
### Instruction:
{{{{ .Prompt }}}}
{{{{ end }}}}### Response:
{{{{ .Response }}}}\"\"\"
{{{{ end }}}}### Response:
{{{{ .Response }}}}\"\"\"
{stop_parameters}
"""
PARAMETER stop ""
PARAMETER stop ""
PARAMETER stop ""
PARAMETER stop ""
PARAMETER stop "<|reserved_special_token_"
"""
def create_and_push_ollama_model(self):
modelfile_content = self.prepare_modelfile_content()
+2 -2
View File
@@ -1,6 +1,6 @@
[project]
name = "PraisonAI"
version = "2.0.64"
version = "2.0.67"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration."
readme = "README.md"
license = ""
@@ -84,7 +84,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.7", "crewai"]
[tool.poetry]
name = "PraisonAI"
version = "2.0.64"
version = "2.0.67"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human–agent collaboration."
authors = ["Mervin Praison"]
license = ""
Generated
+1 -1
View File
@@ -3060,7 +3060,7 @@ wheels = [
[[package]]
name = "praisonai"
version = "2.0.64"
version = "2.0.67"
source = { editable = "." }
dependencies = [
{ name = "instructor" },