PraisonAI 4.7.4__tar.gz → 4.7.6__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 (579) hide show
  1. {praisonai-4.7.4 → praisonai-4.7.6}/PKG-INFO +51 -12
  2. {praisonai-4.7.4 → praisonai-4.7.6}/PraisonAI.egg-info/PKG-INFO +51 -12
  3. {praisonai-4.7.4 → praisonai-4.7.6}/PraisonAI.egg-info/SOURCES.txt +0 -12
  4. {praisonai-4.7.4 → praisonai-4.7.6}/PraisonAI.egg-info/requires.txt +8 -8
  5. {praisonai-4.7.4 → praisonai-4.7.6}/README.md +42 -3
  6. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/__init__.py +7 -2
  7. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/__main__.py +28 -30
  8. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/agents_generator.py +10 -11
  9. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/api/agent_invoke.py +50 -13
  10. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/api/call.py +3 -7
  11. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/auto.py +23 -28
  12. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/rag.py +45 -3
  13. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/serve.py +47 -0
  14. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/config/agents.schema.json +38 -0
  15. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/config/schema.py +5 -0
  16. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/config/validator.py +29 -63
  17. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/db/adapter.py +102 -6
  18. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/a2u_server.py +137 -31
  19. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/autogen_adapter.py +42 -14
  20. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/base.py +22 -28
  21. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/crewai_adapter.py +8 -1
  22. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/praisonai_adapter.py +12 -12
  23. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/registry.py +11 -1
  24. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/inc/models.py +73 -0
  25. praisonai-4.7.6/praisonai/integrations/__init__.py +168 -0
  26. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/_cli_loaders.py +3 -13
  27. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/__init__.py +2 -2
  28. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/registry.py +17 -4
  29. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/security/__init__.py +21 -0
  30. praisonai-4.7.6/praisonai/setup/build.py +13 -0
  31. praisonai-4.7.6/praisonai/setup/post_install.py +21 -0
  32. praisonai-4.7.6/praisonai/setup.py +9 -0
  33. praisonai-4.7.6/praisonai/version.py +1 -0
  34. {praisonai-4.7.4 → praisonai-4.7.6}/pyproject.toml +9 -9
  35. praisonai-4.7.4/praisonai/_dev/parity/__init__.py +0 -42
  36. praisonai-4.7.4/praisonai/_dev/parity/docs_extractor.py +0 -183
  37. praisonai-4.7.4/praisonai/_dev/parity/docs_generator.py +0 -1029
  38. praisonai-4.7.4/praisonai/_dev/parity/generator.py +0 -803
  39. praisonai-4.7.4/praisonai/_dev/parity/python_docs_extractor.py +0 -167
  40. praisonai-4.7.4/praisonai/_dev/parity/python_extractor.py +0 -252
  41. praisonai-4.7.4/praisonai/_dev/parity/rust_docs_extractor.py +0 -55
  42. praisonai-4.7.4/praisonai/_dev/parity/rust_extractor.py +0 -332
  43. praisonai-4.7.4/praisonai/_dev/parity/topic_normalizer.py +0 -170
  44. praisonai-4.7.4/praisonai/_dev/parity/ts_docs_extractor.py +0 -55
  45. praisonai-4.7.4/praisonai/_dev/parity/typescript_extractor.py +0 -225
  46. praisonai-4.7.4/praisonai/integrations/__init__.py +0 -85
  47. praisonai-4.7.4/praisonai/integrations/_unified_registry.py +0 -211
  48. praisonai-4.7.4/praisonai/setup/build.py +0 -21
  49. praisonai-4.7.4/praisonai/setup/post_install.py +0 -23
  50. praisonai-4.7.4/praisonai/setup.py +0 -16
  51. praisonai-4.7.4/praisonai/version.py +0 -1
  52. {praisonai-4.7.4 → praisonai-4.7.6}/PraisonAI.egg-info/dependency_links.txt +0 -0
  53. {praisonai-4.7.4 → praisonai-4.7.6}/PraisonAI.egg-info/entry_points.txt +0 -0
  54. {praisonai-4.7.4 → praisonai-4.7.6}/PraisonAI.egg-info/top_level.txt +0 -0
  55. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_api_auth.py +0 -0
  56. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_approval_spec.py +0 -0
  57. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_async_bridge.py +0 -0
  58. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_bootstrap.py +0 -0
  59. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_dev/__init__.py +0 -0
  60. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_dev/api_md.py +0 -0
  61. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_entrypoint.py +0 -0
  62. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_framework_availability.py +0 -0
  63. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_lazy_cache.py +0 -0
  64. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_logging.py +0 -0
  65. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_registry.py +0 -0
  66. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/_safe_loader.py +0 -0
  67. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/acp/__init__.py +0 -0
  68. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/acp/config.py +0 -0
  69. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/acp/safe_edit.py +0 -0
  70. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/acp/server.py +0 -0
  71. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/acp/session.py +0 -0
  72. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/adapters/__init__.py +0 -0
  73. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/adapters/readers.py +0 -0
  74. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/adapters/rerankers.py +0 -0
  75. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/adapters/retrievers.py +0 -0
  76. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/adapters/vector_stores.py +0 -0
  77. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/agent.py +0 -0
  78. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/agent_scheduler.py +0 -0
  79. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/app/__init__.py +0 -0
  80. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/app/agentos.py +0 -0
  81. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/async_agent_scheduler.py +0 -0
  82. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/audit/__init__.py +0 -0
  83. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/audit/agent_centric.py +0 -0
  84. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/bots/__init__.py +0 -0
  85. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/browser/__init__.py +0 -0
  86. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/__init__.py +0 -0
  87. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/a2a.py +0 -0
  88. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/assistants.py +0 -0
  89. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/audio.py +0 -0
  90. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/batches.py +0 -0
  91. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/completions.py +0 -0
  92. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/container_files.py +0 -0
  93. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/containers.py +0 -0
  94. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/embeddings.py +0 -0
  95. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/files.py +0 -0
  96. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/fine_tuning.py +0 -0
  97. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/guardrails.py +0 -0
  98. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/images.py +0 -0
  99. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/mcp.py +0 -0
  100. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/messages.py +0 -0
  101. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/moderations.py +0 -0
  102. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/ocr.py +0 -0
  103. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/passthrough.py +0 -0
  104. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/rag.py +0 -0
  105. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/realtime.py +0 -0
  106. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/rerank.py +0 -0
  107. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/responses.py +0 -0
  108. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/search.py +0 -0
  109. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/skills.py +0 -0
  110. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/vector_store_files.py +0 -0
  111. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/vector_stores.py +0 -0
  112. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/capabilities/videos.py +0 -0
  113. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/claw/__init__.py +0 -0
  114. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/__init__.py +0 -0
  115. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/_paths.py +0 -0
  116. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/_shim.py +0 -0
  117. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/_warnings.py +0 -0
  118. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/app.py +0 -0
  119. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/approval_backend.py +0 -0
  120. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/branding.py +0 -0
  121. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/__init__.py +0 -0
  122. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/_profiling.py +0 -0
  123. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/acp.py +0 -0
  124. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/agent.py +0 -0
  125. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/agents.py +0 -0
  126. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/app.py +0 -0
  127. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/attach.py +0 -0
  128. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/audit.py +0 -0
  129. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/auth.py +0 -0
  130. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/batch.py +0 -0
  131. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/benchmark.py +0 -0
  132. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/bot.py +0 -0
  133. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/browser.py +0 -0
  134. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/call.py +0 -0
  135. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/chat.py +0 -0
  136. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/checkpoint.py +0 -0
  137. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/claw.py +0 -0
  138. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/code.py +0 -0
  139. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/command.py +0 -0
  140. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/commit.py +0 -0
  141. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/completion.py +0 -0
  142. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/config.py +0 -0
  143. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/context.py +0 -0
  144. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/daemon.py +0 -0
  145. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/dashboard.py +0 -0
  146. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/debug.py +0 -0
  147. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/deploy.py +0 -0
  148. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/diag.py +0 -0
  149. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/docs.py +0 -0
  150. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/doctor.py +0 -0
  151. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/endpoints.py +0 -0
  152. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/environment.py +0 -0
  153. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/eval.py +0 -0
  154. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/examples.py +0 -0
  155. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/flow.py +0 -0
  156. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/gateway.py +0 -0
  157. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/github.py +0 -0
  158. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/hooks.py +0 -0
  159. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/identity.py +0 -0
  160. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/init.py +0 -0
  161. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/kanban.py +0 -0
  162. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/knowledge.py +0 -0
  163. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/langextract.py +0 -0
  164. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/langfuse.py +0 -0
  165. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/loop.py +0 -0
  166. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/lsp.py +0 -0
  167. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/managed.py +0 -0
  168. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/mcp.py +0 -0
  169. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/memory.py +0 -0
  170. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/mint_link.py +0 -0
  171. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/models.py +0 -0
  172. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/n8n.py +0 -0
  173. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/obs.py +0 -0
  174. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/onboard.py +0 -0
  175. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/package.py +0 -0
  176. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/pairing.py +0 -0
  177. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/paths.py +0 -0
  178. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/permissions.py +0 -0
  179. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/plugins.py +0 -0
  180. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/port.py +0 -0
  181. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/profile.py +0 -0
  182. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/publish.py +0 -0
  183. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/realtime.py +0 -0
  184. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/recipe.py +0 -0
  185. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/registry.py +0 -0
  186. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/replay.py +0 -0
  187. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/research.py +0 -0
  188. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/retrieval.py +0 -0
  189. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/rules.py +0 -0
  190. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/run.py +0 -0
  191. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/sandbox.py +0 -0
  192. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/schedule.py +0 -0
  193. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/serve.py +0 -0
  194. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/session.py +0 -0
  195. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/setup.py +0 -0
  196. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/skills.py +0 -0
  197. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/standardise.py +0 -0
  198. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/templates.py +0 -0
  199. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/test.py +0 -0
  200. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/todo.py +0 -0
  201. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/tools.py +0 -0
  202. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/traces.py +0 -0
  203. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/tracker.py +0 -0
  204. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/train.py +0 -0
  205. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/ui.py +0 -0
  206. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/up.py +0 -0
  207. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/validate.py +0 -0
  208. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/version.py +0 -0
  209. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/commands/workflow.py +0 -0
  210. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/config_loader.py +0 -0
  211. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/configuration/__init__.py +0 -0
  212. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/configuration/config.schema.json +0 -0
  213. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/execution/__init__.py +0 -0
  214. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/fallback_schema.py +0 -0
  215. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/__init__.py +0 -0
  216. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/acp.py +0 -0
  217. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/agent_scheduler.py +0 -0
  218. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/agent_tools.py +0 -0
  219. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/approval.py +0 -0
  220. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/background.py +0 -0
  221. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/bots_cli.py +0 -0
  222. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/deploy.py +0 -0
  223. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/endpoints.py +0 -0
  224. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/eval.py +0 -0
  225. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/gateway.py +0 -0
  226. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/ollama.py +0 -0
  227. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/onboard.py +0 -0
  228. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/persistence.py +0 -0
  229. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/recipe.py +0 -0
  230. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/recipe_optimizer.py +0 -0
  231. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/registry.py +0 -0
  232. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/sandbox_cli.py +0 -0
  233. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/templates.py +0 -0
  234. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/tools.py +0 -0
  235. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/tui/__init__.py +0 -0
  236. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/tui/app.py +0 -0
  237. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/features/workflow.py +0 -0
  238. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/interactive/__init__.py +0 -0
  239. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/interactive/async_tui.py +0 -0
  240. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/interactive/config.py +0 -0
  241. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/interactive/core.py +0 -0
  242. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/interactive/events.py +0 -0
  243. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/langfuse_client.py +0 -0
  244. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/__init__.py +0 -0
  245. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/direct_prompt.py +0 -0
  246. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  247. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  248. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  249. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/framework_run.py +0 -0
  250. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  251. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/interactive_legacy.py +0 -0
  252. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  253. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/legacy/workflow_commands.py +0 -0
  254. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/main.py +0 -0
  255. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/output/__init__.py +0 -0
  256. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/schedule_cli.py +0 -0
  257. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/schema_provider.py +0 -0
  258. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/session/__init__.py +0 -0
  259. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/state/__init__.py +0 -0
  260. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/ui/__init__.py +0 -0
  261. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/unified_schema.py +0 -0
  262. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli/utils/__init__.py +0 -0
  263. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/cli_backends/__init__.py +0 -0
  264. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/__init__.py +0 -0
  265. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/agent_tools.py +0 -0
  266. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/diff/__init__.py +0 -0
  267. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/diff/diff_strategy.py +0 -0
  268. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/__init__.py +0 -0
  269. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/apply_diff.py +0 -0
  270. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/execute_command.py +0 -0
  271. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/list_files.py +0 -0
  272. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/read_file.py +0 -0
  273. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/search_replace.py +0 -0
  274. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/tools/write_file.py +0 -0
  275. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/utils/__init__.py +0 -0
  276. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/utils/file_utils.py +0 -0
  277. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/utils/ignore_utils.py +0 -0
  278. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/code/utils/text_utils.py +0 -0
  279. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/config/__init__.py +0 -0
  280. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/__init__.py +0 -0
  281. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/_storage_path.py +0 -0
  282. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/artifact_store.py +0 -0
  283. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/config.py +0 -0
  284. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/history_store.py +0 -0
  285. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/queue.py +0 -0
  286. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/setup.py +0 -0
  287. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/context/terminal_logger.py +0 -0
  288. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/daemon/__init__.py +0 -0
  289. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/db/__init__.py +0 -0
  290. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/deploy/__init__.py +0 -0
  291. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/__init__.py +0 -0
  292. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/discovery.py +0 -0
  293. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/__init__.py +0 -0
  294. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/a2a.py +0 -0
  295. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/a2u.py +0 -0
  296. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/agents_api.py +0 -0
  297. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/base.py +0 -0
  298. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/mcp.py +0 -0
  299. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/openai_compat.py +0 -0
  300. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/recipe.py +0 -0
  301. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  302. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/registry.py +0 -0
  303. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/endpoints/server.py +0 -0
  304. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/__init__.py +0 -0
  305. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/client.py +0 -0
  306. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  307. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  308. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/components/__init__.py +0 -0
  309. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/converter.py +0 -0
  310. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/flow/helpers.py +0 -0
  311. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/__init__.py +0 -0
  312. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/_config_builder.py +0 -0
  313. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/validators.py +0 -0
  314. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/framework_adapters/workflow_framework.py +0 -0
  315. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/gateway/__init__.py +0 -0
  316. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/inbuilt_tools/__init__.py +0 -0
  317. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  318. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/inc/__init__.py +0 -0
  319. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/inc/config.py +0 -0
  320. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/__init__.py +0 -0
  321. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/__init__.py +0 -0
  322. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  323. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/hooks_query.py +0 -0
  324. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  325. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/schedules_runner.py +0 -0
  326. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/usage_bridge.py +0 -0
  327. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/bridges/workflows_service.py +0 -0
  328. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/context_files.py +0 -0
  329. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/gateway_host.py +0 -0
  330. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/host_app.py +0 -0
  331. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/pages/__init__.py +0 -0
  332. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/pages/bot_health.py +0 -0
  333. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integration/pages/workflow_runs.py +0 -0
  334. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/_session_info.py +0 -0
  335. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/_tool_aliases.py +0 -0
  336. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/backend_registry.py +0 -0
  337. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/base.py +0 -0
  338. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/claude_code.py +0 -0
  339. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/codex_cli.py +0 -0
  340. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/__init__.py +0 -0
  341. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/_sync_base.py +0 -0
  342. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/daytona.py +0 -0
  343. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/docker.py +0 -0
  344. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/e2b.py +0 -0
  345. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/flyio.py +0 -0
  346. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/local.py +0 -0
  347. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/modal_compute.py +0 -0
  348. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute/tenki.py +0 -0
  349. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/compute_managed_agent.py +0 -0
  350. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/cursor_cli.py +0 -0
  351. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/db_session_adapter.py +0 -0
  352. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/gemini_cli.py +0 -0
  353. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/hosted_agent.py +0 -0
  354. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/local_agent.py +0 -0
  355. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/managed_agents.py +0 -0
  356. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/managed_local.py +0 -0
  357. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/registry.py +0 -0
  358. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/integrations/sandboxed_agent.py +0 -0
  359. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/executor.py +0 -0
  360. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/models.py +0 -0
  361. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/path_validation.py +0 -0
  362. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/router.py +0 -0
  363. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/server.py +0 -0
  364. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/jobs/store.py +0 -0
  365. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/kanban/__init__.py +0 -0
  366. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/__init__.py +0 -0
  367. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/catalogue.py +0 -0
  368. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/config.py +0 -0
  369. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/credentials.py +0 -0
  370. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/env.py +0 -0
  371. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/llm/gateways.py +0 -0
  372. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/mcp_server/__init__.py +0 -0
  373. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/n8n/__init__.py +0 -0
  374. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/n8n/client.py +0 -0
  375. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/n8n/converter.py +0 -0
  376. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/n8n/preview.py +0 -0
  377. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/n8n/reverse_converter.py +0 -0
  378. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/observability/__init__.py +0 -0
  379. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/observability/hooks.py +0 -0
  380. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/observability/langextract.py +0 -0
  381. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/observability/langfuse.py +0 -0
  382. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/__init__.py +0 -0
  383. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/_valkey_client.py +0 -0
  384. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/config.py +0 -0
  385. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/__init__.py +0 -0
  386. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/_ops.py +0 -0
  387. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/_sql_base.py +0 -0
  388. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  389. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/async_mysql.py +0 -0
  390. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/async_postgres.py +0 -0
  391. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  392. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/base.py +0 -0
  393. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/json_store.py +0 -0
  394. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/mysql.py +0 -0
  395. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/postgres.py +0 -0
  396. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/singlestore.py +0 -0
  397. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/sqlite.py +0 -0
  398. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/supabase.py +0 -0
  399. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/surrealdb.py +0 -0
  400. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  401. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/conversation/turso.py +0 -0
  402. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/factory.py +0 -0
  403. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/hooks/__init__.py +0 -0
  404. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  405. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/__init__.py +0 -0
  406. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/base.py +0 -0
  407. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/cassandra.py +0 -0
  408. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/chroma.py +0 -0
  409. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  410. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  411. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/couchbase.py +0 -0
  412. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/lancedb.py +0 -0
  413. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  414. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  415. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  416. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/milvus.py +0 -0
  417. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  418. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/pgvector.py +0 -0
  419. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/pinecone.py +0 -0
  420. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/qdrant.py +0 -0
  421. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  422. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  423. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  424. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  425. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  426. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/knowledge/weaviate.py +0 -0
  427. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/migrations/__init__.py +0 -0
  428. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/migrations/manager.py +0 -0
  429. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/orchestrator.py +0 -0
  430. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/registry.py +0 -0
  431. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/__init__.py +0 -0
  432. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/async_mongodb.py +0 -0
  433. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/base.py +0 -0
  434. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/dynamodb.py +0 -0
  435. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/firestore.py +0 -0
  436. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/gcs.py +0 -0
  437. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/memory.py +0 -0
  438. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/mongodb.py +0 -0
  439. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/redis.py +0 -0
  440. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/upstash.py +0 -0
  441. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/persistence/state/valkey.py +0 -0
  442. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/profiler.py +0 -0
  443. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/push/__init__.py +0 -0
  444. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/push/client.py +0 -0
  445. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/push/transports.py +0 -0
  446. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/__init__.py +0 -0
  447. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/bridge.py +0 -0
  448. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/core.py +0 -0
  449. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/exceptions.py +0 -0
  450. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/history.py +0 -0
  451. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/models.py +0 -0
  452. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/operations.py +0 -0
  453. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/policy.py +0 -0
  454. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/registry.py +0 -0
  455. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/runtime.py +0 -0
  456. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/security.py +0 -0
  457. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/serve.py +0 -0
  458. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/recipe/server.py +0 -0
  459. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/__init__.py +0 -0
  460. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/analyzer.py +0 -0
  461. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/applier.py +0 -0
  462. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/judge.py +0 -0
  463. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/plan.py +0 -0
  464. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/player.py +0 -0
  465. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/reader.py +0 -0
  466. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/storage.py +0 -0
  467. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/replay/writer.py +0 -0
  468. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/runtime/__init__.py +0 -0
  469. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/runtime/__main__.py +0 -0
  470. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/sandbox/__init__.py +0 -0
  471. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/sandbox/_registry.py +0 -0
  472. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/__init__.py +0 -0
  473. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/_base_scheduler.py +0 -0
  474. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/_delivery.py +0 -0
  475. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/_dispatch.py +0 -0
  476. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/agent_scheduler.py +0 -0
  477. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  478. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/base.py +0 -0
  479. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  480. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/condition_gate.py +0 -0
  481. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/daemon_manager.py +0 -0
  482. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/deployment.py +0 -0
  483. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/executor.py +0 -0
  484. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/run_policy.py +0 -0
  485. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/shared.py +0 -0
  486. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/state_manager.py +0 -0
  487. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/suggestion_engine.py +0 -0
  488. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/scheduler/yaml_loader.py +0 -0
  489. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/security/audit.py +0 -0
  490. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/security/injection.py +0 -0
  491. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/security/protected.py +0 -0
  492. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/setup/__init__.py +0 -0
  493. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/setup/setup_conda_env.py +0 -0
  494. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/__init__.py +0 -0
  495. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/ai_generator.py +0 -0
  496. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/config.py +0 -0
  497. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/dedupe.py +0 -0
  498. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/discovery.py +0 -0
  499. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/drift.py +0 -0
  500. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/engine.py +0 -0
  501. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/example_verifier.py +0 -0
  502. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/manifest.py +0 -0
  503. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/models.py +0 -0
  504. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/reports.py +0 -0
  505. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/templates.py +0 -0
  506. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/undo_redo.py +0 -0
  507. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/standardise/validator.py +0 -0
  508. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/storage/__init__.py +0 -0
  509. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/storage/dynamodb_adapter.py +0 -0
  510. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/storage/mongodb_adapter.py +0 -0
  511. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/storage/postgresql_adapter.py +0 -0
  512. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/storage/redis_adapter.py +0 -0
  513. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/storage/valkey_adapter.py +0 -0
  514. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/__init__.py +0 -0
  515. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/batch_source.py +0 -0
  516. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/cli_docs_source.py +0 -0
  517. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/discovery.py +0 -0
  518. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/docs_source.py +0 -0
  519. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/examples_source.py +0 -0
  520. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/executor.py +0 -0
  521. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/models.py +0 -0
  522. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/report_viewer.py +0 -0
  523. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/reporter.py +0 -0
  524. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/suite_runner/runner.py +0 -0
  525. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/__init__.py +0 -0
  526. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/_tool_sources.py +0 -0
  527. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/cache.py +0 -0
  528. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/dependency_checker.py +0 -0
  529. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/discovery.py +0 -0
  530. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/loader.py +0 -0
  531. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/registry.py +0 -0
  532. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/resolver.py +0 -0
  533. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/security.py +0 -0
  534. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/tool_override.py +0 -0
  535. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/templates/tools_doctor.py +0 -0
  536. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tool_registry.py +0 -0
  537. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tool_resolver.py +0 -0
  538. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/__init__.py +0 -0
  539. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/audio.py +0 -0
  540. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/glob_tool.py +0 -0
  541. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/grep_tool.py +0 -0
  542. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/kanban_tools.py +0 -0
  543. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/multiedit.py +0 -0
  544. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/tools/skill_manage.py +0 -0
  545. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/train/__init__.py +0 -0
  546. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/train.py +0 -0
  547. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/train_vision.py +0 -0
  548. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui/_aiui_datastore.py +0 -0
  549. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui/_external_agents.py +0 -0
  550. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui/context.py +0 -0
  551. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui/database_config.py +0 -0
  552. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_agents/__init__.py +0 -0
  553. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_agents/default_app.py +0 -0
  554. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_bot/__init__.py +0 -0
  555. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_bot/default_app.py +0 -0
  556. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_chat/__init__.py +0 -0
  557. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_chat/default_app.py +0 -0
  558. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_dashboard/__init__.py +0 -0
  559. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_dashboard/default_app.py +0 -0
  560. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_realtime/__init__.py +0 -0
  561. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/ui_realtime/default_app.py +0 -0
  562. {praisonai-4.7.4 → praisonai-4.7.6}/praisonai/upload_vision.py +0 -0
  563. {praisonai-4.7.4 → praisonai-4.7.6}/setup.cfg +0 -0
  564. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test.py +0 -0
  565. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_agents_playbook.py +0 -0
  566. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_approval_system.py +0 -0
  567. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_basic.py +0 -0
  568. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_cli_features.py +0 -0
  569. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_custom_tools_fix.py +0 -0
  570. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_double_api_fix.py +0 -0
  571. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_n8n_agent_invoke.py +0 -0
  572. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_n8n_cli_feature.py +0 -0
  573. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_n8n_integration.py +0 -0
  574. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_phase2_refactor.py +0 -0
  575. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_recipe.py +0 -0
  576. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_registry.py +0 -0
  577. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_runner.py +0 -0
  578. {praisonai-4.7.4 → praisonai-4.7.6}/tests/test_sandboxed_agent_compatibility.py +0 -0
  579. {praisonai-4.7.4 → praisonai-4.7.6}/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.4
3
+ Version: 4.7.6
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.2
15
- Requires-Dist: praisonai-code>=0.1.1
16
- Requires-Dist: praisonai-bot>=0.1.1
17
- Requires-Dist: praisonai-train>=0.1.1
18
- Requires-Dist: praisonai-browser>=0.1.1
19
- Requires-Dist: praisonai-mcp>=0.1.3
20
- Requires-Dist: praisonai-sandbox>=0.1.1
21
- Requires-Dist: praisonai-deploy>=0.1.1
14
+ Requires-Dist: praisonaiagents>=1.7.4
15
+ Requires-Dist: praisonai-code>=0.1.3
16
+ Requires-Dist: praisonai-bot>=0.1.3
17
+ Requires-Dist: praisonai-train>=0.1.3
18
+ Requires-Dist: praisonai-browser>=0.1.3
19
+ Requires-Dist: praisonai-mcp>=0.1.5
20
+ Requires-Dist: praisonai-sandbox>=0.1.3
21
+ Requires-Dist: praisonai-deploy>=0.1.3
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
@@ -247,6 +247,19 @@ curl -fsSL https://praison.ai/install.sh | bash
247
247
  <img src="https://img.shields.io/badge/Highlighted_by_Elon_Musk-000000?style=for-the-badge&logo=x&logoColor=white" alt="Highlighted by Elon Musk" />
248
248
  </a>
249
249
  <br>
250
+ <br>
251
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
252
+ <img src="https://img.shields.io/badge/Download_for_macOS-000000?style=for-the-badge&logo=apple&logoColor=white" alt="Download for macOS" />
253
+ </a>
254
+ &nbsp;&nbsp;
255
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
256
+ <img src="https://img.shields.io/badge/Download_for_Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white" alt="Download for Windows" />
257
+ </a>
258
+ &nbsp;&nbsp;
259
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
260
+ <img src="https://img.shields.io/badge/Download_for_Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download for Linux" />
261
+ </a>
262
+ <br>
250
263
  </div>
251
264
 
252
265
  <p align="center">
@@ -1311,13 +1324,39 @@ For other providers, see [Models docs](https://docs.praison.ai/docs/models).
1311
1324
  <summary><strong>How do I use a local model (Ollama)?</strong></summary>
1312
1325
 
1313
1326
  ```bash
1314
- # Start Ollama server first
1327
+ # Start Ollama and pull a model
1315
1328
  ollama serve
1329
+ ollama pull llama3.2
1330
+ ```
1316
1331
 
1317
- # Set environment variable
1318
- export OPENAI_BASE_URL=http://localhost:11434/v1
1332
+ ```python
1333
+ from praisonaiagents import Agent
1334
+
1335
+ agent = Agent(instructions="You are a helpful assistant", llm="ollama/llama3.2")
1336
+ agent.start("Why is the sky blue?")
1319
1337
  ```
1320
1338
 
1339
+ The `ollama/` prefix is what selects Ollama's handling — tool-call repair,
1340
+ tool-result formatting and the streaming rules small local models need. Or set
1341
+ it by environment instead:
1342
+
1343
+ ```bash
1344
+ export OPENAI_MODEL_NAME=ollama/llama3.2
1345
+ ```
1346
+
1347
+ Setting only `OPENAI_BASE_URL` is not enough: with no model named, the OpenAI
1348
+ default (`gpt-4o-mini`) is sent to Ollama, which answers
1349
+ `404 model 'gpt-4o-mini' not found`. Always name the model.
1350
+
1351
+ Point at a non-default host with `base_url=` or `OLLAMA_HOST`:
1352
+
1353
+ ```python
1354
+ agent = Agent(instructions="...", llm="ollama/llama3.2", base_url="http://192.168.1.10:11434")
1355
+ ```
1356
+
1357
+ The same shape works for other local runtimes — `lm_studio/`, `vllm/` and
1358
+ `hosted_vllm/` with their server's `base_url`.
1359
+
1321
1360
  See [Models docs](https://docs.praison.ai/docs/models) for more details.
1322
1361
 
1323
1362
  </details>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.7.4
3
+ Version: 4.7.6
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.2
15
- Requires-Dist: praisonai-code>=0.1.1
16
- Requires-Dist: praisonai-bot>=0.1.1
17
- Requires-Dist: praisonai-train>=0.1.1
18
- Requires-Dist: praisonai-browser>=0.1.1
19
- Requires-Dist: praisonai-mcp>=0.1.3
20
- Requires-Dist: praisonai-sandbox>=0.1.1
21
- Requires-Dist: praisonai-deploy>=0.1.1
14
+ Requires-Dist: praisonaiagents>=1.7.4
15
+ Requires-Dist: praisonai-code>=0.1.3
16
+ Requires-Dist: praisonai-bot>=0.1.3
17
+ Requires-Dist: praisonai-train>=0.1.3
18
+ Requires-Dist: praisonai-browser>=0.1.3
19
+ Requires-Dist: praisonai-mcp>=0.1.5
20
+ Requires-Dist: praisonai-sandbox>=0.1.3
21
+ Requires-Dist: praisonai-deploy>=0.1.3
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
@@ -247,6 +247,19 @@ curl -fsSL https://praison.ai/install.sh | bash
247
247
  <img src="https://img.shields.io/badge/Highlighted_by_Elon_Musk-000000?style=for-the-badge&logo=x&logoColor=white" alt="Highlighted by Elon Musk" />
248
248
  </a>
249
249
  <br>
250
+ <br>
251
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
252
+ <img src="https://img.shields.io/badge/Download_for_macOS-000000?style=for-the-badge&logo=apple&logoColor=white" alt="Download for macOS" />
253
+ </a>
254
+ &nbsp;&nbsp;
255
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
256
+ <img src="https://img.shields.io/badge/Download_for_Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white" alt="Download for Windows" />
257
+ </a>
258
+ &nbsp;&nbsp;
259
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
260
+ <img src="https://img.shields.io/badge/Download_for_Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download for Linux" />
261
+ </a>
262
+ <br>
250
263
  </div>
251
264
 
252
265
  <p align="center">
@@ -1311,13 +1324,39 @@ For other providers, see [Models docs](https://docs.praison.ai/docs/models).
1311
1324
  <summary><strong>How do I use a local model (Ollama)?</strong></summary>
1312
1325
 
1313
1326
  ```bash
1314
- # Start Ollama server first
1327
+ # Start Ollama and pull a model
1315
1328
  ollama serve
1329
+ ollama pull llama3.2
1330
+ ```
1316
1331
 
1317
- # Set environment variable
1318
- export OPENAI_BASE_URL=http://localhost:11434/v1
1332
+ ```python
1333
+ from praisonaiagents import Agent
1334
+
1335
+ agent = Agent(instructions="You are a helpful assistant", llm="ollama/llama3.2")
1336
+ agent.start("Why is the sky blue?")
1319
1337
  ```
1320
1338
 
1339
+ The `ollama/` prefix is what selects Ollama's handling — tool-call repair,
1340
+ tool-result formatting and the streaming rules small local models need. Or set
1341
+ it by environment instead:
1342
+
1343
+ ```bash
1344
+ export OPENAI_MODEL_NAME=ollama/llama3.2
1345
+ ```
1346
+
1347
+ Setting only `OPENAI_BASE_URL` is not enough: with no model named, the OpenAI
1348
+ default (`gpt-4o-mini`) is sent to Ollama, which answers
1349
+ `404 model 'gpt-4o-mini' not found`. Always name the model.
1350
+
1351
+ Point at a non-default host with `base_url=` or `OLLAMA_HOST`:
1352
+
1353
+ ```python
1354
+ agent = Agent(instructions="...", llm="ollama/llama3.2", base_url="http://192.168.1.10:11434")
1355
+ ```
1356
+
1357
+ The same shape works for other local runtimes — `lm_studio/`, `vllm/` and
1358
+ `hosted_vllm/` with their server's `base_url`.
1359
+
1321
1360
  See [Models docs](https://docs.praison.ai/docs/models) for more details.
1322
1361
 
1323
1362
  </details>
@@ -33,17 +33,6 @@ praisonai/upload_vision.py
33
33
  praisonai/version.py
34
34
  praisonai/_dev/__init__.py
35
35
  praisonai/_dev/api_md.py
36
- praisonai/_dev/parity/__init__.py
37
- praisonai/_dev/parity/docs_extractor.py
38
- praisonai/_dev/parity/docs_generator.py
39
- praisonai/_dev/parity/generator.py
40
- praisonai/_dev/parity/python_docs_extractor.py
41
- praisonai/_dev/parity/python_extractor.py
42
- praisonai/_dev/parity/rust_docs_extractor.py
43
- praisonai/_dev/parity/rust_extractor.py
44
- praisonai/_dev/parity/topic_normalizer.py
45
- praisonai/_dev/parity/ts_docs_extractor.py
46
- praisonai/_dev/parity/typescript_extractor.py
47
36
  praisonai/acp/__init__.py
48
37
  praisonai/acp/config.py
49
38
  praisonai/acp/safe_edit.py
@@ -327,7 +316,6 @@ praisonai/integrations/__init__.py
327
316
  praisonai/integrations/_cli_loaders.py
328
317
  praisonai/integrations/_session_info.py
329
318
  praisonai/integrations/_tool_aliases.py
330
- praisonai/integrations/_unified_registry.py
331
319
  praisonai/integrations/backend_registry.py
332
320
  praisonai/integrations/base.py
333
321
  praisonai/integrations/claude_code.py
@@ -1,14 +1,14 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.7.2
5
- praisonai-code>=0.1.1
6
- praisonai-bot>=0.1.1
7
- praisonai-train>=0.1.1
8
- praisonai-browser>=0.1.1
9
- praisonai-mcp>=0.1.3
10
- praisonai-sandbox>=0.1.1
11
- praisonai-deploy>=0.1.1
4
+ praisonaiagents>=1.7.4
5
+ praisonai-code>=0.1.3
6
+ praisonai-bot>=0.1.3
7
+ praisonai-train>=0.1.3
8
+ praisonai-browser>=0.1.3
9
+ praisonai-mcp>=0.1.5
10
+ praisonai-sandbox>=0.1.3
11
+ praisonai-deploy>=0.1.3
12
12
  python-dotenv>=0.19.0
13
13
  litellm<2,>=1.83.14
14
14
  PyYAML>=6.0
@@ -35,6 +35,19 @@ curl -fsSL https://praison.ai/install.sh | bash
35
35
  <img src="https://img.shields.io/badge/Highlighted_by_Elon_Musk-000000?style=for-the-badge&logo=x&logoColor=white" alt="Highlighted by Elon Musk" />
36
36
  </a>
37
37
  <br>
38
+ <br>
39
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
40
+ <img src="https://img.shields.io/badge/Download_for_macOS-000000?style=for-the-badge&logo=apple&logoColor=white" alt="Download for macOS" />
41
+ </a>
42
+ &nbsp;&nbsp;
43
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
44
+ <img src="https://img.shields.io/badge/Download_for_Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white" alt="Download for Windows" />
45
+ </a>
46
+ &nbsp;&nbsp;
47
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
48
+ <img src="https://img.shields.io/badge/Download_for_Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download for Linux" />
49
+ </a>
50
+ <br>
38
51
  </div>
39
52
 
40
53
  <p align="center">
@@ -1099,13 +1112,39 @@ For other providers, see [Models docs](https://docs.praison.ai/docs/models).
1099
1112
  <summary><strong>How do I use a local model (Ollama)?</strong></summary>
1100
1113
 
1101
1114
  ```bash
1102
- # Start Ollama server first
1115
+ # Start Ollama and pull a model
1103
1116
  ollama serve
1117
+ ollama pull llama3.2
1118
+ ```
1104
1119
 
1105
- # Set environment variable
1106
- export OPENAI_BASE_URL=http://localhost:11434/v1
1120
+ ```python
1121
+ from praisonaiagents import Agent
1122
+
1123
+ agent = Agent(instructions="You are a helpful assistant", llm="ollama/llama3.2")
1124
+ agent.start("Why is the sky blue?")
1107
1125
  ```
1108
1126
 
1127
+ The `ollama/` prefix is what selects Ollama's handling — tool-call repair,
1128
+ tool-result formatting and the streaming rules small local models need. Or set
1129
+ it by environment instead:
1130
+
1131
+ ```bash
1132
+ export OPENAI_MODEL_NAME=ollama/llama3.2
1133
+ ```
1134
+
1135
+ Setting only `OPENAI_BASE_URL` is not enough: with no model named, the OpenAI
1136
+ default (`gpt-4o-mini`) is sent to Ollama, which answers
1137
+ `404 model 'gpt-4o-mini' not found`. Always name the model.
1138
+
1139
+ Point at a non-default host with `base_url=` or `OLLAMA_HOST`:
1140
+
1141
+ ```python
1142
+ agent = Agent(instructions="...", llm="ollama/llama3.2", base_url="http://192.168.1.10:11434")
1143
+ ```
1144
+
1145
+ The same shape works for other local runtimes — `lm_studio/`, `vllm/` and
1146
+ `hosted_vllm/` with their server's `base_url`.
1147
+
1109
1148
  See [Models docs](https://docs.praison.ai/docs/models) for more details.
1110
1149
 
1111
1150
  </details>
@@ -197,8 +197,13 @@ def __getattr__(name):
197
197
  from .integrations.local_agent import LocalAgentConfig
198
198
  return LocalAgentConfig
199
199
  elif name in ('DB', 'PraisonAIDB', 'PraisonDB'):
200
- from .db.adapter import DB
201
- return DB
200
+ # Route through ``praisonai.db`` (not ``db.adapter`` directly) so the
201
+ # deprecation warning defined on the ``praisonai.db`` import path fires
202
+ # consistently. ``db`` classes are deprecated in favour of the ``db(...)``
203
+ # factory; ``from praisonai import DB`` must warn just like
204
+ # ``from praisonai.db import DB``.
205
+ from . import db as _db
206
+ return getattr(_db, name)
202
207
  # Note: n8n is available via direct import: from praisonai.n8n import YAMLToN8nConverter
203
208
  # Lazy loading from main package causes recursion, so use direct import for now
204
209
 
@@ -85,6 +85,32 @@ _global_option_names_lock = threading.Lock()
85
85
  _LEGACY_COLLIDING_SHORT_OPTS = frozenset({"-s", "-f"})
86
86
 
87
87
 
88
+ def _introspect_option_names(command):
89
+ """Derive ``(all_opts, value_opts)`` from a Click command's parameters.
90
+
91
+ Single owner for the parse loop shared by :func:`_get_run_option_names` and
92
+ :func:`_get_global_option_names`; ``all_opts`` is every long/short option
93
+ string and ``value_opts`` is the non-flag subset that consumes a value.
94
+ """
95
+ all_opts = set()
96
+ value_opts = set()
97
+ for param in command.params:
98
+ is_flag = getattr(param, "is_flag", False) or getattr(
99
+ param, "is_bool_flag", False
100
+ )
101
+ for opt in getattr(param, "opts", []):
102
+ if opt.startswith("-"):
103
+ all_opts.add(opt)
104
+ if not is_flag:
105
+ value_opts.add(opt)
106
+ # Secondary opts are the negated forms of bool flags
107
+ # (e.g. ``--no-stream``); never value-consuming.
108
+ for opt in getattr(param, "secondary_opts", []):
109
+ if opt.startswith("-"):
110
+ all_opts.add(opt)
111
+ return all_opts, value_opts
112
+
113
+
88
114
  def _get_run_option_names():
89
115
  """Return the option names accepted by the Typer ``run`` command.
90
116
 
@@ -110,22 +136,7 @@ def _get_run_option_names():
110
136
  from typer.main import get_command as _get_command
111
137
 
112
138
  command = _get_command(run_app)
113
- all_opts = set()
114
- value_opts = set()
115
- for param in command.params:
116
- is_flag = getattr(param, "is_flag", False) or getattr(
117
- param, "is_bool_flag", False
118
- )
119
- for opt in getattr(param, "opts", []):
120
- if opt.startswith("-"):
121
- all_opts.add(opt)
122
- if not is_flag:
123
- value_opts.add(opt)
124
- # Secondary opts are the negated forms of bool flags
125
- # (e.g. ``--no-stream``); never value-consuming.
126
- for opt in getattr(param, "secondary_opts", []):
127
- if opt.startswith("-"):
128
- all_opts.add(opt)
139
+ all_opts, value_opts = _introspect_option_names(command)
129
140
  except Exception:
130
141
  # Introspection depends only on the static command definition, so a
131
142
  # failure here is structural — cache it (as ``False``) to avoid
@@ -157,20 +168,7 @@ def _get_global_option_names():
157
168
  from typer.main import get_command as _get_command
158
169
 
159
170
  command = _get_command(root_app)
160
- all_opts = set()
161
- value_opts = set()
162
- for param in command.params:
163
- is_flag = getattr(param, "is_flag", False) or getattr(
164
- param, "is_bool_flag", False
165
- )
166
- for opt in getattr(param, "opts", []):
167
- if opt.startswith("-"):
168
- all_opts.add(opt)
169
- if not is_flag:
170
- value_opts.add(opt)
171
- for opt in getattr(param, "secondary_opts", []):
172
- if opt.startswith("-"):
173
- all_opts.add(opt)
171
+ all_opts, value_opts = _introspect_option_names(command)
174
172
  except Exception:
175
173
  _global_option_names_cache = False
176
174
  return None
@@ -12,23 +12,22 @@ import difflib
12
12
  import importlib
13
13
  import importlib.util
14
14
  from pathlib import Path
15
- from typing import Dict, Any, Optional, List
15
+ from typing import Dict, Any, Optional, List, TYPE_CHECKING
16
16
 
17
17
  from .version import __version__
18
18
 
19
- # Import new architecture components
20
- from .framework_adapters.base import FrameworkAdapter
21
- from .framework_adapters.registry import FrameworkAdapterRegistry, get_default_registry
19
+ # New architecture components are imported lazily to preserve the wrapper's
20
+ # lazy-import contract: eagerly importing them here would pull the heavy
21
+ # ``praisonaiagents.frameworks.*`` tree on every CLI command and ``praisonai.run``
22
+ # call. Runtime access goes through ``_get_default_adapter_registry()`` below;
23
+ # these type-only imports carry no runtime cost.
24
+ if TYPE_CHECKING:
25
+ from .framework_adapters.base import FrameworkAdapter
26
+ from .framework_adapters.registry import FrameworkAdapterRegistry
22
27
 
23
28
  logger = logging.getLogger("praisonai.agents_generator")
24
29
 
25
30
 
26
- def _rich_print(*args, **kwargs):
27
- """Lazy alias for rich.print — pays the import cost only on first use."""
28
- from rich import print as _rp
29
- return _rp(*args, **kwargs)
30
-
31
-
32
31
  def _yaml_safe_load(stream):
33
32
  """Lazy alias for yaml.safe_load."""
34
33
  import yaml
@@ -668,7 +667,7 @@ class AgentsGenerator:
668
667
  self.close()
669
668
  return False
670
669
 
671
- def _get_framework_adapter(self, framework: str) -> FrameworkAdapter:
670
+ def _get_framework_adapter(self, framework: str) -> "FrameworkAdapter":
672
671
  """
673
672
  Get the appropriate framework adapter for the given framework.
674
673
 
@@ -30,10 +30,22 @@ logger = logging.getLogger(__name__)
30
30
  import os
31
31
  import warnings
32
32
 
33
- CALL_SERVER_TOKEN = os.getenv('CALL_SERVER_TOKEN')
34
33
  _LOCALHOST_HOSTS = frozenset({'127.0.0.1', 'localhost', '::1'})
35
34
 
36
35
 
36
+ def _call_server_token() -> Optional[str]:
37
+ """Live-read the shared server token from the environment.
38
+
39
+ The environment is the single source of truth; capturing it at import time
40
+ broke any host that mounts this router without going through
41
+ ``praisonai.api.call.main()`` (AgentOS, ``serve``, tests, embedders) and
42
+ made a late-loaded ``.env`` or runtime rotation impossible. Reading here —
43
+ like ``_call_auth_disabled`` / ``_configured_bind_host`` already do — makes
44
+ every request observe the current value.
45
+ """
46
+ return os.getenv('CALL_SERVER_TOKEN')
47
+
48
+
37
49
  def _call_auth_disabled() -> bool:
38
50
  return os.getenv('PRAISONAI_CALL_AUTH', '').lower() == 'disabled'
39
51
 
@@ -67,7 +79,8 @@ async def verify_token(
67
79
  stacklevel=2,
68
80
  )
69
81
  return
70
- if not CALL_SERVER_TOKEN:
82
+ expected = _call_server_token()
83
+ if not expected:
71
84
  raise HTTPException(
72
85
  status_code=503,
73
86
  detail="CALL_SERVER_TOKEN is not configured. Set CALL_SERVER_TOKEN to enable authentication.",
@@ -96,7 +109,7 @@ async def verify_token(
96
109
 
97
110
  # Constant-time comparison to avoid a token-recovery timing side channel.
98
111
  import hmac
99
- if not token or not hmac.compare_digest(token, CALL_SERVER_TOKEN):
112
+ if not token or not hmac.compare_digest(token, expected):
100
113
  raise HTTPException(status_code=401, detail="Unauthorized")
101
114
 
102
115
  # Request/Response Models
@@ -185,6 +198,17 @@ class AgentRegistry:
185
198
  _default_registry = AgentRegistry()
186
199
 
187
200
 
201
+ def _registry_dependency() -> AgentRegistry:
202
+ """Which ``AgentRegistry`` serves this request?
203
+
204
+ Returns the process-default registry by default, but is overridable via
205
+ ``app.dependency_overrides[_registry_dependency] = ...`` so an ``AgentOS`` /
206
+ ``serve`` host can bind its own registry per app instance and get real
207
+ per-tenant isolation through the router (not just the free functions).
208
+ """
209
+ return _default_registry
210
+
211
+
188
212
  def register_agent(agent_id: str, agent: Any,
189
213
  *, registry: Optional[AgentRegistry] = None) -> None:
190
214
  """Register an agent for invocation via API."""
@@ -256,7 +280,8 @@ def _clone_agent(agent: Any) -> Any:
256
280
  return _copy.deepcopy(agent)
257
281
 
258
282
 
259
- def resolve_session_agent(agent_id: str, session_id: Optional[str]) -> Any:
283
+ def resolve_session_agent(agent_id: str, session_id: Optional[str],
284
+ *, registry: Optional[AgentRegistry] = None) -> Any:
260
285
  """Resolve an isolated, session-scoped agent for a single request.
261
286
 
262
287
  The registry holds a *template* agent, not a live conversation. Every
@@ -272,7 +297,7 @@ def resolve_session_agent(agent_id: str, session_id: Optional[str]) -> Any:
272
297
  Agents that don't support cloning/session binding (e.g. plain mocks) fall
273
298
  back to the shared registry instance for backward compatibility.
274
299
  """
275
- template = get_agent(agent_id)
300
+ template = get_agent(agent_id, registry=registry)
276
301
  if template is None:
277
302
  return None
278
303
 
@@ -438,7 +463,8 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
438
463
  async def invoke_agent(
439
464
  agent_id: str,
440
465
  request: AgentInvokeRequest,
441
- _: None = Depends(verify_token)
466
+ _: None = Depends(verify_token),
467
+ registry: AgentRegistry = Depends(_registry_dependency),
442
468
  ) -> Union[AgentInvokeResponse, ErrorResponse]:
443
469
  """
444
470
  Invoke a PraisonAI agent with a message.
@@ -472,7 +498,7 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
472
498
  # share mutable chat_history. A provided session_id gives continuity via
473
499
  # the shared session store; its absence yields an ephemeral conversation.
474
500
  try:
475
- agent = resolve_session_agent(agent_id, request.session_id)
501
+ agent = resolve_session_agent(agent_id, request.session_id, registry=registry)
476
502
  except Exception as e:
477
503
  logger.error(f"Failed to isolate agent {agent_id}: {e}")
478
504
  raise HTTPException(
@@ -533,14 +559,17 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
533
559
  )
534
560
 
535
561
  @router.get("/agents")
536
- async def list_agents(_: None = Depends(verify_token)) -> Dict[str, Any]:
562
+ async def list_agents(
563
+ _: None = Depends(verify_token),
564
+ registry: AgentRegistry = Depends(_registry_dependency),
565
+ ) -> Dict[str, Any]:
537
566
  """
538
567
  List all registered agents.
539
568
 
540
569
  Returns:
541
570
  Dictionary containing list of available agents
542
571
  """
543
- agents = list_registered_agents()
572
+ agents = list_registered_agents(registry=registry)
544
573
  return {
545
574
  "agents": agents,
546
575
  "count": len(agents),
@@ -564,11 +593,15 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
564
593
  }
565
594
 
566
595
  @router.delete("/agents/{agent_id}")
567
- async def unregister_agent_endpoint(agent_id: str, _: None = Depends(verify_token)) -> Dict[str, Any]:
596
+ async def unregister_agent_endpoint(
597
+ agent_id: str,
598
+ _: None = Depends(verify_token),
599
+ registry: AgentRegistry = Depends(_registry_dependency),
600
+ ) -> Dict[str, Any]:
568
601
  """
569
602
  Unregister an agent from API access.
570
603
  """
571
- success = unregister_agent(agent_id)
604
+ success = unregister_agent(agent_id, registry=registry)
572
605
  if success:
573
606
  return {
574
607
  "message": f"Agent '{agent_id}' unregistered successfully",
@@ -581,11 +614,15 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
581
614
  )
582
615
 
583
616
  @router.get("/agents/{agent_id}")
584
- async def get_agent_info(agent_id: str, _: None = Depends(verify_token)) -> Dict[str, Any]:
617
+ async def get_agent_info(
618
+ agent_id: str,
619
+ _: None = Depends(verify_token),
620
+ registry: AgentRegistry = Depends(_registry_dependency),
621
+ ) -> Dict[str, Any]:
585
622
  """
586
623
  Get information about a registered agent.
587
624
  """
588
- agent = get_agent(agent_id)
625
+ agent = get_agent(agent_id, registry=registry)
589
626
  if not agent:
590
627
  raise HTTPException(
591
628
  status_code=404,
@@ -221,13 +221,9 @@ def _refresh_env_globals() -> None:
221
221
  CALL_SERVER_TOKEN = os.getenv('CALL_SERVER_TOKEN')
222
222
  MAX_CONCURRENT_CONNECTIONS = int(os.getenv('MAX_CONCURRENT_CONNECTIONS', '5'))
223
223
  MAX_REQUESTS_PER_WINDOW = int(os.getenv('MAX_REQUESTS_PER_WINDOW', '100'))
224
- # The included n8n invoke router captures CALL_SERVER_TOKEN in its own
225
- # module at import; refresh it there too so its auth stays consistent.
226
- try:
227
- from . import agent_invoke as _agent_invoke
228
- _agent_invoke.CALL_SERVER_TOKEN = CALL_SERVER_TOKEN
229
- except Exception:
230
- pass
224
+ # The included n8n invoke router now live-reads CALL_SERVER_TOKEN from the
225
+ # environment per request (agent_invoke._call_server_token), so no
226
+ # cross-module reach-in is needed to keep its auth consistent.
231
227
 
232
228
 
233
229
  # Set up logging