PraisonAI 4.7.5__tar.gz → 4.7.7__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 (578) hide show
  1. {praisonai-4.7.5 → praisonai-4.7.7}/PKG-INFO +53 -13
  2. {praisonai-4.7.5 → praisonai-4.7.7}/PraisonAI.egg-info/PKG-INFO +53 -13
  3. {praisonai-4.7.5 → praisonai-4.7.7}/PraisonAI.egg-info/SOURCES.txt +0 -12
  4. {praisonai-4.7.5 → praisonai-4.7.7}/PraisonAI.egg-info/requires.txt +10 -9
  5. {praisonai-4.7.5 → praisonai-4.7.7}/README.md +42 -3
  6. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/__main__.py +28 -30
  7. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_async_bridge.py +152 -14
  8. praisonai-4.7.7/praisonai/_lazy_cache.py +95 -0
  9. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/agents_generator.py +26 -20
  10. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/api/agent_invoke.py +50 -13
  11. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/api/call.py +3 -7
  12. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/auto.py +115 -57
  13. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/context.py +42 -4
  14. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/rag.py +45 -3
  15. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/recipe.py +10 -2
  16. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/serve.py +47 -0
  17. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/interactive_legacy.py +19 -0
  18. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/subcommand_handlers.py +30 -10
  19. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/workflow_commands.py +61 -32
  20. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/db/adapter.py +131 -83
  21. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/a2u_server.py +137 -31
  22. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/autogen_adapter.py +33 -13
  23. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/crewai_adapter.py +97 -16
  24. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/registry.py +11 -1
  25. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/__init__.py +2 -2
  26. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/registry.py +17 -4
  27. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/observability/hooks.py +59 -23
  28. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/judge.py +13 -3
  29. praisonai-4.7.7/praisonai/setup/build.py +13 -0
  30. praisonai-4.7.7/praisonai/setup/post_install.py +21 -0
  31. praisonai-4.7.7/praisonai/setup.py +9 -0
  32. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/tool_override.py +20 -14
  33. praisonai-4.7.7/praisonai/version.py +1 -0
  34. {praisonai-4.7.5 → praisonai-4.7.7}/pyproject.toml +11 -10
  35. praisonai-4.7.5/praisonai/_dev/parity/__init__.py +0 -42
  36. praisonai-4.7.5/praisonai/_dev/parity/docs_extractor.py +0 -183
  37. praisonai-4.7.5/praisonai/_dev/parity/docs_generator.py +0 -1029
  38. praisonai-4.7.5/praisonai/_dev/parity/generator.py +0 -803
  39. praisonai-4.7.5/praisonai/_dev/parity/python_docs_extractor.py +0 -167
  40. praisonai-4.7.5/praisonai/_dev/parity/python_extractor.py +0 -252
  41. praisonai-4.7.5/praisonai/_dev/parity/rust_docs_extractor.py +0 -55
  42. praisonai-4.7.5/praisonai/_dev/parity/rust_extractor.py +0 -332
  43. praisonai-4.7.5/praisonai/_dev/parity/topic_normalizer.py +0 -170
  44. praisonai-4.7.5/praisonai/_dev/parity/ts_docs_extractor.py +0 -55
  45. praisonai-4.7.5/praisonai/_dev/parity/typescript_extractor.py +0 -225
  46. praisonai-4.7.5/praisonai/_lazy_cache.py +0 -51
  47. praisonai-4.7.5/praisonai/setup/build.py +0 -21
  48. praisonai-4.7.5/praisonai/setup/post_install.py +0 -23
  49. praisonai-4.7.5/praisonai/setup.py +0 -16
  50. praisonai-4.7.5/praisonai/standardise/manifest.py +0 -201
  51. praisonai-4.7.5/praisonai/version.py +0 -1
  52. {praisonai-4.7.5 → praisonai-4.7.7}/PraisonAI.egg-info/dependency_links.txt +0 -0
  53. {praisonai-4.7.5 → praisonai-4.7.7}/PraisonAI.egg-info/entry_points.txt +0 -0
  54. {praisonai-4.7.5 → praisonai-4.7.7}/PraisonAI.egg-info/top_level.txt +0 -0
  55. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/__init__.py +0 -0
  56. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_api_auth.py +0 -0
  57. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_approval_spec.py +0 -0
  58. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_bootstrap.py +0 -0
  59. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_dev/__init__.py +0 -0
  60. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_dev/api_md.py +0 -0
  61. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_entrypoint.py +0 -0
  62. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_framework_availability.py +0 -0
  63. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_logging.py +0 -0
  64. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_registry.py +0 -0
  65. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/_safe_loader.py +0 -0
  66. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/acp/__init__.py +0 -0
  67. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/acp/config.py +0 -0
  68. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/acp/safe_edit.py +0 -0
  69. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/acp/server.py +0 -0
  70. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/acp/session.py +0 -0
  71. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/adapters/__init__.py +0 -0
  72. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/adapters/readers.py +0 -0
  73. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/adapters/rerankers.py +0 -0
  74. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/adapters/retrievers.py +0 -0
  75. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/adapters/vector_stores.py +0 -0
  76. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/agent.py +0 -0
  77. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/agent_scheduler.py +0 -0
  78. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/app/__init__.py +0 -0
  79. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/app/agentos.py +0 -0
  80. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/async_agent_scheduler.py +0 -0
  81. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/audit/__init__.py +0 -0
  82. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/audit/agent_centric.py +0 -0
  83. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/bots/__init__.py +0 -0
  84. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/browser/__init__.py +0 -0
  85. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/__init__.py +0 -0
  86. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/a2a.py +0 -0
  87. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/assistants.py +0 -0
  88. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/audio.py +0 -0
  89. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/batches.py +0 -0
  90. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/completions.py +0 -0
  91. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/container_files.py +0 -0
  92. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/containers.py +0 -0
  93. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/embeddings.py +0 -0
  94. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/files.py +0 -0
  95. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/fine_tuning.py +0 -0
  96. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/guardrails.py +0 -0
  97. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/images.py +0 -0
  98. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/mcp.py +0 -0
  99. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/messages.py +0 -0
  100. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/moderations.py +0 -0
  101. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/ocr.py +0 -0
  102. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/passthrough.py +0 -0
  103. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/rag.py +0 -0
  104. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/realtime.py +0 -0
  105. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/rerank.py +0 -0
  106. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/responses.py +0 -0
  107. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/search.py +0 -0
  108. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/skills.py +0 -0
  109. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/vector_store_files.py +0 -0
  110. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/vector_stores.py +0 -0
  111. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/capabilities/videos.py +0 -0
  112. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/claw/__init__.py +0 -0
  113. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/__init__.py +0 -0
  114. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/_paths.py +0 -0
  115. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/_shim.py +0 -0
  116. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/_warnings.py +0 -0
  117. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/app.py +0 -0
  118. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/approval_backend.py +0 -0
  119. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/branding.py +0 -0
  120. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/__init__.py +0 -0
  121. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/_profiling.py +0 -0
  122. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/acp.py +0 -0
  123. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/agent.py +0 -0
  124. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/agents.py +0 -0
  125. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/app.py +0 -0
  126. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/attach.py +0 -0
  127. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/audit.py +0 -0
  128. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/auth.py +0 -0
  129. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/batch.py +0 -0
  130. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/benchmark.py +0 -0
  131. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/bot.py +0 -0
  132. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/browser.py +0 -0
  133. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/call.py +0 -0
  134. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/chat.py +0 -0
  135. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/checkpoint.py +0 -0
  136. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/claw.py +0 -0
  137. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/code.py +0 -0
  138. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/command.py +0 -0
  139. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/commit.py +0 -0
  140. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/completion.py +0 -0
  141. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/config.py +0 -0
  142. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/daemon.py +0 -0
  143. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/dashboard.py +0 -0
  144. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/debug.py +0 -0
  145. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/deploy.py +0 -0
  146. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/diag.py +0 -0
  147. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/docs.py +0 -0
  148. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/doctor.py +0 -0
  149. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/endpoints.py +0 -0
  150. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/environment.py +0 -0
  151. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/eval.py +0 -0
  152. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/examples.py +0 -0
  153. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/flow.py +0 -0
  154. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/gateway.py +0 -0
  155. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/github.py +0 -0
  156. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/hooks.py +0 -0
  157. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/identity.py +0 -0
  158. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/init.py +0 -0
  159. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/kanban.py +0 -0
  160. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/knowledge.py +0 -0
  161. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/langextract.py +0 -0
  162. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/langfuse.py +0 -0
  163. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/loop.py +0 -0
  164. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/lsp.py +0 -0
  165. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/managed.py +0 -0
  166. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/mcp.py +0 -0
  167. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/memory.py +0 -0
  168. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/mint_link.py +0 -0
  169. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/models.py +0 -0
  170. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/n8n.py +0 -0
  171. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/obs.py +0 -0
  172. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/onboard.py +0 -0
  173. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/package.py +0 -0
  174. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/pairing.py +0 -0
  175. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/paths.py +0 -0
  176. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/permissions.py +0 -0
  177. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/plugins.py +0 -0
  178. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/port.py +0 -0
  179. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/profile.py +0 -0
  180. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/publish.py +0 -0
  181. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/realtime.py +0 -0
  182. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/registry.py +0 -0
  183. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/replay.py +0 -0
  184. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/research.py +0 -0
  185. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/retrieval.py +0 -0
  186. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/rules.py +0 -0
  187. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/run.py +0 -0
  188. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/sandbox.py +0 -0
  189. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/schedule.py +0 -0
  190. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/serve.py +0 -0
  191. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/session.py +0 -0
  192. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/setup.py +0 -0
  193. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/skills.py +0 -0
  194. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/standardise.py +0 -0
  195. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/templates.py +0 -0
  196. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/test.py +0 -0
  197. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/todo.py +0 -0
  198. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/tools.py +0 -0
  199. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/traces.py +0 -0
  200. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/tracker.py +0 -0
  201. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/train.py +0 -0
  202. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/ui.py +0 -0
  203. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/up.py +0 -0
  204. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/validate.py +0 -0
  205. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/version.py +0 -0
  206. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/commands/workflow.py +0 -0
  207. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/config_loader.py +0 -0
  208. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/configuration/__init__.py +0 -0
  209. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/configuration/config.schema.json +0 -0
  210. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/execution/__init__.py +0 -0
  211. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/fallback_schema.py +0 -0
  212. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/__init__.py +0 -0
  213. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/acp.py +0 -0
  214. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/agent_scheduler.py +0 -0
  215. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/agent_tools.py +0 -0
  216. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/approval.py +0 -0
  217. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/background.py +0 -0
  218. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/bots_cli.py +0 -0
  219. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/deploy.py +0 -0
  220. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/endpoints.py +0 -0
  221. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/eval.py +0 -0
  222. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/gateway.py +0 -0
  223. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/ollama.py +0 -0
  224. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/onboard.py +0 -0
  225. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/persistence.py +0 -0
  226. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/recipe.py +0 -0
  227. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/recipe_optimizer.py +0 -0
  228. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/registry.py +0 -0
  229. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/sandbox_cli.py +0 -0
  230. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/templates.py +0 -0
  231. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/tools.py +0 -0
  232. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/tui/__init__.py +0 -0
  233. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/tui/app.py +0 -0
  234. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/features/workflow.py +0 -0
  235. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/interactive/__init__.py +0 -0
  236. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/interactive/async_tui.py +0 -0
  237. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/interactive/config.py +0 -0
  238. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/interactive/core.py +0 -0
  239. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/interactive/events.py +0 -0
  240. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/langfuse_client.py +0 -0
  241. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/__init__.py +0 -0
  242. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/direct_prompt.py +0 -0
  243. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  244. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  245. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  246. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/framework_run.py +0 -0
  247. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  248. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/main.py +0 -0
  249. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/output/__init__.py +0 -0
  250. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/schedule_cli.py +0 -0
  251. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/schema_provider.py +0 -0
  252. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/session/__init__.py +0 -0
  253. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/state/__init__.py +0 -0
  254. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/ui/__init__.py +0 -0
  255. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/unified_schema.py +0 -0
  256. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli/utils/__init__.py +0 -0
  257. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/cli_backends/__init__.py +0 -0
  258. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/__init__.py +0 -0
  259. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/agent_tools.py +0 -0
  260. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/diff/__init__.py +0 -0
  261. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/diff/diff_strategy.py +0 -0
  262. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/__init__.py +0 -0
  263. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/apply_diff.py +0 -0
  264. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/execute_command.py +0 -0
  265. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/list_files.py +0 -0
  266. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/read_file.py +0 -0
  267. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/search_replace.py +0 -0
  268. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/tools/write_file.py +0 -0
  269. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/utils/__init__.py +0 -0
  270. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/utils/file_utils.py +0 -0
  271. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/utils/ignore_utils.py +0 -0
  272. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/code/utils/text_utils.py +0 -0
  273. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/config/__init__.py +0 -0
  274. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/config/agents.schema.json +0 -0
  275. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/config/schema.py +0 -0
  276. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/config/validator.py +0 -0
  277. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/__init__.py +0 -0
  278. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/_storage_path.py +0 -0
  279. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/artifact_store.py +0 -0
  280. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/config.py +0 -0
  281. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/history_store.py +0 -0
  282. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/queue.py +0 -0
  283. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/setup.py +0 -0
  284. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/context/terminal_logger.py +0 -0
  285. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/daemon/__init__.py +0 -0
  286. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/db/__init__.py +0 -0
  287. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/deploy/__init__.py +0 -0
  288. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/__init__.py +0 -0
  289. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/discovery.py +0 -0
  290. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/__init__.py +0 -0
  291. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/a2a.py +0 -0
  292. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/a2u.py +0 -0
  293. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/agents_api.py +0 -0
  294. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/base.py +0 -0
  295. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/mcp.py +0 -0
  296. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/openai_compat.py +0 -0
  297. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/recipe.py +0 -0
  298. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  299. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/registry.py +0 -0
  300. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/endpoints/server.py +0 -0
  301. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/__init__.py +0 -0
  302. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/client.py +0 -0
  303. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  304. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  305. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/components/__init__.py +0 -0
  306. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/converter.py +0 -0
  307. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/flow/helpers.py +0 -0
  308. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/__init__.py +0 -0
  309. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/_config_builder.py +0 -0
  310. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/base.py +0 -0
  311. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
  312. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/validators.py +0 -0
  313. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/framework_adapters/workflow_framework.py +0 -0
  314. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/gateway/__init__.py +0 -0
  315. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/inbuilt_tools/__init__.py +0 -0
  316. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  317. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/inc/__init__.py +0 -0
  318. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/inc/config.py +0 -0
  319. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/inc/models.py +0 -0
  320. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/__init__.py +0 -0
  321. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/__init__.py +0 -0
  322. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  323. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/hooks_query.py +0 -0
  324. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  325. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/schedules_runner.py +0 -0
  326. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/usage_bridge.py +0 -0
  327. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/bridges/workflows_service.py +0 -0
  328. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/context_files.py +0 -0
  329. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/gateway_host.py +0 -0
  330. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/host_app.py +0 -0
  331. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/pages/__init__.py +0 -0
  332. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/pages/bot_health.py +0 -0
  333. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integration/pages/workflow_runs.py +0 -0
  334. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/__init__.py +0 -0
  335. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/_cli_loaders.py +0 -0
  336. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/_session_info.py +0 -0
  337. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/_tool_aliases.py +0 -0
  338. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/backend_registry.py +0 -0
  339. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/base.py +0 -0
  340. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/claude_code.py +0 -0
  341. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/codex_cli.py +0 -0
  342. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/__init__.py +0 -0
  343. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/_sync_base.py +0 -0
  344. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/daytona.py +0 -0
  345. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/docker.py +0 -0
  346. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/e2b.py +0 -0
  347. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/flyio.py +0 -0
  348. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/local.py +0 -0
  349. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/modal_compute.py +0 -0
  350. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute/tenki.py +0 -0
  351. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/compute_managed_agent.py +0 -0
  352. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/cursor_cli.py +0 -0
  353. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/db_session_adapter.py +0 -0
  354. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/gemini_cli.py +0 -0
  355. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/hosted_agent.py +0 -0
  356. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/local_agent.py +0 -0
  357. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/managed_agents.py +0 -0
  358. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/managed_local.py +0 -0
  359. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/registry.py +0 -0
  360. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/integrations/sandboxed_agent.py +0 -0
  361. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/executor.py +0 -0
  362. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/models.py +0 -0
  363. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/path_validation.py +0 -0
  364. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/router.py +0 -0
  365. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/server.py +0 -0
  366. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/jobs/store.py +0 -0
  367. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/kanban/__init__.py +0 -0
  368. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/__init__.py +0 -0
  369. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/catalogue.py +0 -0
  370. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/config.py +0 -0
  371. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/credentials.py +0 -0
  372. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/env.py +0 -0
  373. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/llm/gateways.py +0 -0
  374. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/mcp_server/__init__.py +0 -0
  375. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/n8n/__init__.py +0 -0
  376. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/n8n/client.py +0 -0
  377. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/n8n/converter.py +0 -0
  378. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/n8n/preview.py +0 -0
  379. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/n8n/reverse_converter.py +0 -0
  380. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/observability/__init__.py +0 -0
  381. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/observability/langextract.py +0 -0
  382. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/observability/langfuse.py +0 -0
  383. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/__init__.py +0 -0
  384. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/_valkey_client.py +0 -0
  385. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/config.py +0 -0
  386. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/__init__.py +0 -0
  387. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/_ops.py +0 -0
  388. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/_sql_base.py +0 -0
  389. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  390. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/async_mysql.py +0 -0
  391. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/async_postgres.py +0 -0
  392. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  393. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/base.py +0 -0
  394. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/json_store.py +0 -0
  395. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/mysql.py +0 -0
  396. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/postgres.py +0 -0
  397. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/singlestore.py +0 -0
  398. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/sqlite.py +0 -0
  399. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/supabase.py +0 -0
  400. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/surrealdb.py +0 -0
  401. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  402. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/conversation/turso.py +0 -0
  403. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/factory.py +0 -0
  404. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/hooks/__init__.py +0 -0
  405. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  406. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/__init__.py +0 -0
  407. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/base.py +0 -0
  408. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/cassandra.py +0 -0
  409. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/chroma.py +0 -0
  410. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  411. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  412. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/couchbase.py +0 -0
  413. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/lancedb.py +0 -0
  414. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  415. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  416. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  417. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/milvus.py +0 -0
  418. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  419. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/pgvector.py +0 -0
  420. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/pinecone.py +0 -0
  421. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/qdrant.py +0 -0
  422. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  423. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  424. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  425. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  426. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  427. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/knowledge/weaviate.py +0 -0
  428. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/migrations/__init__.py +0 -0
  429. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/migrations/manager.py +0 -0
  430. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/orchestrator.py +0 -0
  431. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/registry.py +0 -0
  432. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/__init__.py +0 -0
  433. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/async_mongodb.py +0 -0
  434. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/base.py +0 -0
  435. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/dynamodb.py +0 -0
  436. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/firestore.py +0 -0
  437. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/gcs.py +0 -0
  438. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/memory.py +0 -0
  439. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/mongodb.py +0 -0
  440. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/redis.py +0 -0
  441. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/upstash.py +0 -0
  442. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/persistence/state/valkey.py +0 -0
  443. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/profiler.py +0 -0
  444. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/push/__init__.py +0 -0
  445. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/push/client.py +0 -0
  446. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/push/transports.py +0 -0
  447. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/__init__.py +0 -0
  448. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/bridge.py +0 -0
  449. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/core.py +0 -0
  450. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/exceptions.py +0 -0
  451. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/history.py +0 -0
  452. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/models.py +0 -0
  453. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/operations.py +0 -0
  454. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/policy.py +0 -0
  455. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/registry.py +0 -0
  456. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/runtime.py +0 -0
  457. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/security.py +0 -0
  458. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/serve.py +0 -0
  459. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/recipe/server.py +0 -0
  460. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/__init__.py +0 -0
  461. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/analyzer.py +0 -0
  462. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/applier.py +0 -0
  463. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/plan.py +0 -0
  464. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/player.py +0 -0
  465. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/reader.py +0 -0
  466. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/storage.py +0 -0
  467. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/replay/writer.py +0 -0
  468. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/runtime/__init__.py +0 -0
  469. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/runtime/__main__.py +0 -0
  470. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/sandbox/__init__.py +0 -0
  471. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/sandbox/_registry.py +0 -0
  472. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/__init__.py +0 -0
  473. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/_base_scheduler.py +0 -0
  474. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/_delivery.py +0 -0
  475. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/_dispatch.py +0 -0
  476. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/agent_scheduler.py +0 -0
  477. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  478. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/base.py +0 -0
  479. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  480. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/condition_gate.py +0 -0
  481. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/daemon_manager.py +0 -0
  482. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/deployment.py +0 -0
  483. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/executor.py +0 -0
  484. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/run_policy.py +0 -0
  485. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/shared.py +0 -0
  486. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/state_manager.py +0 -0
  487. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/suggestion_engine.py +0 -0
  488. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/scheduler/yaml_loader.py +0 -0
  489. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/security/__init__.py +0 -0
  490. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/security/audit.py +0 -0
  491. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/security/injection.py +0 -0
  492. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/security/protected.py +0 -0
  493. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/setup/__init__.py +0 -0
  494. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/setup/setup_conda_env.py +0 -0
  495. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/__init__.py +0 -0
  496. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/ai_generator.py +0 -0
  497. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/config.py +0 -0
  498. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/dedupe.py +0 -0
  499. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/discovery.py +0 -0
  500. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/drift.py +0 -0
  501. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/engine.py +0 -0
  502. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/example_verifier.py +0 -0
  503. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/models.py +0 -0
  504. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/reports.py +0 -0
  505. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/templates.py +0 -0
  506. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/undo_redo.py +0 -0
  507. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/standardise/validator.py +0 -0
  508. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/storage/__init__.py +0 -0
  509. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/storage/dynamodb_adapter.py +0 -0
  510. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/storage/mongodb_adapter.py +0 -0
  511. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/storage/postgresql_adapter.py +0 -0
  512. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/storage/redis_adapter.py +0 -0
  513. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/storage/valkey_adapter.py +0 -0
  514. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/__init__.py +0 -0
  515. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/batch_source.py +0 -0
  516. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/cli_docs_source.py +0 -0
  517. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/discovery.py +0 -0
  518. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/docs_source.py +0 -0
  519. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/examples_source.py +0 -0
  520. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/executor.py +0 -0
  521. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/models.py +0 -0
  522. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/report_viewer.py +0 -0
  523. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/reporter.py +0 -0
  524. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/suite_runner/runner.py +0 -0
  525. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/__init__.py +0 -0
  526. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/_tool_sources.py +0 -0
  527. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/cache.py +0 -0
  528. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/dependency_checker.py +0 -0
  529. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/discovery.py +0 -0
  530. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/loader.py +0 -0
  531. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/registry.py +0 -0
  532. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/resolver.py +0 -0
  533. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/security.py +0 -0
  534. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/templates/tools_doctor.py +0 -0
  535. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tool_registry.py +0 -0
  536. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tool_resolver.py +0 -0
  537. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/__init__.py +0 -0
  538. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/audio.py +0 -0
  539. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/glob_tool.py +0 -0
  540. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/grep_tool.py +0 -0
  541. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/kanban_tools.py +0 -0
  542. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/multiedit.py +0 -0
  543. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/tools/skill_manage.py +0 -0
  544. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/train/__init__.py +0 -0
  545. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/train.py +0 -0
  546. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/train_vision.py +0 -0
  547. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui/_aiui_datastore.py +0 -0
  548. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui/_external_agents.py +0 -0
  549. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui/context.py +0 -0
  550. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui/database_config.py +0 -0
  551. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_agents/__init__.py +0 -0
  552. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_agents/default_app.py +0 -0
  553. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_bot/__init__.py +0 -0
  554. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_bot/default_app.py +0 -0
  555. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_chat/__init__.py +0 -0
  556. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_chat/default_app.py +0 -0
  557. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_dashboard/__init__.py +0 -0
  558. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_dashboard/default_app.py +0 -0
  559. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_realtime/__init__.py +0 -0
  560. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/ui_realtime/default_app.py +0 -0
  561. {praisonai-4.7.5 → praisonai-4.7.7}/praisonai/upload_vision.py +0 -0
  562. {praisonai-4.7.5 → praisonai-4.7.7}/setup.cfg +0 -0
  563. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test.py +0 -0
  564. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_agents_playbook.py +0 -0
  565. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_approval_system.py +0 -0
  566. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_basic.py +0 -0
  567. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_cli_features.py +0 -0
  568. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_custom_tools_fix.py +0 -0
  569. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_double_api_fix.py +0 -0
  570. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_n8n_agent_invoke.py +0 -0
  571. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_n8n_cli_feature.py +0 -0
  572. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_n8n_integration.py +0 -0
  573. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_phase2_refactor.py +0 -0
  574. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_recipe.py +0 -0
  575. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_registry.py +0 -0
  576. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_runner.py +0 -0
  577. {praisonai-4.7.5 → praisonai-4.7.7}/tests/test_sandboxed_agent_compatibility.py +0 -0
  578. {praisonai-4.7.5 → praisonai-4.7.7}/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.5
3
+ Version: 4.7.7
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.3
15
- Requires-Dist: praisonai-code>=0.1.2
16
- Requires-Dist: praisonai-bot>=0.1.2
17
- Requires-Dist: praisonai-train>=0.1.2
18
- Requires-Dist: praisonai-browser>=0.1.2
19
- Requires-Dist: praisonai-mcp>=0.1.4
20
- Requires-Dist: praisonai-sandbox>=0.1.2
21
- Requires-Dist: praisonai-deploy>=0.1.2
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
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
@@ -129,7 +129,8 @@ Provides-Extra: agno
129
129
  Requires-Dist: praisonai-frameworks[agno]>=0.1.8; extra == "agno"
130
130
  Requires-Dist: praisonai-tools>=0.1.0; extra == "agno"
131
131
  Provides-Extra: google-adk
132
- Requires-Dist: praisonai-frameworks[google-adk]>=0.1.8; extra == "google-adk"
132
+ Requires-Dist: praisonai-frameworks>=0.1.8; extra == "google-adk"
133
+ Requires-Dist: google-adk[extensions]<3,>=2.5; extra == "google-adk"
133
134
  Requires-Dist: praisonai-tools>=0.1.0; extra == "google-adk"
134
135
  Provides-Extra: pydantic-ai
135
136
  Requires-Dist: praisonai-frameworks[pydantic-ai]>=0.1.9; extra == "pydantic-ai"
@@ -247,6 +248,19 @@ curl -fsSL https://praison.ai/install.sh | bash
247
248
  <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
249
  </a>
249
250
  <br>
251
+ <br>
252
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
253
+ <img src="https://img.shields.io/badge/Download_for_macOS-000000?style=for-the-badge&logo=apple&logoColor=white" alt="Download for macOS" />
254
+ </a>
255
+ &nbsp;&nbsp;
256
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
257
+ <img src="https://img.shields.io/badge/Download_for_Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white" alt="Download for Windows" />
258
+ </a>
259
+ &nbsp;&nbsp;
260
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
261
+ <img src="https://img.shields.io/badge/Download_for_Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download for Linux" />
262
+ </a>
263
+ <br>
250
264
  </div>
251
265
 
252
266
  <p align="center">
@@ -1311,13 +1325,39 @@ For other providers, see [Models docs](https://docs.praison.ai/docs/models).
1311
1325
  <summary><strong>How do I use a local model (Ollama)?</strong></summary>
1312
1326
 
1313
1327
  ```bash
1314
- # Start Ollama server first
1328
+ # Start Ollama and pull a model
1315
1329
  ollama serve
1330
+ ollama pull llama3.2
1331
+ ```
1316
1332
 
1317
- # Set environment variable
1318
- export OPENAI_BASE_URL=http://localhost:11434/v1
1333
+ ```python
1334
+ from praisonaiagents import Agent
1335
+
1336
+ agent = Agent(instructions="You are a helpful assistant", llm="ollama/llama3.2")
1337
+ agent.start("Why is the sky blue?")
1319
1338
  ```
1320
1339
 
1340
+ The `ollama/` prefix is what selects Ollama's handling — tool-call repair,
1341
+ tool-result formatting and the streaming rules small local models need. Or set
1342
+ it by environment instead:
1343
+
1344
+ ```bash
1345
+ export OPENAI_MODEL_NAME=ollama/llama3.2
1346
+ ```
1347
+
1348
+ Setting only `OPENAI_BASE_URL` is not enough: with no model named, the OpenAI
1349
+ default (`gpt-4o-mini`) is sent to Ollama, which answers
1350
+ `404 model 'gpt-4o-mini' not found`. Always name the model.
1351
+
1352
+ Point at a non-default host with `base_url=` or `OLLAMA_HOST`:
1353
+
1354
+ ```python
1355
+ agent = Agent(instructions="...", llm="ollama/llama3.2", base_url="http://192.168.1.10:11434")
1356
+ ```
1357
+
1358
+ The same shape works for other local runtimes — `lm_studio/`, `vllm/` and
1359
+ `hosted_vllm/` with their server's `base_url`.
1360
+
1321
1361
  See [Models docs](https://docs.praison.ai/docs/models) for more details.
1322
1362
 
1323
1363
  </details>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.7.5
3
+ Version: 4.7.7
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.3
15
- Requires-Dist: praisonai-code>=0.1.2
16
- Requires-Dist: praisonai-bot>=0.1.2
17
- Requires-Dist: praisonai-train>=0.1.2
18
- Requires-Dist: praisonai-browser>=0.1.2
19
- Requires-Dist: praisonai-mcp>=0.1.4
20
- Requires-Dist: praisonai-sandbox>=0.1.2
21
- Requires-Dist: praisonai-deploy>=0.1.2
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
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
@@ -129,7 +129,8 @@ Provides-Extra: agno
129
129
  Requires-Dist: praisonai-frameworks[agno]>=0.1.8; extra == "agno"
130
130
  Requires-Dist: praisonai-tools>=0.1.0; extra == "agno"
131
131
  Provides-Extra: google-adk
132
- Requires-Dist: praisonai-frameworks[google-adk]>=0.1.8; extra == "google-adk"
132
+ Requires-Dist: praisonai-frameworks>=0.1.8; extra == "google-adk"
133
+ Requires-Dist: google-adk[extensions]<3,>=2.5; extra == "google-adk"
133
134
  Requires-Dist: praisonai-tools>=0.1.0; extra == "google-adk"
134
135
  Provides-Extra: pydantic-ai
135
136
  Requires-Dist: praisonai-frameworks[pydantic-ai]>=0.1.9; extra == "pydantic-ai"
@@ -247,6 +248,19 @@ curl -fsSL https://praison.ai/install.sh | bash
247
248
  <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
249
  </a>
249
250
  <br>
251
+ <br>
252
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
253
+ <img src="https://img.shields.io/badge/Download_for_macOS-000000?style=for-the-badge&logo=apple&logoColor=white" alt="Download for macOS" />
254
+ </a>
255
+ &nbsp;&nbsp;
256
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
257
+ <img src="https://img.shields.io/badge/Download_for_Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white" alt="Download for Windows" />
258
+ </a>
259
+ &nbsp;&nbsp;
260
+ <a href="https://github.com/MervinPraison/PraisonAI/releases/latest">
261
+ <img src="https://img.shields.io/badge/Download_for_Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black" alt="Download for Linux" />
262
+ </a>
263
+ <br>
250
264
  </div>
251
265
 
252
266
  <p align="center">
@@ -1311,13 +1325,39 @@ For other providers, see [Models docs](https://docs.praison.ai/docs/models).
1311
1325
  <summary><strong>How do I use a local model (Ollama)?</strong></summary>
1312
1326
 
1313
1327
  ```bash
1314
- # Start Ollama server first
1328
+ # Start Ollama and pull a model
1315
1329
  ollama serve
1330
+ ollama pull llama3.2
1331
+ ```
1316
1332
 
1317
- # Set environment variable
1318
- export OPENAI_BASE_URL=http://localhost:11434/v1
1333
+ ```python
1334
+ from praisonaiagents import Agent
1335
+
1336
+ agent = Agent(instructions="You are a helpful assistant", llm="ollama/llama3.2")
1337
+ agent.start("Why is the sky blue?")
1319
1338
  ```
1320
1339
 
1340
+ The `ollama/` prefix is what selects Ollama's handling — tool-call repair,
1341
+ tool-result formatting and the streaming rules small local models need. Or set
1342
+ it by environment instead:
1343
+
1344
+ ```bash
1345
+ export OPENAI_MODEL_NAME=ollama/llama3.2
1346
+ ```
1347
+
1348
+ Setting only `OPENAI_BASE_URL` is not enough: with no model named, the OpenAI
1349
+ default (`gpt-4o-mini`) is sent to Ollama, which answers
1350
+ `404 model 'gpt-4o-mini' not found`. Always name the model.
1351
+
1352
+ Point at a non-default host with `base_url=` or `OLLAMA_HOST`:
1353
+
1354
+ ```python
1355
+ agent = Agent(instructions="...", llm="ollama/llama3.2", base_url="http://192.168.1.10:11434")
1356
+ ```
1357
+
1358
+ The same shape works for other local runtimes — `lm_studio/`, `vllm/` and
1359
+ `hosted_vllm/` with their server's `base_url`.
1360
+
1321
1361
  See [Models docs](https://docs.praison.ai/docs/models) for more details.
1322
1362
 
1323
1363
  </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
@@ -497,7 +486,6 @@ praisonai/standardise/discovery.py
497
486
  praisonai/standardise/drift.py
498
487
  praisonai/standardise/engine.py
499
488
  praisonai/standardise/example_verifier.py
500
- praisonai/standardise/manifest.py
501
489
  praisonai/standardise/models.py
502
490
  praisonai/standardise/reports.py
503
491
  praisonai/standardise/templates.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.3
5
- praisonai-code>=0.1.2
6
- praisonai-bot>=0.1.2
7
- praisonai-train>=0.1.2
8
- praisonai-browser>=0.1.2
9
- praisonai-mcp>=0.1.4
10
- praisonai-sandbox>=0.1.2
11
- praisonai-deploy>=0.1.2
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
12
12
  python-dotenv>=0.19.0
13
13
  litellm<2,>=1.83.14
14
14
  PyYAML>=6.0
@@ -158,7 +158,8 @@ requests>=2.31.0
158
158
  praisonai-bot[gateway]
159
159
 
160
160
  [google-adk]
161
- praisonai-frameworks[google-adk]>=0.1.8
161
+ praisonai-frameworks>=0.1.8
162
+ google-adk[extensions]<3,>=2.5
162
163
  praisonai-tools>=0.1.0
163
164
 
164
165
  [gradio]
@@ -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>
@@ -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
@@ -9,15 +9,66 @@ import asyncio
9
9
  import atexit
10
10
  import contextlib
11
11
  import contextvars
12
+ import enum
13
+ import inspect
14
+ import logging
12
15
  import os
13
16
  import threading
17
+ import weakref
14
18
  import concurrent.futures
15
19
  from concurrent.futures import CancelledError as FutureCancelledError, Future
16
- from typing import Awaitable, Iterator, Optional, TypeVar
20
+ from typing import Any, Awaitable, Iterator, Optional, TypeVar
21
+
22
+ logger = logging.getLogger(__name__)
17
23
 
18
24
  T = TypeVar("T")
19
25
 
20
- _DEFAULT_TIMEOUT = float(os.environ.get("PRAISONAI_RUN_SYNC_TIMEOUT", "300"))
26
+
27
+ class _Unset:
28
+ """Sentinel for an *omitted* timeout argument.
29
+
30
+ Distinguishes "caller did not pass a timeout" (resolve the configured
31
+ default via :func:`_default_timeout`) from an explicit ``timeout=None``
32
+ (an intentional request for an *unbounded* wait). The scheduler bridges
33
+ (``integration/bridges/schedules_runner.py``, ``cli/commands/schedule.py``)
34
+ rely on the latter so a long-running claimed job is never cancelled after
35
+ the 300s default.
36
+ """
37
+
38
+ __slots__ = ()
39
+
40
+ def __repr__(self) -> str: # pragma: no cover - debug aid only
41
+ return "<unset>"
42
+
43
+
44
+ _UNSET = _Unset()
45
+
46
+
47
+ def _resolve_timeout(timeout: "float | None | _Unset") -> Optional[float]:
48
+ """Map an omitted timeout to the configured default, preserving explicit None.
49
+
50
+ - ``_UNSET`` (argument omitted) → :func:`_default_timeout` (e.g. 300s).
51
+ - explicit ``None`` → ``None`` (unbounded wait; caller opted in).
52
+ - a number → itself.
53
+ """
54
+ if isinstance(timeout, _Unset):
55
+ return _default_timeout()
56
+ return timeout
57
+
58
+
59
+ def _default_timeout() -> float:
60
+ """Resolve the default run_sync timeout lazily, per call.
61
+
62
+ Read at call time (not import time) so a malformed ``PRAISONAI_RUN_SYNC_TIMEOUT``
63
+ cannot crash ``import praisonai`` with an unrelated ``ValueError``, and so a
64
+ value set after import (dotenv loaded late, per-request reconfig) is honoured.
65
+ Falls back to 300s on a malformed value.
66
+ """
67
+ raw = os.environ.get("PRAISONAI_RUN_SYNC_TIMEOUT", "300")
68
+ try:
69
+ return float(raw)
70
+ except ValueError:
71
+ return 300.0
21
72
 
22
73
  class AsyncBridge:
23
74
  """Per-instance async runner. The module-level `run_sync()` keeps the
@@ -38,6 +89,9 @@ class AsyncBridge:
38
89
  # lock by ``get()``/``submit()`` so ``_spawn_locked()`` can verify the
39
90
  # *caller* (not merely *someone*) owns the lock.
40
91
  self._lock_owner: int | None = None
92
+ # The shared default registers its atexit teardown lazily, on first use,
93
+ # so a bare ``import praisonai`` installs no process-wide hook.
94
+ self._atexit_registered = False
41
95
 
42
96
  def _spawn_locked(self) -> asyncio.AbstractEventLoop:
43
97
  """Create the loop+thread; caller must hold ``self._lock``.
@@ -74,6 +128,13 @@ class AsyncBridge:
74
128
  daemon=True,
75
129
  )
76
130
  self._thread.start()
131
+ # Register the process-exit teardown lazily and only for the shared
132
+ # default. Doing it here (first real use) rather than at import keeps
133
+ # ``import praisonai`` free of an unrequested atexit hook that would
134
+ # compete with hosts like Django/Airflow/Streamlit for shutdown order.
135
+ if not self._atexit_registered and self is globals().get("_BG"):
136
+ atexit.register(self.shutdown)
137
+ self._atexit_registered = True
77
138
  return self._loop
78
139
 
79
140
  def get(self) -> asyncio.AbstractEventLoop:
@@ -94,7 +155,11 @@ class AsyncBridge:
94
155
  finally:
95
156
  self._lock_owner = None
96
157
 
97
- def run_sync(self, coro: Awaitable[T], *, timeout: float | None = _DEFAULT_TIMEOUT) -> T:
158
+ def run_sync(
159
+ self, coro: Awaitable[T], *, timeout: "float | None | _Unset" = _UNSET
160
+ ) -> T:
161
+ # Omitted → configured default; explicit ``None`` → unbounded wait.
162
+ timeout = _resolve_timeout(timeout)
98
163
  try:
99
164
  asyncio.get_running_loop()
100
165
  except RuntimeError:
@@ -245,19 +310,18 @@ def scoped_bridge(bridge: Optional[AsyncBridge] = None) -> Iterator[AsyncBridge]
245
310
  def _shutdown_default() -> None:
246
311
  """Private process-exit hook: tear down the shared default bridge.
247
312
 
248
- Registered with :mod:`atexit`. This is the ONLY sanctioned way the shared
249
- default is shut down; it is deliberately absent from the public module
250
- surface so a single caller cannot terminate async work for the whole
251
- process. Embedders needing explicit lifecycle control own their own
252
- :class:`AsyncBridge` instance.
313
+ Registered with :mod:`atexit` lazily (on the shared default's first real use
314
+ in :meth:`AsyncBridge._spawn_locked`), not at import, so a bare
315
+ ``import praisonai`` installs no process-wide hook. This is the ONLY
316
+ sanctioned way the shared default is shut down; it is deliberately absent
317
+ from the public module surface so a single caller cannot terminate async
318
+ work for the whole process. Embedders needing explicit lifecycle control own
319
+ their own :class:`AsyncBridge` instance.
253
320
  """
254
321
  _BG.shutdown()
255
322
 
256
323
 
257
- atexit.register(_shutdown_default)
258
-
259
-
260
- def run_sync(coro: Awaitable[T], *, timeout: float | None = _DEFAULT_TIMEOUT) -> T:
324
+ def run_sync(coro: Awaitable[T], *, timeout: "float | None | _Unset" = _UNSET) -> T:
261
325
  """
262
326
  Run a coroutine synchronously using the background loop.
263
327
 
@@ -282,7 +346,7 @@ def run_sync(coro: Awaitable[T], *, timeout: float | None = _DEFAULT_TIMEOUT) ->
282
346
  def run_sync_or_offload(
283
347
  coro: Awaitable[T],
284
348
  *,
285
- timeout: float | None = _DEFAULT_TIMEOUT,
349
+ timeout: "float | None | _Unset" = _UNSET,
286
350
  thread_name: str = "praisonai-sync-offload",
287
351
  ) -> T:
288
352
  """Run ``coro`` to completion from *any* calling context.
@@ -303,6 +367,8 @@ def run_sync_or_offload(
303
367
  (it fails loudly inside a loop). Async callers should ``await``
304
368
  :func:`arun_sync_or_offload`, which never blocks the loop.
305
369
  """
370
+ # Omitted → configured default; explicit ``None`` → unbounded wait.
371
+ timeout = _resolve_timeout(timeout)
306
372
  try:
307
373
  asyncio.get_running_loop()
308
374
  except RuntimeError:
@@ -383,7 +449,7 @@ def run_sync_or_offload(
383
449
  async def arun_sync_or_offload(
384
450
  coro: Awaitable[T],
385
451
  *,
386
- timeout: float | None = _DEFAULT_TIMEOUT,
452
+ timeout: "float | None | _Unset" = _UNSET,
387
453
  ) -> T:
388
454
  """Awaitable sibling of :func:`run_sync_or_offload` for async callers.
389
455
 
@@ -397,6 +463,9 @@ async def arun_sync_or_offload(
397
463
  ``asyncio.new_event_loop()``), so a caller-installed :func:`scoped_bridge`
398
464
  binding still wins and per-loop connection pools are preserved.
399
465
  """
466
+ # Omitted → configured default; explicit ``None`` → unbounded wait
467
+ # (``asyncio.wait_for(..., timeout=None)`` waits indefinitely).
468
+ timeout = _resolve_timeout(timeout)
400
469
  fut = _default_bridge().submit(coro)
401
470
  wrapped = asyncio.wrap_future(fut)
402
471
  try:
@@ -404,3 +473,72 @@ async def arun_sync_or_offload(
404
473
  except (asyncio.TimeoutError, asyncio.CancelledError):
405
474
  fut.cancel()
406
475
  raise
476
+
477
+
478
+ class DispatchKind(str, enum.Enum):
479
+ """How a sync caller consumes the result of a (possibly async) store op.
480
+
481
+ Making read-vs-write intent explicit at the *call site* removes the need for
482
+ a name-string allow-list (the old ``_READ_OPS`` frozenset) that silently
483
+ dropped a new read-shaped method's return value under a running loop.
484
+ """
485
+
486
+ READ = "read" #: caller consumes the returned value (never fire-and-forget)
487
+ WRITE = "write" #: caller only cares that it eventually completes
488
+
489
+
490
+ def dispatch_maybe_awaitable(
491
+ value: Any,
492
+ *,
493
+ kind: DispatchKind,
494
+ tracker: "weakref.WeakSet | None" = None,
495
+ tracker_lock: "threading.Lock | None" = None,
496
+ op_name: str = "op",
497
+ ) -> Any:
498
+ """Single owner of "a sync call may return a coroutine; run it correctly".
499
+
500
+ This consolidates the submit/track/callback scaffolding that lifecycle hooks
501
+ would otherwise hand-roll per op. Behaviour:
502
+
503
+ - **Not awaitable**: returned as-is.
504
+ - **No running loop**: block on the shared bridge via :func:`run_sync`.
505
+ - **Running loop + READ**: route through :func:`run_sync_or_offload`, which
506
+ returns the value on a sync path and fails loudly inside a loop instead of
507
+ corrupting a read-modify-write with a silent ``None``.
508
+ - **Running loop + WRITE**: submit to the active bridge as tracked
509
+ fire-and-forget (uuid-keyed store writes are idempotent, so completing them
510
+ slightly later is safe), attach a warning done-callback, and return
511
+ ``None``.
512
+
513
+ Args:
514
+ value: The result of calling the store method (may be a coroutine).
515
+ kind: :class:`DispatchKind.READ` or :class:`DispatchKind.WRITE`.
516
+ tracker: Optional ``WeakSet`` of in-flight futures so a ``close()`` path
517
+ can flush them; only used on the running-loop WRITE branch.
518
+ tracker_lock: Lock guarding ``tracker``.
519
+ op_name: Human-readable op name for log/thread naming.
520
+ """
521
+ if not inspect.isawaitable(value):
522
+ return value
523
+
524
+ try:
525
+ asyncio.get_running_loop()
526
+ except RuntimeError:
527
+ return run_sync(value)
528
+
529
+ if kind is DispatchKind.READ:
530
+ return run_sync_or_offload(value, thread_name=f"praisonai-db-read-{op_name}")
531
+
532
+ fut = current_bridge().submit(value)
533
+ if tracker is not None and tracker_lock is not None:
534
+ with tracker_lock:
535
+ tracker.add(fut)
536
+
537
+ def _on_done(f, name=op_name):
538
+ try:
539
+ f.result()
540
+ except Exception:
541
+ logger.warning("Deferred %s failed", name, exc_info=True)
542
+
543
+ fut.add_done_callback(_on_done)
544
+ return None