Compare commits

...
14 Commits
Author SHA1 Message Date
Mervin Praison e13f543c6d Merge pull request #301 from MervinPraison/develop
v0.0.38
2025-01-16 08:27:58 +00:00
MervinPraison 4f235d358c Update PraisonAI to version 2.0.47 and enhance knowledge management features
- Bumped PraisonAI version from 2.0.46 to 2.0.47 in `Dockerfile`, `pyproject.toml`, and `uv.lock` to reflect the latest updates.
- Updated the `praisonai.rb` formula to point to the new version's tarball.
- Enhanced the knowledge management system by adding a new `knowledge.mdx` file and related examples for creating knowledge-based agents.
- Updated documentation to include new concepts and improve clarity on knowledge management functionalities.
- Refactored deployment scripts to ensure compatibility with the updated package version.

These changes improve the overall functionality and usability of the PraisonAI framework, particularly in knowledge management and deployment processes.
2025-01-16 08:27:33 +00:00
MervinPraison b7847feb1e Update package version and enhance logging in Knowledge class
- Bumped the package version in `pyproject.toml` and `uv.lock` from `0.0.37` to `0.0.38` to reflect recent changes.
- Modified the `Knowledge` class in `knowledge.py` to include a `verbose` parameter for improved logging control.
- Implemented an internal logging helper method to streamline log messages and manage logging levels based on the `verbose` setting.
- Updated various logging statements to utilize the new logging helper, enhancing clarity and consistency in log outputs.

These changes improve the maintainability and usability of the knowledge management system by providing better logging capabilities.
2025-01-16 08:14:21 +00:00
MervinPraison 7ac730462c Update knowledge agent configuration and enhance memory management
- Changed the knowledge source in `knowledge-agents.py` from `large.pdf` to `small.pdf` for improved testing consistency.
- Bumped the package version in `pyproject.toml` from `0.0.36` to `0.0.37` to reflect recent changes.
- Updated the `chromadb` dependency version in `pyproject.toml` to `0.5.23` for compatibility.
- Enhanced the `CustomMemory` class in `knowledge.py` to allow dynamic memory management without relying on LLM, improving performance and flexibility.
- Introduced cached properties in the `Knowledge` class for better configuration handling and memory management.

These changes improve the knowledge agent's functionality and ensure better performance in memory operations.
2025-01-16 08:07:08 +00:00
MervinPraison 9cbc8d082d Add chunking functionality and update knowledge management features
Knowledge working without lazy loading

- Introduced a new `chunking-direct-test.py` file to demonstrate the usage of the `Chunking` class for text chunking with various strategies.
- Updated `knowledge-agents.py` to change the knowledge source from `2409.13731v3.pdf` to `large.pdf` and modified the agent's query for clarity.
- Revised `knowledge-direct-test.py` to replace the reference to `sample.pdf` with `small.pdf`, ensuring consistency in test file usage.
- Added `knowledge-large-pdf-test.py` to test the handling of large PDF files, integrating logging for better traceability.
- Updated `pyproject.toml` to include the new `chonkie` dependency for chunking functionalities.
- Removed the deprecated `sample.pdf` and added `small.pdf` to the agents directory for testing purposes.
- Enhanced the `Knowledge` class in `knowledge.py` to utilize the new `Chunking` class for improved memory management and content processing.

These changes enhance the knowledge management system's capabilities by integrating chunking strategies and improving file handling processes.
2025-01-16 07:56:32 +00:00
MervinPraison 7fb0aed7ac Refactor memory handling in knowledge-direct-test.py and knowledge.py
- Updated memory retrieval, updating, and deletion methods in `knowledge-direct-test.py` to correctly access memory IDs from the new results structure.
- Enhanced logging to provide clearer information about memory operations, including warnings for unexpected memory formats.
- Modified the `Knowledge` class in `knowledge.py` to ensure all memory results are returned in a consistent format, improving the handling of stored memories.
- Improved error handling and added checks for valid memory formats when verifying stored content from text and PDF files.

These changes enhance the robustness and clarity of memory management within the knowledge management system.
2025-01-16 06:24:15 +00:00
MervinPraison 206f0d01e7 Add new knowledge management features and files
- Introduced a new `knowledge-agents-task.py` script to define and execute tasks for knowledge agents, enhancing the framework's capabilities for knowledge retrieval and management.
- Added `knowledge-agents.py` to create a knowledge agent with specific instructions and knowledge sources, allowing for more tailored interactions.
- Implemented `knowledge-direct-test.py` for testing memory storage and retrieval functionalities, showcasing the new capabilities of the knowledge management system.
- Created `md.py` for handling Markdown file conversions, integrating with the knowledge management features.
- Updated `pyproject.toml` to specify the exact version of the `chromadb` dependency, ensuring compatibility with the new features.
- Added new PDF and DOCX files to the agents directory for testing and demonstration purposes.
- Enhanced the `Knowledge` class in `knowledge.py` to support user and agent identifiers, improving memory management and retrieval processes.

This commit significantly expands the knowledge management functionalities within the PraisonAI framework, providing new tools and scripts for better handling of knowledge content.
2025-01-16 05:36:08 +00:00
MervinPraison e19a310314 Update dependencies and enhance knowledge management system
- Updated the `chainlit` dependency version from `2.0.1` to `2.0.3` across multiple configurations in `pyproject.toml` and `agents/pyproject.toml` to ensure compatibility with the latest features and fixes.
- Introduced a new optional dependency group `knowledge` in `agents/pyproject.toml` for enhanced knowledge management capabilities, including `mem0ai` and `markitdown`.
- Refactored the `Knowledge` class in `knowledge.py` to improve initialization and memory management, allowing for better handling of user and agent identifiers.
- Enhanced methods for storing, retrieving, and managing memories, including new functionalities for updating and deleting memories.
- Updated UI components in `mint.json` and `realtime.py` to reflect changes in model naming conventions, improving user experience and clarity.

This commit strengthens the overall functionality and usability of the PraisonAI framework, particularly in knowledge management and UI interactions.
2025-01-15 17:00:15 +00:00
MervinPraison 1ea572689e Refactor Knowledge Management System in knowledge.py
- Overhauled the `Knowledge` class to enhance the knowledge management system, introducing a more flexible initialization with user and agent identifiers, and improved configuration options.
- Streamlined methods for adding, searching, and deleting knowledge, integrating a new memory management system for better performance and organization.
- Updated vector store and embedding configurations to support a wider range of providers and models, including options for graph capabilities.
- Enhanced error handling and debugging features for improved troubleshooting.
- Removed deprecated methods and optimized existing functionality for clarity and efficiency.

This commit significantly improves the structure and capabilities of the knowledge management system within the PraisonAI framework, facilitating better content handling and retrieval.
2025-01-15 06:52:26 +00:00
MervinPraison 96df649b05 Add Knowledge Management System in knowledge.py
- Introduced a new `Knowledge` class for managing knowledge content, including methods for adding, updating, searching, and deleting knowledge.
- Implemented support for various vector store types (Chroma, Pinecone, PGVector, Qdrant, Milvus) for storing embeddings.
- Added functionality for chunking text, generating embeddings using different models (OpenAI, Cohere, SentenceTransformers, HuggingFace), and optional encryption of content.
- Enhanced caching mechanism for search results to improve performance.
- Included comprehensive error handling and debug mode for better troubleshooting.

This commit establishes a robust framework for knowledge management within the PraisonAI agents, enhancing the system's capabilities for handling and retrieving information efficiently.
2025-01-15 06:18:33 +00:00
Mervin Praison 5aed75837a Merge pull request #300 from MervinPraison/develop
Refactor UI documentation and update navigation structure
2025-01-15 05:18:38 +00:00
MervinPraison 9c8f68a05f Refactor UI documentation and update navigation structure
- Renamed and reorganized the UI documentation in `ui.mdx`, changing the title and sidebar title for clarity.
- Updated the installation instructions to provide a more streamlined setup process.
- Removed the previous table of available interfaces and replaced it with a concise description of features.
- Adjusted the `mint.json` file to reflect the new UI documentation structure, enhancing navigation for users.

This commit improves the clarity and accessibility of the user interface documentation, making it easier for users to understand and utilize the PraisonAI framework.
2025-01-15 05:18:07 +00:00
Mervin Praison 9778a69c4d Merge pull request #299 from MervinPraison/develop
Remove deprecated use case documentation and update navigation structure
2025-01-14 17:12:40 +00:00
MervinPraison 73c7994380 Remove deprecated use case documentation and update navigation structure
- Deleted multiple use case files including "Examples," "Adaptive Learning," "Code Review," "Customer Service," "Emergency Response," "Fraud Detection," "Healthcare Diagnosis," "Multilingual Content," "Predictive Maintenance," "Smart City," and "Supply Chain" to streamline documentation.
- Updated `mint.json` to replace "Use Cases" with "Examples" in the navigation, enhancing clarity and organization.
- Adjusted navigation groups to reflect the new structure, ensuring users can easily find relevant information.

This commit focuses on cleaning up outdated documentation and improving the overall user experience by refining the navigation structure.
2025-01-14 17:12:26 +00:00
55 changed files with 2731 additions and 125 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install flask praisonai==2.0.46 gunicorn markdown
RUN pip install flask praisonai==2.0.47 gunicorn markdown
EXPOSE 8080
CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]
+14
View File
@@ -0,0 +1,14 @@
from praisonaiagents.knowledge import Chunking
# No heavy imports or initialization happens here
chunking = Chunking(chunker_type='token')
# Chunker is only initialized when first used
chunks = chunking.chunk("Your text here")
# Embedding model is only loaded if using semantic chunking
semantic_chunking = Chunking(chunker_type='recursive')
# Embedding model and chunker are loaded here on first use
semantic_chunks = semantic_chunking.chunk("Your text here")
print(semantic_chunks)
+3
View File
@@ -0,0 +1,3 @@
I am Mervin Praison, a software engineer and entrepreneur.
I am the founder of Praison AI, a company that is building AI agents to help people with their daily tasks.
+34
View File
@@ -0,0 +1,34 @@
import gradio as gr
from praisonaiagents import Agent, Tools
from praisonaiagents.tools import duckduckgo
def research(query):
agent = Agent(instructions="You are a Research Agent", tools=[duckduckgo])
result = agent.start(query)
# Format the result with enhanced markdown
formatted_result = f"""
{result}
----
*Generated by PraisonAI Research Assistant*
"""
return formatted_result
# Create a simple Gradio interface
demo = gr.Interface(
fn=research,
inputs=gr.Textbox(
label="Research Query",
placeholder="Enter your research topic...",
lines=2
),
outputs=gr.Markdown(
show_copy_button=True,
height=500,
container=True
),
title="AI Research Assistant",
description="Enter your research query below to get started!",
)
if __name__ == "__main__":
demo.launch()
View File
Whitespace-only changes.
+48
View File
@@ -0,0 +1,48 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
import logging
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Define the configuration for the Knowledge instance
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "knowledge_test",
"path": ".praison",
}
}
}
# Create an agent with knowledge capabilities
knowledge_agent = Agent(
name="KnowledgeAgent",
role="Information Specialist",
goal="Store and retrieve knowledge efficiently",
backstory="Expert in managing and utilizing stored knowledge",
knowledge=["sample.pdf"],
knowledge_config=config,
verbose=True
)
# Define a task for the agent
knowledge_task = Task(
name="knowledge_task",
description="Who is Mervin Praison?",
expected_output="Answer to the question",
agent=knowledge_agent
)
# Create and start the agents
agents = PraisonAIAgents(
agents=[knowledge_agent],
tasks=[knowledge_task],
process="sequential",
user_id="user1"
)
# Start execution
result = agents.start()
+20
View File
@@ -0,0 +1,20 @@
from praisonaiagents import Agent
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "custom_knowledge",
"path": ".praison",
}
}
}
agent = Agent(
name="Knowledge Agent",
instructions="You answer questions based on the provided knowledge.",
knowledge=["small.pdf"],
knowledge_config=config
)
agent.start("What is KAG in one line?")
+171
View File
@@ -0,0 +1,171 @@
import logging
from praisonaiagents.knowledge import Knowledge
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "test",
"path": ".praison",
}
}
}
knowledge = Knowledge(config)
# Store memories
logger.info("Storing memories...")
cricket_memory = knowledge.store("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
logger.info(f"Stored cricket memory: {cricket_memory}")
tennis_memory = knowledge.store("Enjoys playing tennis with friends", user_id="alice", metadata={"category": "hobbies"})
logger.info(f"Stored tennis memory: {tennis_memory}")
work_memory = knowledge.store("Works as a software engineer", user_id="alice", metadata={"category": "work"})
logger.info(f"Stored work memory: {work_memory}")
print("Stored memories:")
print(cricket_memory)
print(tennis_memory)
print(work_memory)
# Retrieve all memories for a user
logger.info("Retrieving all memories for Alice...")
alice_memories = knowledge.get_all(user_id="alice")
logger.info(f"Retrieved memories for Alice: {alice_memories}")
print("\nAll memories for Alice:")
for memory in alice_memories:
print(memory)
# Retrieve a specific memory by ID
logger.info(f"Retrieving memory with ID: {cricket_memory['results'][0]['id']}")
retrieved_memory = knowledge.get(cricket_memory['results'][0]["id"])
logger.info(f"Retrieved memory: {retrieved_memory}")
print("\nRetrieved memory:")
print(retrieved_memory)
# Search for memories based on a query
query = "What are Alice's hobbies?"
logger.info(f"Searching for memories with query: {query}")
search_results = knowledge.search(query, user_id="alice")
logger.info(f"Search results: {search_results}")
print(f"\nSearch results for '{query}':")
for memory in search_results:
print(memory)
# Update a memory
logger.info(f"Updating memory with ID: {tennis_memory['results'][0]['id']}")
updated_memory = knowledge.update(memory_id=tennis_memory['results'][0]["id"], data="Loves playing tennis on weekends")
logger.info(f"Updated memory: {updated_memory}")
print("\nUpdated memory:")
print(updated_memory)
# Get memory history
logger.info(f"Retrieving memory history for ID: {tennis_memory['results'][0]['id']}")
memory_history = knowledge.history(memory_id=tennis_memory['results'][0]["id"])
logger.info(f"Memory history: {memory_history}")
print("\nMemory history:")
for entry in memory_history:
print(entry)
# Delete a memory
logger.info(f"Deleting memory with ID: {work_memory['results'][0]['id']}")
knowledge.delete(memory_id=work_memory['results'][0]["id"])
logger.info("Memory deleted")
print("\nDeleted memory")
# Retrieve memories after deletion
logger.info("Retrieving memories after deletion...")
alice_memories = knowledge.get_all(user_id="alice")
logger.info(f"Retrieved memories after deletion: {alice_memories}")
print("\nMemories after deletion:")
for memory in alice_memories:
print(memory)
# Delete all memories for a user
logger.info("Deleting all memories for Alice...")
knowledge.delete_all(user_id="alice")
logger.info("All memories for Alice deleted")
print("\nAll memories for Alice deleted")
# Retrieve memories after deleting all
logger.info("Retrieving memories after deleting all...")
alice_memories = knowledge.get_all(user_id="alice")
logger.info(f"Retrieved memories after deleting all: {alice_memories}")
print("\nMemories after deleting all:")
print(alice_memories)
# Reset all memories
logger.info("Resetting all memories...")
knowledge.reset()
logger.info("All memories reset")
print("\nAll memories reset")
# Test file handling
logger.info("Testing file handling...")
try:
# Get absolute path to test files
current_dir = os.path.dirname(os.path.abspath(__file__))
pdf_file = os.path.join(current_dir, "small.pdf")
txt_file = os.path.join(current_dir, "sample.txt")
# Test text file
logger.info(f"Testing text file: {txt_file}")
# Read and display content
with open(txt_file, 'r') as file:
txt_content = file.read()
print("\nText file content:")
print(txt_content)
# Store the text file using add
txt_memory = knowledge.add(txt_file, user_id="bob", metadata={"type": "text"})
logger.info(f"Stored text file: {txt_memory}")
print("\nStored text content:")
if txt_memory and 'results' in txt_memory and txt_memory['results']:
for mem in txt_memory['results']:
print(mem)
else:
print("No valid memories were stored from the text file")
# Verify text memories are stored
if txt_memory and 'results' in txt_memory and txt_memory['results']:
logger.info("Verifying text memories...")
for mem in txt_memory['results']:
if isinstance(mem, dict) and 'id' in mem:
stored = knowledge.get(mem['id'])
logger.info(f"Verified text memory: {stored}")
else:
logger.warning(f"Unexpected memory format: {mem}")
else:
logger.warning("No valid memories were stored from the text file")
# Test pdf file
logger.info(f"Testing pdf file: {pdf_file}")
pdf_memory = knowledge.add(pdf_file, user_id="bob", metadata={"type": "pdf"})
logger.info(f"Stored pdf file: {pdf_memory}")
print("\nStored pdf content:")
if pdf_memory and 'results' in pdf_memory and pdf_memory['results']:
for mem in pdf_memory['results']:
print(mem)
else:
print("No valid memories were stored from the PDF file")
# Verify stored content
if pdf_memory and 'results' in pdf_memory and pdf_memory['results']:
for memory in pdf_memory['results']:
if isinstance(memory, dict) and 'id' in memory:
stored_memory = knowledge.get(memory['id'])
logger.info(f"Verified stored memory: {stored_memory}")
print("\nVerified content:")
print(stored_memory)
else:
logger.warning(f"Unexpected memory format: {memory}")
else:
logger.warning("No valid memories were stored from the PDF file")
except Exception as e:
logger.error(f"Error during file handling test: {str(e)}")
raise
+40
View File
@@ -0,0 +1,40 @@
import logging
from praisonaiagents.knowledge import Knowledge
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
knowledge = Knowledge()
try:
# Get absolute path to test files
current_dir = os.path.dirname(os.path.abspath(__file__))
pdf_file = os.path.join(current_dir, "large.pdf")
# Test pdf file
logger.info(f"Testing pdf file: {pdf_file}")
pdf_memory = knowledge.add(pdf_file, user_id="bob", metadata={"type": "pdf"})
logger.info(f"Stored pdf file: {pdf_memory}")
print("\nStored pdf content:")
if pdf_memory and 'results' in pdf_memory and pdf_memory['results']:
for mem in pdf_memory['results']:
print(mem)
else:
print("No valid memories were stored from the PDF file")
# Verify stored content
if pdf_memory and 'results' in pdf_memory and pdf_memory['results']:
for memory in pdf_memory['results']:
if isinstance(memory, dict) and 'id' in memory:
stored_memory = knowledge.get(memory['id'])
logger.info(f"Verified stored memory: {stored_memory}")
print("\nVerified content:")
print(stored_memory)
else:
logger.warning(f"Unexpected memory format: {memory}")
else:
logger.warning("No valid memories were stored from the PDF file")
except Exception as e:
logger.error(f"Error during file handling test: {str(e)}")
raise
BIN
View File
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("sample.txt")
print(result.text_content)
+4
View File
@@ -7,6 +7,8 @@ from .agents.agents import PraisonAIAgents
from .task.task import Task
from .tools.tools import Tools
from .agents.autoagents import AutoAgents
from .knowledge.knowledge import Knowledge
from .knowledge.chunking import Chunking
from .memory.memory import Memory
from .main import (
TaskOutput,
@@ -48,4 +50,6 @@ __all__ = [
'register_display_callback',
'sync_display_callbacks',
'async_display_callbacks',
'Knowledge',
'Chunking'
]
+51 -3
View File
@@ -20,6 +20,7 @@ from ..main import (
adisplay_instruction
)
import inspect
import uuid
if TYPE_CHECKING:
from ..task.task import Task
@@ -176,13 +177,15 @@ class Agent:
respect_context_window: bool = True,
code_execution_mode: Literal["safe", "unsafe"] = "safe",
embedder_config: Optional[Dict[str, Any]] = None,
knowledge_sources: Optional[List[Any]] = None,
knowledge: Optional[List[str]] = None,
knowledge_config: Optional[Dict[str, Any]] = None,
use_system_prompt: Optional[bool] = True,
markdown: bool = True,
self_reflect: bool = False,
max_reflect: int = 3,
min_reflect: int = 1,
reflect_llm: Optional[str] = None
reflect_llm: Optional[str] = None,
user_id: Optional[str] = None
):
# Handle backward compatibility for required fields
if all(x is None for x in [name, role, goal, backstory, instructions]):
@@ -226,7 +229,7 @@ class Agent:
self.respect_context_window = respect_context_window
self.code_execution_mode = code_execution_mode
self.embedder_config = embedder_config
self.knowledge_sources = knowledge_sources
self.knowledge = knowledge
self.use_system_prompt = use_system_prompt
self.chat_history = []
self.markdown = markdown
@@ -242,6 +245,36 @@ Your Role: {self.role}\n
Your Goal: {self.goal}
"""
# Generate unique IDs
self.agent_id = str(uuid.uuid4())
# Store user_id
self.user_id = user_id
# Initialize Knowledge with provided or default config
from praisonaiagents.knowledge import Knowledge
self.knowledge = Knowledge(knowledge_config or None)
# Handle knowledge
if knowledge:
for source in knowledge:
self._process_knowledge(source)
def _process_knowledge(self, knowledge_item):
"""Process and store knowledge from a file path, URL, or string."""
try:
if os.path.exists(knowledge_item):
# It's a file path
self.knowledge.add(knowledge_item, user_id=self.user_id, agent_id=self.agent_id)
elif knowledge_item.startswith("http://") or knowledge_item.startswith("https://"):
# It's a URL
pass
else:
# It's a string content
self.knowledge.store(knowledge_item, user_id=self.user_id, agent_id=self.agent_id)
except Exception as e:
logging.error(f"Error processing knowledge item: {knowledge_item}, error: {e}")
def generate_task(self) -> 'Task':
"""Generate a Task object from the agent's instructions"""
from ..task.task import Task
@@ -418,6 +451,21 @@ Your Goal: {self.goal}
return None
def chat(self, prompt, temperature=0.2, tools=None, output_json=None, output_pydantic=None):
# Search for existing knowledge if any knowledge is provided
if self.knowledge:
search_results = self.knowledge.search(prompt, agent_id=self.agent_id)
if search_results:
# Check if search_results is a list of dictionaries or strings
if isinstance(search_results, dict) and 'results' in search_results:
# Extract memory content from the results
knowledge_content = "\n".join([result['memory'] for result in search_results['results']])
else:
# If search_results is a list of strings, join them directly
knowledge_content = "\n".join(search_results)
# Append found knowledge to the prompt
prompt = f"{prompt}\n\nKnowledge: {knowledge_content}"
if self.use_system_prompt:
system_prompt = f"""{self.backstory}\n
Your Role: {self.role}\n
+10 -2
View File
@@ -12,6 +12,7 @@ from ..agent.agent import Agent
from ..task.task import Task
from ..process.process import Process, LoopItems
import asyncio
import uuid
# Set up logger
logger = logging.getLogger(__name__)
@@ -44,10 +45,17 @@ def process_video(video_path: str, seconds_per_frame=2):
return base64_frames
class PraisonAIAgents:
def __init__(self, agents, tasks=None, verbose=0, completion_checker=None, max_retries=5, process="sequential", manager_llm=None, memory=False, memory_config=None, embedder=None):
def __init__(self, agents, tasks=None, verbose=0, completion_checker=None, max_retries=5, process="sequential", manager_llm=None, memory=False, memory_config=None, embedder=None, user_id=None):
if not agents:
raise ValueError("At least one agent must be provided")
self.run_id = str(uuid.uuid4()) # Auto-generate run_id
self.user_id = user_id # Optional user_id
# Pass user_id to each agent
for agent in agents:
agent.user_id = self.user_id
self.agents = agents
self.tasks = {}
if max_retries < 3:
@@ -0,0 +1,8 @@
"""
PraisonAI Knowledge - Advanced knowledge management system with configurable features
"""
from praisonaiagents.knowledge.knowledge import Knowledge
from praisonaiagents.knowledge.chunking import Chunking
__all__ = ["Knowledge", "Chunking"]
@@ -0,0 +1,182 @@
from typing import List, Union, Optional, Dict, Any
from functools import cached_property
import importlib
class Chunking:
"""A unified class for text chunking with various chunking strategies."""
CHUNKER_PARAMS = {
'token': ['chunk_size', 'chunk_overlap', 'tokenizer'],
'word': ['chunk_size', 'chunk_overlap', 'tokenizer'],
'sentence': ['chunk_size', 'chunk_overlap', 'tokenizer'],
'semantic': ['chunk_size', 'embedding_model', 'tokenizer'],
'sdpm': ['chunk_size', 'embedding_model', 'tokenizer'],
'late': ['chunk_size', 'embedding_model', 'tokenizer'],
'recursive': ['chunk_size', 'tokenizer']
}
@cached_property
def SUPPORTED_CHUNKERS(self) -> Dict[str, Any]:
"""Lazy load chunker classes."""
try:
from chonkie.chunker import (
TokenChunker,
WordChunker,
SentenceChunker,
SemanticChunker,
SDPMChunker,
LateChunker,
RecursiveChunker
)
except ImportError:
raise ImportError(
"chonkie package not found. Please install it using: pip install 'praisonaiagents[knowledge]'"
)
return {
'token': TokenChunker,
'word': WordChunker,
'sentence': SentenceChunker,
'semantic': SemanticChunker,
'sdpm': SDPMChunker,
'late': LateChunker,
'recursive': RecursiveChunker
}
def __init__(
self,
chunker_type: str = 'token',
chunk_size: int = 512,
chunk_overlap: int = 128,
tokenizer: str = "gpt2",
embedding_model: Optional[Union[str, Any]] = None,
**kwargs
):
"""Initialize the Chunking class."""
if chunker_type not in self.CHUNKER_PARAMS:
raise ValueError(
f"Unsupported chunker type: {chunker_type}. "
f"Must be one of: {list(self.CHUNKER_PARAMS.keys())}"
)
self.chunker_type = chunker_type
self.chunk_size = chunk_size
self.chunk_overlap = chunk_overlap
self.tokenizer = tokenizer
self._embedding_model = embedding_model
self.kwargs = kwargs
# Initialize these as None for lazy loading
self._chunker = None
self._embeddings = None
@cached_property
def embedding_model(self):
"""Lazy load the embedding model."""
if self._embedding_model is None and self.chunker_type in ['semantic', 'sdpm', 'late']:
from chonkie.embeddings import AutoEmbeddings
return AutoEmbeddings.get_embeddings("all-MiniLM-L6-v2")
elif isinstance(self._embedding_model, str):
from chonkie.embeddings import AutoEmbeddings
return AutoEmbeddings.get_embeddings(self._embedding_model)
return self._embedding_model
def _get_chunker_params(self) -> Dict[str, Any]:
"""Get the appropriate parameters for the current chunker type."""
allowed_params = self.CHUNKER_PARAMS[self.chunker_type]
params = {'chunk_size': self.chunk_size}
if 'chunk_overlap' in allowed_params:
params['chunk_overlap'] = self.chunk_overlap
if 'tokenizer' in allowed_params:
if self.chunker_type in ['semantic', 'sdpm', 'late']:
params['tokenizer'] = self.embedding_model.get_tokenizer_or_token_counter()
else:
params['tokenizer'] = self.tokenizer
if 'embedding_model' in allowed_params:
params['embedding_model'] = self.embedding_model
# Add any additional kwargs that are in allowed_params
for key, value in self.kwargs.items():
if key in allowed_params:
params[key] = value
return params
@cached_property
def chunker(self):
"""Lazy load the chunker instance."""
if self._chunker is None:
chunker_cls = self.SUPPORTED_CHUNKERS[self.chunker_type]
common_params = self._get_chunker_params()
self._chunker = chunker_cls(**common_params)
return self._chunker
def _get_overlap_refinery(self, context_size: Optional[int] = None, **kwargs):
"""Lazy load the overlap refinery."""
try:
from chonkie.refinery import OverlapRefinery
except ImportError:
raise ImportError("Failed to import OverlapRefinery from chonkie.refinery")
if context_size is None:
context_size = self.chunk_overlap
return OverlapRefinery(
context_size=context_size,
tokenizer=self.chunker.tokenizer,
**kwargs
)
def add_overlap_context(
self,
chunks: List[Any],
context_size: int = None,
mode: str = "suffix",
merge_context: bool = True
) -> List[Any]:
"""Add overlap context to chunks using OverlapRefinery."""
refinery = self._get_overlap_refinery(
context_size=context_size,
mode=mode,
merge_context=merge_context
)
return refinery.refine(chunks)
def chunk(
self,
text: Union[str, List[str]],
add_context: bool = False,
context_params: Optional[Dict[str, Any]] = None
) -> Union[List[Any], List[List[Any]]]:
"""Chunk text using the configured chunking strategy."""
chunks = self.chunker(text)
if add_context:
context_params = context_params or {}
if isinstance(text, str):
chunks = self.add_overlap_context(chunks, **context_params)
else:
chunks = [self.add_overlap_context(c, **context_params) for c in chunks]
return chunks
def __call__(
self,
text: Union[str, List[str]],
add_context: bool = False,
context_params: Optional[Dict[str, Any]] = None
) -> Union[List[Any], List[List[Any]]]:
"""Make the Chunking instance callable."""
return self.chunk(text, add_context, context_params)
def __repr__(self) -> str:
"""String representation of the Chunking instance."""
return (
f"Chunking(chunker_type='{self.chunker_type}', "
f"chunk_size={self.chunk_size}, "
f"chunk_overlap={self.chunk_overlap})"
)
@@ -0,0 +1,290 @@
import os
import logging
import uuid
import time
from .chunking import Chunking
from functools import cached_property
logger = logging.getLogger(__name__)
class CustomMemory:
@classmethod
def from_config(cls, config):
from mem0 import Memory
return type('CustomMemory', (Memory,), {
'_add_to_vector_store': cls._add_to_vector_store
}).from_config(config)
@staticmethod
def _add_to_vector_store(self, messages, metadata, filters):
# Custom implementation that doesn't use LLM
parsed_messages = "\n".join([msg["content"] for msg in messages])
# Create a simple fact without using LLM
new_retrieved_facts = [parsed_messages]
# Process embeddings and continue with vector store operations
new_message_embeddings = {}
for new_mem in new_retrieved_facts:
messages_embeddings = self.embedding_model.embed(new_mem)
new_message_embeddings[new_mem] = messages_embeddings
# Create the memory
memory_id = self._create_memory(
data=parsed_messages,
existing_embeddings=new_message_embeddings,
metadata=metadata
)
return [{
"id": memory_id,
"memory": parsed_messages,
"event": "ADD"
}]
class Knowledge:
def __init__(self, config=None, verbose=None):
self._config = config
self._verbose = verbose or 0
os.environ['ANONYMIZED_TELEMETRY'] = 'False' # Chromadb
# Configure logging levels based on verbose setting
if not self._verbose:
# Suppress logs from all relevant dependencies
for logger_name in [
'mem0',
'chromadb',
'local_persistent_hnsw',
'_client',
'main'
]:
logging.getLogger(logger_name).setLevel(logging.WARNING)
# Disable OpenAI API request logging
logging.getLogger('openai').setLevel(logging.WARNING)
# Set root logger to warning to catch any uncategorized logs
logging.getLogger().setLevel(logging.WARNING)
@cached_property
def _deps(self):
try:
from markitdown import MarkItDown
import chromadb
return {
'chromadb': chromadb,
'markdown': MarkItDown()
}
except ImportError:
raise ImportError(
"Required packages not installed. Please install using: "
'pip install "praisonaiagents[knowledge]"'
)
@cached_property
def config(self):
# Generate unique collection name for each instance
collection_name = f"test_{int(time.time())}_{str(uuid.uuid4())[:8]}"
persist_dir = ".praison"
# Create persistent client config
base_config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": collection_name,
"path": persist_dir,
"client": self._deps['chromadb'].PersistentClient(path=persist_dir)
}
},
"version": "v1.1",
"custom_prompt": "Return {{\"facts\": [text]}} where text is the exact input provided and json response"
}
# If config is provided, merge it with base config
if self._config:
if "vector_store" in self._config and "config" in self._config["vector_store"]:
config_copy = self._config["vector_store"]["config"].copy()
for key in ["collection_name", "client"]:
if key in config_copy:
del config_copy[key]
base_config["vector_store"]["config"].update(config_copy)
return base_config
@cached_property
def memory(self):
try:
return CustomMemory.from_config(self.config)
except (NotImplementedError, ValueError) as e:
if "list_collections" in str(e) or "Extra fields not allowed" in str(e):
# Keep only allowed fields
vector_store_config = {
"collection_name": self.config["vector_store"]["config"]["collection_name"],
"path": self.config["vector_store"]["config"]["path"]
}
self.config["vector_store"]["config"] = vector_store_config
from mem0 import Memory
return Memory.from_config(self.config)
raise
@cached_property
def markdown(self):
return self._deps['markdown']
@cached_property
def chunker(self):
return Chunking(
chunker_type='recursive',
chunk_size=512,
chunk_overlap=50
)
def _log(self, message, level=2):
"""Internal logging helper"""
if self._verbose and self._verbose >= level:
logger.info(message)
def store(self, content, user_id=None, agent_id=None, run_id=None, metadata=None):
"""Store a memory."""
try:
if isinstance(content, str):
if any(content.lower().endswith(ext) for ext in ['.pdf', '.doc', '.docx', '.txt']):
self._log(f"Content appears to be a file path, processing file: {content}")
return self.add(content, user_id=user_id, agent_id=agent_id, run_id=run_id, metadata=metadata)
content = content.strip()
if not content:
return []
result = self.memory.add(content, user_id=user_id, agent_id=agent_id, run_id=run_id, metadata=metadata)
self._log(f"Store operation result: {result}")
return result
except Exception as e:
logger.error(f"Error storing content: {str(e)}")
return []
def get_all(self, user_id=None, agent_id=None, run_id=None):
"""Retrieve all memories."""
return self.memory.get_all(user_id=user_id, agent_id=agent_id, run_id=run_id)
def get(self, memory_id):
"""Retrieve a specific memory by ID."""
return self.memory.get(memory_id)
def search(self, query, user_id=None, agent_id=None, run_id=None):
"""Search for memories related to a query."""
return self.memory.search(query, user_id=user_id, agent_id=agent_id, run_id=run_id)
def update(self, memory_id, data):
"""Update a memory."""
return self.memory.update(memory_id, data)
def history(self, memory_id):
"""Get the history of changes for a memory."""
return self.memory.history(memory_id)
def delete(self, memory_id):
"""Delete a memory."""
self.memory.delete(memory_id)
def delete_all(self, user_id=None, agent_id=None, run_id=None):
"""Delete all memories."""
self.memory.delete_all(user_id=user_id, agent_id=agent_id, run_id=run_id)
def reset(self):
"""Reset all memories."""
self.memory.reset()
def normalize_content(self, content):
"""Normalize content for consistent storage."""
# Example normalization: strip whitespace, convert to lowercase
return content.strip().lower()
def add(self, file_path, user_id=None, agent_id=None, run_id=None, metadata=None):
"""Read file content and store it in memory.
Args:
file_path: Can be:
- A string path to local file
- A URL string
- A list containing file paths and/or URLs
"""
if isinstance(file_path, (list, tuple)):
results = []
for path in file_path:
result = self._process_single_input(path, user_id, agent_id, run_id, metadata)
results.extend(result.get('results', []))
return {'results': results, 'relations': []}
return self._process_single_input(file_path, user_id, agent_id, run_id, metadata)
def _process_single_input(self, input_path, user_id=None, agent_id=None, run_id=None, metadata=None):
"""Process a single input which can be a file path or URL."""
try:
# Define supported file extensions
DOCUMENT_EXTENSIONS = {
'document': ('.pdf', '.ppt', '.pptx', '.doc', '.docx', '.xls', '.xlsx'),
'media': ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.mp3', '.wav', '.ogg', '.m4a'),
'text': ('.txt', '.csv', '.json', '.xml', '.md', '.html', '.htm'),
'archive': '.zip'
}
# Check if input is URL
if isinstance(input_path, str) and (input_path.startswith('http://') or input_path.startswith('https://')):
self._log(f"Processing URL: {input_path}")
raise NotImplementedError("URL processing not yet implemented")
# Check if input ends with any supported extension
is_supported_file = any(input_path.lower().endswith(ext)
for exts in DOCUMENT_EXTENSIONS.values()
for ext in (exts if isinstance(exts, tuple) else (exts,)))
if is_supported_file:
self._log(f"Processing as file path: {input_path}")
if not os.path.exists(input_path):
logger.error(f"File not found: {input_path}")
raise FileNotFoundError(f"File not found: {input_path}")
file_ext = '.' + input_path.lower().split('.')[-1] # Get extension reliably
# Process file based on type
if file_ext in DOCUMENT_EXTENSIONS['text']:
with open(input_path, 'r', encoding='utf-8') as file:
content = file.read().strip()
if not content:
raise ValueError("Empty text file")
memories = [self.normalize_content(content)]
else:
# Use MarkItDown for documents and media
result = self.markdown.convert(input_path)
content = result.text_content
if not content:
raise ValueError("No content could be extracted from file")
chunks = self.chunker.chunk(content)
memories = [chunk.text.strip() if hasattr(chunk, 'text') else str(chunk).strip()
for chunk in chunks if chunk]
# Set metadata for file
if not metadata:
metadata = {}
metadata['file_type'] = file_ext.lstrip('.')
metadata['filename'] = os.path.basename(input_path)
else:
# Treat as raw text content only if no file extension
memories = [self.normalize_content(input_path)]
# Store memories
all_results = []
for memory in memories:
if memory:
memory_result = self.store(memory, user_id=user_id, agent_id=agent_id,
run_id=run_id, metadata=metadata)
if memory_result:
all_results.extend(memory_result.get('results', []))
return {'results': all_results, 'relations': []}
except Exception as e:
logger.error(f"Error processing input {input_path}: {str(e)}", exc_info=True)
raise
+16 -3
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "praisonaiagents"
version = "0.0.36"
version = "0.0.38"
description = "Praison AI agents for completing complex tasks with Self Reflection Agents"
authors = [
{ name="Mervin Praison" }
@@ -17,5 +17,18 @@ dependencies = [
[project.optional-dependencies]
memory = [
"chromadb>=0.6.0"
]
"chromadb>=0.5.23"
]
knowledge = [
"mem0ai>=0.1.0",
"chromadb==0.5.23",
"markitdown",
"chonkie"
]
# Combined features
all = [
"praisonaiagents[memory]",
"praisonaiagents[knowledge]"
]
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
# Sample Markdown
## Section 1
This is a test markdown file.
## Section 2
It contains some formatted text and sections.
+3
View File
@@ -0,0 +1,3 @@
This is a sample text file.
It contains multiple lines.
This is for testing purposes.
BIN
View File
Binary file not shown.
+21
View File
@@ -0,0 +1,21 @@
import streamlit as st
from praisonaiagents import Agent, Tools
from praisonaiagents.tools import duckduckgo
st.title("AI Research Assistant")
st.write("Enter your research query below to get started!")
# Initialize the research agent
agent = Agent(instructions="You are a Research Agent", tools=[duckduckgo])
# Create the input field
query = st.text_input("Research Query", placeholder="Enter your research topic...")
# Add a search button
if st.button("Search"):
if query:
with st.spinner("Researching..."):
result = agent.start(query)
st.write(result)
else:
st.warning("Please enter a research query")
View File
Whitespace-only changes.
+919 -21
View File
File diff suppressed because it is too large. Load diff
+85
View File
@@ -0,0 +1,85 @@
---
title: "AI Agents"
description: "Overview of all available PraisonAI agents and their capabilities"
icon: "robot"
---
PraisonAI provides a diverse set of specialized agents for various tasks. Each agent is designed with specific capabilities and tools to handle different types of tasks effectively.
## Data & Analysis
<CardGroup cols={2}>
<Card title="Data Analyst" icon="chart-line" href="/agents/data-analyst">
Analyze data from various sources, create visualizations, and generate insights.
</Card>
<Card title="Finance" icon="money-bill-trend-up" href="/agents/finance">
Track stocks, analyze financial data, and provide investment recommendations.
</Card>
<Card title="Research" icon="magnifying-glass-chart" href="/agents/research">
Conduct comprehensive research and analysis across various topics.
</Card>
<Card title="Wikipedia" icon="book" href="/agents/wikipedia">
Search and extract information from Wikipedia articles.
</Card>
</CardGroup>
## Media & Content
<CardGroup cols={2}>
<Card title="Image Analysis" icon="image" href="/agents/image">
Analyze and understand visual content from images.
</Card>
<Card title="Image to Text" icon="text" href="/agents/image-to-text">
Convert images to textual descriptions and extract text content.
</Card>
<Card title="Video" icon="video" href="/agents/video">
Analyze video content and extract meaningful information.
</Card>
<Card title="Markdown" icon="markdown" href="/agents/markdown">
Generate and format content in Markdown syntax.
</Card>
</CardGroup>
## Search & Recommendations
<CardGroup cols={2}>
<Card title="Web Search" icon="globe" href="/agents/websearch">
Perform intelligent web searches and gather information.
</Card>
<Card title="Recommendation" icon="thumbs-up" href="/agents/recommendation">
Generate personalized recommendations based on preferences.
</Card>
<Card title="Shopping" icon="shop" href="/agents/shopping">
Compare prices and find the best deals across stores.
</Card>
<Card title="Planning" icon="calendar" href="/agents/planning">
Create travel plans and detailed itineraries.
</Card>
</CardGroup>
## Development
<CardGroup cols={2}>
<Card title="Programming" icon="code" href="/agents/programming">
Write, analyze, and debug code across multiple languages.
</Card>
<Card title="Single Agent" icon="circle-1" href="/agents/single">
Simple, focused agent for basic tasks without external tools.
</Card>
</CardGroup>
## Getting Started
Each agent can be easily initialized and customized for your specific needs. Here's a basic example:
```python
from praisonaiagents import Agent
# Create an agent with specific instructions
agent = Agent(instructions="Your task-specific instructions")
# Start the agent with a task
response = agent.start("Your task description")
```
For more detailed information about each agent, click on the respective cards above.
+1 -1
View File
@@ -2,7 +2,7 @@
title: "Image to Text Agent"
sidebarTitle: "Image to Text"
description: "Learn how to create AI agents for converting images to textual descriptions and extracting text from images."
icon: "image-to-text"
icon: "text"
---
```mermaid
+1 -1
View File
@@ -2,7 +2,7 @@
title: "Shopping Agent"
sidebarTitle: "Shopping"
description: "Learn how to create AI agents for price comparison and shopping assistance."
icon: "shopping-cart"
icon: "shop"
---
```mermaid
+1 -1
View File
@@ -110,7 +110,7 @@ Loads environment variables from .env file or system and sets them.</p>
file.write(&#34;FROM python:3.11-slim\n&#34;)
file.write(&#34;WORKDIR /app\n&#34;)
file.write(&#34;COPY . .\n&#34;)
file.write(&#34;RUN pip install flask praisonai==2.0.46 gunicorn markdown\n&#34;)
file.write(&#34;RUN pip install flask praisonai==2.0.47 gunicorn markdown\n&#34;)
file.write(&#34;EXPOSE 8080\n&#34;)
file.write(&#39;CMD [&#34;gunicorn&#34;, &#34;-b&#34;, &#34;0.0.0.0:8080&#34;, &#34;api:app&#34;]\n&#39;)
+232
View File
@@ -0,0 +1,232 @@
---
title: "Knowledge"
description: "Learn how to create AI agents with custom knowledge bases"
icon: "book"
---
```mermaid
flowchart LR
subgraph In[Input]
PDF[PDF]
TXT[TXT]
MD[MD]
end
subgraph Router[Vector Store]
DB[(Chroma)]
end
subgraph Out[Agents]
A1[Agent 1]
A2[Agent 2]
A3[Agent 3]
end
In --> Router
Router --> A1
Router --> A2
Router --> A3
style In fill:#8B0000,color:#fff
style Router fill:#2E8B57,color:#fff
style Out fill:#8B0000,color:#fff
```
## Quick Start
<Steps>
<Step title="Install Package">
Install PraisonAI Agents with knowledge support:
```bash
pip install "praisonaiagents[knowledge]"
```
</Step>
<Step title="Set API Key">
Set your OpenAI API key:
```bash
export OPENAI_API_KEY=xxxxx
```
</Step>
<Step title="Create Script">
Create a new file `app.py`:
```python
from praisonaiagents import Agent
agent = Agent(
name="Knowledge Agent",
instructions="You answer questions based on the provided knowledge.",
knowledge=["small.pdf"]
)
agent.start("What is KAG in one line?")
```
</Step>
</Steps>
## Basic Usage
The simplest way to create a knowledge-based agent is without any configuration:
```python
from praisonaiagents import Agent
agent = Agent(
name="Knowledge Agent",
instructions="You answer questions based on the provided knowledge.",
knowledge=["small.pdf"]
)
agent.start("What is KAG in one line?")
```
## Advanced Configuration
For more control over the knowledge base, you can specify a configuration:
```python
from praisonaiagents import Agent
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "custom_knowledge",
"path": ".praison",
}
}
}
agent = Agent(
name="Knowledge Agent",
instructions="You answer questions based on the provided knowledge.",
knowledge=["small.pdf"],
knowledge_config=config
)
agent.start("What is KAG in one line?")
```
## Multi-Agent Knowledge System
For more complex scenarios, you can create a knowledge-based system with multiple agents:
```python
from praisonaiagents import Agent, Task, PraisonAIAgents
import logging
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Define the configuration for the Knowledge instance
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "knowledge_test",
"path": ".praison",
}
}
}
# Create an agent with knowledge capabilities
knowledge_agent = Agent(
name="KnowledgeAgent",
role="Information Specialist",
goal="Store and retrieve knowledge efficiently",
backstory="Expert in managing and utilizing stored knowledge",
knowledge=["sample.pdf"],
knowledge_config=config,
verbose=True
)
# Define a task for the agent
knowledge_task = Task(
name="knowledge_task",
description="Who is Mervin Praison?",
expected_output="Answer to the question",
agent=knowledge_agent
)
# Create and start the agents
agents = PraisonAIAgents(
agents=[knowledge_agent],
tasks=[knowledge_task],
process="sequential",
user_id="user1"
)
# Start execution
result = agents.start()
```
## Understanding Knowledge Configuration
<AccordionGroup>
<Accordion title="Vector Store Options">
- **Provider**: Choose between different vector store backends (e.g., "chroma")
- **Collection Name**: Name for your knowledge collection
- **Path**: Location to store the vector database
</Accordion>
<Accordion title="Supported File Types">
- PDF documents (*.pdf)
- Text files (*.txt)
- Markdown files (*.md, *.mdx)
- And more...
</Accordion>
<Accordion title="Multi-Agent Setup">
- **Role**: Define specialized roles for knowledge agents
- **Goal**: Set specific knowledge management objectives
- **Process**: Choose between sequential or parallel execution
</Accordion>
</AccordionGroup>
## Features
<CardGroup cols={2}>
<Card title="Custom Knowledge" icon="book">
Import your own documents and data as knowledge sources
</Card>
<Card title="Vector Storage" icon="database">
Efficient storage and retrieval of knowledge embeddings
</Card>
<Card title="Multiple Sources" icon="layer-group">
Combine multiple documents and file types
</Card>
<Card title="Persistent Storage" icon="hard-drive">
Save and reuse knowledge bases across sessions
</Card>
</CardGroup>
## Best Practices
1. **Document Preparation**
- Clean and well-formatted documents work best
- Break large documents into smaller chunks
- Use consistent formatting
2. **Knowledge Organization**
- Group related documents together
- Use meaningful file names
- Keep knowledge bases focused and relevant
3. **Performance Optimization**
- Monitor vector store size
- Clean up unused collections
- Use appropriate chunk sizes
4. **Multi-Agent Coordination**
- Define clear roles and responsibilities
- Set appropriate logging levels for debugging
- Use unique collection names for different agent groups
## Next Steps
- Learn about [Memory Management](/concepts/memory) for long-term recall
- Explore [Tool Integration](/concepts/tools) for enhanced capabilities
- Check out [Examples](/examples) for implementation ideas
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -11,7 +11,7 @@ icon: "code"
<Card
title="Predictive Maintenance"
icon="wrench"
href="/usecases/predictive-maintenance"
href="/examples/predictive-maintenance"
>
Learn how to create AI agents for predictive maintenance and equipment monitoring.
</Card>
@@ -19,7 +19,7 @@ icon: "code"
<Card
title="Emergency Response"
icon="truck-medical"
href="/usecases/emergency-response"
href="/examples/emergency-response"
>
Learn how to create AI agents for coordinated emergency response and resource management.
</Card>
@@ -27,7 +27,7 @@ icon: "code"
<Card
title="Code Review"
icon="code"
href="/usecases/code-review"
href="/examples/code-review"
>
Learn how to create AI agents for automated code review and issue resolution.
</Card>
@@ -35,7 +35,7 @@ icon: "code"
<Card
title="Adaptive Learning"
icon="graduation-cap"
href="/usecases/adaptive-learning"
href="/examples/adaptive-learning"
>
Learn how to create AI agents for personalized adaptive learning experiences.
</Card>
@@ -43,7 +43,7 @@ icon: "code"
<Card
title="Supply Chain"
icon="truck"
href="/usecases/supply-chain"
href="/examples/supply-chain"
>
Learn how to create AI agents for supply chain risk management and mitigation.
</Card>
@@ -51,7 +51,7 @@ icon: "code"
<Card
title="Customer Service"
icon="headset"
href="/usecases/customer-service"
href="/examples/customer-service"
>
Learn how to create AI agents for automated customer service and support.
</Card>
@@ -59,7 +59,7 @@ icon: "code"
<Card
title="Fraud Detection"
icon="shield-check"
href="/usecases/fraud-detection"
href="/examples/fraud-detection"
>
Learn how to create AI agents for real-time fraud detection and alert management.
</Card>
@@ -67,7 +67,7 @@ icon: "code"
<Card
title="Healthcare Diagnosis"
icon="stethoscope"
href="/usecases/healthcare-diagnosis"
href="/examples/healthcare-diagnosis"
>
Learn how to create AI agents for medical diagnosis and treatment recommendations.
</Card>
@@ -75,7 +75,7 @@ icon: "code"
<Card
title="Smart City"
icon="city"
href="/usecases/smart-city"
href="/examples/smart-city"
>
Learn how to create AI agents for smart city resource optimization and management.
</Card>
@@ -83,7 +83,7 @@ icon: "code"
<Card
title="Multilingual Content"
icon="language"
href="/usecases/multilingual-content"
href="/examples/multilingual-content"
>
Learn how to create AI agents for multilingual content generation and cultural adaptation.
</Card>
File renamed without changes.
File renamed without changes.
File renamed without changes.
+25 -16
View File
@@ -60,12 +60,16 @@
"url": "/index"
},
{
"name": "Use Cases",
"url": "/usecases"
"name": "Examples",
"url": "/examples"
},
{
"name": "Agents",
"url": "/agents"
},
{
"name": "UI",
"url": "/ui"
}
],
"navigation": [
@@ -88,7 +92,8 @@
"concepts/tasks",
"concepts/process",
"concepts/tools",
"concepts/memory"
"concepts/memory",
"concepts/knowledge"
]
},
{
@@ -134,23 +139,25 @@
]
},
{
"group": "Usecases",
"group": "Examples",
"pages": [
"usecases/predictive-maintenance",
"usecases/emergency-response",
"usecases/code-review",
"usecases/fraud-detection",
"usecases/supply-chain",
"usecases/healthcare-diagnosis",
"usecases/customer-service",
"usecases/smart-city",
"usecases/multilingual-content",
"usecases/adaptive-learning"
"examples/examples",
"examples/predictive-maintenance",
"examples/emergency-response",
"examples/code-review",
"examples/fraud-detection",
"examples/supply-chain",
"examples/healthcare-diagnosis",
"examples/customer-service",
"examples/smart-city",
"examples/multilingual-content",
"examples/adaptive-learning"
]
},
{
"group": "Agents",
"pages": [
"agents/agents",
"agents/data-analyst",
"agents/finance",
"agents/image",
@@ -217,10 +224,12 @@
{
"group": "User Interface",
"pages": [
"ui/overview",
"ui/gradio",
"ui/streamlit",
"ui/ui",
"ui/chat",
"ui/code",
"ui/realtime"
"ui/code"
]
},
{
+147
View File
@@ -0,0 +1,147 @@
---
title: "Gradio Agent"
sidebarTitle: "Gradio"
description: "Learn how to create web interfaces for your AI agents using Gradio"
icon: "browser"
---
```mermaid
flowchart LR
In[User Input] --> UI[Gradio UI]
UI --> Agent[AI Agent]
Agent --> Out[Results Display]
style In fill:#8B0000,color:#fff
style UI fill:#2E8B57,color:#fff
style Agent fill:#2E8B57,color:#fff
style Out fill:#8B0000,color:#fff
```
## Quick Start
<Steps>
<Step title="Install Dependencies">
First, install the required packages:
```bash
pip install praisonaiagents gradio
```
</Step>
<Step title="Create Script">
Create a new file `app.py`:
```python
import gradio as gr
from praisonaiagents import Agent, Tools
from praisonaiagents.tools import duckduckgo
def research(query):
agent = Agent(instructions="You are a Research Agent", tools=[duckduckgo])
result = agent.start(query)
# Format the result with enhanced markdown
formatted_result = f"""
{result}
----
*Generated by PraisonAI Research Assistant*
"""
return formatted_result
# Create a simple Gradio interface
demo = gr.Interface(
fn=research,
inputs=gr.Textbox(
label="Research Query",
placeholder="Enter your research topic...",
lines=2
),
outputs=gr.Markdown(
show_copy_button=True,
height=500,
container=True
),
title="AI Research Assistant",
description="Enter your research query below to get started!",
)
if __name__ == "__main__":
demo.launch()
```
</Step>
<Step title="Run Application">
Run your Gradio app:
```bash
python app.py
```
</Step>
</Steps>
## Features
<CardGroup cols={2}>
<Card title="Simple Interface" icon="wand-magic-sparkles">
Create beautiful UIs with minimal code.
</Card>
<Card title="Markdown Support" icon="markdown">
Rich text output with built-in markdown rendering.
</Card>
<Card title="Copy Button" icon="copy">
One-click copying of results.
</Card>
<Card title="Responsive Design" icon="mobile">
Mobile-friendly interface out of the box.
</Card>
</CardGroup>
## Understanding the Code
The example demonstrates a simple research assistant with these key components:
1. **Function Definition**:
- `research()` function that processes user input
- Agent initialization and execution
- Result formatting with markdown
2. **Interface Setup**:
- Input textbox configuration
- Markdown output with copy button
- Title and description settings
3. **Launch Configuration**:
- Main entry point check
- Server launch with default settings
## Customization
You can enhance the UI with additional Gradio components:
```python
# Add multiple input types
demo = gr.Interface(
fn=process_inputs,
inputs=[
gr.Textbox(label="Query"),
gr.File(label="Upload Document"),
gr.Dropdown(choices=["Option 1", "Option 2"])
],
outputs=[
gr.Markdown(label="Results"),
gr.Plot(label="Visualization")
]
)
# Add themes and styling
demo = gr.Interface(
...
theme="default",
css=".gradio-container {background-color: #f0f0f0}"
)
# Add authentication
demo.launch(auth=("username", "password"))
```
## Next Steps
- Learn about [Prompt Chaining](/features/promptchaining) for complex UI workflows
- Explore [Evaluator Optimizer](/features/evaluator-optimiser) for improving responses
- Check out [Streamlit Integration](/ui/streamlit) for an alternative UI framework
+63
View File
@@ -0,0 +1,63 @@
---
title: "User Interfaces"
sidebarTitle: "Overview"
description: "Overview of available user interfaces for PraisonAI agents"
icon: "browser"
---
## Available Interfaces
| Interface | Description | URL |
|---|---|---|
| **Streamlit** | Create interactive web apps with Python | [https://docs.praison.ai/ui/streamlit](/ui/streamlit) |
| **Gradio** | Build machine learning web apps rapidly | [https://docs.praison.ai/ui/gradio](/ui/gradio) |
| **UI** | Multi Agents such as CrewAI or AutoGen | [https://docs.praison.ai/ui/ui](/ui/ui) |
| **Chat** | Chat with 100+ LLMs, single AI Agent | [https://docs.praison.ai/ui/chat](/ui/chat) |
| **Code** | Chat with entire Codebase, single AI Agent | [https://docs.praison.ai/ui/code](/ui/code) |
## Interface Types
<CardGroup cols={2}>
<Card title="Web Applications" icon="browser">
Create full-featured web interfaces with Streamlit and Gradio.
</Card>
<Card title="Chat Interfaces" icon="messages">
Build conversational experiences with Chat and Chainlit.
</Card>
<Card title="Code Interaction" icon="code">
Interact with codebases using the Code interface.
</Card>
<Card title="Multi-Agent Systems" icon="users">
Orchestrate multiple agents with UI framework.
</Card>
</CardGroup>
## Features by Interface
### Web Frameworks
- **Streamlit**: Interactive components, real-time updates, data visualization
- **Gradio**: Rapid prototyping, markdown support, file handling
### Chat Systems
- **Chat**: Multiple LLM support, conversation history, context management
### Specialized Interfaces
- **UI**: Agent orchestration, workflow management, inter-agent communication
- **Code**: Codebase navigation, syntax highlighting, version control integration
## Getting Started
<Steps>
<Step title="Choose Interface">
Select the interface that best matches your use case from the table above.
</Step>
<Step title="Install Dependencies">
Each interface has its own installation requirements. Follow the specific guide.
</Step>
<Step title="Create Application">
Use the provided examples and templates to build your application.
</Step>
<Step title="Customize">
Add features and styling to match your needs using the interface's components.
</Step>
</Steps>
+124
View File
@@ -0,0 +1,124 @@
---
title: "Streamlit Agent"
sidebarTitle: "Streamlit"
description: "Learn how to create web interfaces for your AI agents using Streamlit"
icon: "browser"
---
```mermaid
flowchart LR
In[User Input] --> UI[Streamlit UI]
UI --> Agent[AI Agent]
Agent --> Out[Results Display]
style In fill:#8B0000,color:#fff
style UI fill:#2E8B57,color:#fff
style Agent fill:#2E8B57,color:#fff
style Out fill:#8B0000,color:#fff
```
## Quick Start
<Steps>
<Step title="Install Dependencies">
First, install the required packages:
```bash
pip install praisonaiagents streamlit
```
</Step>
<Step title="Create Script">
Create a new file `app.py`:
```python
import streamlit as st
from praisonaiagents import Agent, Tools
from praisonaiagents.tools import duckduckgo
st.title("AI Research Assistant")
st.write("Enter your research query below to get started!")
# Initialize the research agent
agent = Agent(instructions="You are a Research Agent", tools=[duckduckgo])
# Create the input field
query = st.text_input("Research Query", placeholder="Enter your research topic...")
# Add a search button
if st.button("Search"):
if query:
with st.spinner("Researching..."):
result = agent.start(query)
st.write(result)
else:
st.warning("Please enter a research query")
```
</Step>
<Step title="Run Application">
Run your Streamlit app:
```bash
streamlit run app.py
```
</Step>
</Steps>
## Features
<CardGroup cols={2}>
<Card title="Easy Integration" icon="puzzle-piece">
Seamlessly integrate AI agents with Streamlit's UI components.
</Card>
<Card title="Interactive UI" icon="hand-pointer">
Create responsive interfaces with real-time updates.
</Card>
<Card title="Progress Indicators" icon="spinner">
Built-in loading states and progress indicators.
</Card>
<Card title="Rich Output" icon="text-size">
Display formatted text, markdown, and other rich content.
</Card>
</CardGroup>
## Understanding the Code
The example demonstrates a simple research assistant with these key components:
1. **UI Setup**:
- Title and description using `st.title()` and `st.write()`
- Input field with `st.text_input()`
- Search button with `st.button()`
2. **Agent Integration**:
- Initialize the AI agent with specific instructions
- Connect the agent to the UI components
- Handle user input and display results
3. **User Experience**:
- Loading spinner during processing
- Input validation and error messages
- Clean result display
## Customization
You can enhance the UI with additional Streamlit components:
```python
# Add sidebar options
st.sidebar.title("Settings")
model = st.sidebar.selectbox("Select Model", ["GPT-3", "GPT-4"])
# Add multiple input types
text_input = st.text_area("Long Query", height=100)
file_input = st.file_uploader("Upload File")
# Display results with formatting
st.markdown("### Results")
st.json(structured_data)
st.dataframe(tabular_data)
```
## Next Steps
- Learn about [Prompt Chaining](/features/promptchaining) for complex UI workflows
- Explore [Evaluator Optimizer](/features/evaluator-optimiser) for improving responses
- Check out [Gradio Integration](/ui/gradio) for an alternative UI framework
+43 -35
View File
@@ -1,30 +1,44 @@
---
title: "UI"
description: "Comprehensive guide to PraisonAI's user interfaces, including Chainlit, Gradio, and Streamlit integrations with step-by-step setup instructions"
icon: "desktop"
title: "User Interface"
sidebarTitle: "UI"
description: "Interface to Build multi-agent systems with PraisonAI Agent's framework"
icon: "users"
---
<div className="relative w-full aspect-video">
<iframe
className="absolute top-0 left-0 w-full h-full"
src="https://www.youtube.com/embed/tg-ZjNl3OCg"
title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
</div>
## Installation
## Different User Interfaces:
```bash
pip install -U "praisonai[ui]"
```
| Interface | Description | URL |
|---|---|---|
| **UI** | Multi Agents such as CrewAI or AutoGen | [https://docs.praison.ai/ui/ui](https://docs.praison.ai/ui/ui) |
| **Chat** | Chat with 100+ LLMs, single AI Agent | [https://docs.praison.ai/ui/chat](https://docs.praison.ai/ui/chat) |
| **Code** | Chat with entire Codebase, single AI Agent | [https://docs.praison.ai/ui/code](https://docs.praison.ai/ui/code) |
## Interface Types
<CardGroup cols={2}>
<Card title="Multi-Agent Systems" icon="users">
Orchestrate multiple agents with UI framework.
</Card>
</CardGroup>
## Features
Agent orchestration, workflow management, inter-agent communication
## Getting Started
<Steps>
<Step title="Install Dependencies">
Each interface has its own installation requirements. Follow the specific guide.
</Step>
<Step title="Create Application">
Use the provided examples and templates to build your application.
</Step>
<Step title="Customize">
Add features and styling to match your needs using the interface's components.
</Step>
</Steps>
## Chainlit
```bash
pip install -U "praisonai[ui]"
export OPENAI_API_KEY="Enter your API key"
chainlit create-secret
export CHAINLIT_AUTH_SECRET=xxxxxxxx
@@ -49,22 +63,6 @@ CHAINLIT_USERNAME=admin
CHAINLIT_USERNAME=admin
```
## Gradio
```bash
pip install "praisonai[gradio]"
export OPENAI_API_KEY="Enter your API key"
praisonai --ui gradio
```
## Streamlit
```bash
git clone https://github.com/leporejoseph/PraisonAi-Streamlit
cd PraisonAi-Streamlit
pip install -r requirements.txt
streamlit run app.py
```
## Using Chainlit (with Pictures)
## Run Automatically
@@ -103,3 +101,13 @@ streamlit run app.py
### Manual Model Output
![Manual Model Output](../images/ui-step-11.png)
<div className="relative w-full aspect-video">
<iframe
className="absolute top-0 left-0 w-full h-full"
src="https://www.youtube.com/embed/tg-ZjNl3OCg"
title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
></iframe>
</div>
@@ -0,0 +1,48 @@
from praisonaiagents import Agent, Task, PraisonAIAgents
import logging
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Define the configuration for the Knowledge instance
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "knowledge_test",
"path": ".praison",
}
}
}
# Create an agent with knowledge capabilities
knowledge_agent = Agent(
name="KnowledgeAgent",
role="Information Specialist",
goal="Store and retrieve knowledge efficiently",
backstory="Expert in managing and utilizing stored knowledge",
knowledge=["sample.pdf"],
knowledge_config=config,
verbose=True
)
# Define a task for the agent
knowledge_task = Task(
name="knowledge_task",
description="Who is Mervin Praison?",
expected_output="Answer to the question",
agent=knowledge_agent
)
# Create and start the agents
agents = PraisonAIAgents(
agents=[knowledge_agent],
tasks=[knowledge_task],
process="sequential",
user_id="user1"
)
# Start execution
result = agents.start()
+20
View File
@@ -0,0 +1,20 @@
from praisonaiagents import Agent
config = {
"vector_store": {
"provider": "chroma",
"config": {
"collection_name": "custom_knowledge",
"path": ".praison",
}
}
}
agent = Agent(
name="Knowledge Agent",
instructions="You answer questions based on the provided knowledge.",
knowledge=["small.pdf"],
knowledge_config=config
)
agent.start("What is KAG in one line?")
+34
View File
@@ -0,0 +1,34 @@
import gradio as gr
from praisonaiagents import Agent, Tools
from praisonaiagents.tools import duckduckgo
def research(query):
agent = Agent(instructions="You are a Research Agent", tools=[duckduckgo])
result = agent.start(query)
# Format the result with enhanced markdown
formatted_result = f"""
{result}
----
*Generated by PraisonAI Research Assistant*
"""
return formatted_result
# Create a simple Gradio interface
demo = gr.Interface(
fn=research,
inputs=gr.Textbox(
label="Research Query",
placeholder="Enter your research topic...",
lines=2
),
outputs=gr.Markdown(
show_copy_button=True,
height=500,
container=True
),
title="AI Research Assistant",
description="Enter your research query below to get started!",
)
if __name__ == "__main__":
demo.launch()
+21
View File
@@ -0,0 +1,21 @@
import streamlit as st
from praisonaiagents import Agent, Tools
from praisonaiagents.tools import duckduckgo
st.title("AI Research Assistant")
st.write("Enter your research query below to get started!")
# Initialize the research agent
agent = Agent(instructions="You are a Research Agent", tools=[duckduckgo])
# Create the input field
query = st.text_input("Research Query", placeholder="Enter your research topic...")
# Add a search button
if st.button("Search"):
if query:
with st.spinner("Researching..."):
result = agent.start(query)
st.write(result)
else:
st.warning("Please enter a research query")
+1 -1
View File
@@ -3,7 +3,7 @@ class Praisonai < Formula
desc "AI tools for various AI applications"
homepage "https://github.com/MervinPraison/PraisonAI"
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/2.0.46.tar.gz"
url "https://github.com/MervinPraison/PraisonAI/archive/refs/tags/2.0.47.tar.gz"
sha256 "1828fb9227d10f991522c3f24f061943a254b667196b40b1a3e4a54a8d30ce32" # Replace with actual SHA256 checksum
license "MIT"
+1 -1
View File
@@ -56,7 +56,7 @@ class CloudDeployer:
file.write("FROM python:3.11-slim\n")
file.write("WORKDIR /app\n")
file.write("COPY . .\n")
file.write("RUN pip install flask praisonai==2.0.46 gunicorn markdown\n")
file.write("RUN pip install flask praisonai==2.0.47 gunicorn markdown\n")
file.write("EXPOSE 8080\n")
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
+4 -4
View File
@@ -229,7 +229,7 @@ except Exception as e:
@cl.on_chat_start
async def start():
initialize_db()
model_name = load_setting("model_name") or os.getenv("MODEL_NAME", "gpt-4o-mini")
model_name = load_setting("model_name") or os.getenv("MODEL_NAME", "gpt-4o-mini-realtime-preview")
cl.user_session.set("model_name", model_name)
cl.user_session.set("message_history", []) # Initialize message history
logger.debug(f"Model name: {model_name}")
@@ -238,7 +238,7 @@ async def start():
# TextInput(
# id="model_name",
# label="Enter the Model Name",
# placeholder="e.g., gpt-4o-mini",
# placeholder="e.g., gpt-4o-mini-realtime-preview",
# initial=model_name
# )
# ]
@@ -423,14 +423,14 @@ def auth_callback(username: str, password: str):
@cl.on_chat_resume
async def on_chat_resume(thread: ThreadDict):
logger.info(f"Resuming chat: {thread['id']}")
model_name = load_setting("model_name") or os.getenv("MODEL_NAME") or "gpt-4o-mini"
model_name = load_setting("model_name") or os.getenv("MODEL_NAME") or "gpt-4o-mini-realtime-preview"
logger.debug(f"Model name: {model_name}")
settings = cl.ChatSettings(
[
TextInput(
id="model_name",
label="Enter the Model Name",
placeholder="e.g., gpt-4o-mini",
placeholder="e.g., gpt-4o-mini-realtime-preview",
initial=model_name
)
]
+11 -11
View File
@@ -1,7 +1,7 @@
[project]
name = "PraisonAI"
version = "2.0.46"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human–agent collaboration."
version = "2.0.47"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration."
readme = "README.md"
license = ""
requires-python = ">=3.10,<3.13"
@@ -12,7 +12,7 @@ dependencies = [
"rich>=13.7",
"markdown>=3.5",
"pyparsing>=3.0.0",
"praisonaiagents>=0.0.36",
"praisonaiagents>=0.0.38",
"python-dotenv>=0.19.0",
"instructor>=1.3.3",
"PyYAML>=6.0",
@@ -20,7 +20,7 @@ dependencies = [
[project.optional-dependencies]
ui = [
"chainlit==2.0.1",
"chainlit==2.0.3",
"sqlalchemy>=2.0.36",
"aiosqlite>=0.20.0",
"greenlet>=3.0.3",
@@ -34,7 +34,7 @@ openai = ["langchain-openai>=0.1.7"]
anthropic = ["langchain-anthropic>=0.1.13"]
cohere = ["langchain-cohere>=0.1.4"]
chat = [
"chainlit==2.0.1",
"chainlit==2.0.3",
"litellm>=1.41.8",
"aiosqlite>=0.20.0",
"greenlet>=3.0.3",
@@ -46,7 +46,7 @@ chat = [
"pydantic<=2.10.1"
]
code = [
"chainlit==2.0.1",
"chainlit==2.0.3",
"litellm>=1.41.8",
"aiosqlite>=0.20.0",
"greenlet>=3.0.3",
@@ -57,7 +57,7 @@ code = [
"pydantic<=2.10.1"
]
realtime = [
"chainlit==2.0.1",
"chainlit==2.0.3",
"litellm>=1.41.8",
"aiosqlite>=0.20.0",
"greenlet>=3.0.3",
@@ -84,7 +84,7 @@ autogen = ["pyautogen>=0.2.19", "praisonai-tools>=0.0.7", "crewai"]
[tool.poetry]
name = "PraisonAI"
version = "2.0.46"
version = "2.0.47"
description = "PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human–agent collaboration."
authors = ["Mervin Praison"]
license = ""
@@ -102,14 +102,14 @@ python = ">=3.10,<3.13"
rich = ">=13.7"
markdown = ">=3.5"
pyparsing = ">=3.0.0"
praisonaiagents = ">=0.0.36"
praisonaiagents = ">=0.0.38"
python-dotenv = ">=0.19.0"
instructor = ">=1.3.3"
PyYAML = ">=6.0"
pyautogen = {version = ">=0.2.19", optional = true}
crewai = {version = ">=0.32.0", optional = true}
praisonai-tools = {version = ">=0.0.7", optional = true}
chainlit = {version = "==2.0rc1", optional = true}
chainlit = {version = "==2.0.3", optional = true}
gradio = {version = ">=4.26.0", optional = true}
flask = {version = ">=3.0.0", optional = true}
agentops = {version = ">=0.3.12", optional = true}
@@ -173,7 +173,7 @@ mkdocstrings-python = "*"
pdoc3 = "*"
xmlrunner = "*"
unittest2 = "*"
chainlit = "==2.0rc1"
chainlit = "==2.0.3"
gradio = ">=4.26.0"
flask = ">=3.0.0"
agentops = ">=0.3.12"
Generated
+14 -14
View File
@@ -482,7 +482,7 @@ wheels = [
[[package]]
name = "chainlit"
version = "2.0.1"
version = "2.0.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiofiles" },
@@ -508,9 +508,9 @@ dependencies = [
{ name = "uvicorn" },
{ name = "watchfiles" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e0/15/26dc5f957c6344813b2ae8c6f52cc820a7074088509ea947da0cf76ffc5f/chainlit-2.0.1.tar.gz", hash = "sha256:9fb7728aa5704e823c5b5d51f570dcfabafdcc97c23a73e6047f65eb72c938e7", size = 4637433 }
sdist = { url = "https://files.pythonhosted.org/packages/c5/f8/b9e147e388fd2b28e6dcd699c96603416cace6d7ec91d3355baadbfffe6d/chainlit-2.0.3.tar.gz", hash = "sha256:a312879420f470eeeffff27823c70a20cace1d32ff5bb4f103b537870fa8b0a0", size = 4638905 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ca/99/c63fa2e1d7b949c034b7fc838a0c00de22cd2cec30245e379c9dd15dedfd/chainlit-2.0.1-py3-none-any.whl", hash = "sha256:84982902c6f42a91ac341ea9b6d52e6b1348e53a60ee49b4ffe0e5e5be02f4ba", size = 4703745 },
{ url = "https://files.pythonhosted.org/packages/de/10/131110305858c750b46585e55a084a33165aebcd59b0eb96d815ee9a9187/chainlit-2.0.3-py3-none-any.whl", hash = "sha256:d177b5e2e9cf55cb93a864e932cd30e6277aabdb11eb957a5f8f7111bc5275e8", size = 4707072 },
]
[[package]]
@@ -2199,7 +2199,7 @@ wheels = [
[[package]]
name = "literalai"
version = "0.0.623"
version = "0.1.103"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "chevron" },
@@ -2207,7 +2207,7 @@ dependencies = [
{ name = "packaging" },
{ name = "pydantic" },
]
sdist = { url = "https://files.pythonhosted.org/packages/41/af/07d943e62a1297a7b44777297c0dca8f4bfcd6ae18b9df7d3cd9c1970e29/literalai-0.0.623.tar.gz", hash = "sha256:d65c04dde6b1e99d585e4112a607e5fd574d282b70f600c55a671018340dfb0f", size = 57081 }
sdist = { url = "https://files.pythonhosted.org/packages/fc/fc/628b39e31b368aacbca51721ba7a66a4d140e9be916a0c7396664fdaed7a/literalai-0.1.103.tar.gz", hash = "sha256:060e86e63c0f53041a737b2183354ac092ee8cd9faec817dc95df639bb263a7d", size = 62540 }
[[package]]
name = "lxml"
@@ -3060,7 +3060,7 @@ wheels = [
[[package]]
name = "praisonai"
version = "2.0.46"
version = "2.0.47"
source = { editable = "." }
dependencies = [
{ name = "instructor" },
@@ -3164,10 +3164,10 @@ requires-dist = [
{ name = "aiosqlite", marker = "extra == 'code'", specifier = ">=0.20.0" },
{ name = "aiosqlite", marker = "extra == 'realtime'", specifier = ">=0.20.0" },
{ name = "aiosqlite", marker = "extra == 'ui'", specifier = ">=0.20.0" },
{ name = "chainlit", marker = "extra == 'chat'", specifier = "==2.0.1" },
{ name = "chainlit", marker = "extra == 'code'", specifier = "==2.0.1" },
{ name = "chainlit", marker = "extra == 'realtime'", specifier = "==2.0.1" },
{ name = "chainlit", marker = "extra == 'ui'", specifier = "==2.0.1" },
{ name = "chainlit", marker = "extra == 'chat'", specifier = "==2.0.3" },
{ name = "chainlit", marker = "extra == 'code'", specifier = "==2.0.3" },
{ name = "chainlit", marker = "extra == 'realtime'", specifier = "==2.0.3" },
{ name = "chainlit", marker = "extra == 'ui'", specifier = "==2.0.3" },
{ name = "crawl4ai", marker = "extra == 'chat'", specifier = "==0.3.4" },
{ name = "crawl4ai", marker = "extra == 'code'", specifier = "==0.3.4" },
{ name = "crawl4ai", marker = "extra == 'realtime'", specifier = "==0.3.4" },
@@ -3197,7 +3197,7 @@ requires-dist = [
{ name = "plotly", marker = "extra == 'realtime'", specifier = ">=5.24.0" },
{ name = "praisonai-tools", marker = "extra == 'autogen'", specifier = ">=0.0.7" },
{ name = "praisonai-tools", marker = "extra == 'crewai'", specifier = ">=0.0.7" },
{ name = "praisonaiagents", specifier = ">=0.0.36" },
{ name = "praisonaiagents", specifier = ">=0.0.38" },
{ name = "pyautogen", marker = "extra == 'autogen'", specifier = ">=0.2.19" },
{ name = "pydantic", marker = "extra == 'chat'", specifier = "<=2.10.1" },
{ name = "pydantic", marker = "extra == 'code'", specifier = "<=2.10.1" },
@@ -3250,16 +3250,16 @@ wheels = [
[[package]]
name = "praisonaiagents"
version = "0.0.36"
version = "0.0.38"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "openai" },
{ name = "pydantic" },
{ name = "rich" },
]
sdist = { url = "https://files.pythonhosted.org/packages/95/42/4c41d4fd2467d6ec156ec53609a8ff176ec3915c7c196fcb4b8ff2faff42/praisonaiagents-0.0.36.tar.gz", hash = "sha256:a13fd30ec2be40d05c4e689f37dcb4bbbce6dced5118ed5b2e130bc11443029f", size = 69554 }
sdist = { url = "https://files.pythonhosted.org/packages/ac/57/6960631f138850e4076dc0d450b09e91dea7dbc8adc7a92508d191a0e748/praisonaiagents-0.0.38.tar.gz", hash = "sha256:0489221466fdd5dfd8962c74ae0196f0b986f0711be763fbf5e683324210af84", size = 75011 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/49/e0/f34256aed4573aa92bcee1a28f6e3322368be49633dfe9e00fe805d1b37d/praisonaiagents-0.0.36-py3-none-any.whl", hash = "sha256:1767f30fdf3d4c27383742a8392af99e742fad80d740f8847679a2274909070d", size = 86287 },
{ url = "https://files.pythonhosted.org/packages/11/e7/5a32bff222ecd1d24ba059f055951cd943ac108e53e1d29e98d7c3d701be/praisonaiagents-0.0.38-py3-none-any.whl", hash = "sha256:26c35aa017935162669f5404286c3202c37065316d903de6c550cfdd57e6cabc", size = 92685 },
]
[[package]]