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.
Files changed (227) hide show
  1. {praisonai-2.6.2 → praisonai-2.6.3}/PKG-INFO +15 -11
  2. {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/PKG-INFO +15 -11
  3. {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/SOURCES.txt +1 -0
  4. {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/requires.txt +1 -1
  5. {praisonai-2.6.2 → praisonai-2.6.3}/README.md +13 -9
  6. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/__init__.py +6 -0
  7. praisonai-2.6.3/praisonai/cli/features/ollama.py +361 -0
  8. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/templates.py +55 -9
  9. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/tools.py +202 -1
  10. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/main.py +68 -20
  11. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy.py +1 -1
  12. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/tool_override.py +166 -9
  13. praisonai-2.6.3/praisonai/version.py +1 -0
  14. {praisonai-2.6.2 → praisonai-2.6.3}/pyproject.toml +1 -1
  15. praisonai-2.6.2/praisonai/version.py +0 -1
  16. {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/dependency_links.txt +0 -0
  17. {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/entry_points.txt +0 -0
  18. {praisonai-2.6.2 → praisonai-2.6.3}/PraisonAI.egg-info/top_level.txt +0 -0
  19. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/__init__.py +0 -0
  20. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/__main__.py +0 -0
  21. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/__init__.py +0 -0
  22. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/readers.py +0 -0
  23. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/rerankers.py +0 -0
  24. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/retrievers.py +0 -0
  25. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/adapters/vector_stores.py +0 -0
  26. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/agent_scheduler.py +0 -0
  27. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/agents_generator.py +0 -0
  28. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/api/call.py +0 -0
  29. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/auto.py +0 -0
  30. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/chainlit_ui.py +0 -0
  31. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/chat/__init__.py +0 -0
  32. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/chat/app.py +0 -0
  33. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/__init__.py +0 -0
  34. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/agent_scheduler.py +0 -0
  35. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/agents.py +0 -0
  36. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/at_mentions.py +0 -0
  37. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/auto_memory.py +0 -0
  38. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/autonomy_mode.py +0 -0
  39. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/background.py +0 -0
  40. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/base.py +0 -0
  41. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/checkpoints.py +0 -0
  42. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/compaction.py +0 -0
  43. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/compare.py +0 -0
  44. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/cost_tracker.py +0 -0
  45. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/deploy.py +0 -0
  46. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/eval.py +0 -0
  47. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/external_agents.py +0 -0
  48. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/fast_context.py +0 -0
  49. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/flow_display.py +0 -0
  50. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/git_integration.py +0 -0
  51. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/guardrail.py +0 -0
  52. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/handoff.py +0 -0
  53. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/hooks.py +0 -0
  54. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/image.py +0 -0
  55. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/interactive_tui.py +0 -0
  56. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/jobs.py +0 -0
  57. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/knowledge.py +0 -0
  58. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/mcp.py +0 -0
  59. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/message_queue.py +0 -0
  60. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/metrics.py +0 -0
  61. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/n8n.py +0 -0
  62. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/observability.py +0 -0
  63. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/output_style.py +0 -0
  64. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/persistence.py +0 -0
  65. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/profile.py +0 -0
  66. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/profiling.py +0 -0
  67. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/repo_map.py +0 -0
  68. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/router.py +0 -0
  69. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/sandbox_executor.py +0 -0
  70. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/session.py +0 -0
  71. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/skills.py +0 -0
  72. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/slash_commands.py +0 -0
  73. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/telemetry.py +0 -0
  74. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/thinking.py +0 -0
  75. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/todo.py +0 -0
  76. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/features/workflow.py +0 -0
  77. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/cli/schedule_cli.py +0 -0
  78. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/__init__.py +0 -0
  79. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/agent_tools.py +0 -0
  80. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/diff/__init__.py +0 -0
  81. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/diff/diff_strategy.py +0 -0
  82. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/__init__.py +0 -0
  83. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/apply_diff.py +0 -0
  84. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/execute_command.py +0 -0
  85. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/list_files.py +0 -0
  86. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/read_file.py +0 -0
  87. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/search_replace.py +0 -0
  88. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/tools/write_file.py +0 -0
  89. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/__init__.py +0 -0
  90. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/file_utils.py +0 -0
  91. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/ignore_utils.py +0 -0
  92. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/code/utils/text_utils.py +0 -0
  93. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/db/__init__.py +0 -0
  94. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/db/adapter.py +0 -0
  95. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/__init__.py +0 -0
  96. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/api.py +0 -0
  97. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/docker.py +0 -0
  98. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/doctor.py +0 -0
  99. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/main.py +0 -0
  100. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/models.py +0 -0
  101. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/__init__.py +0 -0
  102. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/aws.py +0 -0
  103. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/azure.py +0 -0
  104. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/base.py +0 -0
  105. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/providers/gcp.py +0 -0
  106. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/deploy/schema.py +0 -0
  107. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inbuilt_tools/__init__.py +0 -0
  108. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  109. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inc/__init__.py +0 -0
  110. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inc/config.py +0 -0
  111. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/inc/models.py +0 -0
  112. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/__init__.py +0 -0
  113. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/base.py +0 -0
  114. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/claude_code.py +0 -0
  115. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/codex_cli.py +0 -0
  116. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/cursor_cli.py +0 -0
  117. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/integrations/gemini_cli.py +0 -0
  118. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/__init__.py +0 -0
  119. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/executor.py +0 -0
  120. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/models.py +0 -0
  121. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/router.py +0 -0
  122. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/server.py +0 -0
  123. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/jobs/store.py +0 -0
  124. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/__init__.py +0 -0
  125. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/config.py +0 -0
  126. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/__init__.py +0 -0
  127. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/async_mysql.py +0 -0
  128. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/async_postgres.py +0 -0
  129. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  130. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/base.py +0 -0
  131. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/json_store.py +0 -0
  132. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/mysql.py +0 -0
  133. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/postgres.py +0 -0
  134. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/singlestore.py +0 -0
  135. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/sqlite.py +0 -0
  136. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/supabase.py +0 -0
  137. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/conversation/surrealdb.py +0 -0
  138. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/factory.py +0 -0
  139. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/hooks/__init__.py +0 -0
  140. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  141. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/__init__.py +0 -0
  142. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/base.py +0 -0
  143. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/cassandra.py +0 -0
  144. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/chroma.py +0 -0
  145. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  146. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  147. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/couchbase.py +0 -0
  148. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/lancedb.py +0 -0
  149. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  150. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  151. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  152. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/milvus.py +0 -0
  153. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  154. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/pgvector.py +0 -0
  155. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/pinecone.py +0 -0
  156. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/qdrant.py +0 -0
  157. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  158. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  159. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  160. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  161. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/knowledge/weaviate.py +0 -0
  162. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/migrations/__init__.py +0 -0
  163. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/migrations/manager.py +0 -0
  164. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/orchestrator.py +0 -0
  165. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/__init__.py +0 -0
  166. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/async_mongodb.py +0 -0
  167. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/base.py +0 -0
  168. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/dynamodb.py +0 -0
  169. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/firestore.py +0 -0
  170. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/gcs.py +0 -0
  171. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/memory.py +0 -0
  172. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/mongodb.py +0 -0
  173. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/redis.py +0 -0
  174. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/state/upstash.py +0 -0
  175. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/tests/__init__.py +0 -0
  176. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/persistence/tests/test_all_backends.py +0 -0
  177. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/profiler.py +0 -0
  178. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/__init__.py +0 -0
  179. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/agent_scheduler.py +0 -0
  180. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/base.py +0 -0
  181. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/daemon_manager.py +0 -0
  182. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/state_manager.py +0 -0
  183. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler/yaml_loader.py +0 -0
  184. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/scheduler.py +0 -0
  185. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/__init__.py +0 -0
  186. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/build.py +0 -0
  187. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/post_install.py +0 -0
  188. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup/setup_conda_env.py +0 -0
  189. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/setup.py +0 -0
  190. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/__init__.py +0 -0
  191. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/cache.py +0 -0
  192. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/dependency_checker.py +0 -0
  193. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/discovery.py +0 -0
  194. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/loader.py +0 -0
  195. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/registry.py +0 -0
  196. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/resolver.py +0 -0
  197. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/security.py +0 -0
  198. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/templates/tools_doctor.py +0 -0
  199. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/test.py +0 -0
  200. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/train.py +0 -0
  201. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/train_vision.py +0 -0
  202. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/agents.py +0 -0
  203. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/callbacks.py +0 -0
  204. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/chat.py +0 -0
  205. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/code.py +0 -0
  206. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/colab.py +0 -0
  207. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/colab_chainlit.py +0 -0
  208. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/components/aicoder.py +0 -0
  209. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/context.py +0 -0
  210. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/database_config.py +0 -0
  211. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/db.py +0 -0
  212. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/realtime.py +0 -0
  213. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/realtimeclient/__init__.py +0 -0
  214. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/realtimeclient/tools.py +0 -0
  215. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/ui/sql_alchemy.py +0 -0
  216. {praisonai-2.6.2 → praisonai-2.6.3}/praisonai/upload_vision.py +0 -0
  217. {praisonai-2.6.2 → praisonai-2.6.3}/setup.cfg +0 -0
  218. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test.py +0 -0
  219. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_agents_playbook.py +0 -0
  220. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_approval_system.py +0 -0
  221. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_basic.py +0 -0
  222. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_cli_features.py +0 -0
  223. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_custom_tools_fix.py +0 -0
  224. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_double_api_fix.py +0 -0
  225. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_n8n_integration.py +0 -0
  226. {praisonai-2.6.2 → praisonai-2.6.3}/tests/test_phase2_refactor.py +0 -0
  227. {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.2
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.0
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
- # Show all commands
2104
- praisonai tools help
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.2
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.0
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
- # Show all commands
2104
- praisonai tools help
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
@@ -1,7 +1,7 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=0.4.0
4
+ praisonaiagents>=0.4.1
5
5
  python-dotenv>=0.19.0
6
6
  instructor>=1.3.3
7
7
  PyYAML>=6.0
@@ -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
- # Show all commands
2007
- praisonai tools help
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 override
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=agent_cfg.get("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: