praisonaiagents 0.0.21__py3-none-any.whl → 0.0.23__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.
- praisonaiagents/agent/agent.py +27 -36
- praisonaiagents/agents/agents.py +23 -7
- {praisonaiagents-0.0.21.dist-info → praisonaiagents-0.0.23.dist-info}/METADATA +1 -1
- {praisonaiagents-0.0.21.dist-info → praisonaiagents-0.0.23.dist-info}/RECORD +6 -6
- {praisonaiagents-0.0.21.dist-info → praisonaiagents-0.0.23.dist-info}/WHEEL +0 -0
- {praisonaiagents-0.0.21.dist-info → praisonaiagents-0.0.23.dist-info}/top_level.txt +0 -0
praisonaiagents/agent/agent.py
CHANGED
@@ -140,7 +140,7 @@ class Agent:
|
|
140
140
|
goal: Optional[str] = None,
|
141
141
|
backstory: Optional[str] = None,
|
142
142
|
instructions: Optional[str] = None,
|
143
|
-
llm: Optional[Union[str, Any]] =
|
143
|
+
llm: Optional[Union[str, Any]] = None,
|
144
144
|
tools: Optional[List[Any]] = None,
|
145
145
|
function_calling_llm: Optional[Any] = None,
|
146
146
|
max_iter: int = 20,
|
@@ -189,7 +189,8 @@ class Agent:
|
|
189
189
|
self.self_reflect = True if self_reflect is None else self_reflect
|
190
190
|
|
191
191
|
self.instructions = instructions
|
192
|
-
|
192
|
+
# Check for model name in environment variable if not provided
|
193
|
+
self.llm = llm or os.getenv('OPENAI_MODEL_NAME', 'gpt-4o')
|
193
194
|
self.tools = tools if tools else [] # Store original tools
|
194
195
|
self.function_calling_llm = function_calling_llm
|
195
196
|
self.max_iter = max_iter
|
@@ -214,7 +215,8 @@ class Agent:
|
|
214
215
|
self.markdown = markdown
|
215
216
|
self.max_reflect = max_reflect
|
216
217
|
self.min_reflect = min_reflect
|
217
|
-
|
218
|
+
# Use the same model selection logic for reflect_llm
|
219
|
+
self.reflect_llm = reflect_llm or os.getenv('OPENAI_MODEL_NAME', 'gpt-4o')
|
218
220
|
self.console = Console() # Create a single console instance for the agent
|
219
221
|
|
220
222
|
# Initialize system prompt
|
@@ -392,7 +394,7 @@ Your Goal: {self.goal}
|
|
392
394
|
display_error(f"Error in chat completion: {e}")
|
393
395
|
return None
|
394
396
|
|
395
|
-
def chat(self, prompt, temperature=0.2, tools=None, output_json=None):
|
397
|
+
def chat(self, prompt, temperature=0.2, tools=None, output_json=None, output_pydantic=None):
|
396
398
|
if self.use_system_prompt:
|
397
399
|
system_prompt = f"""{self.backstory}\n
|
398
400
|
Your Role: {self.role}\n
|
@@ -400,6 +402,8 @@ Your Goal: {self.goal}
|
|
400
402
|
"""
|
401
403
|
if output_json:
|
402
404
|
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {output_json.schema_json()}"
|
405
|
+
elif output_pydantic:
|
406
|
+
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {output_pydantic.schema_json()}"
|
403
407
|
else:
|
404
408
|
system_prompt = None
|
405
409
|
|
@@ -408,9 +412,9 @@ Your Goal: {self.goal}
|
|
408
412
|
messages.append({"role": "system", "content": system_prompt})
|
409
413
|
messages.extend(self.chat_history)
|
410
414
|
|
411
|
-
# Modify prompt if output_json is specified
|
415
|
+
# Modify prompt if output_json or output_pydantic is specified
|
412
416
|
original_prompt = prompt
|
413
|
-
if output_json:
|
417
|
+
if output_json or output_pydantic:
|
414
418
|
if isinstance(prompt, str):
|
415
419
|
prompt += "\nReturn ONLY a valid JSON object. No other text or explanation."
|
416
420
|
elif isinstance(prompt, list):
|
@@ -485,23 +489,15 @@ Your Goal: {self.goal}
|
|
485
489
|
return None
|
486
490
|
response_text = response.choices[0].message.content.strip()
|
487
491
|
|
488
|
-
# Handle output_json if specified
|
489
|
-
if output_json:
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
self.chat_history.append({"role": "assistant", "content": response_text})
|
498
|
-
if self.verbose:
|
499
|
-
display_interaction(original_prompt, response_text, markdown=self.markdown,
|
500
|
-
generation_time=time.time() - start_time, console=self.console)
|
501
|
-
return parsed_model
|
502
|
-
except Exception as e:
|
503
|
-
display_error(f"Failed to parse response as {output_json.__name__}: {e}")
|
504
|
-
return None
|
492
|
+
# Handle output_json or output_pydantic if specified
|
493
|
+
if output_json or output_pydantic:
|
494
|
+
# Add to chat history and return raw response
|
495
|
+
self.chat_history.append({"role": "user", "content": original_prompt})
|
496
|
+
self.chat_history.append({"role": "assistant", "content": response_text})
|
497
|
+
if self.verbose:
|
498
|
+
display_interaction(original_prompt, response_text, markdown=self.markdown,
|
499
|
+
generation_time=time.time() - start_time, console=self.console)
|
500
|
+
return response_text
|
505
501
|
|
506
502
|
if not self.self_reflect:
|
507
503
|
self.chat_history.append({"role": "user", "content": original_prompt})
|
@@ -583,19 +579,21 @@ Output MUST be JSON with 'reflection' and 'satisfactory'.
|
|
583
579
|
cleaned = cleaned[:-3].strip()
|
584
580
|
return cleaned
|
585
581
|
|
586
|
-
async def achat(self, prompt, temperature=0.2, tools=None, output_json=None):
|
582
|
+
async def achat(self, prompt, temperature=0.2, tools=None, output_json=None, output_pydantic=None):
|
587
583
|
"""Async version of chat method"""
|
588
584
|
try:
|
589
585
|
# Build system prompt
|
590
586
|
system_prompt = self.system_prompt
|
591
587
|
if output_json:
|
592
588
|
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {output_json.schema_json()}"
|
589
|
+
elif output_pydantic:
|
590
|
+
system_prompt += f"\nReturn ONLY a JSON object that matches this Pydantic model: {output_pydantic.schema_json()}"
|
593
591
|
|
594
592
|
# Build messages
|
595
593
|
if isinstance(prompt, str):
|
596
594
|
messages = [
|
597
595
|
{"role": "system", "content": system_prompt},
|
598
|
-
{"role": "user", "content": prompt + ("\nReturn ONLY a valid JSON object. No other text or explanation." if output_json else "")}
|
596
|
+
{"role": "user", "content": prompt + ("\nReturn ONLY a valid JSON object. No other text or explanation." if (output_json or output_pydantic) else "")}
|
599
597
|
]
|
600
598
|
else:
|
601
599
|
# For multimodal prompts
|
@@ -603,7 +601,7 @@ Output MUST be JSON with 'reflection' and 'satisfactory'.
|
|
603
601
|
{"role": "system", "content": system_prompt},
|
604
602
|
{"role": "user", "content": prompt}
|
605
603
|
]
|
606
|
-
if output_json:
|
604
|
+
if output_json or output_pydantic:
|
607
605
|
# Add JSON instruction to text content
|
608
606
|
for item in messages[-1]["content"]:
|
609
607
|
if item["type"] == "text":
|
@@ -637,22 +635,15 @@ Output MUST be JSON with 'reflection' and 'satisfactory'.
|
|
637
635
|
tools=formatted_tools
|
638
636
|
)
|
639
637
|
return await self._achat_completion(response, tools)
|
640
|
-
elif output_json:
|
638
|
+
elif output_json or output_pydantic:
|
641
639
|
response = await async_client.chat.completions.create(
|
642
640
|
model=self.llm,
|
643
641
|
messages=messages,
|
644
642
|
temperature=temperature,
|
645
643
|
response_format={"type": "json_object"}
|
646
644
|
)
|
647
|
-
|
648
|
-
|
649
|
-
cleaned_json = self.clean_json_output(result)
|
650
|
-
try:
|
651
|
-
parsed = json.loads(cleaned_json)
|
652
|
-
return output_json(**parsed)
|
653
|
-
except Exception as e:
|
654
|
-
display_error(f"Error parsing JSON response: {e}")
|
655
|
-
return None
|
645
|
+
# Return the raw response
|
646
|
+
return response.choices[0].message.content
|
656
647
|
else:
|
657
648
|
response = await async_client.chat.completions.create(
|
658
649
|
model=self.llm,
|
praisonaiagents/agents/agents.py
CHANGED
@@ -54,9 +54,11 @@ class PraisonAIAgents:
|
|
54
54
|
self.verbose = verbose
|
55
55
|
self.max_retries = max_retries
|
56
56
|
self.process = process
|
57
|
-
|
58
|
-
|
59
|
-
self.manager_llm = manager_llm
|
57
|
+
|
58
|
+
# Check for manager_llm in environment variable if not provided
|
59
|
+
self.manager_llm = manager_llm or os.getenv('OPENAI_MODEL_NAME', 'gpt-4o')
|
60
|
+
if self.verbose:
|
61
|
+
logging.info(f"Using model {self.manager_llm} for manager")
|
60
62
|
|
61
63
|
# If no tasks provided, generate them from agents
|
62
64
|
if tasks is None:
|
@@ -193,10 +195,17 @@ Here are the results of previous tasks that might be useful:\n
|
|
193
195
|
|
194
196
|
agent_output = await executor_agent.achat(
|
195
197
|
_get_multimodal_message(task_prompt, task.images),
|
196
|
-
tools=task.tools
|
198
|
+
tools=task.tools,
|
199
|
+
output_json=task.output_json,
|
200
|
+
output_pydantic=task.output_pydantic
|
197
201
|
)
|
198
202
|
else:
|
199
|
-
agent_output = await executor_agent.achat(
|
203
|
+
agent_output = await executor_agent.achat(
|
204
|
+
task_prompt,
|
205
|
+
tools=task.tools,
|
206
|
+
output_json=task.output_json,
|
207
|
+
output_pydantic=task.output_pydantic
|
208
|
+
)
|
200
209
|
|
201
210
|
if agent_output:
|
202
211
|
task_output = TaskOutput(
|
@@ -403,10 +412,17 @@ Here are the results of previous tasks that might be useful:\n
|
|
403
412
|
|
404
413
|
agent_output = executor_agent.chat(
|
405
414
|
_get_multimodal_message(task_prompt, task.images),
|
406
|
-
tools=task.tools
|
415
|
+
tools=task.tools,
|
416
|
+
output_json=task.output_json,
|
417
|
+
output_pydantic=task.output_pydantic
|
407
418
|
)
|
408
419
|
else:
|
409
|
-
agent_output = executor_agent.chat(
|
420
|
+
agent_output = executor_agent.chat(
|
421
|
+
task_prompt,
|
422
|
+
tools=task.tools,
|
423
|
+
output_json=task.output_json,
|
424
|
+
output_pydantic=task.output_pydantic
|
425
|
+
)
|
410
426
|
|
411
427
|
if agent_output:
|
412
428
|
task_output = TaskOutput(
|
@@ -1,9 +1,9 @@
|
|
1
1
|
praisonaiagents/__init__.py,sha256=xJLN8i6V9SRmJFMxSRWDQt_hBePoupVd3WanNIgbBbc,1052
|
2
2
|
praisonaiagents/main.py,sha256=7Phfe0gdxHzbhPb3WRzBTfq9CaLq0K31M5DM_4oCiCQ,12451
|
3
3
|
praisonaiagents/agent/__init__.py,sha256=sKO8wGEXvtCrvV1e834r1Okv0XAqAxqZCqz6hKLiTvA,79
|
4
|
-
praisonaiagents/agent/agent.py,sha256=
|
4
|
+
praisonaiagents/agent/agent.py,sha256=3Y8-eaebjOEculRgiz5IobAf5oadBKEpvNWJE5qaa4A,32305
|
5
5
|
praisonaiagents/agents/__init__.py,sha256=7RDeQNSqZg5uBjD4M_0p_F6YgfWuDuxPFydPU50kDYc,120
|
6
|
-
praisonaiagents/agents/agents.py,sha256=
|
6
|
+
praisonaiagents/agents/agents.py,sha256=BikzgqE469uUg3OeiBBihpYzuK1RUvRaB_CTc3DPdOM,23589
|
7
7
|
praisonaiagents/build/lib/praisonaiagents/__init__.py,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
8
8
|
praisonaiagents/build/lib/praisonaiagents/main.py,sha256=zDhN5KKtKbfruolDNxlyJkcFlkSt4KQkQTDRfQVAhxc,3960
|
9
9
|
praisonaiagents/build/lib/praisonaiagents/agent/__init__.py,sha256=sKO8wGEXvtCrvV1e834r1Okv0XAqAxqZCqz6hKLiTvA,79
|
@@ -18,7 +18,7 @@ praisonaiagents/task/__init__.py,sha256=VL5hXVmyGjINb34AalxpBMl-YW9m5EDcRkMTKkSS
|
|
18
18
|
praisonaiagents/task/task.py,sha256=UiiWgLDOdX_w0opP8h8-u-leVZlq1CkpGUmf7L2qyJs,3110
|
19
19
|
praisonaiagents/tools/__init__.py,sha256=rFen7LHI55mxBVW2raQmqKnK_JFuvTVVAuUmrQpDg_c,87
|
20
20
|
praisonaiagents/tools/tools.py,sha256=fs0fjW7Y_k9qsaR0CmlPjayiiVrDxDmgfr5SwR1Tdck,1363
|
21
|
-
praisonaiagents-0.0.
|
22
|
-
praisonaiagents-0.0.
|
23
|
-
praisonaiagents-0.0.
|
24
|
-
praisonaiagents-0.0.
|
21
|
+
praisonaiagents-0.0.23.dist-info/METADATA,sha256=aHmTnm2rTEpNbB93RxrcCPg2ZfBwJ5V3yXeFi3IoSeA,233
|
22
|
+
praisonaiagents-0.0.23.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
|
23
|
+
praisonaiagents-0.0.23.dist-info/top_level.txt,sha256=_HsRddrJ23iDx5TTqVUVvXG2HeHBL5voshncAMDGjtA,16
|
24
|
+
praisonaiagents-0.0.23.dist-info/RECORD,,
|
File without changes
|
File without changes
|