PraisonAI 1.0.2__cp312-cp312-manylinux_2_35_x86_64.whl → 1.0.3__cp312-cp312-manylinux_2_35_x86_64.whl

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/deploy.py CHANGED
@@ -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==1.0.2 gunicorn markdown\n")
59
+ file.write("RUN pip install flask praisonai==1.0.3 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
 
praisonai/ui/chat.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import chainlit as cl
2
2
  from chainlit.input_widget import TextInput
3
- from chainlit.types import ThreadDict # Change this import
3
+ from chainlit.types import ThreadDict
4
4
  from litellm import acompletion
5
5
  import os
6
6
  import sqlite3
@@ -9,7 +9,6 @@ from typing import Dict, List, Optional
9
9
  from dotenv import load_dotenv
10
10
  load_dotenv()
11
11
  import chainlit.data as cl_data
12
- from chainlit.step import StepDict
13
12
  from literalai.helper import utc_now
14
13
  import logging
15
14
  import json
@@ -20,6 +19,8 @@ import asyncio
20
19
  from PIL import Image
21
20
  import io
22
21
  import base64
22
+ from sqlalchemy import text
23
+ from sqlalchemy.exc import DatabaseError
23
24
 
24
25
  # Set up logging
25
26
  logger = logging.getLogger(__name__)
@@ -48,140 +49,226 @@ create_step_counter = 0
48
49
 
49
50
  DB_PATH = os.path.expanduser("~/.praison/database.sqlite")
50
51
 
51
- def initialize_db():
52
- os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
53
- conn = sqlite3.connect(DB_PATH)
54
- cursor = conn.cursor()
55
- cursor.execute('''
56
- CREATE TABLE IF NOT EXISTS users (
57
- id UUID PRIMARY KEY,
58
- identifier TEXT NOT NULL UNIQUE,
59
- metadata JSONB NOT NULL,
60
- createdAt TEXT
61
- )
62
- ''')
63
- cursor.execute('''
64
- CREATE TABLE IF NOT EXISTS threads (
65
- id UUID PRIMARY KEY,
66
- createdAt TEXT,
67
- name TEXT,
68
- userId UUID,
69
- userIdentifier TEXT,
70
- tags TEXT[],
71
- metadata JSONB NOT NULL DEFAULT '{}',
72
- FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE
73
- )
74
- ''')
75
- cursor.execute('''
76
- CREATE TABLE IF NOT EXISTS steps (
77
- id UUID PRIMARY KEY,
78
- name TEXT NOT NULL,
79
- type TEXT NOT NULL,
80
- threadId UUID NOT NULL,
81
- parentId UUID,
82
- disableFeedback BOOLEAN NOT NULL DEFAULT 0,
83
- streaming BOOLEAN NOT NULL DEFAULT 0,
84
- waitForAnswer BOOLEAN DEFAULT 0,
85
- isError BOOLEAN NOT NULL DEFAULT 0,
86
- metadata JSONB DEFAULT '{}',
87
- tags TEXT[],
88
- input TEXT,
89
- output TEXT,
90
- createdAt TEXT,
91
- start TEXT,
92
- end TEXT,
93
- generation JSONB,
94
- showInput TEXT,
95
- language TEXT,
96
- indent INT,
97
- FOREIGN KEY (threadId) REFERENCES threads (id) ON DELETE CASCADE
98
- )
99
- ''')
100
- cursor.execute('''
101
- CREATE TABLE IF NOT EXISTS elements (
102
- id UUID PRIMARY KEY,
103
- threadId UUID,
104
- type TEXT,
105
- url TEXT,
106
- chainlitKey TEXT,
107
- name TEXT NOT NULL,
108
- display TEXT,
109
- objectKey TEXT,
110
- size TEXT,
111
- page INT,
112
- language TEXT,
113
- forId UUID,
114
- mime TEXT,
115
- FOREIGN KEY (threadId) REFERENCES threads (id) ON DELETE CASCADE
116
- )
117
- ''')
118
- cursor.execute('''
119
- CREATE TABLE IF NOT EXISTS feedbacks (
120
- id UUID PRIMARY KEY,
121
- forId UUID NOT NULL,
122
- value INT NOT NULL,
123
- threadId UUID,
124
- comment TEXT
125
- )
126
- ''')
127
- cursor.execute('''
128
- CREATE TABLE IF NOT EXISTS settings (
129
- id INTEGER PRIMARY KEY AUTOINCREMENT,
130
- key TEXT UNIQUE,
131
- value TEXT
132
- )
133
- ''')
134
- conn.commit()
135
- conn.close()
136
-
137
- def save_setting(key: str, value: str):
138
- """Saves a setting to the database.
139
-
140
- Args:
141
- key: The setting key.
142
- value: The setting value.
143
- """
144
- conn = sqlite3.connect(DB_PATH)
145
- cursor = conn.cursor()
146
- cursor.execute(
147
- """
148
- INSERT OR REPLACE INTO settings (id, key, value)
149
- VALUES ((SELECT id FROM settings WHERE key = ?), ?, ?)
150
- """,
151
- (key, key, value),
152
- )
153
- conn.commit()
154
- conn.close()
155
-
156
- def load_setting(key: str) -> str:
157
- """Loads a setting from the database.
158
-
159
- Args:
160
- key: The setting key.
161
-
162
- Returns:
163
- The setting value, or None if the key is not found.
164
- """
165
- conn = sqlite3.connect(DB_PATH)
166
- cursor = conn.cursor()
167
- cursor.execute('SELECT value FROM settings WHERE key = ?', (key,))
168
- result = cursor.fetchone()
169
- conn.close()
170
- return result[0] if result else None
171
-
52
+ async def create_tables(engine):
53
+ """Create all necessary tables if they don't exist."""
54
+ try:
55
+ async with engine.begin() as conn:
56
+ # Check if we're using PostgreSQL
57
+ dialect = engine.dialect.name
58
+ if dialect == 'postgresql':
59
+ # Create tables with PostgreSQL-specific types
60
+ await conn.execute(text("""
61
+ CREATE TABLE IF NOT EXISTS users (
62
+ id UUID PRIMARY KEY,
63
+ identifier TEXT NOT NULL UNIQUE,
64
+ metadata JSONB NOT NULL,
65
+ createdAt TEXT
66
+ )
67
+ """))
68
+
69
+ await conn.execute(text("""
70
+ CREATE TABLE IF NOT EXISTS threads (
71
+ id UUID PRIMARY KEY,
72
+ createdAt TEXT,
73
+ name TEXT,
74
+ userId UUID,
75
+ userIdentifier TEXT,
76
+ tags TEXT[],
77
+ metadata JSONB NOT NULL DEFAULT '{}',
78
+ FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE
79
+ )
80
+ """))
81
+
82
+ await conn.execute(text("""
83
+ CREATE TABLE IF NOT EXISTS steps (
84
+ id UUID PRIMARY KEY,
85
+ name TEXT NOT NULL,
86
+ type TEXT NOT NULL,
87
+ threadId UUID NOT NULL,
88
+ parentId UUID,
89
+ disableFeedback BOOLEAN NOT NULL DEFAULT 0,
90
+ streaming BOOLEAN NOT NULL DEFAULT 0,
91
+ waitForAnswer BOOLEAN DEFAULT 0,
92
+ isError BOOLEAN NOT NULL DEFAULT 0,
93
+ metadata JSONB DEFAULT '{}',
94
+ tags TEXT[],
95
+ input TEXT,
96
+ output TEXT,
97
+ createdAt TEXT,
98
+ start TEXT,
99
+ end TEXT,
100
+ generation JSONB,
101
+ showInput TEXT,
102
+ language TEXT,
103
+ indent INT,
104
+ FOREIGN KEY (threadId) REFERENCES threads (id) ON DELETE CASCADE
105
+ )
106
+ """))
107
+
108
+ await conn.execute(text("""
109
+ CREATE TABLE IF NOT EXISTS elements (
110
+ id UUID PRIMARY KEY,
111
+ threadId UUID,
112
+ type TEXT,
113
+ url TEXT,
114
+ chainlitKey TEXT,
115
+ name TEXT NOT NULL,
116
+ display TEXT,
117
+ objectKey TEXT,
118
+ size TEXT,
119
+ page INT,
120
+ language TEXT,
121
+ forId UUID,
122
+ mime TEXT,
123
+ FOREIGN KEY (threadId) REFERENCES threads (id) ON DELETE CASCADE
124
+ )
125
+ """))
126
+
127
+ await conn.execute(text("""
128
+ CREATE TABLE IF NOT EXISTS feedbacks (
129
+ id UUID PRIMARY KEY,
130
+ forId UUID NOT NULL,
131
+ value INT NOT NULL,
132
+ threadId UUID,
133
+ comment TEXT
134
+ )
135
+ """))
136
+
137
+ await conn.execute(text("""
138
+ CREATE TABLE IF NOT EXISTS settings (
139
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
140
+ key TEXT UNIQUE,
141
+ value TEXT
142
+ )
143
+ """))
144
+
145
+ # Create indexes
146
+ await conn.execute(text(
147
+ "CREATE INDEX IF NOT EXISTS idx_steps_threadId ON steps(threadId)"
148
+ ))
149
+ await conn.execute(text(
150
+ "CREATE INDEX IF NOT EXISTS idx_threads_createdAt ON threads(createdAt DESC)"
151
+ ))
152
+ else:
153
+ # SQLite tables (existing schema)
154
+ await conn.execute(text("""
155
+ CREATE TABLE IF NOT EXISTS users (
156
+ id TEXT PRIMARY KEY,
157
+ identifier TEXT NOT NULL UNIQUE,
158
+ metadata TEXT NOT NULL,
159
+ createdAt TEXT
160
+ )
161
+ """))
162
+
163
+ await conn.execute(text("""
164
+ CREATE TABLE IF NOT EXISTS threads (
165
+ id TEXT PRIMARY KEY,
166
+ createdAt TEXT,
167
+ name TEXT,
168
+ userId TEXT,
169
+ userIdentifier TEXT,
170
+ tags TEXT,
171
+ metadata TEXT NOT NULL DEFAULT '{}',
172
+ FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE
173
+ )
174
+ """))
175
+
176
+ await conn.execute(text("""
177
+ CREATE TABLE IF NOT EXISTS steps (
178
+ id TEXT PRIMARY KEY,
179
+ name TEXT NOT NULL,
180
+ type TEXT NOT NULL,
181
+ threadId TEXT NOT NULL,
182
+ parentId TEXT,
183
+ disableFeedback BOOLEAN NOT NULL DEFAULT 0,
184
+ streaming BOOLEAN NOT NULL DEFAULT 0,
185
+ waitForAnswer BOOLEAN DEFAULT 0,
186
+ isError BOOLEAN NOT NULL DEFAULT 0,
187
+ metadata TEXT DEFAULT '{}',
188
+ tags TEXT,
189
+ input TEXT,
190
+ output TEXT,
191
+ createdAt TEXT,
192
+ start TEXT,
193
+ end TEXT,
194
+ generation TEXT,
195
+ showInput TEXT,
196
+ language TEXT,
197
+ indent INT,
198
+ FOREIGN KEY (threadId) REFERENCES threads (id) ON DELETE CASCADE
199
+ )
200
+ """))
201
+
202
+ await conn.execute(text("""
203
+ CREATE TABLE IF NOT EXISTS elements (
204
+ id TEXT PRIMARY KEY,
205
+ threadId TEXT,
206
+ type TEXT,
207
+ url TEXT,
208
+ chainlitKey TEXT,
209
+ name TEXT NOT NULL,
210
+ display TEXT,
211
+ objectKey TEXT,
212
+ size TEXT,
213
+ page INT,
214
+ language TEXT,
215
+ forId TEXT,
216
+ mime TEXT,
217
+ FOREIGN KEY (threadId) REFERENCES threads (id) ON DELETE CASCADE
218
+ )
219
+ """))
220
+
221
+ await conn.execute(text("""
222
+ CREATE TABLE IF NOT EXISTS feedbacks (
223
+ id TEXT PRIMARY KEY,
224
+ forId TEXT NOT NULL,
225
+ value INT NOT NULL,
226
+ threadId TEXT,
227
+ comment TEXT
228
+ )
229
+ """))
230
+
231
+ await conn.execute(text("""
232
+ CREATE TABLE IF NOT EXISTS settings (
233
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
234
+ key TEXT UNIQUE,
235
+ value TEXT
236
+ )
237
+ """))
238
+
239
+ # Create indexes
240
+ await conn.execute(text(
241
+ "CREATE INDEX IF NOT EXISTS idx_steps_threadId ON steps(threadId)"
242
+ ))
243
+ await conn.execute(text(
244
+ "CREATE INDEX IF NOT EXISTS idx_threads_createdAt ON threads(createdAt DESC)"
245
+ ))
246
+
247
+ logger.info(f"Successfully created tables for {dialect} database")
248
+ except Exception as e:
249
+ logger.error(f"Error creating tables: {str(e)}")
250
+ raise DatabaseError(f"Failed to create database tables: {str(e)}")
172
251
 
173
252
  # Initialize the database
174
- initialize_db()
175
-
176
- deleted_thread_ids = [] # type: List[str]
253
+ async def initialize_db():
254
+ await create_tables(cl_data._data_layer.engine)
177
255
 
178
256
  # Get database connection string from environment variable or use SQLite as default
179
257
  DB_URL = os.getenv("DATABASE_URL", f"sqlite+aiosqlite:///{DB_PATH}")
258
+ if DB_URL.startswith('postgresql'):
259
+ # Convert postgresql:// to postgresql+psycopg:// if needed
260
+ DB_URL = DB_URL.replace('postgresql://', 'postgresql+psycopg://')
261
+
262
+ # Initialize SQLAlchemy data layer
180
263
  cl_data._data_layer = SQLAlchemyDataLayer(
181
264
  conninfo=DB_URL,
182
265
  ssl_require=bool(os.getenv("DATABASE_SSL", False))
183
266
  )
184
267
 
268
+ # Create tables if using PostgreSQL
269
+ if DB_URL.startswith('postgresql'):
270
+ asyncio.run(initialize_db())
271
+
185
272
  # Set Tavily API key
186
273
  tavily_api_key = os.getenv("TAVILY_API_KEY")
187
274
  tavily_client = TavilyClient(api_key=tavily_api_key) if tavily_api_key else None
@@ -241,10 +328,53 @@ tools = [{
241
328
  }
242
329
  }] if tavily_api_key else []
243
330
 
331
+ async def save_setting(key: str, value: str):
332
+ """Saves a setting to the database.
333
+
334
+ Args:
335
+ key: The setting key.
336
+ value: The setting value.
337
+ """
338
+ try:
339
+ async with cl_data._data_layer.engine.begin() as conn:
340
+ await conn.execute(
341
+ text("""
342
+ INSERT INTO settings (key, value)
343
+ VALUES (:key, :value)
344
+ ON CONFLICT (key) DO UPDATE SET value = :value
345
+ """),
346
+ {"key": key, "value": value}
347
+ )
348
+ logger.debug(f"Saved setting {key}={value}")
349
+ except Exception as e:
350
+ logger.error(f"Error saving setting {key}: {str(e)}")
351
+ raise DatabaseError(f"Failed to save setting: {str(e)}")
352
+
353
+ async def load_setting(key: str) -> str:
354
+ """Loads a setting from the database.
355
+
356
+ Args:
357
+ key: The setting key.
358
+
359
+ Returns:
360
+ The setting value, or None if the key is not found.
361
+ """
362
+ try:
363
+ async with cl_data._data_layer.engine.connect() as conn:
364
+ result = await conn.execute(
365
+ text("SELECT value FROM settings WHERE key = :key"),
366
+ {"key": key}
367
+ )
368
+ row = result.fetchone()
369
+ return row[0] if row else None
370
+ except Exception as e:
371
+ logger.error(f"Error loading setting {key}: {str(e)}")
372
+ return None
373
+
244
374
  @cl.on_chat_start
245
375
  async def start():
246
- initialize_db()
247
- model_name = load_setting("model_name")
376
+ await initialize_db()
377
+ model_name = await load_setting("model_name")
248
378
 
249
379
  if model_name:
250
380
  cl.user_session.set("model_name", model_name)
@@ -274,7 +404,7 @@ async def setup_agent(settings):
274
404
  cl.user_session.set("model_name", model_name)
275
405
 
276
406
  # Save in settings table
277
- save_setting("model_name", model_name)
407
+ await save_setting("model_name", model_name)
278
408
 
279
409
  # Save in thread metadata
280
410
  thread_id = cl.user_session.get("thread_id")
@@ -292,7 +422,7 @@ async def setup_agent(settings):
292
422
 
293
423
  @cl.on_message
294
424
  async def main(message: cl.Message):
295
- model_name = load_setting("model_name") or os.getenv("MODEL_NAME") or "gpt-4o-mini"
425
+ model_name = await load_setting("model_name") or os.getenv("MODEL_NAME") or "gpt-4o-mini"
296
426
  message_history = cl.user_session.get("message_history", [])
297
427
  now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
298
428
 
@@ -474,7 +604,7 @@ async def send_count():
474
604
  @cl.on_chat_resume
475
605
  async def on_chat_resume(thread: ThreadDict):
476
606
  logger.info(f"Resuming chat: {thread['id']}")
477
- model_name = load_setting("model_name") or os.getenv("MODEL_NAME") or "gpt-4o-mini"
607
+ model_name = await load_setting("model_name") or os.getenv("MODEL_NAME") or "gpt-4o-mini"
478
608
  logger.debug(f"Model name: {model_name}")
479
609
  settings = cl.ChatSettings(
480
610
  [
praisonai/ui/code.py CHANGED
@@ -1,7 +1,6 @@
1
1
  import chainlit as cl
2
2
  from chainlit.input_widget import TextInput
3
- from chainlit.types import ThreadDict
4
- from litellm import acompletion, completion
3
+ from chainlit.types import ThreadDict, StepDict
5
4
  import os
6
5
  import sqlite3
7
6
  from datetime import datetime
@@ -9,8 +8,6 @@ from typing import Dict, List, Optional
9
8
  from dotenv import load_dotenv
10
9
  load_dotenv()
11
10
  import chainlit.data as cl_data
12
- from chainlit.step import StepDict
13
- from literalai.helper import utc_now
14
11
  import logging
15
12
  import json
16
13
  from sql_alchemy import SQLAlchemyDataLayer
@@ -43,7 +40,7 @@ if not CHAINLIT_AUTH_SECRET:
43
40
  os.environ["CHAINLIT_AUTH_SECRET"] = "p8BPhQChpg@J>jBz$wGxqLX2V>yTVgP*7Ky9H$aV:axW~ANNX-7_T:o@lnyCBu^U"
44
41
  CHAINLIT_AUTH_SECRET = os.getenv("CHAINLIT_AUTH_SECRET")
45
42
 
46
- now = utc_now()
43
+ now = datetime.now()
47
44
 
48
45
  create_step_counter = 0
49
46
 
@@ -12,6 +12,7 @@ from chainlit.data.base import BaseDataLayer, BaseStorageClient
12
12
  from chainlit.data.utils import queue_until_user_message
13
13
  from chainlit.element import ElementDict
14
14
  from chainlit.logger import logger
15
+ from chainlit.message import Message
15
16
  from chainlit.step import StepDict
16
17
  from chainlit.types import (
17
18
  Feedback,
@@ -204,9 +205,10 @@ class SQLAlchemyDataLayer(BaseDataLayer):
204
205
  async def get_thread(self, thread_id: str) -> Optional[ThreadDict]:
205
206
  if self.show_logger:
206
207
  logger.info(f"SQLAlchemy: get_thread, thread_id={thread_id}")
207
- user_threads: Optional[List[ThreadDict]] = await self.get_all_user_threads(
208
- thread_id=thread_id
208
+ user_threads: Optional[List[ThreadDict]] = (
209
+ await self.get_all_user_threads(thread_id=thread_id) or []
209
210
  )
211
+
210
212
  if user_threads:
211
213
  return user_threads[0]
212
214
  else:
@@ -335,7 +337,7 @@ class SQLAlchemyDataLayer(BaseDataLayer):
335
337
 
336
338
  ###### Steps ######
337
339
  @queue_until_user_message()
338
- async def create_step(self, step_dict: "StepDict"):
340
+ async def create_step(self, step_dict: dict):
339
341
  if self.show_logger:
340
342
  logger.info(f"SQLAlchemy: create_step, step_id={step_dict.get('id')}")
341
343
 
@@ -365,7 +367,7 @@ class SQLAlchemyDataLayer(BaseDataLayer):
365
367
  await self.execute_sql(query=query, parameters=parameters)
366
368
 
367
369
  @queue_until_user_message()
368
- async def update_step(self, step_dict: "StepDict"):
370
+ async def update_step(self, step_dict: dict):
369
371
  if self.show_logger:
370
372
  logger.info(f"SQLAlchemy: update_step, step_id={step_dict.get('id')}")
371
373
  await self.create_step(step_dict)
@@ -646,37 +648,37 @@ class SQLAlchemyDataLayer(BaseDataLayer):
646
648
  value=step_feedback["feedback_value"],
647
649
  comment=step_feedback.get("feedback_comment"),
648
650
  )
649
- step_dict = StepDict(
650
- id=step_feedback["step_id"],
651
- name=step_feedback["step_name"],
652
- type=step_feedback["step_type"],
653
- threadId=thread_id,
654
- parentId=step_feedback.get("step_parentid"),
655
- streaming=step_feedback.get("step_streaming", False),
656
- waitForAnswer=step_feedback.get("step_waitforanswer"),
657
- isError=step_feedback.get("step_iserror"),
658
- metadata=(
651
+ step_dict = {
652
+ "id": step_feedback["step_id"],
653
+ "name": step_feedback["step_name"],
654
+ "type": step_feedback["step_type"],
655
+ "threadId": thread_id,
656
+ "parentId": step_feedback.get("step_parentid"),
657
+ "streaming": step_feedback.get("step_streaming", False),
658
+ "waitForAnswer": step_feedback.get("step_waitforanswer"),
659
+ "isError": step_feedback.get("step_iserror"),
660
+ "metadata": (
659
661
  step_feedback["step_metadata"]
660
662
  if step_feedback.get("step_metadata") is not None
661
663
  else {}
662
664
  ),
663
- tags=step_feedback.get("step_tags"),
664
- input=(
665
+ "tags": step_feedback.get("step_tags"),
666
+ "input": (
665
667
  step_feedback.get("step_input", "")
666
668
  if step_feedback.get("step_showinput")
667
669
  not in [None, "false"]
668
670
  else ""
669
671
  ),
670
- output=step_feedback.get("step_output", ""),
671
- createdAt=step_feedback.get("step_createdat"),
672
- start=step_feedback.get("step_start"),
673
- end=step_feedback.get("step_end"),
674
- generation=step_feedback.get("step_generation"),
675
- showInput=step_feedback.get("step_showinput"),
676
- language=step_feedback.get("step_language"),
677
- indent=step_feedback.get("step_indent"),
678
- feedback=feedback,
679
- )
672
+ "output": step_feedback.get("step_output", ""),
673
+ "createdAt": step_feedback.get("step_createdat"),
674
+ "start": step_feedback.get("step_start"),
675
+ "end": step_feedback.get("step_end"),
676
+ "generation": step_feedback.get("step_generation"),
677
+ "showInput": step_feedback.get("step_showinput"),
678
+ "language": step_feedback.get("step_language"),
679
+ "indent": step_feedback.get("step_indent"),
680
+ "feedback": feedback,
681
+ }
680
682
  # Append the step to the steps list of the corresponding ThreadDict
681
683
  thread_dicts[thread_id]["steps"].append(step_dict)
682
684
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PraisonAI
3
- Version: 1.0.2
3
+ Version: 1.0.3
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
@@ -5,7 +5,7 @@ praisonai/api/call.py,sha256=iHdAlgIH_oTsEbjaGGu1Jjo6DTfMR-SfFdtSxnOLCeY,11032
5
5
  praisonai/auto.py,sha256=NDQiTV8ex_NE5C6AoY26-gMyLZNYrfthgQ6G0Dn1uhU,8304
6
6
  praisonai/chainlit_ui.py,sha256=bNR7s509lp0I9JlJNvwCZRUZosC64qdvlFCt8NmFamQ,12216
7
7
  praisonai/cli.py,sha256=Rg6vikTv4LHR1R6BIEzcaBWFvkdRZr0nOkMi6RCPKh8,21224
8
- praisonai/deploy.py,sha256=D7HQYTHR__UpEmBVqGf-oM-LLWMJri5gQiuNWVmngiw,6027
8
+ praisonai/deploy.py,sha256=Q10KJz39wpEke58Nvqa5tv2-hd4-ACgoX9zXI231Mvc,6027
9
9
  praisonai/inbuilt_tools/__init__.py,sha256=fai4ZJIKz7-iOnGZv5jJX0wmT77PKa4x2jqyaJddKFA,569
10
10
  praisonai/inbuilt_tools/autogen_tools.py,sha256=kJdEv61BTYvdHOaURNEpBcWq8Rs-oC03loNFTIjT-ak,4687
11
11
  praisonai/inc/__init__.py,sha256=sPDlYBBwdk0VlWzaaM_lG0_LD07lS2HRGvPdxXJFiYg,62
@@ -32,8 +32,8 @@ praisonai/setup/setup_conda_env.sh,sha256=te7s0KHsTi7XM-vkNvE0dKC1HeU2tXxqE-sPUS
32
32
  praisonai/setup.py,sha256=0jHgKnIPCtBZiGYaYyTz3PzrJI6nBy55VXk2UctXlDo,373
33
33
  praisonai/test.py,sha256=OL-wesjA5JTohr8rtr6kWoaS4ImkJg2l0GXJ-dUUfRU,4090
34
34
  praisonai/train.py,sha256=DvORlrwKOD-2v4r_z84eV3LsfzpNs-WnPKb5cQB3_t4,11071
35
- praisonai/ui/chat.py,sha256=rpyyFP9aICzpVEvRaKGv5EIQbpEDQZG4lvOBQ5HEJ8Y,18080
36
- praisonai/ui/code.py,sha256=RazArxgCQHpLJXegbgytSmcUZZi18wJRWljDjJuDbTQ,18900
35
+ praisonai/ui/chat.py,sha256=ZZnu5babmHWdsAH-KA2aGlXIlRWL9QfAHrP6js0N4po,24648
36
+ praisonai/ui/code.py,sha256=YP100uHF6BpMyzVh_lgv32GUFLkMu88LXyoSIzv06Wg,18799
37
37
  praisonai/ui/context.py,sha256=oWO2I_WBZb7kZnuXItf18EJX0ZQv-1nAd8rxhwhuuDU,11871
38
38
  praisonai/ui/public/fantasy.svg,sha256=4Gs3kIOux-pjGtw6ogI_rv5_viVJxnE5gRwGilsSg0o,1553
39
39
  praisonai/ui/public/game.svg,sha256=y2QMaA01m8XzuDjTOBWzupOC3-TpnUl9ah89mIhviUw,2406
@@ -45,10 +45,10 @@ praisonai/ui/realtime.py,sha256=qpgcGA8CIUfYuSXtQM0zSlxktFtUZXsryn0Tru-R5wU,1530
45
45
  praisonai/ui/realtimeclient/__init__.py,sha256=zA2xa7rBUSw77wFkndJMQNNPqdH6ywQ3uf4WSYHjNfs,27513
46
46
  praisonai/ui/realtimeclient/realtimedocs.txt,sha256=hmgd8Uwy2SkjSndyyF_-ZOaNxiyHwGaQLGc67DvV-sI,26395
47
47
  praisonai/ui/realtimeclient/tools.py,sha256=IJOYwVOBW5Ocn5_iV9pFkmSKR3WU3YpX3kwF0I3jikQ,7855
48
- praisonai/ui/sql_alchemy.py,sha256=kf025P_37C505YDDJZ-dPSmN_d62J2DCrkxbDAzXyrM,29884
48
+ praisonai/ui/sql_alchemy.py,sha256=gFqeq70R7FyZyYnE_J0SzdhviVqzFJgplNG-2a0JH8I,29970
49
49
  praisonai/version.py,sha256=ugyuFliEqtAwQmH4sTlc16YXKYbFWDmfyk87fErB8-8,21
50
- praisonai-1.0.2.dist-info/LICENSE,sha256=kqvFysVlnFxYOu0HxCe2HlmZmJtdmNGOxWRRkT9TsWc,1035
51
- praisonai-1.0.2.dist-info/METADATA,sha256=UhXSbFJhl1lnF2lnQ9Lp0n685ayF9JwG6RNirW_OS1M,17085
52
- praisonai-1.0.2.dist-info/WHEEL,sha256=Ie8mbC-etDUh6aDhzdvvvp_A-4mQQX7whlOFBnSJhcE,110
53
- praisonai-1.0.2.dist-info/entry_points.txt,sha256=I_xc6a6MNTTfLxYmAxe0rgey0G-_hbY07oFW-ZDnkw4,135
54
- praisonai-1.0.2.dist-info/RECORD,,
50
+ praisonai-1.0.3.dist-info/LICENSE,sha256=kqvFysVlnFxYOu0HxCe2HlmZmJtdmNGOxWRRkT9TsWc,1035
51
+ praisonai-1.0.3.dist-info/METADATA,sha256=-rar2DKEWc82gJFeJjxCO8rix62xK6M1PjnHj1lHwvk,17085
52
+ praisonai-1.0.3.dist-info/WHEEL,sha256=Ie8mbC-etDUh6aDhzdvvvp_A-4mQQX7whlOFBnSJhcE,110
53
+ praisonai-1.0.3.dist-info/entry_points.txt,sha256=I_xc6a6MNTTfLxYmAxe0rgey0G-_hbY07oFW-ZDnkw4,135
54
+ praisonai-1.0.3.dist-info/RECORD,,