praisonAI 2.6.2__tar.gz → 2.6.3__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.6.2 → praisonai-2.6.3}/PKG-INFO +15 -11
- {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/PKG-INFO +15 -11
- {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/SOURCES.txt +1 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/requires.txt +1 -1
- {praisonai-2.6.2 → praisonai-2.6.3}/README.md +13 -9
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/__init__.py +6 -0
- praisonai-2.6.3/praisonai/cli/features/ollama.py +361 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/templates.py +55 -9
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/tools.py +202 -1
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/main.py +68 -20
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy.py +1 -1
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/tool_override.py +166 -9
- praisonai-2.6.3/praisonai/version.py +1 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/pyproject.toml +1 -1
- praisonai-2.6.2/praisonai/version.py +0 -1
- {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/__main__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/readers.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/agent_scheduler.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/agents_generator.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/api/call.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/auto.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/chainlit_ui.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/chat/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/chat/app.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/agents.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/at_mentions.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/auto_memory.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/autonomy_mode.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/background.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/checkpoints.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/compaction.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/compare.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/cost_tracker.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/eval.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/external_agents.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/fast_context.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/flow_display.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/git_integration.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/guardrail.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/handoff.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/hooks.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/image.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/interactive_tui.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/jobs.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/knowledge.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/mcp.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/message_queue.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/metrics.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/n8n.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/observability.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/output_style.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/profile.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/profiling.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/repo_map.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/router.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/sandbox_executor.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/session.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/skills.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/slash_commands.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/telemetry.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/thinking.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/todo.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/agent_tools.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/db/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/db/adapter.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/api.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/docker.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/doctor.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/main.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/models.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/aws.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/azure.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/gcp.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/schema.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inc/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inc/config.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inc/models.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/executor.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/models.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/router.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/server.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/store.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/config.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/factory.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/orchestrator.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/profiler.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/base.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/build.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/post_install.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/cache.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/discovery.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/loader.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/registry.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/resolver.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/security.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/test.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/train.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/train_vision.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/agents.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/callbacks.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/chat.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/code.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/colab.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/colab_chainlit.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/context.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/database_config.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/db.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/realtime.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/realtimeclient/__init__.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/realtimeclient/tools.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/sql_alchemy.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/upload_vision.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/setup.cfg +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_agents_playbook.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_approval_system.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_basic.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_cli_features.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_double_api_fix.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_n8n_integration.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_phase2_refactor.py +0 -0
- {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_runner.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.3
|
|
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.4.
|
|
14
|
+
Requires-Dist: praisonaiagents>=0.4.1
|
|
15
15
|
Requires-Dist: python-dotenv>=0.19.0
|
|
16
16
|
Requires-Dist: instructor>=1.3.3
|
|
17
17
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -2091,18 +2091,22 @@ manager.delete_checkpoint("deploy-v1")
|
|
|
2091
2091
|
|
|
2092
2092
|
### Tools CLI:
|
|
2093
2093
|
```bash
|
|
2094
|
-
# List all available tools
|
|
2095
2094
|
praisonai tools list
|
|
2096
|
-
|
|
2097
|
-
# Get info about a specific tool
|
|
2098
2095
|
praisonai tools info internet_search
|
|
2099
|
-
|
|
2100
|
-
# Search for tools
|
|
2101
2096
|
praisonai tools search "web"
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
praisonai tools
|
|
2105
|
-
|
|
2097
|
+
praisonai tools doctor
|
|
2098
|
+
praisonai tools resolve shell_tool
|
|
2099
|
+
praisonai tools discover
|
|
2100
|
+
praisonai tools show-sources
|
|
2101
|
+
praisonai tools show-sources --template ai-video-editor
|
|
2102
|
+
```
|
|
2103
|
+
|
|
2104
|
+
| Command | Example | Docs |
|
|
2105
|
+
|---------|---------|------|
|
|
2106
|
+
| `tools list` | [example](examples/tools/) | [docs](https://docs.praison.ai/docs/cli/tools) |
|
|
2107
|
+
| `tools resolve` | [example](examples/tools/example_tools_resolve.py) | [docs](https://docs.praison.ai/docs/cli/tools-resolve) |
|
|
2108
|
+
| `tools discover` | [example](examples/tools/example_tools_discover.py) | [docs](https://docs.praison.ai/docs/cli/tools-discover) |
|
|
2109
|
+
| `tools show-sources` | [example](examples/tools/example_tools_sources.py) | [docs](https://docs.praison.ai/docs/cli/tools-show-sources) |
|
|
2106
2110
|
|
|
2107
2111
|
### Handoff CLI:
|
|
2108
2112
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.3
|
|
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.4.
|
|
14
|
+
Requires-Dist: praisonaiagents>=0.4.1
|
|
15
15
|
Requires-Dist: python-dotenv>=0.19.0
|
|
16
16
|
Requires-Dist: instructor>=1.3.3
|
|
17
17
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -2091,18 +2091,22 @@ manager.delete_checkpoint("deploy-v1")
|
|
|
2091
2091
|
|
|
2092
2092
|
### Tools CLI:
|
|
2093
2093
|
```bash
|
|
2094
|
-
# List all available tools
|
|
2095
2094
|
praisonai tools list
|
|
2096
|
-
|
|
2097
|
-
# Get info about a specific tool
|
|
2098
2095
|
praisonai tools info internet_search
|
|
2099
|
-
|
|
2100
|
-
# Search for tools
|
|
2101
2096
|
praisonai tools search "web"
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
praisonai tools
|
|
2105
|
-
|
|
2097
|
+
praisonai tools doctor
|
|
2098
|
+
praisonai tools resolve shell_tool
|
|
2099
|
+
praisonai tools discover
|
|
2100
|
+
praisonai tools show-sources
|
|
2101
|
+
praisonai tools show-sources --template ai-video-editor
|
|
2102
|
+
```
|
|
2103
|
+
|
|
2104
|
+
| Command | Example | Docs |
|
|
2105
|
+
|---------|---------|------|
|
|
2106
|
+
| `tools list` | [example](examples/tools/) | [docs](https://docs.praison.ai/docs/cli/tools) |
|
|
2107
|
+
| `tools resolve` | [example](examples/tools/example_tools_resolve.py) | [docs](https://docs.praison.ai/docs/cli/tools-resolve) |
|
|
2108
|
+
| `tools discover` | [example](examples/tools/example_tools_discover.py) | [docs](https://docs.praison.ai/docs/cli/tools-discover) |
|
|
2109
|
+
| `tools show-sources` | [example](examples/tools/example_tools_sources.py) | [docs](https://docs.praison.ai/docs/cli/tools-show-sources) |
|
|
2106
2110
|
|
|
2107
2111
|
### Handoff CLI:
|
|
2108
2112
|
```bash
|
|
@@ -62,6 +62,7 @@ praisonai/cli/features/message_queue.py
|
|
|
62
62
|
praisonai/cli/features/metrics.py
|
|
63
63
|
praisonai/cli/features/n8n.py
|
|
64
64
|
praisonai/cli/features/observability.py
|
|
65
|
+
praisonai/cli/features/ollama.py
|
|
65
66
|
praisonai/cli/features/output_style.py
|
|
66
67
|
praisonai/cli/features/persistence.py
|
|
67
68
|
praisonai/cli/features/profile.py
|
|
@@ -1994,18 +1994,22 @@ manager.delete_checkpoint("deploy-v1")
|
|
|
1994
1994
|
|
|
1995
1995
|
### Tools CLI:
|
|
1996
1996
|
```bash
|
|
1997
|
-
# List all available tools
|
|
1998
1997
|
praisonai tools list
|
|
1999
|
-
|
|
2000
|
-
# Get info about a specific tool
|
|
2001
1998
|
praisonai tools info internet_search
|
|
2002
|
-
|
|
2003
|
-
# Search for tools
|
|
2004
1999
|
praisonai tools search "web"
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
praisonai tools
|
|
2008
|
-
|
|
2000
|
+
praisonai tools doctor
|
|
2001
|
+
praisonai tools resolve shell_tool
|
|
2002
|
+
praisonai tools discover
|
|
2003
|
+
praisonai tools show-sources
|
|
2004
|
+
praisonai tools show-sources --template ai-video-editor
|
|
2005
|
+
```
|
|
2006
|
+
|
|
2007
|
+
| Command | Example | Docs |
|
|
2008
|
+
|---------|---------|------|
|
|
2009
|
+
| `tools list` | [example](examples/tools/) | [docs](https://docs.praison.ai/docs/cli/tools) |
|
|
2010
|
+
| `tools resolve` | [example](examples/tools/example_tools_resolve.py) | [docs](https://docs.praison.ai/docs/cli/tools-resolve) |
|
|
2011
|
+
| `tools discover` | [example](examples/tools/example_tools_discover.py) | [docs](https://docs.praison.ai/docs/cli/tools-discover) |
|
|
2012
|
+
| `tools show-sources` | [example](examples/tools/example_tools_sources.py) | [docs](https://docs.praison.ai/docs/cli/tools-show-sources) |
|
|
2009
2013
|
|
|
2010
2014
|
### Handoff CLI:
|
|
2011
2015
|
```bash
|
|
@@ -35,6 +35,7 @@ Features:
|
|
|
35
35
|
- thinking: Thinking budget management
|
|
36
36
|
- compaction: Context compaction settings
|
|
37
37
|
- output_style: Output style configuration
|
|
38
|
+
- ollama: Ollama provider and Weak-Model-Proof execution
|
|
38
39
|
"""
|
|
39
40
|
|
|
40
41
|
# Type hints available for IDE support
|
|
@@ -87,6 +88,8 @@ __all__ = [
|
|
|
87
88
|
'ThinkingHandler',
|
|
88
89
|
'CompactionHandler',
|
|
89
90
|
'OutputStyleHandler',
|
|
91
|
+
# Ollama + WMP
|
|
92
|
+
'OllamaHandler',
|
|
90
93
|
]
|
|
91
94
|
|
|
92
95
|
def __getattr__(name):
|
|
@@ -204,4 +207,7 @@ def __getattr__(name):
|
|
|
204
207
|
elif name == 'OutputStyleHandler':
|
|
205
208
|
from .output_style import OutputStyleHandler
|
|
206
209
|
return OutputStyleHandler
|
|
210
|
+
elif name == 'OllamaHandler':
|
|
211
|
+
from .ollama import OllamaHandler
|
|
212
|
+
return OllamaHandler
|
|
207
213
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Ollama CLI Handler
|
|
3
|
+
|
|
4
|
+
CLI support for Ollama provider and Weak-Model-Proof execution.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from typing import Any, Dict, List, Optional
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class OllamaHandler:
|
|
15
|
+
"""
|
|
16
|
+
Handler for Ollama CLI commands.
|
|
17
|
+
|
|
18
|
+
Supports:
|
|
19
|
+
- --provider ollama
|
|
20
|
+
- --weak-model-proof / --wmp
|
|
21
|
+
- --ollama-host
|
|
22
|
+
- --ollama-model
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
model: str = "llama3.2:3b",
|
|
28
|
+
host: Optional[str] = None,
|
|
29
|
+
weak_model_proof: bool = True,
|
|
30
|
+
verbose: bool = False,
|
|
31
|
+
**kwargs
|
|
32
|
+
):
|
|
33
|
+
"""
|
|
34
|
+
Initialize Ollama handler.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
model: Ollama model name
|
|
38
|
+
host: Ollama server host
|
|
39
|
+
weak_model_proof: Enable WMP
|
|
40
|
+
verbose: Verbose output
|
|
41
|
+
**kwargs: Additional options
|
|
42
|
+
"""
|
|
43
|
+
self.model = model
|
|
44
|
+
self.host = host or os.environ.get("OLLAMA_HOST", "http://localhost:11434")
|
|
45
|
+
self.weak_model_proof = weak_model_proof
|
|
46
|
+
self.verbose = verbose
|
|
47
|
+
self.extra_kwargs = kwargs
|
|
48
|
+
|
|
49
|
+
self._provider = None
|
|
50
|
+
self._wmp_hooks = None
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def provider(self):
|
|
54
|
+
"""Lazy-load Ollama provider."""
|
|
55
|
+
if self._provider is None:
|
|
56
|
+
try:
|
|
57
|
+
from praisonai.providers import OllamaProvider
|
|
58
|
+
self._provider = OllamaProvider(
|
|
59
|
+
model=self.model,
|
|
60
|
+
host=self.host,
|
|
61
|
+
weak_model_proof=self.weak_model_proof,
|
|
62
|
+
**self.extra_kwargs
|
|
63
|
+
)
|
|
64
|
+
except ImportError as e:
|
|
65
|
+
logger.error(f"Failed to import OllamaProvider: {e}")
|
|
66
|
+
raise
|
|
67
|
+
return self._provider
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def wmp_hooks(self):
|
|
71
|
+
"""Lazy-load WMP hooks."""
|
|
72
|
+
if self._wmp_hooks is None and self.weak_model_proof:
|
|
73
|
+
try:
|
|
74
|
+
from praisonai.wmp import WMPHooks, WeakModelProofConfig
|
|
75
|
+
|
|
76
|
+
# Auto-configure based on model
|
|
77
|
+
config = WeakModelProofConfig.for_ollama(
|
|
78
|
+
self._detect_model_size()
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
self._wmp_hooks = WMPHooks(
|
|
82
|
+
config=config,
|
|
83
|
+
llm_fn=self._llm_fn,
|
|
84
|
+
)
|
|
85
|
+
except ImportError as e:
|
|
86
|
+
logger.warning(f"WMP not available: {e}")
|
|
87
|
+
self._wmp_hooks = None
|
|
88
|
+
return self._wmp_hooks
|
|
89
|
+
|
|
90
|
+
def _detect_model_size(self) -> str:
|
|
91
|
+
"""Detect model size from name."""
|
|
92
|
+
model_lower = self.model.lower()
|
|
93
|
+
|
|
94
|
+
if any(x in model_lower for x in ["70b", "72b", "65b"]):
|
|
95
|
+
return "large"
|
|
96
|
+
elif any(x in model_lower for x in ["13b", "14b", "7b", "8b"]):
|
|
97
|
+
return "medium"
|
|
98
|
+
else:
|
|
99
|
+
return "small"
|
|
100
|
+
|
|
101
|
+
def _llm_fn(self, prompt: str) -> str:
|
|
102
|
+
"""LLM function for WMP."""
|
|
103
|
+
response = self.provider.chat(prompt)
|
|
104
|
+
return response.content
|
|
105
|
+
|
|
106
|
+
def chat(
|
|
107
|
+
self,
|
|
108
|
+
message: str,
|
|
109
|
+
system: Optional[str] = None,
|
|
110
|
+
stream: bool = False,
|
|
111
|
+
) -> str:
|
|
112
|
+
"""
|
|
113
|
+
Send a chat message.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
message: User message
|
|
117
|
+
system: System prompt
|
|
118
|
+
stream: Enable streaming
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Response text
|
|
122
|
+
"""
|
|
123
|
+
if self.weak_model_proof and self.wmp_hooks:
|
|
124
|
+
# Use WMP execution
|
|
125
|
+
self.wmp_hooks.on_task_start(message)
|
|
126
|
+
|
|
127
|
+
messages = [{"role": "user", "content": message}]
|
|
128
|
+
if system:
|
|
129
|
+
messages.insert(0, {"role": "system", "content": system})
|
|
130
|
+
|
|
131
|
+
enhanced_messages = self.wmp_hooks.on_before_llm_call(messages)
|
|
132
|
+
|
|
133
|
+
# Call Ollama
|
|
134
|
+
response = self.provider.chat(
|
|
135
|
+
messages=enhanced_messages,
|
|
136
|
+
stream=stream,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
if stream:
|
|
140
|
+
# Collect streamed response
|
|
141
|
+
full_response = ""
|
|
142
|
+
for chunk in response:
|
|
143
|
+
full_response += chunk
|
|
144
|
+
if self.verbose:
|
|
145
|
+
print(chunk, end="", flush=True)
|
|
146
|
+
if self.verbose:
|
|
147
|
+
print()
|
|
148
|
+
response_text = full_response
|
|
149
|
+
else:
|
|
150
|
+
response_text = response.content
|
|
151
|
+
|
|
152
|
+
# Post-process with WMP
|
|
153
|
+
response_text = self.wmp_hooks.on_after_llm_call(response_text)
|
|
154
|
+
|
|
155
|
+
return response_text
|
|
156
|
+
else:
|
|
157
|
+
# Direct Ollama call
|
|
158
|
+
response = self.provider.chat(
|
|
159
|
+
messages=message,
|
|
160
|
+
system=system,
|
|
161
|
+
stream=stream,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
if stream:
|
|
165
|
+
full_response = ""
|
|
166
|
+
for chunk in response:
|
|
167
|
+
full_response += chunk
|
|
168
|
+
if self.verbose:
|
|
169
|
+
print(chunk, end="", flush=True)
|
|
170
|
+
if self.verbose:
|
|
171
|
+
print()
|
|
172
|
+
return full_response
|
|
173
|
+
else:
|
|
174
|
+
return response.content
|
|
175
|
+
|
|
176
|
+
def execute(
|
|
177
|
+
self,
|
|
178
|
+
task: str,
|
|
179
|
+
tools: Optional[List] = None,
|
|
180
|
+
) -> Dict[str, Any]:
|
|
181
|
+
"""
|
|
182
|
+
Execute a task with WMP.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
task: Task description
|
|
186
|
+
tools: Available tools
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
Execution result
|
|
190
|
+
"""
|
|
191
|
+
if self.weak_model_proof:
|
|
192
|
+
try:
|
|
193
|
+
from praisonai.wmp import WMPExecutor, WeakModelProofConfig
|
|
194
|
+
|
|
195
|
+
config = WeakModelProofConfig.for_ollama(
|
|
196
|
+
self._detect_model_size()
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
executor = WMPExecutor(config=config)
|
|
200
|
+
result = executor.execute(
|
|
201
|
+
task=task,
|
|
202
|
+
llm_fn=self._llm_fn,
|
|
203
|
+
tools=tools,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
return result.to_dict()
|
|
207
|
+
|
|
208
|
+
except ImportError:
|
|
209
|
+
logger.warning("WMP not available, falling back to direct execution")
|
|
210
|
+
|
|
211
|
+
# Direct execution
|
|
212
|
+
response = self.chat(task)
|
|
213
|
+
return {
|
|
214
|
+
"success": True,
|
|
215
|
+
"result": response,
|
|
216
|
+
"wmp_enabled": False,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
def list_models(self) -> List[Dict[str, Any]]:
|
|
220
|
+
"""List available Ollama models."""
|
|
221
|
+
return self.provider.list_models()
|
|
222
|
+
|
|
223
|
+
def pull_model(self, model: str) -> None:
|
|
224
|
+
"""Pull a model from Ollama registry."""
|
|
225
|
+
if self.verbose:
|
|
226
|
+
print(f"Pulling model: {model}")
|
|
227
|
+
|
|
228
|
+
for progress in self.provider.pull_model(model, stream=True):
|
|
229
|
+
if self.verbose and hasattr(progress, 'status'):
|
|
230
|
+
print(f" {progress.status}", end="\r")
|
|
231
|
+
|
|
232
|
+
if self.verbose:
|
|
233
|
+
print(f"\nModel {model} pulled successfully")
|
|
234
|
+
|
|
235
|
+
def is_available(self) -> bool:
|
|
236
|
+
"""Check if Ollama is available."""
|
|
237
|
+
return self.provider.is_available()
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def handle_ollama_command(args, unknown_args: List[str] = None) -> int:
|
|
241
|
+
"""
|
|
242
|
+
Handle Ollama CLI commands.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
args: Parsed arguments
|
|
246
|
+
unknown_args: Unknown arguments
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
Exit code
|
|
250
|
+
"""
|
|
251
|
+
from rich.console import Console
|
|
252
|
+
console = Console()
|
|
253
|
+
|
|
254
|
+
# Get options from args
|
|
255
|
+
model = getattr(args, 'ollama_model', None) or getattr(args, 'model', 'llama3.2:3b')
|
|
256
|
+
host = getattr(args, 'ollama_host', None)
|
|
257
|
+
wmp = getattr(args, 'weak_model_proof', True)
|
|
258
|
+
verbose = getattr(args, 'verbose', False)
|
|
259
|
+
|
|
260
|
+
try:
|
|
261
|
+
handler = OllamaHandler(
|
|
262
|
+
model=model,
|
|
263
|
+
host=host,
|
|
264
|
+
weak_model_proof=wmp,
|
|
265
|
+
verbose=verbose,
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
# Check availability
|
|
269
|
+
if not handler.is_available():
|
|
270
|
+
console.print("[red]Error: Ollama server not available[/red]")
|
|
271
|
+
console.print(f"Make sure Ollama is running at {handler.host}")
|
|
272
|
+
return 1
|
|
273
|
+
|
|
274
|
+
# Get command/prompt
|
|
275
|
+
prompt = getattr(args, 'command', None) or getattr(args, 'direct_prompt', None)
|
|
276
|
+
|
|
277
|
+
if not prompt:
|
|
278
|
+
console.print("[yellow]No prompt provided[/yellow]")
|
|
279
|
+
return 1
|
|
280
|
+
|
|
281
|
+
# Execute
|
|
282
|
+
if wmp:
|
|
283
|
+
console.print(f"[dim]Using Ollama with Weak-Model-Proof ({model})[/dim]")
|
|
284
|
+
else:
|
|
285
|
+
console.print(f"[dim]Using Ollama ({model})[/dim]")
|
|
286
|
+
|
|
287
|
+
result = handler.execute(prompt)
|
|
288
|
+
|
|
289
|
+
if result.get("success"):
|
|
290
|
+
console.print(result.get("result", ""))
|
|
291
|
+
|
|
292
|
+
if verbose and result.get("wmp_enabled"):
|
|
293
|
+
console.print(f"\n[dim]Steps: {result.get('steps_executed', 0)}, "
|
|
294
|
+
f"Retries: {result.get('retries', 0)}[/dim]")
|
|
295
|
+
else:
|
|
296
|
+
console.print(f"[red]Error: {result.get('error', 'Unknown error')}[/red]")
|
|
297
|
+
return 1
|
|
298
|
+
|
|
299
|
+
return 0
|
|
300
|
+
|
|
301
|
+
except Exception as e:
|
|
302
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
303
|
+
if verbose:
|
|
304
|
+
import traceback
|
|
305
|
+
console.print(traceback.format_exc())
|
|
306
|
+
return 1
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def add_ollama_arguments(parser) -> None:
|
|
310
|
+
"""
|
|
311
|
+
Add Ollama-related arguments to parser.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
parser: ArgumentParser instance
|
|
315
|
+
"""
|
|
316
|
+
parser.add_argument(
|
|
317
|
+
"--provider",
|
|
318
|
+
type=str,
|
|
319
|
+
choices=["ollama", "litellm", "openai"],
|
|
320
|
+
help="LLM provider to use"
|
|
321
|
+
)
|
|
322
|
+
parser.add_argument(
|
|
323
|
+
"--ollama-model",
|
|
324
|
+
type=str,
|
|
325
|
+
default="llama3.2:3b",
|
|
326
|
+
help="Ollama model name (e.g., llama3.2:3b, mistral, qwen2.5:7b)"
|
|
327
|
+
)
|
|
328
|
+
parser.add_argument(
|
|
329
|
+
"--ollama-host",
|
|
330
|
+
type=str,
|
|
331
|
+
help="Ollama server host (default: http://localhost:11434)"
|
|
332
|
+
)
|
|
333
|
+
parser.add_argument(
|
|
334
|
+
"--weak-model-proof", "--wmp",
|
|
335
|
+
action="store_true",
|
|
336
|
+
default=None,
|
|
337
|
+
dest="weak_model_proof",
|
|
338
|
+
help="Enable Weak-Model-Proof execution (default: auto for Ollama)"
|
|
339
|
+
)
|
|
340
|
+
parser.add_argument(
|
|
341
|
+
"--no-wmp",
|
|
342
|
+
action="store_false",
|
|
343
|
+
dest="weak_model_proof",
|
|
344
|
+
help="Disable Weak-Model-Proof execution"
|
|
345
|
+
)
|
|
346
|
+
parser.add_argument(
|
|
347
|
+
"--wmp-strict",
|
|
348
|
+
action="store_true",
|
|
349
|
+
help="Use strict WMP mode (more retries, stricter validation)"
|
|
350
|
+
)
|
|
351
|
+
parser.add_argument(
|
|
352
|
+
"--wmp-fast",
|
|
353
|
+
action="store_true",
|
|
354
|
+
help="Use fast WMP mode (fewer retries, faster execution)"
|
|
355
|
+
)
|
|
356
|
+
parser.add_argument(
|
|
357
|
+
"--step-budget",
|
|
358
|
+
type=int,
|
|
359
|
+
default=10,
|
|
360
|
+
help="Maximum steps for WMP execution (default: 10)"
|
|
361
|
+
)
|
|
@@ -472,10 +472,12 @@ class TemplatesHandler:
|
|
|
472
472
|
template_args = args[1:]
|
|
473
473
|
offline = "--offline" in args
|
|
474
474
|
strict_tools = "--strict-tools" in args
|
|
475
|
+
no_template_tools_py = "--no-template-tools-py" in args
|
|
475
476
|
|
|
476
|
-
# Parse --tools
|
|
477
|
+
# Parse --tools, --tools-dir, --tools-source overrides
|
|
477
478
|
tools_files = []
|
|
478
479
|
tools_dirs = []
|
|
480
|
+
tools_sources_override = []
|
|
479
481
|
i = 0
|
|
480
482
|
while i < len(args):
|
|
481
483
|
if args[i] == "--tools" and i + 1 < len(args):
|
|
@@ -484,6 +486,9 @@ class TemplatesHandler:
|
|
|
484
486
|
elif args[i] == "--tools-dir" and i + 1 < len(args):
|
|
485
487
|
tools_dirs.append(args[i + 1])
|
|
486
488
|
i += 2
|
|
489
|
+
elif args[i] == "--tools-source" and i + 1 < len(args):
|
|
490
|
+
tools_sources_override.append(args[i + 1])
|
|
491
|
+
i += 2
|
|
487
492
|
else:
|
|
488
493
|
i += 1
|
|
489
494
|
|
|
@@ -530,13 +535,33 @@ class TemplatesHandler:
|
|
|
530
535
|
|
|
531
536
|
# Load tool overrides if specified
|
|
532
537
|
tool_registry = None
|
|
538
|
+
from praisonai.templates.tool_override import create_tool_registry_with_overrides, resolve_tools
|
|
539
|
+
|
|
540
|
+
# Get template directory for local tools.py autoload (unless disabled)
|
|
541
|
+
template_dir = None
|
|
542
|
+
if not no_template_tools_py:
|
|
543
|
+
template_dir = str(template.path) if template.path else None
|
|
544
|
+
|
|
545
|
+
# Get tools_sources from template requires + CLI overrides
|
|
546
|
+
tools_sources = []
|
|
547
|
+
if template.requires and isinstance(template.requires, dict):
|
|
548
|
+
ts = template.requires.get("tools_sources", [])
|
|
549
|
+
if ts:
|
|
550
|
+
tools_sources.extend(ts)
|
|
551
|
+
# Add CLI --tools-source overrides
|
|
552
|
+
if tools_sources_override:
|
|
553
|
+
tools_sources.extend(tools_sources_override)
|
|
554
|
+
|
|
555
|
+
# Always build registry (includes defaults + template sources)
|
|
556
|
+
tool_registry = create_tool_registry_with_overrides(
|
|
557
|
+
override_files=tools_files if tools_files else None,
|
|
558
|
+
override_dirs=tools_dirs if tools_dirs else None,
|
|
559
|
+
include_defaults=True,
|
|
560
|
+
tools_sources=tools_sources if tools_sources else None,
|
|
561
|
+
template_dir=template_dir,
|
|
562
|
+
)
|
|
563
|
+
|
|
533
564
|
if tools_files or tools_dirs:
|
|
534
|
-
from praisonai.templates.tool_override import create_tool_registry_with_overrides
|
|
535
|
-
tool_registry = create_tool_registry_with_overrides(
|
|
536
|
-
override_files=tools_files,
|
|
537
|
-
override_dirs=tools_dirs,
|
|
538
|
-
include_defaults=True
|
|
539
|
-
)
|
|
540
565
|
print(f"✓ Loaded {len(tool_registry)} tools from overrides")
|
|
541
566
|
|
|
542
567
|
# Load and run workflow
|
|
@@ -560,12 +585,20 @@ class TemplatesHandler:
|
|
|
560
585
|
agent_map = {}
|
|
561
586
|
|
|
562
587
|
for agent_cfg in agents_config:
|
|
588
|
+
# Resolve tool names to callable tools
|
|
589
|
+
agent_tool_names = agent_cfg.get("tools", [])
|
|
590
|
+
resolved_agent_tools = resolve_tools(
|
|
591
|
+
agent_tool_names,
|
|
592
|
+
registry=tool_registry,
|
|
593
|
+
template_dir=template_dir
|
|
594
|
+
)
|
|
595
|
+
|
|
563
596
|
agent = Agent(
|
|
564
597
|
name=agent_cfg.get("name", "Agent"),
|
|
565
598
|
role=agent_cfg.get("role", ""),
|
|
566
599
|
goal=agent_cfg.get("goal", ""),
|
|
567
600
|
backstory=agent_cfg.get("backstory", ""),
|
|
568
|
-
tools=
|
|
601
|
+
tools=resolved_agent_tools,
|
|
569
602
|
llm=agent_cfg.get("llm"),
|
|
570
603
|
verbose=agent_cfg.get("verbose", True)
|
|
571
604
|
)
|
|
@@ -597,8 +630,21 @@ class TemplatesHandler:
|
|
|
597
630
|
)
|
|
598
631
|
praison_agents.start()
|
|
599
632
|
elif "steps" in workflow_config:
|
|
600
|
-
# Workflow format (steps)
|
|
633
|
+
# Workflow format (steps) - resolve tools in each step's agent
|
|
601
634
|
from praisonaiagents import Workflow
|
|
635
|
+
|
|
636
|
+
# Resolve tools for each step's agent if specified
|
|
637
|
+
steps = workflow_config.get("steps", [])
|
|
638
|
+
for step in steps:
|
|
639
|
+
if "agent" in step and isinstance(step["agent"], dict):
|
|
640
|
+
agent_cfg = step["agent"]
|
|
641
|
+
if "tools" in agent_cfg:
|
|
642
|
+
agent_cfg["tools"] = resolve_tools(
|
|
643
|
+
agent_cfg["tools"],
|
|
644
|
+
registry=tool_registry,
|
|
645
|
+
template_dir=template_dir
|
|
646
|
+
)
|
|
647
|
+
|
|
602
648
|
workflow = Workflow(**workflow_config)
|
|
603
649
|
workflow.run()
|
|
604
650
|
else:
|