PraisonAI 2.2.35__tar.gz → 2.2.37__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.

Potentially problematic release.


This version of PraisonAI might be problematic. Click here for more details.

Files changed (79) hide show
  1. {praisonai-2.2.35 → praisonai-2.2.37}/PKG-INFO +2 -2
  2. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/cli.py +48 -9
  3. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/deploy.py +58 -11
  4. {praisonai-2.2.35 → praisonai-2.2.37}/pyproject.toml +4 -4
  5. {praisonai-2.2.35 → praisonai-2.2.37}/README.md +0 -0
  6. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/README.md +0 -0
  7. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/__init__.py +0 -0
  8. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/__main__.py +0 -0
  9. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/agents_generator.py +0 -0
  10. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/api/call.py +0 -0
  11. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/auto.py +0 -0
  12. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/chainlit_ui.py +0 -0
  13. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/inbuilt_tools/__init__.py +0 -0
  14. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  15. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/inc/__init__.py +0 -0
  16. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/inc/config.py +0 -0
  17. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/inc/models.py +0 -0
  18. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/android-chrome-192x192.png +0 -0
  19. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/android-chrome-512x512.png +0 -0
  20. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/apple-touch-icon.png +0 -0
  21. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/fantasy.svg +0 -0
  22. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/favicon-16x16.png +0 -0
  23. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/favicon-32x32.png +0 -0
  24. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/favicon.ico +0 -0
  25. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/game.svg +0 -0
  26. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/logo_dark.png +0 -0
  27. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/logo_light.png +0 -0
  28. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/movie.svg +0 -0
  29. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/praison-ai-agents-architecture-dark.png +0 -0
  30. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/praison-ai-agents-architecture.png +0 -0
  31. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/public/thriller.svg +0 -0
  32. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/scheduler.py +0 -0
  33. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup/__init__.py +0 -0
  34. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup/build.py +0 -0
  35. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup/config.yaml +0 -0
  36. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup/post_install.py +0 -0
  37. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup/setup_conda_env.py +0 -0
  38. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup/setup_conda_env.sh +0 -0
  39. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/setup.py +0 -0
  40. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/test.py +0 -0
  41. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/train.py +0 -0
  42. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/train_vision.py +0 -0
  43. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/README.md +0 -0
  44. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/agents.py +0 -0
  45. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/callbacks.py +0 -0
  46. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/chat.py +0 -0
  47. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/code.py +0 -0
  48. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/colab.py +0 -0
  49. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/colab_chainlit.py +0 -0
  50. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/components/aicoder.py +0 -0
  51. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/chainlit.md +0 -0
  52. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/bn.json +0 -0
  53. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/en-US.json +0 -0
  54. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/gu.json +0 -0
  55. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/he-IL.json +0 -0
  56. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/hi.json +0 -0
  57. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/kn.json +0 -0
  58. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/ml.json +0 -0
  59. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/mr.json +0 -0
  60. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/ta.json +0 -0
  61. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/te.json +0 -0
  62. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/config/translations/zh-CN.json +0 -0
  63. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/context.py +0 -0
  64. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/database_config.py +0 -0
  65. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/db.py +0 -0
  66. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/fantasy.svg +0 -0
  67. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/game.svg +0 -0
  68. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/logo_dark.png +0 -0
  69. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/logo_light.png +0 -0
  70. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/movie.svg +0 -0
  71. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/praison.css +0 -0
  72. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/public/thriller.svg +0 -0
  73. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/realtime.py +0 -0
  74. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/realtimeclient/__init__.py +0 -0
  75. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/realtimeclient/tools.py +0 -0
  76. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/sql_alchemy.py +0 -0
  77. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/ui/tools.md +0 -0
  78. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/upload_vision.py +0 -0
  79. {praisonai-2.2.35 → praisonai-2.2.37}/praisonai/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: PraisonAI
3
- Version: 2.2.35
3
+ Version: 2.2.37
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
@@ -64,7 +64,7 @@ Requires-Dist: playwright (>=1.47.0) ; extra == "code"
64
64
  Requires-Dist: plotly (>=5.24.0) ; extra == "realtime"
65
65
  Requires-Dist: praisonai-tools (>=0.0.15) ; extra == "autogen"
66
66
  Requires-Dist: praisonai-tools (>=0.0.15) ; extra == "crewai"
67
- Requires-Dist: praisonaiagents (>=0.0.108)
67
+ Requires-Dist: praisonaiagents (>=0.0.110)
68
68
  Requires-Dist: pyautogen (>=0.2.19) ; extra == "autogen"
69
69
  Requires-Dist: pydantic (<=2.10.1) ; extra == "chat"
70
70
  Requires-Dist: pydantic (<=2.10.1) ; extra == "code"
@@ -170,6 +170,25 @@ class PraisonAI:
170
170
  pass
171
171
  return None
172
172
 
173
+ def read_file_if_provided(self, file_path):
174
+ """
175
+ Read content from a file if the file path is provided.
176
+ Returns the file content or None if file cannot be read.
177
+ """
178
+ if not file_path:
179
+ return None
180
+
181
+ try:
182
+ with open(file_path, 'r', encoding='utf-8') as f:
183
+ file_content = f.read().strip()
184
+ return file_content if file_content else None
185
+ except FileNotFoundError:
186
+ print(f"[red]ERROR: File not found: {file_path}[/red]")
187
+ sys.exit(1)
188
+ except Exception as e:
189
+ print(f"[red]ERROR: Failed to read file: {e}[/red]")
190
+ sys.exit(1)
191
+
173
192
  def main(self):
174
193
  """
175
194
  The main function of the PraisonAI object. It parses the command-line arguments,
@@ -189,15 +208,24 @@ class PraisonAI:
189
208
 
190
209
  # Check for piped input from stdin
191
210
  stdin_input = self.read_stdin_if_available()
211
+
212
+ # Check for file input if --file is provided
213
+ file_input = self.read_file_if_provided(getattr(args, 'file', None))
192
214
 
193
215
  if args.command:
194
216
  if args.command.startswith("tests.test") or args.command.startswith("tests/test"): # Argument used for testing purposes
195
217
  print("test")
196
218
  return "test"
197
219
  else:
198
- # If stdin input is available, append it to the command
220
+ # Combine command with any available inputs (stdin and/or file)
221
+ combined_inputs = []
199
222
  if stdin_input:
200
- combined_prompt = f"{args.command} {stdin_input}"
223
+ combined_inputs.append(stdin_input)
224
+ if file_input:
225
+ combined_inputs.append(file_input)
226
+
227
+ if combined_inputs:
228
+ combined_prompt = f"{args.command} {' '.join(combined_inputs)}"
201
229
  result = self.handle_direct_prompt(combined_prompt)
202
230
  print(result)
203
231
  return result
@@ -206,20 +234,30 @@ class PraisonAI:
206
234
  elif hasattr(args, 'direct_prompt') and args.direct_prompt:
207
235
  # Only handle direct prompt if agent_file wasn't explicitly set in constructor
208
236
  if original_agent_file == "agents.yaml": # Default value, so safe to use direct prompt
209
- # If stdin input is available, append it to the direct prompt
210
- prompt = args.direct_prompt
237
+ # Combine direct prompt with any available inputs (stdin and/or file)
238
+ prompt_parts = [args.direct_prompt]
211
239
  if stdin_input:
212
- prompt = f"{args.direct_prompt} {stdin_input}"
240
+ prompt_parts.append(stdin_input)
241
+ if file_input:
242
+ prompt_parts.append(file_input)
243
+ prompt = ' '.join(prompt_parts)
213
244
  result = self.handle_direct_prompt(prompt)
214
245
  print(result)
215
246
  return result
216
247
  else:
217
248
  # Agent file was explicitly set, ignore direct prompt and use the file
218
249
  pass
219
- elif stdin_input:
220
- # If only stdin input is provided (no command), use it as direct prompt
221
- if original_agent_file == "agents.yaml": # Default value, so safe to use stdin as prompt
222
- result = self.handle_direct_prompt(stdin_input)
250
+ elif stdin_input or file_input:
251
+ # If only stdin/file input is provided (no command), use it as direct prompt
252
+ if original_agent_file == "agents.yaml": # Default value, so safe to use input as prompt
253
+ # Combine any available inputs
254
+ inputs = []
255
+ if stdin_input:
256
+ inputs.append(stdin_input)
257
+ if file_input:
258
+ inputs.append(file_input)
259
+ combined_input = ' '.join(inputs)
260
+ result = self.handle_direct_prompt(combined_input)
223
261
  print(result)
224
262
  return result
225
263
  # If no command or direct_prompt, preserve agent_file from constructor (don't overwrite)
@@ -530,6 +568,7 @@ class PraisonAI:
530
568
  parser.add_argument("--public", action="store_true", help="Use ngrok to expose the server publicly (only with --call)")
531
569
  parser.add_argument("--merge", action="store_true", help="Merge existing agents.yaml with auto-generated agents instead of overwriting")
532
570
  parser.add_argument("--claudecode", action="store_true", help="Enable Claude Code integration for file modifications and coding tasks")
571
+ parser.add_argument("--file", "-f", type=str, help="Read input from a file and append it to the prompt")
533
572
 
534
573
  # If we're in a test environment, parse with empty args to avoid pytest interference
535
574
  if in_test_env:
@@ -1,5 +1,6 @@
1
1
  import subprocess
2
2
  import os
3
+ import platform
3
4
  from dotenv import load_dotenv
4
5
 
5
6
  class CloudDeployer:
@@ -56,7 +57,7 @@ class CloudDeployer:
56
57
  file.write("FROM python:3.11-slim\n")
57
58
  file.write("WORKDIR /app\n")
58
59
  file.write("COPY . .\n")
59
- file.write("RUN pip install flask praisonai==2.2.35 gunicorn markdown\n")
60
+ file.write("RUN pip install flask praisonai==2.2.37 gunicorn markdown\n")
60
61
  file.write("EXPOSE 8080\n")
61
62
  file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
62
63
 
@@ -116,20 +117,66 @@ class CloudDeployer:
116
117
  self.create_api_file()
117
118
  self.create_dockerfile()
118
119
  """Runs a sequence of shell commands for deployment, continues on error."""
120
+
121
+ # Get project ID upfront for Windows compatibility
122
+ try:
123
+ result = subprocess.run(['gcloud', 'config', 'get-value', 'project'],
124
+ capture_output=True, text=True, check=True)
125
+ project_id = result.stdout.strip()
126
+ except subprocess.CalledProcessError:
127
+ print("ERROR: Failed to get GCP project ID. Ensure gcloud is configured.")
128
+ return
129
+
130
+ # Get environment variables
131
+ openai_model = os.environ.get('OPENAI_MODEL_NAME', 'gpt-4o')
132
+ openai_key = os.environ.get('OPENAI_API_KEY', 'Enter your API key')
133
+ openai_base = os.environ.get('OPENAI_API_BASE', 'https://api.openai.com/v1')
134
+
135
+ # Build commands with actual values
119
136
  commands = [
120
- "yes | gcloud auth configure-docker us-central1-docker.pkg.dev",
121
- "gcloud artifacts repositories create praisonai-repository --repository-format=docker --location=us-central1",
122
- "docker build --platform linux/amd64 -t gcr.io/$(gcloud config get-value project)/praisonai-app:latest .",
123
- "docker tag gcr.io/$(gcloud config get-value project)/praisonai-app:latest us-central1-docker.pkg.dev/$(gcloud config get-value project)/praisonai-repository/praisonai-app:latest",
124
- "docker push us-central1-docker.pkg.dev/$(gcloud config get-value project)/praisonai-repository/praisonai-app:latest",
125
- "gcloud run deploy praisonai-service --image us-central1-docker.pkg.dev/$(gcloud config get-value project)/praisonai-repository/praisonai-app:latest --platform managed --region us-central1 --allow-unauthenticated --set-env-vars OPENAI_MODEL_NAME=${OPENAI_MODEL_NAME},OPENAI_API_KEY=${OPENAI_API_KEY},OPENAI_API_BASE=${OPENAI_API_BASE}"
137
+ ['gcloud', 'auth', 'configure-docker', 'us-central1-docker.pkg.dev'],
138
+ ['gcloud', 'artifacts', 'repositories', 'create', 'praisonai-repository',
139
+ '--repository-format=docker', '--location=us-central1'],
140
+ ['docker', 'build', '--platform', 'linux/amd64', '-t',
141
+ f'gcr.io/{project_id}/praisonai-app:latest', '.'],
142
+ ['docker', 'tag', f'gcr.io/{project_id}/praisonai-app:latest',
143
+ f'us-central1-docker.pkg.dev/{project_id}/praisonai-repository/praisonai-app:latest'],
144
+ ['docker', 'push',
145
+ f'us-central1-docker.pkg.dev/{project_id}/praisonai-repository/praisonai-app:latest'],
146
+ ['gcloud', 'run', 'deploy', 'praisonai-service',
147
+ '--image', f'us-central1-docker.pkg.dev/{project_id}/praisonai-repository/praisonai-app:latest',
148
+ '--platform', 'managed', '--region', 'us-central1', '--allow-unauthenticated',
149
+ '--set-env-vars', f'OPENAI_MODEL_NAME={openai_model},OPENAI_API_KEY={openai_key},OPENAI_API_BASE={openai_base}']
126
150
  ]
127
-
128
- for cmd in commands:
151
+
152
+ # Run commands with appropriate handling for each platform
153
+ for i, cmd in enumerate(commands):
129
154
  try:
130
- subprocess.run(cmd, shell=True, check=True)
155
+ if i == 0: # First command (gcloud auth configure-docker)
156
+ if platform.system() != 'Windows':
157
+ # On Unix, pipe 'yes' to auto-confirm
158
+ proc = subprocess.Popen(cmd, stdin=subprocess.PIPE)
159
+ proc.communicate(input=b'Y\n')
160
+ if proc.returncode != 0:
161
+ raise subprocess.CalledProcessError(proc.returncode, cmd)
162
+ else:
163
+ # On Windows, try with --quiet flag to avoid prompts
164
+ cmd_with_quiet = cmd + ['--quiet']
165
+ try:
166
+ subprocess.run(cmd_with_quiet, check=True)
167
+ except subprocess.CalledProcessError:
168
+ # If --quiet fails, try without it
169
+ print("Note: You may need to manually confirm the authentication prompt")
170
+ subprocess.run(cmd, check=True)
171
+ else:
172
+ # Run other commands normally
173
+ subprocess.run(cmd, check=True)
131
174
  except subprocess.CalledProcessError as e:
132
- print(f"ERROR: Command '{e.cmd}' failed with exit status {e.returncode}")
175
+ print(f"ERROR: Command failed with exit status {e.returncode}")
176
+ # Commands 2 (build) and 4 (push) and 5 (deploy) are critical
177
+ if i in [2, 4, 5]:
178
+ print("Critical command failed. Aborting deployment.")
179
+ return
133
180
  print(f"Continuing with the next command...")
134
181
 
135
182
  # Usage
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "PraisonAI"
3
- version = "2.2.35"
3
+ version = "2.2.37"
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.108",
15
+ "praisonaiagents>=0.0.110",
16
16
  "python-dotenv>=0.19.0",
17
17
  "instructor>=1.3.3",
18
18
  "PyYAML>=6.0",
@@ -95,7 +95,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.15", "crewai"]
95
95
 
96
96
  [tool.poetry]
97
97
  name = "PraisonAI"
98
- version = "2.2.35"
98
+ version = "2.2.37"
99
99
  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."
100
100
  authors = ["Mervin Praison"]
101
101
  license = ""
@@ -113,7 +113,7 @@ python = ">=3.10,<3.13"
113
113
  rich = ">=13.7"
114
114
  markdown = ">=3.5"
115
115
  pyparsing = ">=3.0.0"
116
- praisonaiagents = ">=0.0.108"
116
+ praisonaiagents = ">=0.0.110"
117
117
  python-dotenv = ">=0.19.0"
118
118
  instructor = ">=1.3.3"
119
119
  PyYAML = ">=6.0"
File without changes
File without changes
File without changes