PraisonAI 2.0.76__tar.gz → 2.0.78__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. {praisonai-2.0.76 → praisonai-2.0.78}/PKG-INFO +2 -2
  2. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/deploy.py +1 -1
  3. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/train_vision.py +32 -0
  4. praisonai-2.0.78/praisonai/upload_vision.py +140 -0
  5. {praisonai-2.0.76 → praisonai-2.0.78}/pyproject.toml +4 -4
  6. {praisonai-2.0.76 → praisonai-2.0.78}/LICENSE +0 -0
  7. {praisonai-2.0.76 → praisonai-2.0.78}/README.md +0 -0
  8. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/__init__.py +0 -0
  9. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/__main__.py +0 -0
  10. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/agents_generator.py +0 -0
  11. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/api/call.py +0 -0
  12. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/auto.py +0 -0
  13. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/chainlit_ui.py +0 -0
  14. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/cli.py +0 -0
  15. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/inbuilt_tools/__init__.py +0 -0
  16. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  17. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/inc/__init__.py +0 -0
  18. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/inc/config.py +0 -0
  19. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/inc/models.py +0 -0
  20. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/android-chrome-192x192.png +0 -0
  21. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/android-chrome-512x512.png +0 -0
  22. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/apple-touch-icon.png +0 -0
  23. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/fantasy.svg +0 -0
  24. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/favicon-16x16.png +0 -0
  25. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/favicon-32x32.png +0 -0
  26. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/favicon.ico +0 -0
  27. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/game.svg +0 -0
  28. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/logo_dark.png +0 -0
  29. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/logo_light.png +0 -0
  30. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/movie.svg +0 -0
  31. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/praison-ai-agents-architecture-dark.png +0 -0
  32. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/praison-ai-agents-architecture.png +0 -0
  33. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/public/thriller.svg +0 -0
  34. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup/__init__.py +0 -0
  35. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup/build.py +0 -0
  36. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup/config.yaml +0 -0
  37. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup/post_install.py +0 -0
  38. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup/setup_conda_env.py +0 -0
  39. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup/setup_conda_env.sh +0 -0
  40. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/setup.py +0 -0
  41. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/test.py +0 -0
  42. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/train.py +0 -0
  43. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/README.md +0 -0
  44. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/agents.py +0 -0
  45. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/callbacks.py +0 -0
  46. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/chat.py +0 -0
  47. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/code.py +0 -0
  48. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/colab.py +0 -0
  49. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/colab_chainlit.py +0 -0
  50. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/components/aicoder.py +0 -0
  51. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/config.toml +0 -0
  52. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/bn.json +0 -0
  53. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/en-US.json +0 -0
  54. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/gu.json +0 -0
  55. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/he-IL.json +0 -0
  56. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/hi.json +0 -0
  57. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/kn.json +0 -0
  58. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/ml.json +0 -0
  59. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/mr.json +0 -0
  60. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/ta.json +0 -0
  61. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/te.json +0 -0
  62. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/.chainlit/translations/zh-CN.json +0 -0
  63. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/chainlit.md +0 -0
  64. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/bn.json +0 -0
  65. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/en-US.json +0 -0
  66. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/gu.json +0 -0
  67. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/he-IL.json +0 -0
  68. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/hi.json +0 -0
  69. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/kn.json +0 -0
  70. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/ml.json +0 -0
  71. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/mr.json +0 -0
  72. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/ta.json +0 -0
  73. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/te.json +0 -0
  74. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/config/translations/zh-CN.json +0 -0
  75. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/context.py +0 -0
  76. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/db.py +0 -0
  77. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/fantasy.svg +0 -0
  78. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/game.svg +0 -0
  79. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/logo_dark.png +0 -0
  80. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/logo_light.png +0 -0
  81. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/movie.svg +0 -0
  82. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/praison.css +0 -0
  83. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/public/thriller.svg +0 -0
  84. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/realtime.py +0 -0
  85. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/realtimeclient/__init__.py +0 -0
  86. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/realtimeclient/realtimedocs.txt +0 -0
  87. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/realtimeclient/tools.py +0 -0
  88. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/sql_alchemy.py +0 -0
  89. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/ui/tools.md +0 -0
  90. {praisonai-2.0.76 → praisonai-2.0.78}/praisonai/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: PraisonAI
3
- Version: 2.0.76
3
+ Version: 2.0.78
4
4
  Summary: 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.
5
5
  Author: Mervin Praison
6
6
  Requires-Python: >=3.10,<3.13
@@ -61,7 +61,7 @@ Requires-Dist: playwright (>=1.47.0) ; extra == "code"
61
61
  Requires-Dist: plotly (>=5.24.0) ; extra == "realtime"
62
62
  Requires-Dist: praisonai-tools (>=0.0.7) ; extra == "autogen"
63
63
  Requires-Dist: praisonai-tools (>=0.0.7) ; extra == "crewai"
64
- Requires-Dist: praisonaiagents (>=0.0.61)
64
+ Requires-Dist: praisonaiagents (>=0.0.63)
65
65
  Requires-Dist: pyautogen (>=0.2.19) ; extra == "autogen"
66
66
  Requires-Dist: pydantic (<=2.10.1) ; extra == "chat"
67
67
  Requires-Dist: pydantic (<=2.10.1) ; extra == "code"
@@ -56,7 +56,7 @@ class CloudDeployer:
56
56
  file.write("FROM python:3.11-slim\n")
57
57
  file.write("WORKDIR /app\n")
58
58
  file.write("COPY . .\n")
59
- file.write("RUN pip install flask praisonai==2.0.76 gunicorn markdown\n")
59
+ file.write("RUN pip install flask praisonai==2.0.78 gunicorn markdown\n")
60
60
  file.write("EXPOSE 8080\n")
61
61
  file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
62
62
 
@@ -240,6 +240,32 @@ class TrainVisionModel:
240
240
  quantization_method="q4_k_m"
241
241
  )
242
242
 
243
+ def prepare_modelfile_content(self):
244
+ output_model = self.config["hf_model_name"]
245
+
246
+ template = '''{{- range $index, $_ := .Messages }}<|start_header_id|>{{ .Role }}<|end_header_id|>
247
+
248
+ {{ .Content }}
249
+ {{- if gt (len (slice $.Messages $index)) 1 }}<|eot_id|>
250
+ {{- else if ne .Role "assistant" }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
251
+
252
+ {{ end }}
253
+ {{- end }}'''
254
+
255
+ return f"""FROM {output_model}
256
+ TEMPLATE {template}
257
+ PARAMETER temperature 0.6
258
+ PARAMETER top_p 0.9
259
+ """
260
+
261
+ def create_and_push_ollama_model(self):
262
+ modelfile_content = self.prepare_modelfile_content()
263
+ with open("Modelfile", "w") as file:
264
+ file.write(modelfile_content)
265
+ subprocess.run(["ollama", "serve"])
266
+ subprocess.run(["ollama", "create", f"{self.config['ollama_model']}:{self.config['model_parameters']}", "-f", "Modelfile"])
267
+ subprocess.run(["ollama", "push", f"{self.config['ollama_model']}:{self.config['model_parameters']}"])
268
+
243
269
  def run(self):
244
270
  self.print_system_info()
245
271
  self.check_gpu()
@@ -247,6 +273,12 @@ class TrainVisionModel:
247
273
  if self.config.get("train", "true").lower() == "true":
248
274
  self.prepare_model()
249
275
  self.train_model()
276
+ if self.config.get("huggingface_save", "true").lower() == "true":
277
+ self.save_model_merged()
278
+ if self.config.get("huggingface_save_gguf", "true").lower() == "true":
279
+ self.push_model_gguf()
280
+ if self.config.get("ollama_save", "true").lower() == "true":
281
+ self.create_and_push_ollama_model()
250
282
 
251
283
 
252
284
  def main():
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ This script handles uploading trained vision models to Hugging Face and Ollama.
5
+ It reads configuration from config.yaml and provides options to upload in different formats.
6
+ """
7
+
8
+ import os
9
+ import yaml
10
+ import torch
11
+ import shutil
12
+ import subprocess
13
+ from unsloth import FastVisionModel
14
+
15
+ class UploadVisionModel:
16
+ def __init__(self, config_path="config.yaml"):
17
+ self.load_config(config_path)
18
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
19
+ self.model = None
20
+ self.hf_tokenizer = None
21
+
22
+ def load_config(self, path):
23
+ """Load configuration from yaml file."""
24
+ with open(path, "r") as file:
25
+ self.config = yaml.safe_load(file)
26
+ print("DEBUG: Loaded config:", self.config)
27
+
28
+ def prepare_model(self):
29
+ """Load the trained model for uploading."""
30
+ print("DEBUG: Loading trained model and tokenizer...")
31
+ self.model, original_tokenizer = FastVisionModel.from_pretrained(
32
+ model_name=self.config.get("output_dir", "lora_model"),
33
+ load_in_4bit=self.config.get("load_in_4bit", True)
34
+ )
35
+ self.hf_tokenizer = original_tokenizer
36
+ print("DEBUG: Model and tokenizer loaded successfully.")
37
+
38
+ def save_model_merged(self):
39
+ """Save merged model to Hugging Face Hub."""
40
+ print(f"DEBUG: Saving merged model to Hugging Face Hub: {self.config['hf_model_name']}")
41
+ if os.path.exists(self.config["hf_model_name"]):
42
+ shutil.rmtree(self.config["hf_model_name"])
43
+ self.model.push_to_hub_merged(
44
+ self.config["hf_model_name"],
45
+ self.hf_tokenizer,
46
+ save_method="merged_16bit",
47
+ token=os.getenv("HF_TOKEN")
48
+ )
49
+ print("DEBUG: Model saved to Hugging Face Hub successfully.")
50
+
51
+ def push_model_gguf(self):
52
+ """Push model in GGUF format to Hugging Face Hub."""
53
+ print(f"DEBUG: Pushing GGUF model to Hugging Face Hub: {self.config['hf_model_name']}")
54
+ self.model.push_to_hub_gguf(
55
+ self.config["hf_model_name"],
56
+ self.hf_tokenizer,
57
+ quantization_method=self.config.get("quantization_method", "q4_k_m"),
58
+ token=os.getenv("HF_TOKEN")
59
+ )
60
+ print("DEBUG: GGUF model pushed to Hugging Face Hub successfully.")
61
+
62
+ def prepare_modelfile_content(self):
63
+ """Prepare Ollama modelfile content using Llama 3.2 vision template."""
64
+ output_model = self.config["hf_model_name"]
65
+
66
+ # Using Llama 3.2 vision template format
67
+ template = """{{- range $index, $_ := .Messages }}<|start_header_id|>{{ .Role }}<|end_header_id|>
68
+
69
+ {{ .Content }}
70
+ {{- if gt (len (slice $.Messages $index)) 1 }}<|eot_id|>
71
+ {{- else if ne .Role "assistant" }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
72
+
73
+ {{ end }}
74
+ {{- end }}"""
75
+
76
+ # Assemble the modelfile content with Llama 3.2 vision parameters
77
+ modelfile = f"FROM {output_model}\n"
78
+ modelfile += "TEMPLATE \"""" + template + "\"""\n"
79
+ modelfile += "PARAMETER temperature 0.6\n"
80
+ modelfile += "PARAMETER top_p 0.9\n"
81
+ return modelfile
82
+
83
+ def create_and_push_ollama_model(self):
84
+ """Create and push model to Ollama."""
85
+ print(f"DEBUG: Creating Ollama model: {self.config['ollama_model']}:{self.config['model_parameters']}")
86
+ modelfile_content = self.prepare_modelfile_content()
87
+ with open("Modelfile", "w") as file:
88
+ file.write(modelfile_content)
89
+
90
+ print("DEBUG: Starting Ollama server...")
91
+ subprocess.run(["ollama", "serve"])
92
+
93
+ print("DEBUG: Creating Ollama model...")
94
+ subprocess.run([
95
+ "ollama", "create",
96
+ f"{self.config['ollama_model']}:{self.config['model_parameters']}",
97
+ "-f", "Modelfile"
98
+ ])
99
+
100
+ print("DEBUG: Pushing model to Ollama...")
101
+ subprocess.run([
102
+ "ollama", "push",
103
+ f"{self.config['ollama_model']}:{self.config['model_parameters']}"
104
+ ])
105
+ print("DEBUG: Model pushed to Ollama successfully.")
106
+
107
+ def upload(self, target="all"):
108
+ """
109
+ Upload the model to specified targets.
110
+ Args:
111
+ target (str): One of 'all', 'huggingface', 'huggingface_gguf', or 'ollama'
112
+ """
113
+ self.prepare_model()
114
+
115
+ if target in ["all", "huggingface"]:
116
+ self.save_model_merged()
117
+
118
+ if target in ["all", "huggingface_gguf"]:
119
+ self.push_model_gguf()
120
+
121
+ if target in ["all", "ollama"]:
122
+ self.create_and_push_ollama_model()
123
+
124
+ def main():
125
+ import argparse
126
+ parser = argparse.ArgumentParser(description="Upload Vision Model to Various Platforms")
127
+ parser.add_argument("--config", default="config.yaml", help="Path to configuration file")
128
+ parser.add_argument(
129
+ "--target",
130
+ choices=["all", "huggingface", "huggingface_gguf", "ollama"],
131
+ default="all",
132
+ help="Target platform to upload to"
133
+ )
134
+ args = parser.parse_args()
135
+
136
+ uploader = UploadVisionModel(config_path=args.config)
137
+ uploader.upload(target=args.target)
138
+
139
+ if __name__ == "__main__":
140
+ main()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "PraisonAI"
3
- version = "2.0.76"
3
+ version = "2.0.78"
4
4
  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."
5
5
  readme = "README.md"
6
6
  license = ""
@@ -12,7 +12,7 @@ dependencies = [
12
12
  "rich>=13.7",
13
13
  "markdown>=3.5",
14
14
  "pyparsing>=3.0.0",
15
- "praisonaiagents>=0.0.61",
15
+ "praisonaiagents>=0.0.63",
16
16
  "python-dotenv>=0.19.0",
17
17
  "instructor>=1.3.3",
18
18
  "PyYAML>=6.0",
@@ -84,7 +84,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.7", "crewai"]
84
84
 
85
85
  [tool.poetry]
86
86
  name = "PraisonAI"
87
- version = "2.0.76"
87
+ version = "2.0.78"
88
88
  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."
89
89
  authors = ["Mervin Praison"]
90
90
  license = ""
@@ -102,7 +102,7 @@ python = ">=3.10,<3.13"
102
102
  rich = ">=13.7"
103
103
  markdown = ">=3.5"
104
104
  pyparsing = ">=3.0.0"
105
- praisonaiagents = ">=0.0.61"
105
+ praisonaiagents = ">=0.0.63"
106
106
  python-dotenv = ">=0.19.0"
107
107
  instructor = ">=1.3.3"
108
108
  PyYAML = ">=6.0"
File without changes
File without changes
File without changes
File without changes
File without changes