PraisonAI 0.0.71__tar.gz → 0.0.72__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.
- {praisonai-0.0.71 → praisonai-0.0.72}/PKG-INFO +3 -2
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/deploy.py +1 -1
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/chat.py +37 -6
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/code.py +37 -7
- {praisonai-0.0.71 → praisonai-0.0.72}/pyproject.toml +6 -5
- {praisonai-0.0.71 → praisonai-0.0.72}/LICENSE +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/README.md +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/__init__.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/__main__.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/agents_generator.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/auto.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/chainlit_ui.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/cli.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/inc/__init__.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/inc/config.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/inc/models.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/android-chrome-192x192.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/android-chrome-512x512.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/apple-touch-icon.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/fantasy.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/favicon-16x16.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/favicon-32x32.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/favicon.ico +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/game.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/logo_dark.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/logo_light.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/movie.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/public/thriller.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/setup/__init__.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/setup/build.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/setup/config.yaml +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/setup/post_install.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/setup/setup_conda_env.sh +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/test.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/train.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/context.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/public/fantasy.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/public/game.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/public/logo_dark.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/public/logo_light.png +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/public/movie.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/public/thriller.svg +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/ui/sql_alchemy.py +0 -0
- {praisonai-0.0.71 → praisonai-0.0.72}/praisonai/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.72
|
|
4
4
|
Summary: PraisonAI application combines AutoGen and CrewAI or similar frameworks into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customization, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
Requires-Python: >=3.10,<3.13
|
|
@@ -19,9 +19,10 @@ Provides-Extra: gradio
|
|
|
19
19
|
Provides-Extra: openai
|
|
20
20
|
Provides-Extra: train
|
|
21
21
|
Provides-Extra: ui
|
|
22
|
-
Requires-Dist: agentops (>=0.
|
|
22
|
+
Requires-Dist: agentops (>=0.3.12) ; extra == "agentops"
|
|
23
23
|
Requires-Dist: aiosqlite (>=0.20.0) ; extra == "chat" or extra == "code"
|
|
24
24
|
Requires-Dist: chainlit (==1.2.0) ; extra == "ui" or extra == "chat" or extra == "code"
|
|
25
|
+
Requires-Dist: crawl4ai (==0.3.4) ; extra == "chat" or extra == "code"
|
|
25
26
|
Requires-Dist: crewai (>=0.32.0)
|
|
26
27
|
Requires-Dist: flask (>=3.0.0) ; extra == "api"
|
|
27
28
|
Requires-Dist: gradio (>=4.26.0) ; extra == "gradio"
|
|
@@ -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==0.0.
|
|
59
|
+
file.write("RUN pip install flask praisonai==0.0.72 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
|
|
|
@@ -15,6 +15,8 @@ import logging
|
|
|
15
15
|
import json
|
|
16
16
|
from sql_alchemy import SQLAlchemyDataLayer
|
|
17
17
|
from tavily import TavilyClient
|
|
18
|
+
from crawl4ai import WebCrawler
|
|
19
|
+
import asyncio
|
|
18
20
|
|
|
19
21
|
# Set up logging
|
|
20
22
|
logger = logging.getLogger(__name__)
|
|
@@ -176,27 +178,55 @@ cl_data._data_layer = SQLAlchemyDataLayer(conninfo=f"sqlite+aiosqlite:///{DB_PAT
|
|
|
176
178
|
tavily_api_key = os.getenv("TAVILY_API_KEY")
|
|
177
179
|
tavily_client = TavilyClient(api_key=tavily_api_key) if tavily_api_key else None
|
|
178
180
|
|
|
179
|
-
#
|
|
181
|
+
# Modify the tavily_web_search function to be synchronous
|
|
180
182
|
def tavily_web_search(query):
|
|
181
183
|
if not tavily_client:
|
|
182
184
|
return json.dumps({
|
|
183
185
|
"query": query,
|
|
184
186
|
"error": "Tavily API key is not set. Web search is unavailable."
|
|
185
187
|
})
|
|
188
|
+
|
|
186
189
|
response = tavily_client.search(query)
|
|
187
|
-
|
|
190
|
+
logger.debug(f"Tavily search response: {response}")
|
|
191
|
+
|
|
192
|
+
# Create an instance of WebCrawler
|
|
193
|
+
crawler = WebCrawler()
|
|
194
|
+
|
|
195
|
+
# Warm up the crawler (load necessary models)
|
|
196
|
+
crawler.warmup()
|
|
197
|
+
|
|
198
|
+
# Prepare the results
|
|
199
|
+
results = []
|
|
200
|
+
for result in response.get('results', []):
|
|
201
|
+
url = result.get('url')
|
|
202
|
+
if url:
|
|
203
|
+
try:
|
|
204
|
+
# Run the crawler on each URL
|
|
205
|
+
crawl_result = crawler.run(url=url)
|
|
206
|
+
results.append({
|
|
207
|
+
"content": result.get('content'),
|
|
208
|
+
"url": url,
|
|
209
|
+
"full_content": crawl_result.markdown
|
|
210
|
+
})
|
|
211
|
+
except Exception as e:
|
|
212
|
+
logger.error(f"Error crawling {url}: {str(e)}")
|
|
213
|
+
results.append({
|
|
214
|
+
"content": result.get('content'),
|
|
215
|
+
"url": url,
|
|
216
|
+
"full_content": "Error: Unable to crawl this URL"
|
|
217
|
+
})
|
|
218
|
+
|
|
188
219
|
return json.dumps({
|
|
189
220
|
"query": query,
|
|
190
|
-
"
|
|
191
|
-
"top_result": response['results'][0]['content'] if response['results'] else 'No results found'
|
|
221
|
+
"results": results
|
|
192
222
|
})
|
|
193
223
|
|
|
194
|
-
#
|
|
224
|
+
# Update the tools definition
|
|
195
225
|
tools = [{
|
|
196
226
|
"type": "function",
|
|
197
227
|
"function": {
|
|
198
228
|
"name": "tavily_web_search",
|
|
199
|
-
"description": "Search the web using Tavily API",
|
|
229
|
+
"description": "Search the web using Tavily API and crawl the resulting URLs",
|
|
200
230
|
"parameters": {
|
|
201
231
|
"type": "object",
|
|
202
232
|
"properties": {
|
|
@@ -346,6 +376,7 @@ Current Date and Time: {now}
|
|
|
346
376
|
if function_args:
|
|
347
377
|
try:
|
|
348
378
|
function_args = json.loads(function_args)
|
|
379
|
+
# Call the function synchronously
|
|
349
380
|
function_response = function_to_call(
|
|
350
381
|
query=function_args.get("query"),
|
|
351
382
|
)
|
|
@@ -17,6 +17,8 @@ from sql_alchemy import SQLAlchemyDataLayer
|
|
|
17
17
|
from context import ContextGatherer
|
|
18
18
|
from tavily import TavilyClient
|
|
19
19
|
from datetime import datetime
|
|
20
|
+
from crawl4ai import WebCrawler
|
|
21
|
+
|
|
20
22
|
# Set up logging
|
|
21
23
|
logger = logging.getLogger(__name__)
|
|
22
24
|
log_level = os.getenv("LOGLEVEL", "INFO").upper()
|
|
@@ -238,19 +240,47 @@ async def setup_agent(settings):
|
|
|
238
240
|
tavily_api_key = os.getenv("TAVILY_API_KEY")
|
|
239
241
|
tavily_client = TavilyClient(api_key=tavily_api_key) if tavily_api_key else None
|
|
240
242
|
|
|
241
|
-
# Function to call Tavily Search API
|
|
243
|
+
# Function to call Tavily Search API and crawl the results
|
|
242
244
|
def tavily_web_search(query):
|
|
243
245
|
if not tavily_client:
|
|
244
246
|
return json.dumps({
|
|
245
247
|
"query": query,
|
|
246
248
|
"error": "Tavily API key is not set. Web search is unavailable."
|
|
247
249
|
})
|
|
250
|
+
|
|
248
251
|
response = tavily_client.search(query)
|
|
249
|
-
|
|
252
|
+
logger.debug(f"Tavily search response: {response}")
|
|
253
|
+
|
|
254
|
+
# Create an instance of WebCrawler
|
|
255
|
+
crawler = WebCrawler()
|
|
256
|
+
|
|
257
|
+
# Warm up the crawler (load necessary models)
|
|
258
|
+
crawler.warmup()
|
|
259
|
+
|
|
260
|
+
# Prepare the results
|
|
261
|
+
results = []
|
|
262
|
+
for result in response.get('results', []):
|
|
263
|
+
url = result.get('url')
|
|
264
|
+
if url:
|
|
265
|
+
try:
|
|
266
|
+
# Run the crawler on each URL
|
|
267
|
+
crawl_result = crawler.run(url=url)
|
|
268
|
+
results.append({
|
|
269
|
+
"content": result.get('content'),
|
|
270
|
+
"url": url,
|
|
271
|
+
"full_content": crawl_result.markdown
|
|
272
|
+
})
|
|
273
|
+
except Exception as e:
|
|
274
|
+
logger.error(f"Error crawling {url}: {str(e)}")
|
|
275
|
+
results.append({
|
|
276
|
+
"content": result.get('content'),
|
|
277
|
+
"url": url,
|
|
278
|
+
"full_content": "Error: Unable to crawl this URL"
|
|
279
|
+
})
|
|
280
|
+
|
|
250
281
|
return json.dumps({
|
|
251
282
|
"query": query,
|
|
252
|
-
"
|
|
253
|
-
"top_result": response['results'][0]['content'] if response['results'] else 'No results found'
|
|
283
|
+
"results": results
|
|
254
284
|
})
|
|
255
285
|
|
|
256
286
|
# Define the tool for function calling
|
|
@@ -258,7 +288,7 @@ tools = [{
|
|
|
258
288
|
"type": "function",
|
|
259
289
|
"function": {
|
|
260
290
|
"name": "tavily_web_search",
|
|
261
|
-
"description": "Search the web using Tavily API",
|
|
291
|
+
"description": "Search the web using Tavily API and crawl the resulting URLs",
|
|
262
292
|
"parameters": {
|
|
263
293
|
"type": "object",
|
|
264
294
|
"properties": {
|
|
@@ -300,14 +330,14 @@ async def main(message: cl.Message):
|
|
|
300
330
|
completion_params["tool_choice"] = "auto"
|
|
301
331
|
|
|
302
332
|
response = await acompletion(**completion_params)
|
|
303
|
-
|
|
333
|
+
logger.debug(f"LLM response: {response}")
|
|
304
334
|
|
|
305
335
|
full_response = ""
|
|
306
336
|
tool_calls = []
|
|
307
337
|
current_tool_call = None
|
|
308
338
|
|
|
309
339
|
async for part in response:
|
|
310
|
-
|
|
340
|
+
logger.debug(f"LLM part: {part}")
|
|
311
341
|
if 'choices' in part and len(part['choices']) > 0:
|
|
312
342
|
delta = part['choices'][0].get('delta', {})
|
|
313
343
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "PraisonAI"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.72"
|
|
4
4
|
description = "PraisonAI application combines AutoGen and CrewAI or similar frameworks into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customization, and efficient human-agent collaboration."
|
|
5
5
|
authors = ["Mervin Praison"]
|
|
6
6
|
license = ""
|
|
@@ -24,7 +24,7 @@ pyparsing = ">=3.0.0"
|
|
|
24
24
|
chainlit = {version = "==1.2.0", optional = true}
|
|
25
25
|
gradio = {version = ">=4.26.0", optional = true}
|
|
26
26
|
flask = {version = ">=3.0.0", optional = true}
|
|
27
|
-
agentops = {version = ">=0.
|
|
27
|
+
agentops = {version = ">=0.3.12", optional = true}
|
|
28
28
|
langchain-google-genai = {version = ">=1.0.4", optional = true}
|
|
29
29
|
langchain-anthropic = {version = ">=0.1.13", optional = true}
|
|
30
30
|
langchain-openai = {version = ">=0.1.7", optional = true}
|
|
@@ -33,6 +33,7 @@ litellm = {version = ">=1.41.8", optional = true}
|
|
|
33
33
|
aiosqlite= {version = ">=0.20.0", optional = true}
|
|
34
34
|
greenlet = {version = ">=3.0.3", optional = true}
|
|
35
35
|
tavily-python = {version = "==0.5.0", optional=true}
|
|
36
|
+
crawl4ai = {version = "==0.3.4", optional = true}
|
|
36
37
|
|
|
37
38
|
[tool.poetry.group.docs.dependencies]
|
|
38
39
|
mkdocs = "*"
|
|
@@ -74,7 +75,7 @@ unittest2 = "*"
|
|
|
74
75
|
chainlit = "==1.2.0"
|
|
75
76
|
gradio = ">=4.26.0"
|
|
76
77
|
flask = ">=3.0.0"
|
|
77
|
-
agentops = ">=0.
|
|
78
|
+
agentops = ">=0.3.12"
|
|
78
79
|
langchain-google-genai = ">=1.0.4"
|
|
79
80
|
langchain-anthropic = ">=0.1.13"
|
|
80
81
|
langchain-openai = ">=0.1.7"
|
|
@@ -102,8 +103,8 @@ google = ["langchain-google-genai"]
|
|
|
102
103
|
openai = ["langchain-openai"]
|
|
103
104
|
anthropic = ["langchain-anthropic"]
|
|
104
105
|
cohere = ["langchain-cohere"]
|
|
105
|
-
chat = ["chainlit", "litellm", "aiosqlite", "greenlet", "tavily-python"]
|
|
106
|
-
code = ["chainlit", "litellm", "aiosqlite", "greenlet", "tavily-python"]
|
|
106
|
+
chat = ["chainlit", "litellm", "aiosqlite", "greenlet", "tavily-python", "crawl4ai"]
|
|
107
|
+
code = ["chainlit", "litellm", "aiosqlite", "greenlet", "tavily-python", "crawl4ai"]
|
|
107
108
|
train = ["setup-conda-env"]
|
|
108
109
|
|
|
109
110
|
[tool.poetry-dynamic-versioning]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|