PraisonAI 0.0.41__py3-none-any.whl → 0.0.43__py3-none-any.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/agents_generator.py +10 -0
- praisonai/cli.py +28 -1
- praisonai/deploy.py +1 -1
- praisonai/ui/chat.py +308 -0
- {praisonai-0.0.41.dist-info → praisonai-0.0.43.dist-info}/METADATA +15 -94
- {praisonai-0.0.41.dist-info → praisonai-0.0.43.dist-info}/RECORD +9 -8
- {praisonai-0.0.41.dist-info → praisonai-0.0.43.dist-info}/LICENSE +0 -0
- {praisonai-0.0.41.dist-info → praisonai-0.0.43.dist-info}/WHEEL +0 -0
- {praisonai-0.0.41.dist-info → praisonai-0.0.43.dist-info}/entry_points.txt +0 -0
praisonai/agents_generator.py
CHANGED
|
@@ -279,6 +279,9 @@ class AgentsGenerator:
|
|
|
279
279
|
else: # framework=crewai
|
|
280
280
|
if agentops_exists:
|
|
281
281
|
agentops.init(os.environ.get("AGENTOPS_API_KEY"), tags=["crewai"])
|
|
282
|
+
|
|
283
|
+
tasks_dict = {}
|
|
284
|
+
|
|
282
285
|
for role, details in config['roles'].items():
|
|
283
286
|
role_filled = details['role'].format(topic=topic)
|
|
284
287
|
goal_filled = details['goal'].format(topic=topic)
|
|
@@ -352,7 +355,14 @@ class AgentsGenerator:
|
|
|
352
355
|
task.callback = self.task_callback
|
|
353
356
|
|
|
354
357
|
tasks.append(task)
|
|
358
|
+
tasks_dict[task_name] = task
|
|
355
359
|
|
|
360
|
+
for role, details in config['roles'].items():
|
|
361
|
+
for task_name, task_details in details.get('tasks', {}).items():
|
|
362
|
+
task = tasks_dict[task_name]
|
|
363
|
+
context_tasks = [tasks_dict[ctx] for ctx in task_details.get('context', []) if ctx in tasks_dict]
|
|
364
|
+
task.context = context_tasks
|
|
365
|
+
|
|
356
366
|
crew = Crew(
|
|
357
367
|
agents=list(agents.values()),
|
|
358
368
|
tasks=tasks,
|
praisonai/cli.py
CHANGED
|
@@ -84,6 +84,11 @@ class PraisonAI:
|
|
|
84
84
|
deployer = CloudDeployer()
|
|
85
85
|
deployer.run_commands()
|
|
86
86
|
return
|
|
87
|
+
|
|
88
|
+
if getattr(args, 'chat', False):
|
|
89
|
+
self.create_chainlit_chat_interface()
|
|
90
|
+
return
|
|
91
|
+
|
|
87
92
|
invocation_cmd = "praisonai"
|
|
88
93
|
version_string = f"PraisonAI version {__version__}"
|
|
89
94
|
|
|
@@ -163,8 +168,30 @@ class PraisonAI:
|
|
|
163
168
|
args.agent_file = 'agents.yaml'
|
|
164
169
|
if args.agent_file == 'ui':
|
|
165
170
|
args.ui = 'chainlit'
|
|
171
|
+
if args.agent_file == 'chat':
|
|
172
|
+
args.ui = 'chainlit'
|
|
173
|
+
args.chat = True
|
|
166
174
|
|
|
167
175
|
return args
|
|
176
|
+
|
|
177
|
+
def create_chainlit_chat_interface(self):
|
|
178
|
+
"""
|
|
179
|
+
Create a Chainlit interface for the chat application.
|
|
180
|
+
|
|
181
|
+
This function sets up a Chainlit application that listens for messages.
|
|
182
|
+
When a message is received, it runs PraisonAI with the provided message as the topic.
|
|
183
|
+
The generated agents are then used to perform tasks.
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
None: This function does not return any value. It starts the Chainlit application.
|
|
187
|
+
"""
|
|
188
|
+
if CHAINLIT_AVAILABLE:
|
|
189
|
+
import praisonai
|
|
190
|
+
os.environ["CHAINLIT_PORT"] = "8084"
|
|
191
|
+
chat_ui_path = os.path.join(os.path.dirname(praisonai.__file__), 'ui', 'chat.py')
|
|
192
|
+
chainlit_run([chat_ui_path])
|
|
193
|
+
else:
|
|
194
|
+
print("ERROR: Chat UI is not installed. Please install it with 'pip install \"praisonai\[chat]\"' to use the chat UI.")
|
|
168
195
|
|
|
169
196
|
def create_gradio_interface(self):
|
|
170
197
|
"""
|
|
@@ -247,7 +274,7 @@ class PraisonAI:
|
|
|
247
274
|
chainlit_ui_path = os.path.join(os.path.dirname(praisonai.__file__), 'chainlit_ui.py')
|
|
248
275
|
chainlit_run([chainlit_ui_path])
|
|
249
276
|
else:
|
|
250
|
-
print("ERROR: Chainlit is not installed. Please install it with 'pip install
|
|
277
|
+
print("ERROR: Chainlit is not installed. Please install it with 'pip install \"praisonai\[ui]\"' to use the UI.")
|
|
251
278
|
|
|
252
279
|
if __name__ == "__main__":
|
|
253
280
|
praison_ai = PraisonAI()
|
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==0.0.
|
|
59
|
+
file.write("RUN pip install flask praisonai==0.0.43 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
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import chainlit as cl
|
|
2
|
+
from chainlit.input_widget import TextInput
|
|
3
|
+
from chainlit.types import ThreadDict
|
|
4
|
+
from litellm import acompletion
|
|
5
|
+
import os
|
|
6
|
+
import sqlite3
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from typing import Dict, List, Optional
|
|
9
|
+
from dotenv import load_dotenv
|
|
10
|
+
load_dotenv()
|
|
11
|
+
import chainlit.data as cl_data
|
|
12
|
+
from chainlit.step import StepDict
|
|
13
|
+
from literalai.helper import utc_now
|
|
14
|
+
|
|
15
|
+
now = utc_now()
|
|
16
|
+
|
|
17
|
+
create_step_counter = 0
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
|
|
21
|
+
DB_PATH = "threads.db"
|
|
22
|
+
|
|
23
|
+
def initialize_db():
|
|
24
|
+
conn = sqlite3.connect(DB_PATH)
|
|
25
|
+
cursor = conn.cursor()
|
|
26
|
+
cursor.execute('''
|
|
27
|
+
CREATE TABLE IF NOT EXISTS threads (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
name TEXT,
|
|
30
|
+
createdAt TEXT,
|
|
31
|
+
userId TEXT,
|
|
32
|
+
userIdentifier TEXT
|
|
33
|
+
)
|
|
34
|
+
''')
|
|
35
|
+
cursor.execute('''
|
|
36
|
+
CREATE TABLE IF NOT EXISTS steps (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
threadId TEXT,
|
|
39
|
+
name TEXT,
|
|
40
|
+
createdAt TEXT,
|
|
41
|
+
type TEXT,
|
|
42
|
+
output TEXT,
|
|
43
|
+
FOREIGN KEY (threadId) REFERENCES threads (id)
|
|
44
|
+
)
|
|
45
|
+
''')
|
|
46
|
+
conn.commit()
|
|
47
|
+
conn.close()
|
|
48
|
+
|
|
49
|
+
def save_thread_to_db(thread):
|
|
50
|
+
conn = sqlite3.connect(DB_PATH)
|
|
51
|
+
cursor = conn.cursor()
|
|
52
|
+
cursor.execute('''
|
|
53
|
+
INSERT OR REPLACE INTO threads (id, name, createdAt, userId, userIdentifier)
|
|
54
|
+
VALUES (?, ?, ?, ?, ?)
|
|
55
|
+
''', (thread['id'], thread['name'], thread['createdAt'], thread['userId'], thread['userIdentifier']))
|
|
56
|
+
|
|
57
|
+
# No steps to save as steps are empty in the provided thread data
|
|
58
|
+
conn.commit()
|
|
59
|
+
conn.close()
|
|
60
|
+
print("saved")
|
|
61
|
+
|
|
62
|
+
def update_thread_in_db(thread):
|
|
63
|
+
conn = sqlite3.connect(DB_PATH)
|
|
64
|
+
cursor = conn.cursor()
|
|
65
|
+
|
|
66
|
+
# Insert or update the thread
|
|
67
|
+
cursor.execute('''
|
|
68
|
+
INSERT OR REPLACE INTO threads (id, name, createdAt, userId, userIdentifier)
|
|
69
|
+
VALUES (?, ?, ?, ?, ?)
|
|
70
|
+
''', (thread['id'], thread['name'], thread['createdAt'], thread['userId'], thread['userIdentifier']))
|
|
71
|
+
|
|
72
|
+
# Fetch message_history from metadata
|
|
73
|
+
message_history = thread['metadata']['message_history']
|
|
74
|
+
|
|
75
|
+
# Ensure user messages come first followed by assistant messages
|
|
76
|
+
user_messages = [msg for msg in message_history if msg['role'] == 'user']
|
|
77
|
+
assistant_messages = [msg for msg in message_history if msg['role'] == 'assistant']
|
|
78
|
+
ordered_steps = [val for pair in zip(user_messages, assistant_messages) for val in pair]
|
|
79
|
+
|
|
80
|
+
# Generate steps from ordered message_history
|
|
81
|
+
steps = []
|
|
82
|
+
for idx, message in enumerate(ordered_steps):
|
|
83
|
+
step_id = f"{thread['id']}-step-{idx}"
|
|
84
|
+
step_type = 'user_message' if message['role'] == 'user' else 'assistant_message'
|
|
85
|
+
step_name = 'user' if message['role'] == 'user' else 'assistant'
|
|
86
|
+
created_at = message.get('createdAt', thread['createdAt']) # Use thread's createdAt if no timestamp in message
|
|
87
|
+
steps.append({
|
|
88
|
+
'id': step_id,
|
|
89
|
+
'threadId': thread['id'],
|
|
90
|
+
'name': step_name,
|
|
91
|
+
'createdAt': created_at,
|
|
92
|
+
'type': step_type,
|
|
93
|
+
'output': message['content']
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
# Insert all steps into the database
|
|
97
|
+
for step in steps:
|
|
98
|
+
cursor.execute('''
|
|
99
|
+
INSERT OR REPLACE INTO steps (id, threadId, name, createdAt, type, output)
|
|
100
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
101
|
+
''', (step['id'], step['threadId'], step['name'], step['createdAt'], step['type'], step['output']))
|
|
102
|
+
|
|
103
|
+
conn.commit()
|
|
104
|
+
conn.close()
|
|
105
|
+
|
|
106
|
+
def load_threads_from_db():
|
|
107
|
+
conn = sqlite3.connect(DB_PATH)
|
|
108
|
+
cursor = conn.cursor()
|
|
109
|
+
cursor.execute('SELECT * FROM threads')
|
|
110
|
+
thread_rows = cursor.fetchall()
|
|
111
|
+
threads = []
|
|
112
|
+
for thread_row in thread_rows:
|
|
113
|
+
cursor.execute('SELECT * FROM steps WHERE threadId = ?', (thread_row[0],))
|
|
114
|
+
step_rows = cursor.fetchall()
|
|
115
|
+
steps = []
|
|
116
|
+
for step_row in step_rows:
|
|
117
|
+
steps.append({
|
|
118
|
+
"id": step_row[0],
|
|
119
|
+
"threadId": step_row[1],
|
|
120
|
+
"name": step_row[2],
|
|
121
|
+
"createdAt": step_row[3],
|
|
122
|
+
"type": step_row[4],
|
|
123
|
+
"output": step_row[5]
|
|
124
|
+
})
|
|
125
|
+
threads.append({
|
|
126
|
+
"id": thread_row[0],
|
|
127
|
+
"name": thread_row[1],
|
|
128
|
+
"createdAt": thread_row[2],
|
|
129
|
+
"userId": thread_row[3],
|
|
130
|
+
"userIdentifier": thread_row[4],
|
|
131
|
+
"steps": steps
|
|
132
|
+
})
|
|
133
|
+
conn.close()
|
|
134
|
+
return threads
|
|
135
|
+
|
|
136
|
+
# Initialize the database
|
|
137
|
+
initialize_db()
|
|
138
|
+
thread_history = load_threads_from_db()
|
|
139
|
+
|
|
140
|
+
deleted_thread_ids = [] # type: List[str]
|
|
141
|
+
|
|
142
|
+
class TestDataLayer(cl_data.BaseDataLayer):
|
|
143
|
+
async def get_user(self, identifier: str):
|
|
144
|
+
return cl.PersistedUser(id="test", createdAt=now, identifier=identifier)
|
|
145
|
+
|
|
146
|
+
async def create_user(self, user: cl.User):
|
|
147
|
+
return cl.PersistedUser(id="test", createdAt=now, identifier=user.identifier)
|
|
148
|
+
|
|
149
|
+
async def update_thread(
|
|
150
|
+
self,
|
|
151
|
+
thread_id: str,
|
|
152
|
+
name: Optional[str] = None,
|
|
153
|
+
user_id: Optional[str] = None,
|
|
154
|
+
metadata: Optional[Dict] = None,
|
|
155
|
+
tags: Optional[List[str]] = None,
|
|
156
|
+
):
|
|
157
|
+
thread = next((t for t in thread_history if t["id"] == thread_id), None)
|
|
158
|
+
if thread:
|
|
159
|
+
if name:
|
|
160
|
+
thread["name"] = name
|
|
161
|
+
if metadata:
|
|
162
|
+
thread["metadata"] = metadata
|
|
163
|
+
if tags:
|
|
164
|
+
thread["tags"] = tags
|
|
165
|
+
update_thread_in_db(thread)
|
|
166
|
+
cl.user_session.set("message_history", thread['metadata']['message_history'])
|
|
167
|
+
cl.user_session.set("thread_id", thread["id"])
|
|
168
|
+
print("Updated")
|
|
169
|
+
|
|
170
|
+
else:
|
|
171
|
+
thread_history.append(
|
|
172
|
+
{
|
|
173
|
+
"id": thread_id,
|
|
174
|
+
"name": name,
|
|
175
|
+
"metadata": metadata,
|
|
176
|
+
"tags": tags,
|
|
177
|
+
"createdAt": utc_now(),
|
|
178
|
+
"userId": user_id,
|
|
179
|
+
"userIdentifier": "admin",
|
|
180
|
+
"steps": [],
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
thread = {
|
|
184
|
+
"id": thread_id,
|
|
185
|
+
"name": name,
|
|
186
|
+
"metadata": metadata,
|
|
187
|
+
"tags": tags,
|
|
188
|
+
"createdAt": utc_now(),
|
|
189
|
+
"userId": user_id,
|
|
190
|
+
"userIdentifier": "admin",
|
|
191
|
+
"steps": [],
|
|
192
|
+
}
|
|
193
|
+
save_thread_to_db(thread)
|
|
194
|
+
|
|
195
|
+
@cl_data.queue_until_user_message()
|
|
196
|
+
async def create_step(self, step_dict: StepDict):
|
|
197
|
+
global create_step_counter
|
|
198
|
+
create_step_counter += 1
|
|
199
|
+
|
|
200
|
+
thread = next(
|
|
201
|
+
(t for t in thread_history if t["id"] == step_dict.get("threadId")), None
|
|
202
|
+
)
|
|
203
|
+
if thread:
|
|
204
|
+
thread["steps"].append(step_dict)
|
|
205
|
+
|
|
206
|
+
async def get_thread_author(self, thread_id: str):
|
|
207
|
+
return "admin"
|
|
208
|
+
|
|
209
|
+
async def list_threads(
|
|
210
|
+
self, pagination: cl_data.Pagination, filters: cl_data.ThreadFilter
|
|
211
|
+
) -> cl_data.PaginatedResponse[cl_data.ThreadDict]:
|
|
212
|
+
return cl_data.PaginatedResponse(
|
|
213
|
+
data=[t for t in thread_history if t["id"] not in deleted_thread_ids],
|
|
214
|
+
pageInfo=cl_data.PageInfo(
|
|
215
|
+
hasNextPage=False, startCursor=None, endCursor=None
|
|
216
|
+
),
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
async def get_thread(self, thread_id: str):
|
|
220
|
+
thread_history = load_threads_from_db()
|
|
221
|
+
return next((t for t in thread_history if t["id"] == thread_id), None)
|
|
222
|
+
|
|
223
|
+
async def delete_thread(self, thread_id: str):
|
|
224
|
+
deleted_thread_ids.append(thread_id)
|
|
225
|
+
|
|
226
|
+
cl_data._data_layer = TestDataLayer()
|
|
227
|
+
|
|
228
|
+
@cl.on_chat_start
|
|
229
|
+
async def start():
|
|
230
|
+
initialize_db()
|
|
231
|
+
await cl.ChatSettings(
|
|
232
|
+
[
|
|
233
|
+
TextInput(
|
|
234
|
+
id="model_name",
|
|
235
|
+
label="Enter the Model Name",
|
|
236
|
+
placeholder="e.g., gpt-3.5-turbo"
|
|
237
|
+
)
|
|
238
|
+
]
|
|
239
|
+
).send()
|
|
240
|
+
|
|
241
|
+
@cl.on_settings_update
|
|
242
|
+
async def setup_agent(settings):
|
|
243
|
+
model_name = settings["model_name"]
|
|
244
|
+
cl.user_session.set("model_name", model_name)
|
|
245
|
+
|
|
246
|
+
@cl.on_message
|
|
247
|
+
async def main(message: cl.Message):
|
|
248
|
+
model_name = cl.user_session.get("model_name", "gpt-3.5-turbo")
|
|
249
|
+
message_history = cl.user_session.get("message_history", [])
|
|
250
|
+
message_history.append({"role": "user", "content": message.content})
|
|
251
|
+
|
|
252
|
+
msg = cl.Message(content="")
|
|
253
|
+
await msg.send()
|
|
254
|
+
|
|
255
|
+
response = await acompletion(
|
|
256
|
+
model=model_name,
|
|
257
|
+
messages=message_history,
|
|
258
|
+
stream=True,
|
|
259
|
+
temperature=0.7,
|
|
260
|
+
max_tokens=500,
|
|
261
|
+
top_p=1
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
full_response = ""
|
|
265
|
+
async for part in response:
|
|
266
|
+
if token := part['choices'][0]['delta']['content']:
|
|
267
|
+
await msg.stream_token(token)
|
|
268
|
+
full_response += token
|
|
269
|
+
print(full_response)
|
|
270
|
+
message_history.append({"role": "assistant", "content": full_response})
|
|
271
|
+
print(message_history)
|
|
272
|
+
cl.user_session.set("message_history", message_history)
|
|
273
|
+
await msg.update()
|
|
274
|
+
|
|
275
|
+
username = os.getenv("CHAINLIT_USERNAME", "admin") # Default to "admin" if not found
|
|
276
|
+
password = os.getenv("CHAINLIT_PASSWORD", "admin") # Default to "admin" if not found
|
|
277
|
+
|
|
278
|
+
@cl.password_auth_callback
|
|
279
|
+
def auth_callback(username: str, password: str):
|
|
280
|
+
if (username, password) == (username, password):
|
|
281
|
+
return cl.User(
|
|
282
|
+
identifier=username, metadata={"role": "ADMIN", "provider": "credentials"}
|
|
283
|
+
)
|
|
284
|
+
else:
|
|
285
|
+
return None
|
|
286
|
+
|
|
287
|
+
async def send_count():
|
|
288
|
+
await cl.Message(
|
|
289
|
+
f"Create step counter: {create_step_counter}", disable_feedback=True
|
|
290
|
+
).send()
|
|
291
|
+
|
|
292
|
+
@cl.on_chat_resume
|
|
293
|
+
async def on_chat_resume(thread: cl_data.ThreadDict):
|
|
294
|
+
thread_id = thread["id"]
|
|
295
|
+
cl.user_session.set("thread_id", thread["id"])
|
|
296
|
+
message_history = cl.user_session.get("message_history", [])
|
|
297
|
+
steps = thread["steps"]
|
|
298
|
+
|
|
299
|
+
for message in steps:
|
|
300
|
+
msg_type = message.get("type")
|
|
301
|
+
if msg_type == "user_message":
|
|
302
|
+
message_history.append({"role": "user", "content": message.get("output", "")})
|
|
303
|
+
elif msg_type == "assistant_message":
|
|
304
|
+
message_history.append({"role": "assistant", "content": message.get("output", "")})
|
|
305
|
+
else:
|
|
306
|
+
print(f"Message without type: {message}")
|
|
307
|
+
|
|
308
|
+
cl.user_session.set("message_history", message_history)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.43
|
|
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
|
|
@@ -11,13 +11,14 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
11
11
|
Provides-Extra: agentops
|
|
12
12
|
Provides-Extra: anthropic
|
|
13
13
|
Provides-Extra: api
|
|
14
|
+
Provides-Extra: chat
|
|
14
15
|
Provides-Extra: cohere
|
|
15
16
|
Provides-Extra: google
|
|
16
17
|
Provides-Extra: gradio
|
|
17
18
|
Provides-Extra: openai
|
|
18
19
|
Provides-Extra: ui
|
|
19
20
|
Requires-Dist: agentops (>=0.2.6) ; extra == "agentops"
|
|
20
|
-
Requires-Dist: chainlit (>=1.1.301,<2.0.0) ; extra == "ui"
|
|
21
|
+
Requires-Dist: chainlit (>=1.1.301,<2.0.0) ; extra == "ui" or extra == "chat"
|
|
21
22
|
Requires-Dist: crewai (>=0.32.0)
|
|
22
23
|
Requires-Dist: flask (>=3.0.0) ; extra == "api"
|
|
23
24
|
Requires-Dist: gradio (>=4.26.0) ; extra == "gradio"
|
|
@@ -25,6 +26,7 @@ Requires-Dist: langchain-anthropic (>=0.1.13) ; extra == "anthropic"
|
|
|
25
26
|
Requires-Dist: langchain-cohere (>=0.1.4) ; extra == "cohere"
|
|
26
27
|
Requires-Dist: langchain-google-genai (>=1.0.4) ; extra == "google"
|
|
27
28
|
Requires-Dist: langchain-openai (>=0.1.7) ; extra == "openai"
|
|
29
|
+
Requires-Dist: litellm (>=1.41.8) ; extra == "chat"
|
|
28
30
|
Requires-Dist: markdown (>=3.5)
|
|
29
31
|
Requires-Dist: praisonai-tools (>=0.0.7)
|
|
30
32
|
Requires-Dist: pyautogen (>=0.2.19)
|
|
@@ -34,8 +36,19 @@ Project-URL: Homepage, https://docs.praison.ai
|
|
|
34
36
|
Project-URL: Repository, https://github.com/mervinpraison/PraisonAI
|
|
35
37
|
Description-Content-Type: text/markdown
|
|
36
38
|
|
|
39
|
+
<p align="center">
|
|
40
|
+
<picture>
|
|
41
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/images/praisonai-logo-large.png">
|
|
42
|
+
<source media="(prefers-color-scheme: light)" srcset="docs/images/praisonai-logo-black-large.png">
|
|
43
|
+
<img alt="PraisonAI Logo" src="docs/images/praisonai-logo-black-large.png">
|
|
44
|
+
</picture>
|
|
45
|
+
</p>
|
|
46
|
+
<div align="center">
|
|
47
|
+
|
|
37
48
|
# Praison AI
|
|
38
49
|
|
|
50
|
+
</div>
|
|
51
|
+
|
|
39
52
|
Praison AI, leveraging both AutoGen and CrewAI or any other agent framework, represents a low-code, centralised framework designed to simplify the creation and orchestration of multi-agent systems for various LLM applications, emphasizing ease of use, customization, and human-agent interaction.
|
|
40
53
|
|
|
41
54
|
## TL;DR
|
|
@@ -46,14 +59,6 @@ praisonai --init create a movie script about dog in moon
|
|
|
46
59
|
praisonai
|
|
47
60
|
```
|
|
48
61
|
|
|
49
|
-
<p align="center">
|
|
50
|
-
<picture>
|
|
51
|
-
<source media="(prefers-color-scheme: dark)" srcset="docs/images/praisonai-logo-large.png">
|
|
52
|
-
<source media="(prefers-color-scheme: light)" srcset="docs/images/praisonai-logo-black-large.png">
|
|
53
|
-
<img alt="PraisonAI Logo" src="docs/images/praisonai-logo-black-large.png">
|
|
54
|
-
</picture>
|
|
55
|
-
</p>
|
|
56
|
-
|
|
57
62
|
## Installation
|
|
58
63
|
|
|
59
64
|
```bash
|
|
@@ -183,12 +188,6 @@ roles:
|
|
|
183
188
|
- InternetSearchTool
|
|
184
189
|
```
|
|
185
190
|
|
|
186
|
-
## Test
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
python -m unittest tests.test
|
|
190
|
-
```
|
|
191
|
-
|
|
192
191
|
## Agents Playbook
|
|
193
192
|
|
|
194
193
|
### Simple Playbook Example
|
|
@@ -207,49 +206,6 @@ roles:
|
|
|
207
206
|
expected_output: 'Complete script ready for production.'
|
|
208
207
|
```
|
|
209
208
|
|
|
210
|
-
### Detailed Playbook Example
|
|
211
|
-
|
|
212
|
-
```yaml
|
|
213
|
-
framework: crewai
|
|
214
|
-
topic: Artificial Intelligence
|
|
215
|
-
roles:
|
|
216
|
-
movie_concept_creator:
|
|
217
|
-
backstory: 'Creative thinker with a deep understanding of cinematic storytelling,
|
|
218
|
-
capable of using AI-generated storylines to create unique and compelling movie
|
|
219
|
-
ideas.'
|
|
220
|
-
goal: Generate engaging movie concepts using AI storylines
|
|
221
|
-
role: Movie Concept Creator
|
|
222
|
-
tasks:
|
|
223
|
-
movie_concept_development:
|
|
224
|
-
description: 'Develop movie concepts from AI-generated storylines, ensuring
|
|
225
|
-
they are engaging and have strong narrative arcs.'
|
|
226
|
-
expected_output: 'Well-structured movie concept document with character
|
|
227
|
-
bios, settings, and plot outlines.'
|
|
228
|
-
screenwriter:
|
|
229
|
-
backstory: 'Expert in writing engaging dialogue and script structure, able to
|
|
230
|
-
turn movie concepts into production-ready scripts.'
|
|
231
|
-
goal: Write compelling scripts based on movie concepts
|
|
232
|
-
role: Screenwriter
|
|
233
|
-
tasks:
|
|
234
|
-
scriptwriting_task:
|
|
235
|
-
description: 'Turn movie concepts into polished scripts with well-developed
|
|
236
|
-
characters, strong dialogue, and effective scene transitions.'
|
|
237
|
-
expected_output: 'Production-ready script with a beginning, middle, and
|
|
238
|
-
end, along with character development and engaging dialogues.'
|
|
239
|
-
editor:
|
|
240
|
-
backstory: 'Adept at identifying inconsistencies, improving language usage,
|
|
241
|
-
and maintaining the overall flow of the script.'
|
|
242
|
-
goal: Refine the scripts and ensure continuity of the movie storyline
|
|
243
|
-
role: Editor
|
|
244
|
-
tasks:
|
|
245
|
-
editing_task:
|
|
246
|
-
description: 'Review, edit, and refine the scripts to ensure they are cohesive
|
|
247
|
-
and follow a well-structured narrative.'
|
|
248
|
-
expected_output: 'A polished final draft of the script with no inconsistencies,
|
|
249
|
-
strong character development, and effective dialogue.'
|
|
250
|
-
dependencies: []
|
|
251
|
-
```
|
|
252
|
-
|
|
253
209
|
## Include praisonai package in your project
|
|
254
210
|
|
|
255
211
|
```python
|
|
@@ -280,41 +236,6 @@ if __name__ == "__main__":
|
|
|
280
236
|
auto()
|
|
281
237
|
```
|
|
282
238
|
|
|
283
|
-
## Include CrewAI Tools
|
|
284
|
-
|
|
285
|
-
```
|
|
286
|
-
pip install "praisonai[crewai-tools]"
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
## Deploy
|
|
290
|
-
|
|
291
|
-
```bash
|
|
292
|
-
gcloud init
|
|
293
|
-
gcloud services enable run.googleapis.com
|
|
294
|
-
gcloud services enable containerregistry.googleapis.com
|
|
295
|
-
gcloud services enable cloudbuild.googleapis.com
|
|
296
|
-
|
|
297
|
-
export OPENAI_MODEL_NAME="gpt-4o"
|
|
298
|
-
export OPENAI_API_KEY="Enter your API key"
|
|
299
|
-
export OPENAI_API_BASE="https://api.openai.com/v1"
|
|
300
|
-
|
|
301
|
-
yes | gcloud auth configure-docker us-central1-docker.pkg.dev
|
|
302
|
-
gcloud artifacts repositories create praisonai-repository --repository-format=docker --location=us-central1
|
|
303
|
-
|
|
304
|
-
PROJECT_ID=$(gcloud config get-value project)
|
|
305
|
-
TAG="latest"
|
|
306
|
-
docker build --platform linux/amd64 -t gcr.io/${PROJECT_ID}/praisonai-app:${TAG} .
|
|
307
|
-
docker tag gcr.io/${PROJECT_ID}/praisonai-app:${TAG} us-central1-docker.pkg.dev/${PROJECT_ID}/praisonai-repository/praisonai-app:${TAG}
|
|
308
|
-
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/praisonai-repository/praisonai-app:${TAG}
|
|
309
|
-
|
|
310
|
-
gcloud run deploy praisonai-service \
|
|
311
|
-
--image us-central1-docker.pkg.dev/${PROJECT_ID}/praisonai-repository/praisonai-app:${TAG} \
|
|
312
|
-
--platform managed \
|
|
313
|
-
--region us-central1 \
|
|
314
|
-
--allow-unauthenticated \
|
|
315
|
-
--set-env-vars OPENAI_MODEL_NAME=${OPENAI_MODEL_NAME},OPENAI_API_KEY=${OPENAI_API_KEY},OPENAI_API_BASE=${OPENAI_API_BASE}
|
|
316
|
-
```
|
|
317
|
-
|
|
318
239
|
### Commands to Install Dependencies:
|
|
319
240
|
|
|
320
241
|
1. **Install all dependencies, including dev dependencies:**
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
praisonai/__init__.py,sha256=JrgyPlzZfLlozoW7SHZ1nVJ63rLPR3ki2k5ZPywYrnI,175
|
|
2
2
|
praisonai/__main__.py,sha256=MVgsjMThjBexHt4nhd760JCqvP4x0IQcwo8kULOK4FQ,144
|
|
3
|
-
praisonai/agents_generator.py,sha256=
|
|
3
|
+
praisonai/agents_generator.py,sha256=8d1WRbubvEkBrW1HZ7_xnGyqgJi0yxmXa3MgTIqef1c,19127
|
|
4
4
|
praisonai/auto.py,sha256=9spTXqj47Hmmqv5QHRYE_RzSVHH_KoPbaZjskUj2UcE,7895
|
|
5
5
|
praisonai/chainlit_ui.py,sha256=bNR7s509lp0I9JlJNvwCZRUZosC64qdvlFCt8NmFamQ,12216
|
|
6
|
-
praisonai/cli.py,sha256=
|
|
7
|
-
praisonai/deploy.py,sha256=
|
|
6
|
+
praisonai/cli.py,sha256=RAPXxz6FxEG8Ek7XVRrzZ0FE1fwNHRd-prOjVjJjd0k,12180
|
|
7
|
+
praisonai/deploy.py,sha256=E-K35liJeVRHhJtEpE9_41IFg0lT4dr1f2amobYxpws,6031
|
|
8
8
|
praisonai/inbuilt_tools/__init__.py,sha256=mUKnbL6Gram9c9f2m8wJwEzURBLmPEOcHzwySBH89YA,74
|
|
9
9
|
praisonai/inbuilt_tools/autogen_tools.py,sha256=svYkM2N7DVFvbiwgoAS7U_MqTOD8rHf8VD3BaFUV5_Y,14907
|
|
10
10
|
praisonai/inc/__init__.py,sha256=sPDlYBBwdk0VlWzaaM_lG0_LD07lS2HRGvPdxXJFiYg,62
|
|
@@ -14,9 +14,10 @@ praisonai/public/game.svg,sha256=y2QMaA01m8XzuDjTOBWzupOC3-TpnUl9ah89mIhviUw,240
|
|
|
14
14
|
praisonai/public/movie.svg,sha256=aJ2EQ8vXZusVsF2SeuAVxP4RFJzQ14T26ejrGYdBgzk,1289
|
|
15
15
|
praisonai/public/thriller.svg,sha256=2dYY72EcgbEyTxS4QzjAm37Y4srtPWEW4vCMFki98ZI,3163
|
|
16
16
|
praisonai/test.py,sha256=RZKq3UEFb6AnFFiHER3zBXfNmlteSLBlrTmOvnpnZLo,4092
|
|
17
|
+
praisonai/ui/chat.py,sha256=kyfWIIpVdb6D54SnoMPw3MQp0xk6sppgTzT-Xflz9Tw,10149
|
|
17
18
|
praisonai/version.py,sha256=ugyuFliEqtAwQmH4sTlc16YXKYbFWDmfyk87fErB8-8,21
|
|
18
|
-
praisonai-0.0.
|
|
19
|
-
praisonai-0.0.
|
|
20
|
-
praisonai-0.0.
|
|
21
|
-
praisonai-0.0.
|
|
22
|
-
praisonai-0.0.
|
|
19
|
+
praisonai-0.0.43.dist-info/LICENSE,sha256=kqvFysVlnFxYOu0HxCe2HlmZmJtdmNGOxWRRkT9TsWc,1035
|
|
20
|
+
praisonai-0.0.43.dist-info/METADATA,sha256=UW42K2ecDGhjfNlqV5rd_Xh6xYkQqLSwxMZzRgh6zVY,8088
|
|
21
|
+
praisonai-0.0.43.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
22
|
+
praisonai-0.0.43.dist-info/entry_points.txt,sha256=Qg41eW3A1-dvdV5tF7LqChfYof8Rihk2rN1fiEE3vnk,53
|
|
23
|
+
praisonai-0.0.43.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|