praisonaiagents 0.0.99__tar.gz → 0.0.100__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.
Files changed (60) hide show
  1. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/PKG-INFO +1 -1
  2. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/agent/agent.py +2 -5
  3. praisonaiagents-0.0.100/praisonaiagents/guardrails/__init__.py +11 -0
  4. praisonaiagents-0.0.100/praisonaiagents/guardrails/guardrail_result.py +43 -0
  5. praisonaiagents-0.0.100/praisonaiagents/guardrails/llm_guardrail.py +88 -0
  6. praisonaiagents-0.0.100/praisonaiagents/memory/__init__.py +15 -0
  7. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/memory/memory.py +7 -4
  8. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/task/task.py +5 -1
  9. praisonaiagents-0.0.100/praisonaiagents/tools/searxng_tools.py +94 -0
  10. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents.egg-info/PKG-INFO +1 -1
  11. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents.egg-info/SOURCES.txt +5 -0
  12. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/pyproject.toml +4 -3
  13. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/README.md +0 -0
  14. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/__init__.py +0 -0
  15. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/agent/__init__.py +0 -0
  16. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/agent/image_agent.py +0 -0
  17. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/agents/__init__.py +0 -0
  18. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/agents/agents.py +0 -0
  19. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/agents/autoagents.py +0 -0
  20. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/approval.py +0 -0
  21. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/knowledge/__init__.py +0 -0
  22. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/knowledge/chunking.py +0 -0
  23. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/knowledge/knowledge.py +0 -0
  24. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/llm/__init__.py +0 -0
  25. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/llm/llm.py +0 -0
  26. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/main.py +0 -0
  27. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/mcp/__init__.py +0 -0
  28. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/mcp/mcp.py +0 -0
  29. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/mcp/mcp_sse.py +0 -0
  30. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/process/__init__.py +0 -0
  31. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/process/process.py +0 -0
  32. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/session.py +0 -0
  33. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/task/__init__.py +0 -0
  34. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/__init__.py +0 -0
  35. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/arxiv_tools.py +0 -0
  36. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/calculator_tools.py +0 -0
  37. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/csv_tools.py +0 -0
  38. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/duckdb_tools.py +0 -0
  39. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/duckduckgo_tools.py +0 -0
  40. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/excel_tools.py +0 -0
  41. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/file_tools.py +0 -0
  42. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/json_tools.py +0 -0
  43. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/newspaper_tools.py +0 -0
  44. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/pandas_tools.py +0 -0
  45. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/python_tools.py +0 -0
  46. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/shell_tools.py +0 -0
  47. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/spider_tools.py +0 -0
  48. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/test.py +0 -0
  49. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/tools.py +0 -0
  50. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/train/data/generatecot.py +0 -0
  51. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/wikipedia_tools.py +0 -0
  52. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/xml_tools.py +0 -0
  53. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/yaml_tools.py +0 -0
  54. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents/tools/yfinance_tools.py +0 -0
  55. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents.egg-info/dependency_links.txt +0 -0
  56. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents.egg-info/requires.txt +0 -0
  57. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/praisonaiagents.egg-info/top_level.txt +0 -0
  58. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/setup.cfg +0 -0
  59. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/tests/test-graph-memory.py +0 -0
  60. {praisonaiagents-0.0.99 → praisonaiagents-0.0.100}/tests/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonaiagents
3
- Version: 0.0.99
3
+ Version: 0.0.100
4
4
  Summary: Praison AI agents for completing complex tasks with Self Reflection Agents
5
5
  Author: Mervin Praison
6
6
  Requires-Python: >=3.10
@@ -619,12 +619,9 @@ Your Goal: {self.goal}
619
619
  while retry_count <= self.max_guardrail_retries:
620
620
  # Create TaskOutput object
621
621
  task_output = TaskOutput(
622
+ description="Agent response output",
622
623
  raw=current_response,
623
- output=current_response,
624
- pydantic=None,
625
- json_dict=None,
626
- name=f"{self.name}_output",
627
- description="Agent response output"
624
+ agent=self.name
628
625
  )
629
626
 
630
627
  # Process guardrail
@@ -0,0 +1,11 @@
1
+ """
2
+ Guardrails module for PraisonAI Agents.
3
+
4
+ This module provides validation and safety mechanisms for task outputs,
5
+ including both function-based and LLM-based guardrails.
6
+ """
7
+
8
+ from .guardrail_result import GuardrailResult
9
+ from .llm_guardrail import LLMGuardrail
10
+
11
+ __all__ = ["GuardrailResult", "LLMGuardrail"]
@@ -0,0 +1,43 @@
1
+ """
2
+ Guardrail result classes for PraisonAI Agents.
3
+
4
+ This module provides the result types for guardrail validation,
5
+ following the same pattern as CrewAI for consistency.
6
+ """
7
+
8
+ from typing import Any, Tuple, Union
9
+ from pydantic import BaseModel, Field
10
+ from ..main import TaskOutput
11
+
12
+
13
+ class GuardrailResult(BaseModel):
14
+ """Result of a guardrail validation."""
15
+
16
+ success: bool = Field(description="Whether the guardrail check passed")
17
+ result: Union[str, TaskOutput, None] = Field(description="The result if modified, or None if unchanged")
18
+ error: str = Field(default="", description="Error message if validation failed")
19
+
20
+ @classmethod
21
+ def from_tuple(cls, result: Tuple[bool, Any]) -> "GuardrailResult":
22
+ """Create a GuardrailResult from a tuple returned by a guardrail function.
23
+
24
+ Args:
25
+ result: Tuple of (success, result_or_error)
26
+
27
+ Returns:
28
+ GuardrailResult: The structured result
29
+ """
30
+ success, data = result
31
+
32
+ if success:
33
+ return cls(
34
+ success=True,
35
+ result=data,
36
+ error=""
37
+ )
38
+ else:
39
+ return cls(
40
+ success=False,
41
+ result=None,
42
+ error=str(data) if data else "Guardrail validation failed"
43
+ )
@@ -0,0 +1,88 @@
1
+ """
2
+ LLM-based guardrail implementation for PraisonAI Agents.
3
+
4
+ This module provides LLM-powered guardrails that can validate task outputs
5
+ using natural language descriptions, similar to CrewAI's implementation.
6
+ """
7
+
8
+ import logging
9
+ from typing import Any, Tuple, Union, Optional
10
+ from pydantic import BaseModel
11
+ from ..main import TaskOutput
12
+
13
+
14
+ class LLMGuardrail:
15
+ """An LLM-powered guardrail that validates task outputs using natural language."""
16
+
17
+ def __init__(self, description: str, llm: Any = None):
18
+ """Initialize the LLM guardrail.
19
+
20
+ Args:
21
+ description: Natural language description of what to validate
22
+ llm: The LLM instance to use for validation
23
+ """
24
+ self.description = description
25
+ self.llm = llm
26
+ self.logger = logging.getLogger(__name__)
27
+
28
+ def __call__(self, task_output: TaskOutput) -> Tuple[bool, Union[str, TaskOutput]]:
29
+ """Validate the task output using the LLM.
30
+
31
+ Args:
32
+ task_output: The task output to validate
33
+
34
+ Returns:
35
+ Tuple of (success, result) where result is the output or error message
36
+ """
37
+ try:
38
+ if not self.llm:
39
+ self.logger.warning("No LLM provided for guardrail validation")
40
+ return True, task_output
41
+
42
+ # Create validation prompt
43
+ validation_prompt = f"""
44
+ You are a quality assurance validator. Your task is to evaluate the following output against specific criteria.
45
+
46
+ Validation Criteria: {self.description}
47
+
48
+ Output to Validate:
49
+ {task_output.raw}
50
+
51
+ Please evaluate if this output meets the criteria. Respond with:
52
+ 1. "PASS" if the output meets all criteria
53
+ 2. "FAIL: [specific reason]" if the output does not meet criteria
54
+
55
+ Your response:"""
56
+
57
+ # Get LLM response
58
+ if hasattr(self.llm, 'chat'):
59
+ # For Agent's LLM interface
60
+ response = self.llm.chat(validation_prompt, temperature=0.1)
61
+ elif hasattr(self.llm, 'get_response'):
62
+ # For custom LLM instances
63
+ response = self.llm.get_response(validation_prompt, temperature=0.1)
64
+ elif callable(self.llm):
65
+ # For simple callable LLMs
66
+ response = self.llm(validation_prompt)
67
+ else:
68
+ self.logger.error(f"Unsupported LLM type: {type(self.llm)}")
69
+ return True, task_output
70
+
71
+ # Parse response
72
+ response = str(response).strip()
73
+
74
+ if response.upper().startswith("PASS"):
75
+ return True, task_output
76
+ elif response.upper().startswith("FAIL"):
77
+ # Extract the reason
78
+ reason = response[5:].strip(": ")
79
+ return False, f"Guardrail validation failed: {reason}"
80
+ else:
81
+ # Unclear response, log and pass through
82
+ self.logger.warning(f"Unclear guardrail response: {response}")
83
+ return True, task_output
84
+
85
+ except Exception as e:
86
+ self.logger.error(f"Error in LLM guardrail validation: {str(e)}")
87
+ # On error, pass through the original output
88
+ return True, task_output
@@ -0,0 +1,15 @@
1
+ """
2
+ Memory module for PraisonAI Agents
3
+
4
+ This module provides memory management capabilities including:
5
+ - Short-term memory (STM) for ephemeral context
6
+ - Long-term memory (LTM) for persistent knowledge
7
+ - Entity memory for structured data
8
+ - User memory for preferences/history
9
+ - Quality-based storage decisions
10
+ - Graph memory support via Mem0
11
+ """
12
+
13
+ from .memory import Memory
14
+
15
+ __all__ = ["Memory"]
@@ -910,11 +910,14 @@ class Memory:
910
910
  """
911
911
 
912
912
  try:
913
- # Use OpenAI client from main.py
914
- from ..main import client
913
+ # Use LiteLLM for consistency with the rest of the codebase
914
+ import litellm
915
915
 
916
- response = client.chat.completions.create(
917
- model=llm or "gpt-4o",
916
+ # Convert model name if it's in litellm format
917
+ model_name = llm or "gpt-4o-mini"
918
+
919
+ response = litellm.completion(
920
+ model=model_name,
918
921
  messages=[{
919
922
  "role": "user",
920
923
  "content": custom_prompt or default_prompt
@@ -308,7 +308,11 @@ class Task:
308
308
  if self.agent:
309
309
  if getattr(self.agent, '_using_custom_llm', False) and hasattr(self.agent, 'llm_instance'):
310
310
  # For custom LLM instances (like Ollama)
311
- llm_model = self.agent.llm_instance
311
+ # Extract the model name from the LLM instance
312
+ if hasattr(self.agent.llm_instance, 'model'):
313
+ llm_model = self.agent.llm_instance.model
314
+ else:
315
+ llm_model = "gpt-4o-mini" # Default fallback
312
316
  elif hasattr(self.agent, 'llm') and self.agent.llm:
313
317
  # For standard model strings
314
318
  llm_model = self.agent.llm
@@ -0,0 +1,94 @@
1
+ """SearxNG search functionality.
2
+
3
+ Usage:
4
+ from praisonaiagents.tools import searxng_search
5
+ results = searxng_search("AI news")
6
+
7
+ or
8
+ from praisonaiagents.tools import searxng
9
+ results = searxng("AI news")
10
+ """
11
+
12
+ from typing import List, Dict, Optional
13
+ import logging
14
+ from importlib import util
15
+
16
+ def searxng_search(
17
+ query: str,
18
+ max_results: int = 5,
19
+ searxng_url: Optional[str] = None
20
+ ) -> List[Dict]:
21
+ """Perform an internet search using SearxNG instance.
22
+
23
+ Args:
24
+ query: Search query string
25
+ max_results: Maximum number of results to return
26
+ searxng_url: SearxNG instance URL (defaults to localhost:32768)
27
+
28
+ Returns:
29
+ List[Dict]: Search results with title, url, and snippet keys
30
+ Returns error dict on failure
31
+ """
32
+ # Check if requests is available
33
+ if util.find_spec("requests") is None:
34
+ error_msg = "SearxNG search requires requests package. Install with: pip install requests"
35
+ logging.error(error_msg)
36
+ return [{"error": error_msg}]
37
+
38
+ try:
39
+ import requests
40
+
41
+ # Default URL for local SearxNG instance
42
+ url = searxng_url or "http://localhost:32768/search"
43
+
44
+ params = {
45
+ 'q': query,
46
+ 'format': 'json',
47
+ 'engines': 'google,bing,duckduckgo', # Multiple engines
48
+ 'safesearch': '1' # Safe search enabled
49
+ }
50
+
51
+ response = requests.get(url, params=params, timeout=10)
52
+ response.raise_for_status()
53
+
54
+ raw_results = response.json().get('results', [])
55
+
56
+ # Standardize to PraisonAI format
57
+ results = []
58
+ for i, result in enumerate(raw_results[:max_results]):
59
+ results.append({
60
+ "title": result.get("title", ""),
61
+ "url": result.get("url", ""),
62
+ "snippet": result.get("content", "")
63
+ })
64
+
65
+ return results
66
+
67
+ except requests.exceptions.ConnectionError:
68
+ error_msg = f"Could not connect to SearxNG at {url}. Ensure SearxNG is running."
69
+ logging.error(error_msg)
70
+ return [{"error": error_msg}]
71
+ except requests.exceptions.Timeout:
72
+ error_msg = "SearxNG search request timed out"
73
+ logging.error(error_msg)
74
+ return [{"error": error_msg}]
75
+ except requests.exceptions.RequestException as e:
76
+ error_msg = f"SearxNG search request failed: {e}"
77
+ logging.error(error_msg)
78
+ return [{"error": error_msg}]
79
+ except (ValueError, KeyError) as e:
80
+ error_msg = f"Error parsing SearxNG response: {e}"
81
+ logging.error(error_msg)
82
+ return [{"error": error_msg}]
83
+
84
+ def searxng(query: str, max_results: int = 5, searxng_url: Optional[str] = None) -> List[Dict]:
85
+ """Alias for searxng_search function."""
86
+ return searxng_search(query, max_results, searxng_url)
87
+
88
+ if __name__ == "__main__":
89
+ # Example usage
90
+ results = searxng_search("Python programming")
91
+ for result in results:
92
+ print(f"\nTitle: {result.get('title')}")
93
+ print(f"URL: {result.get('url')}")
94
+ print(f"Snippet: {result.get('snippet')}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonaiagents
3
- Version: 0.0.99
3
+ Version: 0.0.100
4
4
  Summary: Praison AI agents for completing complex tasks with Self Reflection Agents
5
5
  Author: Mervin Praison
6
6
  Requires-Python: >=3.10
@@ -15,6 +15,9 @@ praisonaiagents/agent/image_agent.py
15
15
  praisonaiagents/agents/__init__.py
16
16
  praisonaiagents/agents/agents.py
17
17
  praisonaiagents/agents/autoagents.py
18
+ praisonaiagents/guardrails/__init__.py
19
+ praisonaiagents/guardrails/guardrail_result.py
20
+ praisonaiagents/guardrails/llm_guardrail.py
18
21
  praisonaiagents/knowledge/__init__.py
19
22
  praisonaiagents/knowledge/chunking.py
20
23
  praisonaiagents/knowledge/knowledge.py
@@ -23,6 +26,7 @@ praisonaiagents/llm/llm.py
23
26
  praisonaiagents/mcp/__init__.py
24
27
  praisonaiagents/mcp/mcp.py
25
28
  praisonaiagents/mcp/mcp_sse.py
29
+ praisonaiagents/memory/__init__.py
26
30
  praisonaiagents/memory/memory.py
27
31
  praisonaiagents/process/__init__.py
28
32
  praisonaiagents/process/process.py
@@ -40,6 +44,7 @@ praisonaiagents/tools/json_tools.py
40
44
  praisonaiagents/tools/newspaper_tools.py
41
45
  praisonaiagents/tools/pandas_tools.py
42
46
  praisonaiagents/tools/python_tools.py
47
+ praisonaiagents/tools/searxng_tools.py
43
48
  praisonaiagents/tools/shell_tools.py
44
49
  praisonaiagents/tools/spider_tools.py
45
50
  praisonaiagents/tools/test.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "praisonaiagents"
7
- version = "0.0.99"
7
+ version = "0.0.100"
8
8
  description = "Praison AI agents for completing complex tasks with Self Reflection Agents"
9
9
  requires-python = ">=3.10"
10
10
  authors = [
@@ -63,5 +63,6 @@ all = [
63
63
  "praisonaiagents[api]"
64
64
  ]
65
65
 
66
- [tool.setuptools]
67
- packages = ["praisonaiagents"]
66
+ [tool.setuptools.packages.find]
67
+ where = ["."]
68
+ include = ["praisonaiagents*"]