PraisonAI 4.7.7__tar.gz → 4.7.9__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 (562) hide show
  1. {praisonai-4.7.7 → praisonai-4.7.9}/PKG-INFO +11 -9
  2. {praisonai-4.7.7 → praisonai-4.7.9}/PraisonAI.egg-info/PKG-INFO +11 -9
  3. {praisonai-4.7.7 → praisonai-4.7.9}/PraisonAI.egg-info/requires.txt +10 -8
  4. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/agents_generator.py +33 -11
  5. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/api/agent_invoke.py +93 -44
  6. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/app/agentos.py +128 -1
  7. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/passthrough.py +101 -21
  8. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/_shim.py +21 -1
  9. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/sandbox_cli.py +0 -26
  10. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/langfuse_client.py +18 -1
  11. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/db/adapter.py +81 -2
  12. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/registry.py +23 -1
  13. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/workflow_framework.py +10 -3
  14. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/executor.py +55 -15
  15. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/models.py +1 -1
  16. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/router.py +7 -1
  17. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/history.py +132 -37
  18. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/operations.py +39 -15
  19. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/run_policy.py +10 -0
  20. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/yaml_loader.py +5 -2
  21. praisonai-4.7.9/praisonai/version.py +1 -0
  22. {praisonai-4.7.7 → praisonai-4.7.9}/pyproject.toml +19 -8
  23. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_n8n_agent_invoke.py +278 -0
  24. praisonai-4.7.7/praisonai/version.py +0 -1
  25. {praisonai-4.7.7 → praisonai-4.7.9}/PraisonAI.egg-info/SOURCES.txt +0 -0
  26. {praisonai-4.7.7 → praisonai-4.7.9}/PraisonAI.egg-info/dependency_links.txt +0 -0
  27. {praisonai-4.7.7 → praisonai-4.7.9}/PraisonAI.egg-info/entry_points.txt +0 -0
  28. {praisonai-4.7.7 → praisonai-4.7.9}/PraisonAI.egg-info/top_level.txt +0 -0
  29. {praisonai-4.7.7 → praisonai-4.7.9}/README.md +0 -0
  30. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/__init__.py +0 -0
  31. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/__main__.py +0 -0
  32. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_api_auth.py +0 -0
  33. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_approval_spec.py +0 -0
  34. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_async_bridge.py +0 -0
  35. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_bootstrap.py +0 -0
  36. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_dev/__init__.py +0 -0
  37. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_dev/api_md.py +0 -0
  38. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_entrypoint.py +0 -0
  39. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_framework_availability.py +0 -0
  40. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_lazy_cache.py +0 -0
  41. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_logging.py +0 -0
  42. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_registry.py +0 -0
  43. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/_safe_loader.py +0 -0
  44. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/acp/__init__.py +0 -0
  45. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/acp/config.py +0 -0
  46. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/acp/safe_edit.py +0 -0
  47. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/acp/server.py +0 -0
  48. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/acp/session.py +0 -0
  49. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/adapters/__init__.py +0 -0
  50. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/adapters/readers.py +0 -0
  51. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/adapters/rerankers.py +0 -0
  52. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/adapters/retrievers.py +0 -0
  53. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/adapters/vector_stores.py +0 -0
  54. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/agent.py +0 -0
  55. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/agent_scheduler.py +0 -0
  56. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/api/call.py +0 -0
  57. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/app/__init__.py +0 -0
  58. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/async_agent_scheduler.py +0 -0
  59. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/audit/__init__.py +0 -0
  60. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/audit/agent_centric.py +0 -0
  61. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/auto.py +0 -0
  62. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/bots/__init__.py +0 -0
  63. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/browser/__init__.py +0 -0
  64. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/__init__.py +0 -0
  65. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/a2a.py +0 -0
  66. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/assistants.py +0 -0
  67. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/audio.py +0 -0
  68. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/batches.py +0 -0
  69. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/completions.py +0 -0
  70. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/container_files.py +0 -0
  71. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/containers.py +0 -0
  72. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/embeddings.py +0 -0
  73. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/files.py +0 -0
  74. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/fine_tuning.py +0 -0
  75. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/guardrails.py +0 -0
  76. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/images.py +0 -0
  77. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/mcp.py +0 -0
  78. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/messages.py +0 -0
  79. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/moderations.py +0 -0
  80. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/ocr.py +0 -0
  81. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/rag.py +0 -0
  82. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/realtime.py +0 -0
  83. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/rerank.py +0 -0
  84. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/responses.py +0 -0
  85. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/search.py +0 -0
  86. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/skills.py +0 -0
  87. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/vector_store_files.py +0 -0
  88. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/vector_stores.py +0 -0
  89. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/capabilities/videos.py +0 -0
  90. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/claw/__init__.py +0 -0
  91. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/__init__.py +0 -0
  92. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/_paths.py +0 -0
  93. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/_warnings.py +0 -0
  94. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/app.py +0 -0
  95. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/approval_backend.py +0 -0
  96. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/branding.py +0 -0
  97. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/__init__.py +0 -0
  98. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/_profiling.py +0 -0
  99. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/acp.py +0 -0
  100. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/agent.py +0 -0
  101. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/agents.py +0 -0
  102. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/app.py +0 -0
  103. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/attach.py +0 -0
  104. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/audit.py +0 -0
  105. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/auth.py +0 -0
  106. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/batch.py +0 -0
  107. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/benchmark.py +0 -0
  108. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/bot.py +0 -0
  109. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/browser.py +0 -0
  110. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/call.py +0 -0
  111. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/chat.py +0 -0
  112. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/checkpoint.py +0 -0
  113. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/claw.py +0 -0
  114. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/code.py +0 -0
  115. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/command.py +0 -0
  116. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/commit.py +0 -0
  117. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/completion.py +0 -0
  118. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/config.py +0 -0
  119. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/context.py +0 -0
  120. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/daemon.py +0 -0
  121. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/dashboard.py +0 -0
  122. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/debug.py +0 -0
  123. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/deploy.py +0 -0
  124. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/diag.py +0 -0
  125. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/docs.py +0 -0
  126. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/doctor.py +0 -0
  127. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/endpoints.py +0 -0
  128. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/environment.py +0 -0
  129. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/eval.py +0 -0
  130. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/examples.py +0 -0
  131. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/flow.py +0 -0
  132. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/gateway.py +0 -0
  133. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/github.py +0 -0
  134. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/hooks.py +0 -0
  135. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/identity.py +0 -0
  136. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/init.py +0 -0
  137. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/kanban.py +0 -0
  138. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/knowledge.py +0 -0
  139. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/langextract.py +0 -0
  140. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/langfuse.py +0 -0
  141. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/loop.py +0 -0
  142. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/lsp.py +0 -0
  143. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/managed.py +0 -0
  144. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/mcp.py +0 -0
  145. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/memory.py +0 -0
  146. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/mint_link.py +0 -0
  147. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/models.py +0 -0
  148. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/n8n.py +0 -0
  149. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/obs.py +0 -0
  150. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/onboard.py +0 -0
  151. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/package.py +0 -0
  152. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/pairing.py +0 -0
  153. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/paths.py +0 -0
  154. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/permissions.py +0 -0
  155. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/plugins.py +0 -0
  156. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/port.py +0 -0
  157. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/profile.py +0 -0
  158. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/publish.py +0 -0
  159. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/rag.py +0 -0
  160. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/realtime.py +0 -0
  161. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/recipe.py +0 -0
  162. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/registry.py +0 -0
  163. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/replay.py +0 -0
  164. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/research.py +0 -0
  165. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/retrieval.py +0 -0
  166. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/rules.py +0 -0
  167. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/run.py +0 -0
  168. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/sandbox.py +0 -0
  169. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/schedule.py +0 -0
  170. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/serve.py +0 -0
  171. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/session.py +0 -0
  172. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/setup.py +0 -0
  173. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/skills.py +0 -0
  174. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/standardise.py +0 -0
  175. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/templates.py +0 -0
  176. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/test.py +0 -0
  177. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/todo.py +0 -0
  178. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/tools.py +0 -0
  179. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/traces.py +0 -0
  180. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/tracker.py +0 -0
  181. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/train.py +0 -0
  182. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/ui.py +0 -0
  183. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/up.py +0 -0
  184. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/validate.py +0 -0
  185. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/version.py +0 -0
  186. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/commands/workflow.py +0 -0
  187. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/config_loader.py +0 -0
  188. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/configuration/__init__.py +0 -0
  189. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/configuration/config.schema.json +0 -0
  190. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/execution/__init__.py +0 -0
  191. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/fallback_schema.py +0 -0
  192. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/__init__.py +0 -0
  193. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/acp.py +0 -0
  194. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/agent_scheduler.py +0 -0
  195. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/agent_tools.py +0 -0
  196. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/approval.py +0 -0
  197. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/background.py +0 -0
  198. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/bots_cli.py +0 -0
  199. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/deploy.py +0 -0
  200. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/endpoints.py +0 -0
  201. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/eval.py +0 -0
  202. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/gateway.py +0 -0
  203. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/ollama.py +0 -0
  204. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/onboard.py +0 -0
  205. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/persistence.py +0 -0
  206. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/recipe.py +0 -0
  207. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/recipe_optimizer.py +0 -0
  208. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/registry.py +0 -0
  209. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/serve.py +0 -0
  210. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/templates.py +0 -0
  211. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/tools.py +0 -0
  212. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/tui/__init__.py +0 -0
  213. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/tui/app.py +0 -0
  214. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/features/workflow.py +0 -0
  215. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/interactive/__init__.py +0 -0
  216. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/interactive/async_tui.py +0 -0
  217. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/interactive/config.py +0 -0
  218. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/interactive/core.py +0 -0
  219. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/interactive/events.py +0 -0
  220. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/__init__.py +0 -0
  221. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/direct_prompt.py +0 -0
  222. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  223. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  224. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  225. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/framework_run.py +0 -0
  226. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  227. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/interactive_legacy.py +0 -0
  228. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  229. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/legacy/workflow_commands.py +0 -0
  230. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/main.py +0 -0
  231. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/output/__init__.py +0 -0
  232. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/schedule_cli.py +0 -0
  233. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/schema_provider.py +0 -0
  234. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/session/__init__.py +0 -0
  235. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/state/__init__.py +0 -0
  236. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/ui/__init__.py +0 -0
  237. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/unified_schema.py +0 -0
  238. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli/utils/__init__.py +0 -0
  239. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/cli_backends/__init__.py +0 -0
  240. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/__init__.py +0 -0
  241. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/agent_tools.py +0 -0
  242. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/diff/__init__.py +0 -0
  243. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/diff/diff_strategy.py +0 -0
  244. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/__init__.py +0 -0
  245. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/apply_diff.py +0 -0
  246. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/execute_command.py +0 -0
  247. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/list_files.py +0 -0
  248. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/read_file.py +0 -0
  249. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/search_replace.py +0 -0
  250. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/tools/write_file.py +0 -0
  251. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/utils/__init__.py +0 -0
  252. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/utils/file_utils.py +0 -0
  253. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/utils/ignore_utils.py +0 -0
  254. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/code/utils/text_utils.py +0 -0
  255. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/config/__init__.py +0 -0
  256. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/config/agents.schema.json +0 -0
  257. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/config/schema.py +0 -0
  258. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/config/validator.py +0 -0
  259. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/__init__.py +0 -0
  260. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/_storage_path.py +0 -0
  261. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/artifact_store.py +0 -0
  262. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/config.py +0 -0
  263. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/history_store.py +0 -0
  264. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/queue.py +0 -0
  265. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/setup.py +0 -0
  266. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/context/terminal_logger.py +0 -0
  267. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/daemon/__init__.py +0 -0
  268. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/db/__init__.py +0 -0
  269. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/deploy/__init__.py +0 -0
  270. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/__init__.py +0 -0
  271. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/a2u_server.py +0 -0
  272. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/discovery.py +0 -0
  273. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/__init__.py +0 -0
  274. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/a2a.py +0 -0
  275. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/a2u.py +0 -0
  276. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/agents_api.py +0 -0
  277. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/base.py +0 -0
  278. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/mcp.py +0 -0
  279. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/openai_compat.py +0 -0
  280. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/recipe.py +0 -0
  281. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  282. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/registry.py +0 -0
  283. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/endpoints/server.py +0 -0
  284. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/__init__.py +0 -0
  285. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/client.py +0 -0
  286. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  287. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  288. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/components/__init__.py +0 -0
  289. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/converter.py +0 -0
  290. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/flow/helpers.py +0 -0
  291. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/__init__.py +0 -0
  292. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/_config_builder.py +0 -0
  293. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/autogen_adapter.py +0 -0
  294. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/base.py +0 -0
  295. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/crewai_adapter.py +0 -0
  296. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
  297. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/framework_adapters/validators.py +0 -0
  298. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/gateway/__init__.py +0 -0
  299. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/inbuilt_tools/__init__.py +0 -0
  300. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  301. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/inc/__init__.py +0 -0
  302. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/inc/config.py +0 -0
  303. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/inc/models.py +0 -0
  304. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/__init__.py +0 -0
  305. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/__init__.py +0 -0
  306. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  307. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/hooks_query.py +0 -0
  308. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  309. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/schedules_runner.py +0 -0
  310. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/usage_bridge.py +0 -0
  311. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/bridges/workflows_service.py +0 -0
  312. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/context_files.py +0 -0
  313. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/gateway_host.py +0 -0
  314. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/host_app.py +0 -0
  315. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/pages/__init__.py +0 -0
  316. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/pages/bot_health.py +0 -0
  317. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integration/pages/workflow_runs.py +0 -0
  318. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/__init__.py +0 -0
  319. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/_cli_loaders.py +0 -0
  320. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/_session_info.py +0 -0
  321. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/_tool_aliases.py +0 -0
  322. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/backend_registry.py +0 -0
  323. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/base.py +0 -0
  324. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/claude_code.py +0 -0
  325. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/codex_cli.py +0 -0
  326. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/__init__.py +0 -0
  327. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/_sync_base.py +0 -0
  328. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/daytona.py +0 -0
  329. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/docker.py +0 -0
  330. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/e2b.py +0 -0
  331. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/flyio.py +0 -0
  332. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/local.py +0 -0
  333. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/modal_compute.py +0 -0
  334. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute/tenki.py +0 -0
  335. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/compute_managed_agent.py +0 -0
  336. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/cursor_cli.py +0 -0
  337. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/db_session_adapter.py +0 -0
  338. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/gemini_cli.py +0 -0
  339. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/hosted_agent.py +0 -0
  340. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/local_agent.py +0 -0
  341. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/managed_agents.py +0 -0
  342. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/managed_local.py +0 -0
  343. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/registry.py +0 -0
  344. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/integrations/sandboxed_agent.py +0 -0
  345. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/__init__.py +0 -0
  346. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/path_validation.py +0 -0
  347. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/server.py +0 -0
  348. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/jobs/store.py +0 -0
  349. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/kanban/__init__.py +0 -0
  350. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/__init__.py +0 -0
  351. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/catalogue.py +0 -0
  352. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/config.py +0 -0
  353. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/credentials.py +0 -0
  354. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/env.py +0 -0
  355. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/gateways.py +0 -0
  356. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/llm/registry.py +0 -0
  357. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/mcp_server/__init__.py +0 -0
  358. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/n8n/__init__.py +0 -0
  359. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/n8n/client.py +0 -0
  360. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/n8n/converter.py +0 -0
  361. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/n8n/preview.py +0 -0
  362. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/n8n/reverse_converter.py +0 -0
  363. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/observability/__init__.py +0 -0
  364. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/observability/hooks.py +0 -0
  365. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/observability/langextract.py +0 -0
  366. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/observability/langfuse.py +0 -0
  367. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/__init__.py +0 -0
  368. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/_valkey_client.py +0 -0
  369. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/config.py +0 -0
  370. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/__init__.py +0 -0
  371. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/_ops.py +0 -0
  372. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/_sql_base.py +0 -0
  373. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  374. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/async_mysql.py +0 -0
  375. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/async_postgres.py +0 -0
  376. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  377. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/base.py +0 -0
  378. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/json_store.py +0 -0
  379. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/mysql.py +0 -0
  380. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/postgres.py +0 -0
  381. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/singlestore.py +0 -0
  382. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/sqlite.py +0 -0
  383. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/supabase.py +0 -0
  384. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/surrealdb.py +0 -0
  385. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  386. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/conversation/turso.py +0 -0
  387. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/factory.py +0 -0
  388. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/hooks/__init__.py +0 -0
  389. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  390. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/__init__.py +0 -0
  391. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/base.py +0 -0
  392. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/cassandra.py +0 -0
  393. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/chroma.py +0 -0
  394. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  395. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  396. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/couchbase.py +0 -0
  397. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/lancedb.py +0 -0
  398. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  399. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  400. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  401. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/milvus.py +0 -0
  402. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  403. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/pgvector.py +0 -0
  404. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/pinecone.py +0 -0
  405. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/qdrant.py +0 -0
  406. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  407. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  408. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  409. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  410. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  411. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/knowledge/weaviate.py +0 -0
  412. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/migrations/__init__.py +0 -0
  413. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/migrations/manager.py +0 -0
  414. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/orchestrator.py +0 -0
  415. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/registry.py +0 -0
  416. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/__init__.py +0 -0
  417. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/async_mongodb.py +0 -0
  418. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/base.py +0 -0
  419. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/dynamodb.py +0 -0
  420. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/firestore.py +0 -0
  421. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/gcs.py +0 -0
  422. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/memory.py +0 -0
  423. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/mongodb.py +0 -0
  424. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/redis.py +0 -0
  425. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/upstash.py +0 -0
  426. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/persistence/state/valkey.py +0 -0
  427. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/profiler.py +0 -0
  428. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/push/__init__.py +0 -0
  429. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/push/client.py +0 -0
  430. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/push/transports.py +0 -0
  431. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/__init__.py +0 -0
  432. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/bridge.py +0 -0
  433. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/core.py +0 -0
  434. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/exceptions.py +0 -0
  435. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/models.py +0 -0
  436. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/policy.py +0 -0
  437. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/registry.py +0 -0
  438. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/runtime.py +0 -0
  439. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/security.py +0 -0
  440. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/serve.py +0 -0
  441. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/recipe/server.py +0 -0
  442. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/__init__.py +0 -0
  443. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/analyzer.py +0 -0
  444. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/applier.py +0 -0
  445. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/judge.py +0 -0
  446. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/plan.py +0 -0
  447. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/player.py +0 -0
  448. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/reader.py +0 -0
  449. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/storage.py +0 -0
  450. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/replay/writer.py +0 -0
  451. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/runtime/__init__.py +0 -0
  452. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/runtime/__main__.py +0 -0
  453. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/sandbox/__init__.py +0 -0
  454. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/sandbox/_registry.py +0 -0
  455. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/__init__.py +0 -0
  456. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/_base_scheduler.py +0 -0
  457. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/_delivery.py +0 -0
  458. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/_dispatch.py +0 -0
  459. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/agent_scheduler.py +0 -0
  460. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  461. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/base.py +0 -0
  462. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  463. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/condition_gate.py +0 -0
  464. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/daemon_manager.py +0 -0
  465. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/deployment.py +0 -0
  466. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/executor.py +0 -0
  467. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/shared.py +0 -0
  468. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/state_manager.py +0 -0
  469. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/scheduler/suggestion_engine.py +0 -0
  470. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/security/__init__.py +0 -0
  471. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/security/audit.py +0 -0
  472. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/security/injection.py +0 -0
  473. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/security/protected.py +0 -0
  474. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/setup/__init__.py +0 -0
  475. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/setup/build.py +0 -0
  476. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/setup/post_install.py +0 -0
  477. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/setup/setup_conda_env.py +0 -0
  478. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/setup.py +0 -0
  479. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/__init__.py +0 -0
  480. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/ai_generator.py +0 -0
  481. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/config.py +0 -0
  482. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/dedupe.py +0 -0
  483. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/discovery.py +0 -0
  484. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/drift.py +0 -0
  485. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/engine.py +0 -0
  486. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/example_verifier.py +0 -0
  487. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/models.py +0 -0
  488. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/reports.py +0 -0
  489. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/templates.py +0 -0
  490. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/undo_redo.py +0 -0
  491. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/standardise/validator.py +0 -0
  492. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/storage/__init__.py +0 -0
  493. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/storage/dynamodb_adapter.py +0 -0
  494. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/storage/mongodb_adapter.py +0 -0
  495. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/storage/postgresql_adapter.py +0 -0
  496. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/storage/redis_adapter.py +0 -0
  497. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/storage/valkey_adapter.py +0 -0
  498. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/__init__.py +0 -0
  499. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/batch_source.py +0 -0
  500. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/cli_docs_source.py +0 -0
  501. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/discovery.py +0 -0
  502. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/docs_source.py +0 -0
  503. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/examples_source.py +0 -0
  504. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/executor.py +0 -0
  505. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/models.py +0 -0
  506. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/report_viewer.py +0 -0
  507. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/reporter.py +0 -0
  508. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/suite_runner/runner.py +0 -0
  509. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/__init__.py +0 -0
  510. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/_tool_sources.py +0 -0
  511. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/cache.py +0 -0
  512. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/dependency_checker.py +0 -0
  513. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/discovery.py +0 -0
  514. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/loader.py +0 -0
  515. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/registry.py +0 -0
  516. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/resolver.py +0 -0
  517. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/security.py +0 -0
  518. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/tool_override.py +0 -0
  519. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/templates/tools_doctor.py +0 -0
  520. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tool_registry.py +0 -0
  521. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tool_resolver.py +0 -0
  522. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/__init__.py +0 -0
  523. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/audio.py +0 -0
  524. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/glob_tool.py +0 -0
  525. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/grep_tool.py +0 -0
  526. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/kanban_tools.py +0 -0
  527. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/multiedit.py +0 -0
  528. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/tools/skill_manage.py +0 -0
  529. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/train/__init__.py +0 -0
  530. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/train.py +0 -0
  531. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/train_vision.py +0 -0
  532. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui/_aiui_datastore.py +0 -0
  533. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui/_external_agents.py +0 -0
  534. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui/context.py +0 -0
  535. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui/database_config.py +0 -0
  536. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_agents/__init__.py +0 -0
  537. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_agents/default_app.py +0 -0
  538. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_bot/__init__.py +0 -0
  539. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_bot/default_app.py +0 -0
  540. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_chat/__init__.py +0 -0
  541. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_chat/default_app.py +0 -0
  542. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_dashboard/__init__.py +0 -0
  543. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_dashboard/default_app.py +0 -0
  544. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_realtime/__init__.py +0 -0
  545. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/ui_realtime/default_app.py +0 -0
  546. {praisonai-4.7.7 → praisonai-4.7.9}/praisonai/upload_vision.py +0 -0
  547. {praisonai-4.7.7 → praisonai-4.7.9}/setup.cfg +0 -0
  548. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test.py +0 -0
  549. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_agents_playbook.py +0 -0
  550. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_approval_system.py +0 -0
  551. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_basic.py +0 -0
  552. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_cli_features.py +0 -0
  553. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_custom_tools_fix.py +0 -0
  554. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_double_api_fix.py +0 -0
  555. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_n8n_cli_feature.py +0 -0
  556. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_n8n_integration.py +0 -0
  557. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_phase2_refactor.py +0 -0
  558. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_recipe.py +0 -0
  559. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_registry.py +0 -0
  560. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_runner.py +0 -0
  561. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_sandboxed_agent_compatibility.py +0 -0
  562. {praisonai-4.7.7 → praisonai-4.7.9}/tests/test_serve_features.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.7.7
3
+ Version: 4.7.9
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,14 +11,14 @@ 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>=1.7.5
15
- Requires-Dist: praisonai-code>=0.1.4
16
- Requires-Dist: praisonai-bot>=0.1.4
17
- Requires-Dist: praisonai-train>=0.1.4
18
- Requires-Dist: praisonai-browser>=0.1.4
19
- Requires-Dist: praisonai-mcp>=0.1.6
20
- Requires-Dist: praisonai-sandbox>=0.1.4
21
- Requires-Dist: praisonai-deploy>=0.1.4
14
+ Requires-Dist: praisonaiagents>=1.7.7
15
+ Requires-Dist: praisonai-code>=0.1.6
16
+ Requires-Dist: praisonai-bot>=0.1.6
17
+ Requires-Dist: praisonai-train>=0.1.6
18
+ Requires-Dist: praisonai-browser>=0.1.6
19
+ Requires-Dist: praisonai-mcp>=0.1.8
20
+ Requires-Dist: praisonai-sandbox>=0.1.6
21
+ Requires-Dist: praisonai-deploy>=0.1.6
22
22
  Requires-Dist: python-dotenv>=0.19.0
23
23
  Requires-Dist: litellm<2,>=1.83.14
24
24
  Requires-Dist: PyYAML>=6.0
@@ -140,6 +140,8 @@ Requires-Dist: agent-client-protocol>=0.7.0; extra == "acp"
140
140
  Provides-Extra: flow
141
141
  Requires-Dist: langflow>=1.0.0; extra == "flow"
142
142
  Requires-Dist: requests>=2.31.0; extra == "flow"
143
+ Requires-Dist: a2a-sdk[http-server]>=1.0.0; extra == "flow"
144
+ Requires-Dist: fastapi-pagination>=0.12.34; extra == "flow"
143
145
  Provides-Extra: lite
144
146
  Provides-Extra: all
145
147
  Requires-Dist: fastapi>=0.115.0; extra == "all"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.7.7
3
+ Version: 4.7.9
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,14 +11,14 @@ 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>=1.7.5
15
- Requires-Dist: praisonai-code>=0.1.4
16
- Requires-Dist: praisonai-bot>=0.1.4
17
- Requires-Dist: praisonai-train>=0.1.4
18
- Requires-Dist: praisonai-browser>=0.1.4
19
- Requires-Dist: praisonai-mcp>=0.1.6
20
- Requires-Dist: praisonai-sandbox>=0.1.4
21
- Requires-Dist: praisonai-deploy>=0.1.4
14
+ Requires-Dist: praisonaiagents>=1.7.7
15
+ Requires-Dist: praisonai-code>=0.1.6
16
+ Requires-Dist: praisonai-bot>=0.1.6
17
+ Requires-Dist: praisonai-train>=0.1.6
18
+ Requires-Dist: praisonai-browser>=0.1.6
19
+ Requires-Dist: praisonai-mcp>=0.1.8
20
+ Requires-Dist: praisonai-sandbox>=0.1.6
21
+ Requires-Dist: praisonai-deploy>=0.1.6
22
22
  Requires-Dist: python-dotenv>=0.19.0
23
23
  Requires-Dist: litellm<2,>=1.83.14
24
24
  Requires-Dist: PyYAML>=6.0
@@ -140,6 +140,8 @@ Requires-Dist: agent-client-protocol>=0.7.0; extra == "acp"
140
140
  Provides-Extra: flow
141
141
  Requires-Dist: langflow>=1.0.0; extra == "flow"
142
142
  Requires-Dist: requests>=2.31.0; extra == "flow"
143
+ Requires-Dist: a2a-sdk[http-server]>=1.0.0; extra == "flow"
144
+ Requires-Dist: fastapi-pagination>=0.12.34; extra == "flow"
143
145
  Provides-Extra: lite
144
146
  Provides-Extra: all
145
147
  Requires-Dist: fastapi>=0.115.0; extra == "all"
@@ -1,14 +1,14 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.7.5
5
- praisonai-code>=0.1.4
6
- praisonai-bot>=0.1.4
7
- praisonai-train>=0.1.4
8
- praisonai-browser>=0.1.4
9
- praisonai-mcp>=0.1.6
10
- praisonai-sandbox>=0.1.4
11
- praisonai-deploy>=0.1.4
4
+ praisonaiagents>=1.7.7
5
+ praisonai-code>=0.1.6
6
+ praisonai-bot>=0.1.6
7
+ praisonai-train>=0.1.6
8
+ praisonai-browser>=0.1.6
9
+ praisonai-mcp>=0.1.8
10
+ praisonai-sandbox>=0.1.6
11
+ praisonai-deploy>=0.1.6
12
12
  python-dotenv>=0.19.0
13
13
  litellm<2,>=1.83.14
14
14
  PyYAML>=6.0
@@ -153,6 +153,8 @@ praisonai-sandbox[e2b]
153
153
  [flow]
154
154
  langflow>=1.0.0
155
155
  requests>=2.31.0
156
+ a2a-sdk[http-server]>=1.0.0
157
+ fastapi-pagination>=0.12.34
156
158
 
157
159
  [gateway]
158
160
  praisonai-bot[gateway]
@@ -844,8 +844,11 @@ class AgentsGenerator:
844
844
  # Build tools dictionary using shared logic
845
845
  tools_dict = self._build_tools_dict(config)
846
846
 
847
- # Select framework and resolve adapter variant
848
- framework_name = self.framework or config.get('framework', 'praisonai')
847
+ # Select framework and resolve adapter variant. Registry is the single
848
+ # source of truth for the default, so no literal framework name here.
849
+ framework_name = self._adapter_registry.resolve_or_default(
850
+ self.framework or config.get('framework')
851
+ )
849
852
  adapter = self._select_framework(framework_name, config)
850
853
 
851
854
  # Validate framework availability through the injected registry so a
@@ -1376,10 +1379,13 @@ class AgentsGenerator:
1376
1379
  if self._is_workflow_yaml(config):
1377
1380
  # Bracket the workflow run in the same observability session the
1378
1381
  # sequential/hierarchical path uses so AgentOps init/finalize fires
1379
- # for workflow YAMLs too. Workflow YAMLs are native-only, so tag
1380
- # them 'praisonai'.
1382
+ # for workflow YAMLs too. Tag with the config-resolved framework
1383
+ # (registry default when omitted) rather than a hardcoded name.
1381
1384
  self._validate_workflow_cli_capabilities()
1382
- with observability_session("praisonai"):
1385
+ workflow_label = self._adapter_registry.resolve_or_default(
1386
+ self.framework or config.get('framework')
1387
+ ).lower()
1388
+ with observability_session(workflow_label):
1383
1389
  return self._run_yaml_workflow(config)
1384
1390
 
1385
1391
  # Use shared preparation logic
@@ -1432,10 +1438,14 @@ class AgentsGenerator:
1432
1438
  if self._is_workflow_yaml(config):
1433
1439
  # Bracket the async workflow run in the same observability session
1434
1440
  # the sequential/hierarchical path uses so AgentOps init/finalize
1435
- # fires for workflow YAMLs too. Workflow YAMLs are native-only, so
1436
- # tag them 'praisonai'.
1441
+ # fires for workflow YAMLs too. Tag with the config-resolved
1442
+ # framework (registry default when omitted) rather than a hardcoded
1443
+ # name.
1437
1444
  self._validate_workflow_cli_capabilities()
1438
- with observability_session("praisonai"):
1445
+ workflow_label = self._adapter_registry.resolve_or_default(
1446
+ self.framework or config.get('framework')
1447
+ ).lower()
1448
+ with observability_session(workflow_label):
1439
1449
  return await self._arun_yaml_workflow(config)
1440
1450
 
1441
1451
  # Use shared preparation logic (off the event loop to avoid blocking imports)
@@ -1493,23 +1503,35 @@ class AgentsGenerator:
1493
1503
  )
1494
1504
  # Validate the YAML-declared framework first so a non-native workflow
1495
1505
  # YAML (e.g. framework: crewai) can't slip through just because the
1496
- # generator instance still holds the default 'praisonai'.
1497
- workflow_framework = framework_from_config(config)
1506
+ # generator instance still holds the default 'praisonai'. Resolve
1507
+ # through the injected registry (not the process default) so the
1508
+ # build-time framework agrees with the observability label and a
1509
+ # tenant-scoped adapter is honoured. Fall back to the process default
1510
+ # when the instance was built without an injected registry.
1511
+ registry = getattr(self, "_adapter_registry", None) or _get_default_adapter_registry()
1512
+ workflow_framework = framework_from_config(
1513
+ config, registry=registry
1514
+ )
1498
1515
  validate_workflow_framework(
1499
1516
  workflow_framework,
1500
1517
  source="agents.yaml workflow section",
1518
+ registry=registry,
1501
1519
  )
1502
1520
  if self.framework:
1503
1521
  validate_workflow_framework(
1504
1522
  self.framework,
1505
1523
  source="AgentsGenerator framework",
1524
+ registry=registry,
1506
1525
  )
1507
1526
 
1508
1527
  # Parity with the sequential/hierarchical path: reject an incompatible
1509
1528
  # cli_backend in a workflow YAML at build time instead of accepting it
1510
1529
  # silently. Workflow YAMLs are native-only, so validate against
1511
1530
  # 'praisonai'.
1512
- self._validate_cli_backend_compatibility(config, workflow_framework or 'praisonai')
1531
+ self._validate_cli_backend_compatibility(
1532
+ config,
1533
+ registry.resolve_or_default(workflow_framework),
1534
+ )
1513
1535
 
1514
1536
  # The framework-level check above passes for 'praisonai' because the
1515
1537
  # sequential/hierarchical adapter does support cli_backend — but
@@ -443,6 +443,42 @@ def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> N
443
443
  )
444
444
 
445
445
 
446
+ async def _safe_close_agent(agent: Any) -> None:
447
+ """Best-effort teardown of a per-request agent clone.
448
+
449
+ ``resolve_session_agent`` returns a fresh clone for every invoke of a
450
+ session-isolatable ``Agent`` (so concurrent callers never share
451
+ ``chat_history``). Those clones lazily spin up LLM client pools,
452
+ tool-executor threads and MCP subprocesses that
453
+ ``Agent.close()``/``aclose()`` release — without this teardown each request
454
+ leaks them into the long-lived server process.
455
+
456
+ Only a *clone* is closed. Ownership is derived from the agent itself via
457
+ :func:`_supports_session_isolation`: an isolatable agent was cloned for this
458
+ request and is safe to close, whereas a non-isolatable one (plain mock /
459
+ lightweight callable) is the shared registry instance and must NOT be closed
460
+ or the next request would run against a torn-down agent. Deriving ownership
461
+ from the resolved object — rather than comparing it against a second,
462
+ independently-timed registry lookup — is race-free even when the registry
463
+ entry is concurrently replaced.
464
+
465
+ Errors are swallowed (logged) so cleanup never masks a successful response.
466
+ """
467
+ if agent is None or not _supports_session_isolation(agent):
468
+ return
469
+ try:
470
+ aclose = getattr(agent, "aclose", None)
471
+ if inspect.iscoroutinefunction(aclose):
472
+ await aclose()
473
+ else:
474
+ close = getattr(agent, "close", None)
475
+ if callable(close):
476
+ import asyncio
477
+ await asyncio.to_thread(close)
478
+ except Exception:
479
+ logger.exception("Agent cleanup failed")
480
+
481
+
446
482
  def _supports_async_start(agent: Any) -> bool:
447
483
  """Return True if agent.astart is a coroutine function."""
448
484
  astart = getattr(agent, "astart", None)
@@ -511,52 +547,60 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
511
547
  status_code=404,
512
548
  detail=f"Agent '{agent_id}' not found"
513
549
  )
514
-
515
- # Apply per-request agent_config overrides to the isolated clone, or
516
- # reject unsupported keys with a 400 so the caller isn't silently
517
- # running a different config than they asked for.
518
- try:
519
- _apply_agent_config(agent, request.agent_config)
520
- except AgentConfigError as e:
521
- raise HTTPException(status_code=400, detail=str(e))
522
550
 
523
551
  try:
524
- # Session ID echoed back to the caller
525
- session_id = request.session_id or "default"
526
-
527
- # Invoke agent (handle both sync and async agents)
528
- if _supports_async_start(agent):
529
- # Async agent
530
- result = await agent.astart(request.message)
531
- elif _supports_sync_start(agent):
532
- # Sync agent - run in a worker thread to avoid blocking the event
533
- # loop. ``asyncio.to_thread`` is the correct primitive inside a
534
- # running request coroutine (``get_event_loop()`` is deprecated
535
- # there since Python 3.10).
536
- import asyncio
537
- result = await asyncio.to_thread(agent.start, request.message)
538
- else:
539
- raise AttributeError(f"Agent {agent_id} must provide start() or async astart()")
540
-
541
- logger.info(f"Agent {agent_id} invoked successfully")
542
-
543
- return AgentInvokeResponse(
544
- result=str(result),
545
- session_id=session_id,
546
- status="success",
547
- metadata={
548
- "agent_id": agent_id,
549
- "message_length": len(request.message),
550
- "response_length": len(str(result))
551
- }
552
- )
553
-
554
- except Exception as e:
555
- logger.error(f"Agent {agent_id} invocation failed: {e}")
556
- raise HTTPException(
557
- status_code=500,
558
- detail=f"Agent execution failed: {str(e)}"
559
- )
552
+ # Apply per-request agent_config overrides to the isolated clone, or
553
+ # reject unsupported keys with a 400 so the caller isn't silently
554
+ # running a different config than they asked for.
555
+ try:
556
+ _apply_agent_config(agent, request.agent_config)
557
+ except AgentConfigError as e:
558
+ raise HTTPException(status_code=400, detail=str(e))
559
+
560
+ try:
561
+ # Session ID echoed back to the caller
562
+ session_id = request.session_id or "default"
563
+
564
+ # Invoke agent (handle both sync and async agents)
565
+ if _supports_async_start(agent):
566
+ # Async agent
567
+ result = await agent.astart(request.message)
568
+ elif _supports_sync_start(agent):
569
+ # Sync agent - run in a worker thread to avoid blocking the event
570
+ # loop. ``asyncio.to_thread`` is the correct primitive inside a
571
+ # running request coroutine (``get_event_loop()`` is deprecated
572
+ # there since Python 3.10).
573
+ import asyncio
574
+ result = await asyncio.to_thread(agent.start, request.message)
575
+ else:
576
+ raise AttributeError(f"Agent {agent_id} must provide start() or async astart()")
577
+
578
+ logger.info(f"Agent {agent_id} invoked successfully")
579
+
580
+ return AgentInvokeResponse(
581
+ result=str(result),
582
+ session_id=session_id,
583
+ status="success",
584
+ metadata={
585
+ "agent_id": agent_id,
586
+ "message_length": len(request.message),
587
+ "response_length": len(str(result))
588
+ }
589
+ )
590
+
591
+ except HTTPException:
592
+ raise
593
+ except Exception as e:
594
+ logger.error(f"Agent {agent_id} invocation failed: {e}")
595
+ raise HTTPException(
596
+ status_code=500,
597
+ detail=f"Agent execution failed: {str(e)}"
598
+ )
599
+ finally:
600
+ # Release the per-request clone's resources (LLM pools, tool-executor
601
+ # threads, MCP subprocesses). No-op when the agent fell back to the
602
+ # shared template. Never masks the response.
603
+ await _safe_close_agent(agent)
560
604
 
561
605
  @router.get("/agents")
562
606
  async def list_agents(
@@ -669,6 +713,7 @@ async def invoke_agent_standalone(
669
713
  "available_agents": list_registered_agents()
670
714
  }
671
715
 
716
+ agent = None
672
717
  try:
673
718
  # Per-session isolated agent view (see resolve_session_agent). Done
674
719
  # inside the try so a clone/isolation failure returns a clean error
@@ -715,6 +760,10 @@ async def invoke_agent_standalone(
715
760
  "status": "error",
716
761
  "agent_id": agent_id
717
762
  }
763
+ finally:
764
+ # Release the per-request clone's resources; no-op for the shared
765
+ # template fallback. Never masks the response.
766
+ await _safe_close_agent(agent)
718
767
 
719
768
 
720
769
  # Example usage and helper functions
@@ -13,6 +13,16 @@ import os
13
13
  from praisonaiagents import AgentOSConfig, AgentOSProtocol
14
14
 
15
15
 
16
+ def _run_to_dict(record: Any) -> Dict[str, Any]:
17
+ """A RunRecord as JSON. Uses whatever the record exposes rather than
18
+ assuming a shape, so a ledger with extra fields is not silently truncated."""
19
+ if hasattr(record, "as_dict"):
20
+ return record.as_dict()
21
+ if hasattr(record, "__dict__"):
22
+ return {k: v for k, v in vars(record).items() if not k.startswith("_")}
23
+ return {"run": str(record)}
24
+
25
+
16
26
  class AgentOS:
17
27
  """
18
28
  Production platform for deploying AI agents as web services.
@@ -139,7 +149,7 @@ class AgentOS:
139
149
 
140
150
  def _register_routes(self, app: Any) -> None:
141
151
  """Register API routes."""
142
- from fastapi import HTTPException
152
+ from fastapi import HTTPException, Query
143
153
  from pydantic import BaseModel
144
154
 
145
155
  class ChatRequest(BaseModel):
@@ -166,6 +176,123 @@ class AgentOS:
166
176
  async def health():
167
177
  return {"status": "healthy"}
168
178
 
179
+ # ── Read endpoints ────────────────────────────────────────────────
180
+ # AgentOS could list agents and take a chat turn, and nothing else. A
181
+ # session could not be replayed, a run inspected, or a pending approval
182
+ # seen over HTTP, even though the protocols to expose all three already
183
+ # existed. These are READ-only on purpose: mutating a run over HTTP is a
184
+ # much larger design question than surfacing one.
185
+ #
186
+ # Each returns 503 with what to configure when its store is absent.
187
+ # Returning an empty list would be indistinguishable from "no runs yet",
188
+ # which is the failure this codebase keeps finding.
189
+
190
+ def _unavailable(what: str, how: str):
191
+ raise HTTPException(
192
+ status_code=503,
193
+ detail=f"{what} is not available: {how}",
194
+ )
195
+
196
+ @app.get(f"{self.config.api_prefix}/runs")
197
+ async def list_runs(limit: int = Query(50, ge=1, le=500)):
198
+ ledger = getattr(self, "run_ledger", None)
199
+ if ledger is None:
200
+ _unavailable(
201
+ "Run history",
202
+ "no run ledger is configured on this AgentOS instance. "
203
+ "Attach a praisonaiagents.runs.SQLiteRunLedger as `run_ledger`.",
204
+ )
205
+ records = ledger.list_all(limit=limit)
206
+ return {"runs": [_run_to_dict(r) for r in records], "count": len(records)}
207
+
208
+ @app.get(f"{self.config.api_prefix}/runs/{{run_id}}")
209
+ async def get_run(run_id: str):
210
+ ledger = getattr(self, "run_ledger", None)
211
+ if ledger is None:
212
+ _unavailable(
213
+ "Run history",
214
+ "no run ledger is configured on this AgentOS instance.",
215
+ )
216
+ record = ledger.get(run_id)
217
+ if record is None:
218
+ raise HTTPException(status_code=404, detail=f"No run {run_id!r}")
219
+ return _run_to_dict(record)
220
+
221
+ @app.get(f"{self.config.api_prefix}/sessions")
222
+ async def list_sessions(limit: int = Query(20, ge=1, le=200)):
223
+ store = getattr(self, "session_store", None)
224
+ if store is None or not hasattr(store, "recent"):
225
+ _unavailable(
226
+ "Session history",
227
+ "no session store is configured on this AgentOS instance. "
228
+ "Attach a praisonaiagents.session store as `session_store`.",
229
+ )
230
+ summaries = store.recent(limit=limit)
231
+ return {
232
+ "sessions": [
233
+ s.as_dict() if hasattr(s, "as_dict") else dict(s) for s in summaries
234
+ ],
235
+ "count": len(summaries),
236
+ }
237
+
238
+ @app.get(f"{self.config.api_prefix}/sessions/{{session_id}}")
239
+ async def get_session(session_id: str, limit: int = Query(100, ge=1, le=500)):
240
+ store = getattr(self, "session_store", None)
241
+ if store is None:
242
+ _unavailable(
243
+ "Session history",
244
+ "no session store is configured on this AgentOS instance.",
245
+ )
246
+ if hasattr(store, "session_exists"):
247
+ if not store.session_exists(session_id):
248
+ raise HTTPException(status_code=404, detail=f"No session {session_id!r}")
249
+ elif not store.get_chat_history(session_id, limit):
250
+ # Stores without session_exists cannot distinguish an unknown
251
+ # session from an empty one; treat an empty transcript as absent
252
+ # rather than returning a healthy-looking 200 for a bad id.
253
+ raise HTTPException(status_code=404, detail=f"No session {session_id!r}")
254
+ return {
255
+ "session_id": session_id,
256
+ "messages": store.get_chat_history(session_id, limit),
257
+ }
258
+
259
+ @app.get(f"{self.config.api_prefix}/approvals")
260
+ async def list_approvals():
261
+ try:
262
+ from praisonaiagents.approval import get_approval_registry
263
+ except ImportError:
264
+ _unavailable("Approvals", "praisonaiagents.approval is not installed.")
265
+ registry = get_approval_registry()
266
+
267
+ # The registry stores approval requirements across four fields --
268
+ # global tools plus per-agent overrides -- rather than a single
269
+ # dict. Reading the public accessors (is_required/get_risk_level)
270
+ # keeps this decoupled from that private shape. Fall back to the
271
+ # attributes only to enumerate which (agent, tool) pairs exist.
272
+ global_tools = getattr(registry, "_required_tools", None)
273
+ agent_tools = getattr(registry, "_agent_required_tools", None)
274
+ if global_tools is None and agent_tools is None:
275
+ _unavailable(
276
+ "Approvals",
277
+ "this build's approval registry exposes no requirement listing.",
278
+ )
279
+
280
+ requirements = []
281
+ for tool in sorted(global_tools or ()):
282
+ requirements.append({
283
+ "tool": tool,
284
+ "agent": None,
285
+ "risk_level": registry.get_risk_level(tool),
286
+ })
287
+ for agent, tools in (agent_tools or {}).items():
288
+ for tool in sorted(tools):
289
+ requirements.append({
290
+ "tool": tool,
291
+ "agent": agent,
292
+ "risk_level": registry.get_risk_level(tool, agent),
293
+ })
294
+ return {"requirements": requirements}
295
+
169
296
  @app.get(f"{self.config.api_prefix}/agents")
170
297
  async def list_agents():
171
298
  return {
@@ -7,7 +7,91 @@ Provides generic API passthrough functionality for provider-specific endpoints.
7
7
  from dataclasses import dataclass, field
8
8
  from typing import Optional, Any, Dict
9
9
  from urllib.parse import urlparse
10
+ import asyncio
10
11
  import ipaddress
12
+ import threading
13
+
14
+
15
+ # Shared HTTP clients for the httpx fallback path (used when litellm's
16
+ # passthrough route is unavailable). Reused across calls so the hot passthrough
17
+ # fallback shares a keep-alive connection pool instead of opening + tearing down
18
+ # a socket per agent call. Timeout is applied per-request, so a single client
19
+ # safely serves callers with different ``timeout`` values.
20
+ _sync_client: Any = None
21
+ _async_client: Any = None
22
+ _async_client_loop: Any = None
23
+ _client_lock = threading.Lock()
24
+
25
+
26
+ def _get_sync_client() -> Any:
27
+ """Return the shared sync httpx client, constructing it lazily."""
28
+ global _sync_client
29
+ if _sync_client is None:
30
+ with _client_lock:
31
+ if _sync_client is None:
32
+ import httpx
33
+ _sync_client = httpx.Client()
34
+ return _sync_client
35
+
36
+
37
+ def _get_async_client() -> Any:
38
+ """Return the shared async httpx client for the running event loop.
39
+
40
+ ``httpx.AsyncClient`` binds its connection pool to the event loop that first
41
+ used it, so a client cached across separate ``asyncio.run()`` lifecycles (or
42
+ reused from a different loop) fails with a loop-closed error. We therefore
43
+ key the cached client to its owning loop and rebuild it whenever the current
44
+ loop differs from the one that created it.
45
+ """
46
+ global _async_client, _async_client_loop
47
+ import httpx
48
+
49
+ try:
50
+ current_loop = asyncio.get_running_loop()
51
+ except RuntimeError:
52
+ current_loop = None
53
+
54
+ with _client_lock:
55
+ if _async_client is None or _async_client_loop is not current_loop:
56
+ _async_client = httpx.AsyncClient()
57
+ _async_client_loop = current_loop
58
+ return _async_client
59
+
60
+
61
+ def close_clients() -> None:
62
+ """Close the cached sync client and clear the sync/async globals.
63
+
64
+ Provided as an explicit shutdown hook for long-lived hosts that want to
65
+ release the pooled sockets deterministically. The async client cannot be
66
+ awaited from this sync helper, so it is dropped (and rebuilt per-loop on next
67
+ use); the sync client is closed here.
68
+ """
69
+ global _sync_client, _async_client, _async_client_loop
70
+ with _client_lock:
71
+ if _sync_client is not None:
72
+ try:
73
+ _sync_client.close()
74
+ finally:
75
+ _sync_client = None
76
+ _async_client = None
77
+ _async_client_loop = None
78
+
79
+
80
+ async def aclose_clients() -> None:
81
+ """Await-close the cached async client (in its own loop) and the sync one."""
82
+ global _sync_client, _async_client, _async_client_loop
83
+ client = None
84
+ with _client_lock:
85
+ client = _async_client
86
+ _async_client = None
87
+ _async_client_loop = None
88
+ if _sync_client is not None:
89
+ try:
90
+ _sync_client.close()
91
+ finally:
92
+ _sync_client = None
93
+ if client is not None:
94
+ await client.aclose()
11
95
 
12
96
 
13
97
  @dataclass
@@ -121,22 +205,20 @@ def passthrough(
121
205
  metadata=metadata or {},
122
206
  )
123
207
  except AttributeError:
124
- # Fallback to httpx if passthrough not available
125
- import httpx
126
-
208
+ # Fallback to a shared httpx client if the passthrough route is missing.
127
209
  url = f"{_validate_api_base(api_base) if api_base else 'https://api.openai.com'}{endpoint}"
128
210
  request_headers = headers or {}
129
211
  if api_key:
130
212
  request_headers['Authorization'] = f"Bearer {api_key}"
131
213
 
132
- with httpx.Client(timeout=timeout) as client:
133
- response = client.request(
134
- method=method,
135
- url=url,
136
- headers=request_headers,
137
- json=json_data,
138
- data=data,
139
- )
214
+ response = _get_sync_client().request(
215
+ method=method,
216
+ url=url,
217
+ headers=request_headers,
218
+ json=json_data,
219
+ data=data,
220
+ timeout=timeout,
221
+ )
140
222
 
141
223
  return PassthroughResult(
142
224
  data=response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text,
@@ -203,21 +285,19 @@ async def apassthrough(
203
285
  metadata=metadata or {},
204
286
  )
205
287
  except AttributeError:
206
- import httpx
207
-
208
288
  url = f"{_validate_api_base(api_base) if api_base else 'https://api.openai.com'}{endpoint}"
209
289
  request_headers = headers or {}
210
290
  if api_key:
211
291
  request_headers['Authorization'] = f"Bearer {api_key}"
212
292
 
213
- async with httpx.AsyncClient(timeout=timeout) as client:
214
- response = await client.request(
215
- method=method,
216
- url=url,
217
- headers=request_headers,
218
- json=json_data,
219
- data=data,
220
- )
293
+ response = await _get_async_client().request(
294
+ method=method,
295
+ url=url,
296
+ headers=request_headers,
297
+ json=json_data,
298
+ data=data,
299
+ timeout=timeout,
300
+ )
221
301
 
222
302
  return PassthroughResult(
223
303
  data=response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text,