praisonAI 2.5.2__tar.gz → 2.5.4__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.
- {praisonai-2.5.2 → praisonai-2.5.4}/PKG-INFO +2 -2
- {praisonai-2.5.2 → praisonai-2.5.4}/PraisonAI.egg-info/PKG-INFO +2 -2
- {praisonai-2.5.2 → praisonai-2.5.4}/PraisonAI.egg-info/requires.txt +1 -1
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/adapters/rerankers.py +15 -15
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/adapters/vector_stores.py +11 -1
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/chat/__init__.py +4 -12
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/knowledge.py +147 -1
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/deploy.py +1 -1
- praisonai-2.5.4/praisonai/version.py +1 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/pyproject.toml +1 -1
- praisonai-2.5.2/praisonai/version.py +0 -1
- {praisonai-2.5.2 → praisonai-2.5.4}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/README.md +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/__main__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/adapters/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/adapters/readers.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/agent_scheduler.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/agents_generator.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/api/call.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/auto.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/chainlit_ui.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/chat/app.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/agents.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/at_mentions.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/auto_memory.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/autonomy_mode.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/background.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/base.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/checkpoints.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/compare.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/cost_tracker.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/eval.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/external_agents.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/fast_context.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/flow_display.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/git_integration.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/guardrail.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/handoff.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/hooks.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/image.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/interactive_tui.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/jobs.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/mcp.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/message_queue.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/metrics.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/n8n.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/observability.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/profile.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/profiling.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/repo_map.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/router.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/sandbox_executor.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/session.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/skills.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/slash_commands.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/telemetry.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/todo.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/tools.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/main.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/agent_tools.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/db/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/db/adapter.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/inc/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/inc/config.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/inc/models.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/integrations/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/integrations/base.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/jobs/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/jobs/executor.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/jobs/models.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/jobs/router.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/jobs/server.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/jobs/store.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/config.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/factory.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/orchestrator.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/base.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/profiler.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler/base.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/scheduler.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/setup/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/setup/build.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/setup/post_install.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/setup.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/test.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/train.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/train_vision.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/agents.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/callbacks.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/chat.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/code.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/colab.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/colab_chainlit.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/context.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/database_config.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/db.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/realtime.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/realtimeclient/__init__.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/realtimeclient/tools.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/ui/sql_alchemy.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/praisonai/upload_vision.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/setup.cfg +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_agents_playbook.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_approval_system.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_basic.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_cli_features.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_double_api_fix.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_n8n_integration.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_phase2_refactor.py +0 -0
- {praisonai-2.5.2 → praisonai-2.5.4}/tests/test_runner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.4
|
|
4
4
|
Summary: 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.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -11,7 +11,7 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
Requires-Dist: rich>=13.7
|
|
12
12
|
Requires-Dist: markdown>=3.5
|
|
13
13
|
Requires-Dist: pyparsing>=3.0.0
|
|
14
|
-
Requires-Dist: praisonaiagents>=0.3.
|
|
14
|
+
Requires-Dist: praisonaiagents>=0.3.4
|
|
15
15
|
Requires-Dist: python-dotenv>=0.19.0
|
|
16
16
|
Requires-Dist: instructor>=1.3.3
|
|
17
17
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.4
|
|
4
4
|
Summary: 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.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -11,7 +11,7 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
Requires-Dist: rich>=13.7
|
|
12
12
|
Requires-Dist: markdown>=3.5
|
|
13
13
|
Requires-Dist: pyparsing>=3.0.0
|
|
14
|
-
Requires-Dist: praisonaiagents>=0.3.
|
|
14
|
+
Requires-Dist: praisonaiagents>=0.3.4
|
|
15
15
|
Requires-Dist: python-dotenv>=0.19.0
|
|
16
16
|
Requires-Dist: instructor>=1.3.3
|
|
17
17
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -57,13 +57,10 @@ class LLMReranker:
|
|
|
57
57
|
self._client = None
|
|
58
58
|
|
|
59
59
|
def _get_client(self):
|
|
60
|
-
"""
|
|
61
|
-
if self.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
import openai
|
|
65
|
-
self._client = openai.OpenAI()
|
|
66
|
-
return self._client
|
|
60
|
+
"""Get LLM client - returns self.llm if provided, otherwise None (use litellm)."""
|
|
61
|
+
if self.llm:
|
|
62
|
+
return self.llm
|
|
63
|
+
return None # Will use litellm directly
|
|
67
64
|
|
|
68
65
|
def rerank(
|
|
69
66
|
self,
|
|
@@ -118,7 +115,7 @@ class LLMReranker:
|
|
|
118
115
|
return results
|
|
119
116
|
|
|
120
117
|
def _score_document(self, query: str, document: str) -> float:
|
|
121
|
-
"""Score a single document's relevance to query."""
|
|
118
|
+
"""Score a single document's relevance to query using litellm."""
|
|
122
119
|
try:
|
|
123
120
|
client = self._get_client()
|
|
124
121
|
|
|
@@ -131,18 +128,21 @@ Document: {document[:1000]}
|
|
|
131
128
|
|
|
132
129
|
Relevance score (0-10):"""
|
|
133
130
|
|
|
134
|
-
if
|
|
135
|
-
|
|
131
|
+
# Check if client has a callable 'chat' method (PraisonAI Agent)
|
|
132
|
+
if client is not None and hasattr(client, 'chat') and callable(getattr(client, 'chat', None)):
|
|
133
|
+
# PraisonAI Agent or similar with callable chat method
|
|
136
134
|
response = client.chat(prompt)
|
|
137
135
|
else:
|
|
138
|
-
#
|
|
139
|
-
|
|
136
|
+
# Use litellm for unified multi-provider support
|
|
137
|
+
import litellm
|
|
138
|
+
|
|
139
|
+
# litellm handles model-specific quirks automatically
|
|
140
|
+
completion = litellm.completion(
|
|
140
141
|
model=self.model,
|
|
141
142
|
messages=[{"role": "user", "content": prompt}],
|
|
142
|
-
max_tokens=10
|
|
143
|
-
temperature=0
|
|
143
|
+
max_tokens=10
|
|
144
144
|
)
|
|
145
|
-
response =
|
|
145
|
+
response = completion.choices[0].message.content
|
|
146
146
|
|
|
147
147
|
# Parse score
|
|
148
148
|
if response:
|
|
@@ -107,7 +107,17 @@ class ChromaVectorStore:
|
|
|
107
107
|
) -> List[str]:
|
|
108
108
|
"""Add vectors to ChromaDB."""
|
|
109
109
|
ids = ids or [str(uuid_module.uuid4()) for _ in texts]
|
|
110
|
-
|
|
110
|
+
|
|
111
|
+
# ChromaDB requires non-empty metadata dicts
|
|
112
|
+
# Ensure each metadata dict has at least one key
|
|
113
|
+
if metadatas is None:
|
|
114
|
+
metadatas = [{"_source": "praisonai"} for _ in texts]
|
|
115
|
+
else:
|
|
116
|
+
# Ensure no empty dicts - add placeholder if empty
|
|
117
|
+
metadatas = [
|
|
118
|
+
m if m else {"_source": "praisonai"}
|
|
119
|
+
for m in metadatas
|
|
120
|
+
]
|
|
111
121
|
|
|
112
122
|
# Use different collection if namespace specified
|
|
113
123
|
if namespace and namespace != self.namespace:
|
|
@@ -79,24 +79,16 @@ def start_chat_server(
|
|
|
79
79
|
_register_agent(a)
|
|
80
80
|
|
|
81
81
|
# Start the chainlit server
|
|
82
|
-
import sys
|
|
83
82
|
from pathlib import Path
|
|
84
83
|
|
|
85
84
|
# Use the built-in app file
|
|
86
85
|
app_file = Path(__file__).parent / "app.py"
|
|
87
86
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
str(app_file),
|
|
92
|
-
"--host", config.host,
|
|
93
|
-
"--port", str(config.port),
|
|
94
|
-
]
|
|
87
|
+
# Set environment variables for chainlit
|
|
88
|
+
os.environ["CHAINLIT_HOST"] = config.host
|
|
89
|
+
os.environ["CHAINLIT_PORT"] = str(config.port)
|
|
95
90
|
|
|
96
|
-
|
|
97
|
-
sys.argv.append("-w")
|
|
98
|
-
|
|
99
|
-
run_chainlit()
|
|
91
|
+
run_chainlit(str(app_file))
|
|
100
92
|
|
|
101
93
|
|
|
102
94
|
# Global registry for agents
|
|
@@ -68,7 +68,7 @@ class KnowledgeHandler(CommandHandler):
|
|
|
68
68
|
return "knowledge"
|
|
69
69
|
|
|
70
70
|
def get_actions(self) -> List[str]:
|
|
71
|
-
return ["add", "query", "search", "list", "clear", "stats", "info", "help"]
|
|
71
|
+
return ["add", "query", "search", "list", "clear", "stats", "info", "export", "import", "help"]
|
|
72
72
|
|
|
73
73
|
def get_help_text(self) -> str:
|
|
74
74
|
return """
|
|
@@ -78,6 +78,8 @@ Knowledge Commands:
|
|
|
78
78
|
praisonai knowledge list - List indexed documents
|
|
79
79
|
praisonai knowledge clear - Clear knowledge base
|
|
80
80
|
praisonai knowledge stats - Show knowledge base statistics
|
|
81
|
+
praisonai knowledge export <file.json> - Export knowledge base to JSON file
|
|
82
|
+
praisonai knowledge import <file.json> - Import knowledge base from JSON file
|
|
81
83
|
praisonai knowledge help - Show this help message
|
|
82
84
|
|
|
83
85
|
Options:
|
|
@@ -380,6 +382,150 @@ Examples:
|
|
|
380
382
|
"""Alias for action_stats."""
|
|
381
383
|
return self.action_stats(args, **kwargs)
|
|
382
384
|
|
|
385
|
+
def action_export(self, args: List[str], **kwargs) -> bool:
|
|
386
|
+
"""
|
|
387
|
+
Export knowledge base to JSON file.
|
|
388
|
+
|
|
389
|
+
Exports all documents with their metadata, embeddings, and content
|
|
390
|
+
for backup or migration purposes.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
args: List containing output file path
|
|
394
|
+
|
|
395
|
+
Returns:
|
|
396
|
+
True if successful
|
|
397
|
+
"""
|
|
398
|
+
import json
|
|
399
|
+
from datetime import datetime
|
|
400
|
+
|
|
401
|
+
if not args:
|
|
402
|
+
# Default filename with timestamp
|
|
403
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
404
|
+
output_file = os.path.join(self.workspace, f"knowledge_export_{timestamp}.json")
|
|
405
|
+
else:
|
|
406
|
+
output_file = args[0]
|
|
407
|
+
if not os.path.isabs(output_file):
|
|
408
|
+
output_file = os.path.join(self.workspace, output_file)
|
|
409
|
+
|
|
410
|
+
knowledge = self._get_knowledge()
|
|
411
|
+
if not knowledge:
|
|
412
|
+
return False
|
|
413
|
+
|
|
414
|
+
try:
|
|
415
|
+
export_data = {
|
|
416
|
+
"version": "1.0",
|
|
417
|
+
"exported_at": datetime.now().isoformat(),
|
|
418
|
+
"workspace": self.workspace,
|
|
419
|
+
"vector_store": self.vector_store,
|
|
420
|
+
"documents": []
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
# Try to get all documents from knowledge/memory
|
|
424
|
+
if hasattr(knowledge, 'memory') and hasattr(knowledge.memory, 'get_all'):
|
|
425
|
+
all_docs = knowledge.memory.get_all()
|
|
426
|
+
if all_docs:
|
|
427
|
+
for doc in all_docs:
|
|
428
|
+
if isinstance(doc, dict):
|
|
429
|
+
export_data["documents"].append(doc)
|
|
430
|
+
else:
|
|
431
|
+
export_data["documents"].append({
|
|
432
|
+
"content": str(doc),
|
|
433
|
+
"metadata": {}
|
|
434
|
+
})
|
|
435
|
+
elif hasattr(knowledge, 'get_all'):
|
|
436
|
+
all_docs = knowledge.get_all()
|
|
437
|
+
if all_docs:
|
|
438
|
+
for doc in all_docs:
|
|
439
|
+
if isinstance(doc, dict):
|
|
440
|
+
export_data["documents"].append(doc)
|
|
441
|
+
else:
|
|
442
|
+
export_data["documents"].append({
|
|
443
|
+
"content": str(doc),
|
|
444
|
+
"metadata": {}
|
|
445
|
+
})
|
|
446
|
+
|
|
447
|
+
# Ensure output directory exists
|
|
448
|
+
os.makedirs(os.path.dirname(output_file) or ".", exist_ok=True)
|
|
449
|
+
|
|
450
|
+
with open(output_file, 'w', encoding='utf-8') as f:
|
|
451
|
+
json.dump(export_data, f, indent=2, default=str)
|
|
452
|
+
|
|
453
|
+
doc_count = len(export_data["documents"])
|
|
454
|
+
self.print_status(f"✅ Exported {doc_count} documents to {output_file}", "success")
|
|
455
|
+
return True
|
|
456
|
+
|
|
457
|
+
except Exception as e:
|
|
458
|
+
self.print_status(f"Export failed: {e}", "error")
|
|
459
|
+
return False
|
|
460
|
+
|
|
461
|
+
def action_import(self, args: List[str], **kwargs) -> bool:
|
|
462
|
+
"""
|
|
463
|
+
Import knowledge base from JSON file.
|
|
464
|
+
|
|
465
|
+
Imports documents from a previously exported JSON file.
|
|
466
|
+
|
|
467
|
+
Args:
|
|
468
|
+
args: List containing input file path
|
|
469
|
+
|
|
470
|
+
Returns:
|
|
471
|
+
True if successful
|
|
472
|
+
"""
|
|
473
|
+
import json
|
|
474
|
+
|
|
475
|
+
if not args:
|
|
476
|
+
self.print_status("Usage: praisonai knowledge import <file.json>", "error")
|
|
477
|
+
return False
|
|
478
|
+
|
|
479
|
+
input_file = args[0]
|
|
480
|
+
if not os.path.isabs(input_file):
|
|
481
|
+
input_file = os.path.join(self.workspace, input_file)
|
|
482
|
+
|
|
483
|
+
if not os.path.exists(input_file):
|
|
484
|
+
self.print_status(f"File not found: {input_file}", "error")
|
|
485
|
+
return False
|
|
486
|
+
|
|
487
|
+
knowledge = self._get_knowledge()
|
|
488
|
+
if not knowledge:
|
|
489
|
+
return False
|
|
490
|
+
|
|
491
|
+
try:
|
|
492
|
+
with open(input_file, 'r', encoding='utf-8') as f:
|
|
493
|
+
import_data = json.load(f)
|
|
494
|
+
|
|
495
|
+
# version field reserved for future schema migrations
|
|
496
|
+
_ = import_data.get("version", "unknown")
|
|
497
|
+
documents = import_data.get("documents", [])
|
|
498
|
+
|
|
499
|
+
if not documents:
|
|
500
|
+
self.print_status("No documents found in import file", "warning")
|
|
501
|
+
return True
|
|
502
|
+
|
|
503
|
+
imported_count = 0
|
|
504
|
+
for doc in documents:
|
|
505
|
+
try:
|
|
506
|
+
content = doc.get("content") or doc.get("memory") or doc.get("text", "")
|
|
507
|
+
metadata = doc.get("metadata", {})
|
|
508
|
+
|
|
509
|
+
if content:
|
|
510
|
+
if hasattr(knowledge, 'store'):
|
|
511
|
+
knowledge.store(content, metadata=metadata)
|
|
512
|
+
elif hasattr(knowledge, 'add'):
|
|
513
|
+
knowledge.add(content, metadata=metadata)
|
|
514
|
+
imported_count += 1
|
|
515
|
+
except Exception as e:
|
|
516
|
+
if self.verbose:
|
|
517
|
+
self.print_status(f"Skipped document: {e}", "warning")
|
|
518
|
+
|
|
519
|
+
self.print_status(f"✅ Imported {imported_count} documents from {input_file}", "success")
|
|
520
|
+
return True
|
|
521
|
+
|
|
522
|
+
except json.JSONDecodeError as e:
|
|
523
|
+
self.print_status(f"Invalid JSON file: {e}", "error")
|
|
524
|
+
return False
|
|
525
|
+
except Exception as e:
|
|
526
|
+
self.print_status(f"Import failed: {e}", "error")
|
|
527
|
+
return False
|
|
528
|
+
|
|
383
529
|
def execute(self, action: str, action_args: List[str], **kwargs) -> Any:
|
|
384
530
|
"""Execute knowledge command action."""
|
|
385
531
|
return super().execute(action, action_args, **kwargs)
|
|
@@ -57,7 +57,7 @@ class CloudDeployer:
|
|
|
57
57
|
file.write("FROM python:3.11-slim\n")
|
|
58
58
|
file.write("WORKDIR /app\n")
|
|
59
59
|
file.write("COPY . .\n")
|
|
60
|
-
file.write("RUN pip install flask praisonai==2.5.
|
|
60
|
+
file.write("RUN pip install flask praisonai==2.5.4 gunicorn markdown\n")
|
|
61
61
|
file.write("EXPOSE 8080\n")
|
|
62
62
|
file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
|
|
63
63
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.5.4"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.5.2"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|