PraisonAI 4.7.0__tar.gz → 4.7.4__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 (580) hide show
  1. {praisonai-4.7.0 → praisonai-4.7.4}/PKG-INFO +9 -9
  2. {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/PKG-INFO +9 -9
  3. {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/SOURCES.txt +0 -5
  4. {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/requires.txt +8 -8
  5. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/__main__.py +105 -0
  6. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_async_bridge.py +31 -8
  7. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/generator.py +20 -2
  8. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/typescript_extractor.py +7 -1
  9. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_lazy_cache.py +9 -5
  10. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/agents_generator.py +124 -16
  11. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/api/agent_invoke.py +60 -3
  12. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/api/call.py +259 -93
  13. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/__init__.py +1 -1
  14. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/container_files.py +10 -13
  15. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/containers.py +8 -22
  16. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/search.py +19 -23
  17. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/vector_store_files.py +54 -85
  18. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/_shim.py +49 -14
  19. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/schedule.py +52 -0
  20. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/persistence.py +23 -19
  21. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/dispatch/argparse_builder.py +9 -1
  22. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/validator.py +17 -2
  23. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/db/adapter.py +44 -8
  24. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/_config_builder.py +25 -7
  25. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/autogen_adapter.py +50 -8
  26. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/crewai_adapter.py +8 -2
  27. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/praisonai_adapter.py +59 -24
  28. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/schedules_runner.py +14 -2
  29. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/base.py +30 -16
  30. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/executor.py +89 -16
  31. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/router.py +27 -3
  32. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/sqlite.py +38 -6
  33. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/orchestrator.py +54 -20
  34. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/async_mongodb.py +157 -0
  35. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/dynamodb.py +96 -23
  36. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/firestore.py +43 -21
  37. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/serve.py +73 -21
  38. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/_base_scheduler.py +265 -16
  39. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/_delivery.py +50 -6
  40. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/agent_scheduler.py +75 -79
  41. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/async_agent_scheduler.py +134 -6
  42. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/yaml_loader.py +1 -1
  43. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/audit.py +26 -0
  44. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/ai_generator.py +38 -6
  45. praisonai-4.7.4/praisonai/version.py +1 -0
  46. {praisonai-4.7.0 → praisonai-4.7.4}/pyproject.toml +9 -9
  47. praisonai-4.7.0/praisonai/persistence/tests/__init__.py +0 -3
  48. praisonai-4.7.0/praisonai/persistence/tests/test_all_backends.py +0 -633
  49. praisonai-4.7.0/praisonai/persistence/tests/test_registry_lazy.py +0 -80
  50. praisonai-4.7.0/praisonai/persistence/tests/test_valkey_backends.py +0 -492
  51. praisonai-4.7.0/praisonai/standardise/enhanced_templates.py +0 -680
  52. praisonai-4.7.0/praisonai/version.py +0 -1
  53. {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/dependency_links.txt +0 -0
  54. {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/entry_points.txt +0 -0
  55. {praisonai-4.7.0 → praisonai-4.7.4}/PraisonAI.egg-info/top_level.txt +0 -0
  56. {praisonai-4.7.0 → praisonai-4.7.4}/README.md +0 -0
  57. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/__init__.py +0 -0
  58. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_api_auth.py +0 -0
  59. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_approval_spec.py +0 -0
  60. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_bootstrap.py +0 -0
  61. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/__init__.py +0 -0
  62. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/api_md.py +0 -0
  63. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/__init__.py +0 -0
  64. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/docs_extractor.py +0 -0
  65. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/docs_generator.py +0 -0
  66. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  67. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/python_extractor.py +0 -0
  68. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  69. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/rust_extractor.py +0 -0
  70. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  71. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  72. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_entrypoint.py +0 -0
  73. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_framework_availability.py +0 -0
  74. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_logging.py +0 -0
  75. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_registry.py +0 -0
  76. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/_safe_loader.py +0 -0
  77. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/__init__.py +0 -0
  78. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/config.py +0 -0
  79. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/safe_edit.py +0 -0
  80. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/server.py +0 -0
  81. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/acp/session.py +0 -0
  82. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/__init__.py +0 -0
  83. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/readers.py +0 -0
  84. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/rerankers.py +0 -0
  85. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/retrievers.py +0 -0
  86. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/adapters/vector_stores.py +0 -0
  87. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/agent.py +0 -0
  88. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/agent_scheduler.py +0 -0
  89. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/app/__init__.py +0 -0
  90. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/app/agentos.py +0 -0
  91. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/async_agent_scheduler.py +0 -0
  92. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/audit/__init__.py +0 -0
  93. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/audit/agent_centric.py +0 -0
  94. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/auto.py +0 -0
  95. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/bots/__init__.py +0 -0
  96. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/browser/__init__.py +0 -0
  97. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/a2a.py +0 -0
  98. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/assistants.py +0 -0
  99. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/audio.py +0 -0
  100. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/batches.py +0 -0
  101. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/completions.py +0 -0
  102. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/embeddings.py +0 -0
  103. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/files.py +0 -0
  104. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/fine_tuning.py +0 -0
  105. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/guardrails.py +0 -0
  106. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/images.py +0 -0
  107. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/mcp.py +0 -0
  108. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/messages.py +0 -0
  109. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/moderations.py +0 -0
  110. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/ocr.py +0 -0
  111. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/passthrough.py +0 -0
  112. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/rag.py +0 -0
  113. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/realtime.py +0 -0
  114. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/rerank.py +0 -0
  115. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/responses.py +0 -0
  116. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/skills.py +0 -0
  117. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/vector_stores.py +0 -0
  118. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/capabilities/videos.py +0 -0
  119. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/claw/__init__.py +0 -0
  120. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/__init__.py +0 -0
  121. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/_paths.py +0 -0
  122. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/_warnings.py +0 -0
  123. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/app.py +0 -0
  124. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/approval_backend.py +0 -0
  125. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/branding.py +0 -0
  126. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/__init__.py +0 -0
  127. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/_profiling.py +0 -0
  128. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/acp.py +0 -0
  129. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/agent.py +0 -0
  130. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/agents.py +0 -0
  131. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/app.py +0 -0
  132. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/attach.py +0 -0
  133. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/audit.py +0 -0
  134. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/auth.py +0 -0
  135. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/batch.py +0 -0
  136. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/benchmark.py +0 -0
  137. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/bot.py +0 -0
  138. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/browser.py +0 -0
  139. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/call.py +0 -0
  140. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/chat.py +0 -0
  141. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/checkpoint.py +0 -0
  142. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/claw.py +0 -0
  143. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/code.py +0 -0
  144. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/command.py +0 -0
  145. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/commit.py +0 -0
  146. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/completion.py +0 -0
  147. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/config.py +0 -0
  148. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/context.py +0 -0
  149. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/daemon.py +0 -0
  150. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/dashboard.py +0 -0
  151. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/debug.py +0 -0
  152. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/deploy.py +0 -0
  153. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/diag.py +0 -0
  154. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/docs.py +0 -0
  155. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/doctor.py +0 -0
  156. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/endpoints.py +0 -0
  157. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/environment.py +0 -0
  158. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/eval.py +0 -0
  159. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/examples.py +0 -0
  160. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/flow.py +0 -0
  161. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/gateway.py +0 -0
  162. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/github.py +0 -0
  163. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/hooks.py +0 -0
  164. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/identity.py +0 -0
  165. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/init.py +0 -0
  166. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/kanban.py +0 -0
  167. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/knowledge.py +0 -0
  168. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/langextract.py +0 -0
  169. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/langfuse.py +0 -0
  170. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/loop.py +0 -0
  171. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/lsp.py +0 -0
  172. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/managed.py +0 -0
  173. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/mcp.py +0 -0
  174. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/memory.py +0 -0
  175. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/mint_link.py +0 -0
  176. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/models.py +0 -0
  177. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/n8n.py +0 -0
  178. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/obs.py +0 -0
  179. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/onboard.py +0 -0
  180. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/package.py +0 -0
  181. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/pairing.py +0 -0
  182. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/paths.py +0 -0
  183. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/permissions.py +0 -0
  184. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/plugins.py +0 -0
  185. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/port.py +0 -0
  186. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/profile.py +0 -0
  187. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/publish.py +0 -0
  188. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/rag.py +0 -0
  189. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/realtime.py +0 -0
  190. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/recipe.py +0 -0
  191. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/registry.py +0 -0
  192. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/replay.py +0 -0
  193. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/research.py +0 -0
  194. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/retrieval.py +0 -0
  195. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/rules.py +0 -0
  196. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/run.py +0 -0
  197. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/sandbox.py +0 -0
  198. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/serve.py +0 -0
  199. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/session.py +0 -0
  200. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/setup.py +0 -0
  201. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/skills.py +0 -0
  202. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/standardise.py +0 -0
  203. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/templates.py +0 -0
  204. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/test.py +0 -0
  205. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/todo.py +0 -0
  206. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/tools.py +0 -0
  207. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/traces.py +0 -0
  208. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/tracker.py +0 -0
  209. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/train.py +0 -0
  210. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/ui.py +0 -0
  211. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/up.py +0 -0
  212. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/validate.py +0 -0
  213. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/version.py +0 -0
  214. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/commands/workflow.py +0 -0
  215. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/config_loader.py +0 -0
  216. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/configuration/__init__.py +0 -0
  217. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/configuration/config.schema.json +0 -0
  218. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/execution/__init__.py +0 -0
  219. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/fallback_schema.py +0 -0
  220. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/__init__.py +0 -0
  221. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/acp.py +0 -0
  222. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/agent_scheduler.py +0 -0
  223. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/agent_tools.py +0 -0
  224. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/approval.py +0 -0
  225. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/background.py +0 -0
  226. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/bots_cli.py +0 -0
  227. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/deploy.py +0 -0
  228. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/endpoints.py +0 -0
  229. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/eval.py +0 -0
  230. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/gateway.py +0 -0
  231. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/ollama.py +0 -0
  232. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/onboard.py +0 -0
  233. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/recipe.py +0 -0
  234. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/recipe_optimizer.py +0 -0
  235. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/registry.py +0 -0
  236. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/sandbox_cli.py +0 -0
  237. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/serve.py +0 -0
  238. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/templates.py +0 -0
  239. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/tools.py +0 -0
  240. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/tui/__init__.py +0 -0
  241. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/tui/app.py +0 -0
  242. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/features/workflow.py +0 -0
  243. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/__init__.py +0 -0
  244. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/async_tui.py +0 -0
  245. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/config.py +0 -0
  246. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/core.py +0 -0
  247. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/interactive/events.py +0 -0
  248. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/langfuse_client.py +0 -0
  249. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/__init__.py +0 -0
  250. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/direct_prompt.py +0 -0
  251. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  252. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  253. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/framework_run.py +0 -0
  254. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  255. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/interactive_legacy.py +0 -0
  256. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  257. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/legacy/workflow_commands.py +0 -0
  258. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/main.py +0 -0
  259. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/output/__init__.py +0 -0
  260. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/schedule_cli.py +0 -0
  261. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/schema_provider.py +0 -0
  262. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/session/__init__.py +0 -0
  263. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/state/__init__.py +0 -0
  264. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/ui/__init__.py +0 -0
  265. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/unified_schema.py +0 -0
  266. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli/utils/__init__.py +0 -0
  267. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/cli_backends/__init__.py +0 -0
  268. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/__init__.py +0 -0
  269. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/agent_tools.py +0 -0
  270. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/diff/__init__.py +0 -0
  271. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/diff/diff_strategy.py +0 -0
  272. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/__init__.py +0 -0
  273. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/apply_diff.py +0 -0
  274. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/execute_command.py +0 -0
  275. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/list_files.py +0 -0
  276. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/read_file.py +0 -0
  277. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/search_replace.py +0 -0
  278. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/tools/write_file.py +0 -0
  279. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/__init__.py +0 -0
  280. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/file_utils.py +0 -0
  281. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/ignore_utils.py +0 -0
  282. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/code/utils/text_utils.py +0 -0
  283. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/__init__.py +0 -0
  284. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/agents.schema.json +0 -0
  285. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/config/schema.py +0 -0
  286. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/__init__.py +0 -0
  287. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/_storage_path.py +0 -0
  288. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/artifact_store.py +0 -0
  289. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/config.py +0 -0
  290. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/history_store.py +0 -0
  291. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/queue.py +0 -0
  292. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/setup.py +0 -0
  293. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/context/terminal_logger.py +0 -0
  294. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/daemon/__init__.py +0 -0
  295. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/db/__init__.py +0 -0
  296. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/deploy/__init__.py +0 -0
  297. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/__init__.py +0 -0
  298. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/a2u_server.py +0 -0
  299. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/discovery.py +0 -0
  300. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/__init__.py +0 -0
  301. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/a2a.py +0 -0
  302. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/a2u.py +0 -0
  303. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/agents_api.py +0 -0
  304. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/base.py +0 -0
  305. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/mcp.py +0 -0
  306. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/openai_compat.py +0 -0
  307. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/recipe.py +0 -0
  308. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  309. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/registry.py +0 -0
  310. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/endpoints/server.py +0 -0
  311. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/__init__.py +0 -0
  312. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/client.py +0 -0
  313. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  314. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  315. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/components/__init__.py +0 -0
  316. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/converter.py +0 -0
  317. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/flow/helpers.py +0 -0
  318. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/__init__.py +0 -0
  319. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/base.py +0 -0
  320. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/registry.py +0 -0
  321. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/validators.py +0 -0
  322. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/framework_adapters/workflow_framework.py +0 -0
  323. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/gateway/__init__.py +0 -0
  324. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inbuilt_tools/__init__.py +0 -0
  325. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  326. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inc/__init__.py +0 -0
  327. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inc/config.py +0 -0
  328. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/inc/models.py +0 -0
  329. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/__init__.py +0 -0
  330. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/__init__.py +0 -0
  331. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  332. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/hooks_query.py +0 -0
  333. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  334. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/usage_bridge.py +0 -0
  335. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/bridges/workflows_service.py +0 -0
  336. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/context_files.py +0 -0
  337. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/gateway_host.py +0 -0
  338. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/host_app.py +0 -0
  339. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/pages/__init__.py +0 -0
  340. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/pages/bot_health.py +0 -0
  341. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integration/pages/workflow_runs.py +0 -0
  342. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/__init__.py +0 -0
  343. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_cli_loaders.py +0 -0
  344. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_session_info.py +0 -0
  345. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_tool_aliases.py +0 -0
  346. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/_unified_registry.py +0 -0
  347. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/backend_registry.py +0 -0
  348. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/claude_code.py +0 -0
  349. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/codex_cli.py +0 -0
  350. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/__init__.py +0 -0
  351. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/_sync_base.py +0 -0
  352. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/daytona.py +0 -0
  353. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/docker.py +0 -0
  354. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/e2b.py +0 -0
  355. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/flyio.py +0 -0
  356. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/local.py +0 -0
  357. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/modal_compute.py +0 -0
  358. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute/tenki.py +0 -0
  359. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/compute_managed_agent.py +0 -0
  360. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/cursor_cli.py +0 -0
  361. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/db_session_adapter.py +0 -0
  362. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/gemini_cli.py +0 -0
  363. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/hosted_agent.py +0 -0
  364. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/local_agent.py +0 -0
  365. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/managed_agents.py +0 -0
  366. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/managed_local.py +0 -0
  367. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/registry.py +0 -0
  368. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/integrations/sandboxed_agent.py +0 -0
  369. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/__init__.py +0 -0
  370. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/models.py +0 -0
  371. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/path_validation.py +0 -0
  372. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/server.py +0 -0
  373. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/jobs/store.py +0 -0
  374. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/kanban/__init__.py +0 -0
  375. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/__init__.py +0 -0
  376. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/catalogue.py +0 -0
  377. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/config.py +0 -0
  378. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/credentials.py +0 -0
  379. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/env.py +0 -0
  380. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/gateways.py +0 -0
  381. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/llm/registry.py +0 -0
  382. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/mcp_server/__init__.py +0 -0
  383. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/__init__.py +0 -0
  384. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/client.py +0 -0
  385. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/converter.py +0 -0
  386. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/preview.py +0 -0
  387. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/n8n/reverse_converter.py +0 -0
  388. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/__init__.py +0 -0
  389. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/hooks.py +0 -0
  390. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/langextract.py +0 -0
  391. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/observability/langfuse.py +0 -0
  392. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/__init__.py +0 -0
  393. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/_valkey_client.py +0 -0
  394. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/config.py +0 -0
  395. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/__init__.py +0 -0
  396. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/_ops.py +0 -0
  397. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/_sql_base.py +0 -0
  398. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  399. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/async_mysql.py +0 -0
  400. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/async_postgres.py +0 -0
  401. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  402. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/base.py +0 -0
  403. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/json_store.py +0 -0
  404. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/mysql.py +0 -0
  405. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/postgres.py +0 -0
  406. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/singlestore.py +0 -0
  407. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/supabase.py +0 -0
  408. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/surrealdb.py +0 -0
  409. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  410. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/conversation/turso.py +0 -0
  411. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/factory.py +0 -0
  412. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/hooks/__init__.py +0 -0
  413. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  414. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/__init__.py +0 -0
  415. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/base.py +0 -0
  416. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/cassandra.py +0 -0
  417. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/chroma.py +0 -0
  418. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  419. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  420. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/couchbase.py +0 -0
  421. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/lancedb.py +0 -0
  422. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  423. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  424. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  425. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/milvus.py +0 -0
  426. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  427. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/pgvector.py +0 -0
  428. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/pinecone.py +0 -0
  429. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/qdrant.py +0 -0
  430. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  431. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  432. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  433. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  434. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  435. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/knowledge/weaviate.py +0 -0
  436. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/migrations/__init__.py +0 -0
  437. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/migrations/manager.py +0 -0
  438. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/registry.py +0 -0
  439. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/__init__.py +0 -0
  440. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/base.py +0 -0
  441. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/gcs.py +0 -0
  442. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/memory.py +0 -0
  443. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/mongodb.py +0 -0
  444. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/redis.py +0 -0
  445. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/upstash.py +0 -0
  446. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/persistence/state/valkey.py +0 -0
  447. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/profiler.py +0 -0
  448. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/push/__init__.py +0 -0
  449. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/push/client.py +0 -0
  450. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/push/transports.py +0 -0
  451. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/__init__.py +0 -0
  452. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/bridge.py +0 -0
  453. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/core.py +0 -0
  454. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/exceptions.py +0 -0
  455. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/history.py +0 -0
  456. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/models.py +0 -0
  457. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/operations.py +0 -0
  458. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/policy.py +0 -0
  459. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/registry.py +0 -0
  460. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/runtime.py +0 -0
  461. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/security.py +0 -0
  462. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/recipe/server.py +0 -0
  463. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/__init__.py +0 -0
  464. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/analyzer.py +0 -0
  465. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/applier.py +0 -0
  466. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/judge.py +0 -0
  467. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/plan.py +0 -0
  468. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/player.py +0 -0
  469. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/reader.py +0 -0
  470. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/storage.py +0 -0
  471. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/replay/writer.py +0 -0
  472. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/runtime/__init__.py +0 -0
  473. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/runtime/__main__.py +0 -0
  474. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/sandbox/__init__.py +0 -0
  475. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/sandbox/_registry.py +0 -0
  476. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/__init__.py +0 -0
  477. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/_dispatch.py +0 -0
  478. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/base.py +0 -0
  479. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  480. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/condition_gate.py +0 -0
  481. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/daemon_manager.py +0 -0
  482. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/deployment.py +0 -0
  483. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/executor.py +0 -0
  484. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/run_policy.py +0 -0
  485. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/shared.py +0 -0
  486. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/state_manager.py +0 -0
  487. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/scheduler/suggestion_engine.py +0 -0
  488. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/__init__.py +0 -0
  489. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/injection.py +0 -0
  490. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/security/protected.py +0 -0
  491. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/__init__.py +0 -0
  492. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/build.py +0 -0
  493. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/post_install.py +0 -0
  494. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup/setup_conda_env.py +0 -0
  495. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/setup.py +0 -0
  496. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/__init__.py +0 -0
  497. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/config.py +0 -0
  498. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/dedupe.py +0 -0
  499. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/discovery.py +0 -0
  500. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/drift.py +0 -0
  501. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/engine.py +0 -0
  502. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/example_verifier.py +0 -0
  503. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/manifest.py +0 -0
  504. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/models.py +0 -0
  505. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/reports.py +0 -0
  506. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/templates.py +0 -0
  507. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/undo_redo.py +0 -0
  508. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/standardise/validator.py +0 -0
  509. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/__init__.py +0 -0
  510. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/dynamodb_adapter.py +0 -0
  511. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/mongodb_adapter.py +0 -0
  512. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/postgresql_adapter.py +0 -0
  513. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/redis_adapter.py +0 -0
  514. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/storage/valkey_adapter.py +0 -0
  515. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/__init__.py +0 -0
  516. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/batch_source.py +0 -0
  517. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/cli_docs_source.py +0 -0
  518. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/discovery.py +0 -0
  519. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/docs_source.py +0 -0
  520. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/examples_source.py +0 -0
  521. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/executor.py +0 -0
  522. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/models.py +0 -0
  523. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/report_viewer.py +0 -0
  524. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/reporter.py +0 -0
  525. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/suite_runner/runner.py +0 -0
  526. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/__init__.py +0 -0
  527. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/_tool_sources.py +0 -0
  528. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/cache.py +0 -0
  529. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/dependency_checker.py +0 -0
  530. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/discovery.py +0 -0
  531. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/loader.py +0 -0
  532. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/registry.py +0 -0
  533. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/resolver.py +0 -0
  534. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/security.py +0 -0
  535. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/tool_override.py +0 -0
  536. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/templates/tools_doctor.py +0 -0
  537. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tool_registry.py +0 -0
  538. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tool_resolver.py +0 -0
  539. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/__init__.py +0 -0
  540. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/audio.py +0 -0
  541. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/glob_tool.py +0 -0
  542. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/grep_tool.py +0 -0
  543. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/kanban_tools.py +0 -0
  544. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/multiedit.py +0 -0
  545. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/tools/skill_manage.py +0 -0
  546. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/train/__init__.py +0 -0
  547. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/train.py +0 -0
  548. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/train_vision.py +0 -0
  549. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/_aiui_datastore.py +0 -0
  550. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/_external_agents.py +0 -0
  551. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/context.py +0 -0
  552. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui/database_config.py +0 -0
  553. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_agents/__init__.py +0 -0
  554. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_agents/default_app.py +0 -0
  555. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_bot/__init__.py +0 -0
  556. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_bot/default_app.py +0 -0
  557. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_chat/__init__.py +0 -0
  558. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_chat/default_app.py +0 -0
  559. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_dashboard/__init__.py +0 -0
  560. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_dashboard/default_app.py +0 -0
  561. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_realtime/__init__.py +0 -0
  562. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/ui_realtime/default_app.py +0 -0
  563. {praisonai-4.7.0 → praisonai-4.7.4}/praisonai/upload_vision.py +0 -0
  564. {praisonai-4.7.0 → praisonai-4.7.4}/setup.cfg +0 -0
  565. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test.py +0 -0
  566. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_agents_playbook.py +0 -0
  567. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_approval_system.py +0 -0
  568. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_basic.py +0 -0
  569. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_cli_features.py +0 -0
  570. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_custom_tools_fix.py +0 -0
  571. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_double_api_fix.py +0 -0
  572. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_n8n_agent_invoke.py +0 -0
  573. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_n8n_cli_feature.py +0 -0
  574. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_n8n_integration.py +0 -0
  575. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_phase2_refactor.py +0 -0
  576. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_recipe.py +0 -0
  577. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_registry.py +0 -0
  578. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_runner.py +0 -0
  579. {praisonai-4.7.0 → praisonai-4.7.4}/tests/test_sandboxed_agent_compatibility.py +0 -0
  580. {praisonai-4.7.0 → praisonai-4.7.4}/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.0
3
+ Version: 4.7.4
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.0
15
- Requires-Dist: praisonai-code>=0.1.0
16
- Requires-Dist: praisonai-bot>=0.1.0
17
- Requires-Dist: praisonai-train>=0.1.0
18
- Requires-Dist: praisonai-browser>=0.1.0
19
- Requires-Dist: praisonai-mcp>=0.1.0
20
- Requires-Dist: praisonai-sandbox>=0.1.0
21
- Requires-Dist: praisonai-deploy>=0.1.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
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.7.0
3
+ Version: 4.7.4
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.0
15
- Requires-Dist: praisonai-code>=0.1.0
16
- Requires-Dist: praisonai-bot>=0.1.0
17
- Requires-Dist: praisonai-train>=0.1.0
18
- Requires-Dist: praisonai-browser>=0.1.0
19
- Requires-Dist: praisonai-mcp>=0.1.0
20
- Requires-Dist: praisonai-sandbox>=0.1.0
21
- Requires-Dist: praisonai-deploy>=0.1.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
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
@@ -436,10 +436,6 @@ praisonai/persistence/state/mongodb.py
436
436
  praisonai/persistence/state/redis.py
437
437
  praisonai/persistence/state/upstash.py
438
438
  praisonai/persistence/state/valkey.py
439
- praisonai/persistence/tests/__init__.py
440
- praisonai/persistence/tests/test_all_backends.py
441
- praisonai/persistence/tests/test_registry_lazy.py
442
- praisonai/persistence/tests/test_valkey_backends.py
443
439
  praisonai/push/__init__.py
444
440
  praisonai/push/client.py
445
441
  praisonai/push/transports.py
@@ -501,7 +497,6 @@ praisonai/standardise/dedupe.py
501
497
  praisonai/standardise/discovery.py
502
498
  praisonai/standardise/drift.py
503
499
  praisonai/standardise/engine.py
504
- praisonai/standardise/enhanced_templates.py
505
500
  praisonai/standardise/example_verifier.py
506
501
  praisonai/standardise/manifest.py
507
502
  praisonai/standardise/models.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.0
5
- praisonai-code>=0.1.0
6
- praisonai-bot>=0.1.0
7
- praisonai-train>=0.1.0
8
- praisonai-browser>=0.1.0
9
- praisonai-mcp>=0.1.0
10
- praisonai-sandbox>=0.1.0
11
- praisonai-deploy>=0.1.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
12
12
  python-dotenv>=0.19.0
13
13
  litellm<2,>=1.83.14
14
14
  PyYAML>=6.0
@@ -23,6 +23,44 @@ import threading
23
23
  _typer_commands_cache = None
24
24
  _typer_commands_lock = threading.Lock()
25
25
 
26
+ # Cache for the legacy dispatcher's implemented-verb set. ``None`` means "not yet
27
+ # computed"; a frozenset once derived. Populated lazily from the legacy
28
+ # argparse builder's authoritative ``LEGACY_SPECIAL_COMMANDS`` oracle so the
29
+ # unified dispatcher never reclassifies an *implemented* verb as free text and
30
+ # bills it to an LLM (#4327).
31
+ _legacy_verbs_cache = None
32
+ _legacy_verbs_lock = threading.Lock()
33
+
34
+ # Fail-closed fallback for :func:`_get_legacy_verbs`. If importing the
35
+ # authoritative ``LEGACY_SPECIAL_COMMANDS`` oracle ever fails, we must NOT return
36
+ # an empty set — that would let an *implemented* verb (``thinking status`` etc.)
37
+ # fall through to the bare-prompt rule and be billed to an LLM, reintroducing the
38
+ # #4327 regression. This static mirror keeps the routing guard functional so such
39
+ # verbs still reach the legacy handler even when discovery is degraded. It only
40
+ # needs to stay a *superset-safe* copy of the oracle; drift merely means a newly
41
+ # added verb isn't recognised until the oracle import recovers, never a bill.
42
+ _LEGACY_VERBS_FALLBACK = frozenset({
43
+ 'chat', 'code', 'call', 'realtime', 'train', 'ui', 'context', 'research',
44
+ 'memory', 'rules', 'workflow', 'hooks', 'knowledge', 'session', 'tools',
45
+ 'todo', 'docs', 'mcp', 'commit', 'serve', 'schedule', 'skills', 'profile',
46
+ 'eval', 'agents', 'run', 'thinking', 'compaction', 'output', 'deploy',
47
+ 'templates', 'recipe', 'endpoints', 'audio', 'embed', 'embedding', 'images',
48
+ 'moderate', 'files', 'batches', 'vector-stores', 'rerank', 'ocr',
49
+ 'assistants', 'fine-tuning', 'completions', 'messages', 'guardrails', 'rag',
50
+ 'videos', 'a2a', 'containers', 'passthrough', 'responses', 'search',
51
+ 'realtime-api', 'doctor', 'registry', 'package', 'install', 'uninstall',
52
+ 'acp', 'debug', 'lsp', 'diag', 'browser', 'replay', 'bot', 'gateway',
53
+ 'sandbox', 'wizard', 'migrate', 'security', 'persistence', 'paths', 'claw',
54
+ 'github', 'managed', 'flow', 'dashboard', 'backends', 'audit',
55
+ })
56
+
57
+ # Verbs excluded from the "route implemented verbs to legacy" guard. ``containers``
58
+ # and ``vector-stores`` reach a capability that fabricates a success with zero
59
+ # network (#4322); restoring their routing would promote that fabrication from
60
+ # unreachable to user-visible, so they are held back until #4322 lands. They keep
61
+ # their current behaviour rather than being rerouted here.
62
+ _LEGACY_VERB_ROUTING_EXCLUSIONS = frozenset({"containers", "vector-stores"})
63
+
26
64
  # Cache for the run command's supported option names. ``None`` means "not yet
27
65
  # computed"; a tuple ``(all_opts, value_opts)`` once derived; ``False`` marks a
28
66
  # discovery failure so the conservative legacy fallback is used without retrying
@@ -263,6 +301,64 @@ def _get_typer_commands():
263
301
  return _typer_commands_cache
264
302
 
265
303
 
304
+ def _get_legacy_verbs():
305
+ """Auto-discover the legacy dispatcher's implemented-verb set.
306
+
307
+ Sourced from the legacy argparse builder's authoritative
308
+ ``LEGACY_SPECIAL_COMMANDS`` oracle so this stays in lockstep with the verbs
309
+ legacy actually handles.
310
+
311
+ Fails *closed*: if the oracle import raises, return the static
312
+ :data:`_LEGACY_VERBS_FALLBACK` mirror rather than an empty set. An empty set
313
+ would let an implemented verb fall through to the bare-prompt rule and be
314
+ billed to an LLM — the #4327 regression this guard exists to prevent. The
315
+ fallback is *not* cached so a later caller can still pick up the authoritative
316
+ oracle once the transient import failure clears.
317
+ """
318
+ global _legacy_verbs_cache
319
+
320
+ if _legacy_verbs_cache is not None:
321
+ return _legacy_verbs_cache
322
+
323
+ with _legacy_verbs_lock:
324
+ if _legacy_verbs_cache is not None: # Double-check
325
+ return _legacy_verbs_cache
326
+
327
+ try:
328
+ from praisonai.cli.legacy.dispatch.argparse_builder import (
329
+ LEGACY_SPECIAL_COMMANDS,
330
+ )
331
+ verbs = frozenset(LEGACY_SPECIAL_COMMANDS)
332
+ except Exception:
333
+ import logging
334
+ logging.getLogger("praisonai.__main__").warning(
335
+ "Legacy verb discovery failed; using static fallback registry so "
336
+ "implemented verbs still route to their handler (not the LLM).",
337
+ exc_info=True,
338
+ )
339
+ # Fail closed: recognise implemented verbs from the static mirror.
340
+ # Do NOT poison the cache — a later caller can still load the oracle.
341
+ return _LEGACY_VERBS_FALLBACK
342
+
343
+ _legacy_verbs_cache = verbs
344
+ return _legacy_verbs_cache
345
+
346
+
347
+ def _is_implemented_legacy_verb(first_cmd):
348
+ """True when ``first_cmd`` is a verb the legacy dispatcher implements.
349
+
350
+ Such a token is an *implemented command*, not free text — it must reach its
351
+ handler on the legacy path, never be joined/quoted and billed to an LLM by
352
+ the modern ``run`` forwarder (#4327). A small exclusion set
353
+ (:data:`_LEGACY_VERB_ROUTING_EXCLUSIONS`) is withheld pending #4322.
354
+ """
355
+ if not first_cmd:
356
+ return False
357
+ if first_cmd in _LEGACY_VERB_ROUTING_EXCLUSIONS:
358
+ return False
359
+ return first_cmd in _get_legacy_verbs()
360
+
361
+
266
362
  def _iter_argv_tokens(argv, value_opts=None):
267
363
  """Classify each ``argv`` token, yielding ``(arg, name, kind)``.
268
364
 
@@ -610,6 +706,15 @@ def main():
610
706
  _run_typer(argv)
611
707
  return
612
708
 
709
+ # A verb the legacy dispatcher implements is a *command*, not free text.
710
+ # Without this guard it falls through to the bare-prompt rule below and is
711
+ # joined/quoted into a modern ``run`` prompt and billed to an LLM (#4327):
712
+ # ``praisonai thinking status`` costs ~2.5k tokens and exits 0 instead of
713
+ # reaching its handler. Route it to legacy, which owns the handler.
714
+ if _is_implemented_legacy_verb(first_cmd):
715
+ _run_legacy(argv)
716
+ return
717
+
613
718
  # A lone token that is a near-miss for a registered command is a mistyped
614
719
  # verb, not a prompt. Without this guard it falls through to the bare-prompt
615
720
  # rule below and is billed to an LLM: ``praisonai deploi`` costs money and
@@ -291,22 +291,45 @@ def run_sync_or_offload(
291
291
  :class:`AsyncBridge` via :func:`run_sync`, sharing its background loop and
292
292
  connection pools.
293
293
  - Called from inside a running loop (FastAPI handler, Jupyter, async test):
294
- copies the caller's ContextVars onto a worker thread that hands the
295
- coroutine to the SAME bridge (never a fresh ``asyncio.new_event_loop()``),
296
- so a caller-installed :func:`scoped_bridge` binding still wins and
297
- LiteLLM/HTTPX per-loop connection pools are preserved. Exceptions are
298
- re-raised on the caller thread.
294
+ by default this raises ``RuntimeError`` rather than blocking the loop,
295
+ pointing callers at the awaitable siblings (:func:`arun_sync_or_offload`,
296
+ ``adapter.arun``, ``praisonai.arun``). Set
297
+ ``PRAISONAI_ALLOW_LOOP_BLOCKING=true`` to opt into the legacy behaviour
298
+ that copies the caller's ContextVars onto a worker thread handing the
299
+ coroutine to the SAME bridge (never a fresh ``asyncio.new_event_loop()``)
300
+ and joins it — which pins the loop for up to ``timeout`` seconds.
299
301
 
300
302
  Callers who *know* they are on a sync-only path should use :func:`run_sync`
301
- (it fails loudly inside a loop). Everything that participates in the 3-way
302
- surface (CLI + YAML + Python) should use this helper so the correct
303
- running-loop handling lives in one place instead of being re-implemented.
303
+ (it fails loudly inside a loop). Async callers should ``await``
304
+ :func:`arun_sync_or_offload`, which never blocks the loop.
304
305
  """
305
306
  try:
306
307
  asyncio.get_running_loop()
307
308
  except RuntimeError:
308
309
  return run_sync(coro, timeout=timeout)
309
310
 
311
+ # Strict path (default): never block a running event loop. Joining the
312
+ # worker thread from the loop thread pins the loop for up to ``timeout``
313
+ # seconds — exactly the "async-safe" pathology this project forbids. Steer
314
+ # callers to the awaitable siblings that never block the loop.
315
+ if os.environ.get("PRAISONAI_ALLOW_LOOP_BLOCKING", "").lower() not in (
316
+ "1",
317
+ "true",
318
+ ):
319
+ # Close the coroutine we are refusing to run so it does not leak as a
320
+ # "coroutine was never awaited" warning.
321
+ with contextlib.suppress(Exception):
322
+ coro.close() # type: ignore[attr-defined]
323
+ raise RuntimeError(
324
+ "run_sync_or_offload() would block the running event loop for up to "
325
+ f"{timeout}s. From an async context, await one of:\n"
326
+ " - praisonai.arun(...)\n"
327
+ " - adapter.arun(...)\n"
328
+ " - praisonai._async_bridge.arun_sync_or_offload(coro)\n"
329
+ "Set PRAISONAI_ALLOW_LOOP_BLOCKING=true to opt into the legacy "
330
+ "blocking behaviour."
331
+ )
332
+
310
333
  result: list[T] = []
311
334
  error: list[BaseException] = []
312
335
  # Hold the concurrent.futures.Future for the in-flight coroutine so the
@@ -453,6 +453,16 @@ class ParityTrackerGenerator:
453
453
  lines.append(f"> **Version:** {tracker['version']} | **Last Updated:** {tracker['lastUpdated']}")
454
454
  lines.append(f"> **Source of Truth:** {tracker['sourceOfTruth']}")
455
455
  lines.append("")
456
+ lines.append("> [!IMPORTANT]")
457
+ lines.append("> **What this measures:** whether a matching *exported symbol name* exists in")
458
+ lines.append("> the TypeScript SDK's public surface (parsed from `src/index.ts`). It does **not**")
459
+ lines.append("> verify that the capability is reachable, wired up, or behaves like its Python")
460
+ lines.append("> counterpart. A `✅ exported` cell means the name is exported — not that it works.")
461
+ lines.append("> Counts include barrel re-exports, so `TypeScript Features` reflects module")
462
+ lines.append("> structure, not distinct capabilities, and is not directly comparable to the")
463
+ lines.append("> Python count. For a capability with a testable contract, rely on its conformance")
464
+ lines.append("> suite rather than this table.")
465
+ lines.append("")
456
466
 
457
467
  # Summary
458
468
  summary = tracker['summary']
@@ -482,7 +492,7 @@ class ParityTrackerGenerator:
482
492
  done_count = sum(1 for g in gaps if g['status'] == 'DONE')
483
493
  todo_count = len(gaps) - done_count
484
494
 
485
- lines.append(f"### {priority_key} ({done_count} done, {todo_count} todo)")
495
+ lines.append(f"### {priority_key} ({done_count} exported, {todo_count} missing)")
486
496
  lines.append("")
487
497
  lines.append("| Feature | Python | TypeScript | Effort | Status |")
488
498
  lines.append("|---------|--------|------------|--------|--------|")
@@ -490,7 +500,7 @@ class ParityTrackerGenerator:
490
500
  for gap in sorted(gaps, key=lambda x: (x['status'] != 'TODO', x['feature'])):
491
501
  py = "✅" if gap['python'] else "❌"
492
502
  ts = "✅" if gap['typescript'] else "❌"
493
- status = "✅ DONE" if gap['status'] == 'DONE' else "⏳ TODO"
503
+ status = "✅ exported" if gap['status'] == 'DONE' else "⏳ missing"
494
504
  feature = _escape_md(gap['feature'])
495
505
  lines.append(f"| `{feature}` | {py} | {ts} | {gap['effort']} | {status} |")
496
506
 
@@ -617,6 +627,14 @@ class ParityTrackerGenerator:
617
627
  lines.append("")
618
628
  lines.append(f"> **Python Features:** {python_count} | **Rust Features:** {rust_count} | **Parity:** {parity_pct}%")
619
629
  lines.append("")
630
+ lines.append("> [!IMPORTANT]")
631
+ lines.append("> **What this measures:** whether a matching *exported symbol name* exists in the")
632
+ lines.append("> Rust crate's public surface. It does **not** verify that the capability is")
633
+ lines.append("> reachable or behaves like its Python counterpart — an exported item whose body")
634
+ lines.append("> returns `Err(\"not yet implemented\")` still counts here. Treat `✅` as \"a symbol")
635
+ lines.append("> of this name is exported\", not \"this works\". For a capability with a testable")
636
+ lines.append("> contract, rely on its conformance suite rather than this table.")
637
+ lines.append("")
620
638
  lines.append("## Summary")
621
639
  lines.append("")
622
640
  lines.append("| Metric | Count |")
@@ -55,8 +55,14 @@ class TypeScriptFeatureExtractor:
55
55
  - export { Name } from './path' statements
56
56
  - export type { Name } from './path' statements
57
57
  - export * from './path' statements
58
-
58
+
59
59
  It categorizes exports into modules based on their source paths.
60
+
61
+ IMPORTANT — this measures symbol *names*, not behaviour. Presence of an
62
+ exported name here does NOT mean the capability is reachable, wired up, or
63
+ behaviourally equivalent to its Python counterpart. A name that is exported
64
+ but never called (e.g. an approval manager that no code path invokes) still
65
+ shows up. Downstream reports must label these as "exported", not "done".
60
66
  """
61
67
 
62
68
  # Module category mapping based on source paths
@@ -6,7 +6,7 @@ T = TypeVar("T")
6
6
 
7
7
 
8
8
  class LazyCache:
9
- """Thread-safe double-checked lazy cache. Caches and re-raises ImportError exceptions."""
9
+ """Thread-safe double-checked lazy cache. Caches and re-raises terminal loader failures."""
10
10
 
11
11
  def __init__(self) -> None:
12
12
  self._cache: Dict[str, object] = {}
@@ -16,19 +16,23 @@ class LazyCache:
16
16
  if key in self._cache:
17
17
  cached = self._cache[key]
18
18
  # Re-raise cached exception
19
- if isinstance(cached, ImportError):
19
+ if isinstance(cached, BaseException):
20
20
  raise cached
21
21
  return cached # type: ignore[return-value]
22
22
  with self._lock:
23
23
  if key in self._cache:
24
24
  cached = self._cache[key]
25
- if isinstance(cached, ImportError):
25
+ if isinstance(cached, BaseException):
26
26
  raise cached
27
27
  return cached # type: ignore[return-value]
28
28
  try:
29
29
  value: object = loader()
30
- except ImportError as e:
31
- # Cache the exception and re-raise
30
+ except (KeyboardInterrupt, SystemExit):
31
+ # Control-flow exceptions must propagate cleanly, never memoised.
32
+ raise
33
+ except BaseException as e:
34
+ # Cache every terminal loader failure so a broken optional dep
35
+ # fails fast instead of re-running the import/probe every call.
32
36
  self._cache[key] = e
33
37
  raise
34
38
  self._cache[key] = value
@@ -897,12 +897,40 @@ class AgentsGenerator:
897
897
  # Enforce tool_timeout from CLI/YAML at the wrapper layer so the field is
898
898
  # not silently dropped. The timeout stack (_wrap_tool_with_timeout) is
899
899
  # framework-agnostic and works for both the native and external adapters.
900
- effective = self._resolve_effective_tool_timeout(config)
901
- if effective and effective > 0:
902
- tools_dict = {
903
- name: self._wrap_tool_with_timeout(tool, effective)
904
- for name, tool in tools_dict.items()
905
- }
900
+ # Determine whether a single uniform timeout applies to every agent, or
901
+ # whether agents declared *heterogeneous* per-agent budgets. A uniform
902
+ # value can still be wrapped once onto the shared dict (cheapest path);
903
+ # heterogeneous values must be wrapped per-agent so a documented
904
+ # per-agent ``tool_timeout`` is honoured instead of being silently
905
+ # downgraded to the tightest value for the whole run.
906
+ # The uniform and per-agent paths are mutually exclusive. Always resolve
907
+ # BOTH internal keys on every call (setting the inactive one to None) so
908
+ # that when the *same* generator instance is reused with a different
909
+ # timeout layout, a stale closure from a previous run can never leak into
910
+ # the adapters and apply the wrong budget to the current run.
911
+ uniform = self._resolve_uniform_tool_timeout(config)
912
+ wrap = None
913
+ resolver = None
914
+ if uniform and uniform > 0:
915
+ wrap = lambda t, _sec=uniform: self._wrap_tool_with_timeout(t, _sec)
916
+ tools_dict = {name: wrap(tool) for name, tool in tools_dict.items()}
917
+ else:
918
+ # No single uniform timeout. If any agent declared a per-agent
919
+ # tool_timeout, expose a resolver so adapters wrap each agent's tools
920
+ # with that agent's own budget (tools stay shared; only the guard
921
+ # closure differs). Falls back to no wrap for agents without one.
922
+ resolver = self.make_agent_tool_wrap_resolver(config)
923
+
924
+ # Expose the per-run wrap so adapters that inject *more* tools after this
925
+ # point (e.g. PraisonAIAdapter's ACP/LSP centric tools) apply the same
926
+ # timeout guard instead of silently bypassing it; expose the per-agent
927
+ # resolver for heterogeneous budgets. Both keys are written every time so
928
+ # the inactive path is cleared rather than left holding a prior closure.
929
+ self.cli_config = {
930
+ **(self.cli_config or {}),
931
+ "_tool_timeout_wrap": wrap,
932
+ "_agent_tool_wrap_resolver": resolver,
933
+ }
906
934
  return tools_dict
907
935
 
908
936
  def _resolve_effective_tool_timeout(self, config):
@@ -943,6 +971,84 @@ class AgentsGenerator:
943
971
  )
944
972
  return tightest
945
973
 
974
+ @staticmethod
975
+ def _declared_agent_timeout(entity):
976
+ """Return a positive numeric ``tool_timeout`` declared on an entity, else None."""
977
+ v = entity.get("tool_timeout") if isinstance(entity, dict) else None
978
+ if isinstance(v, (int, float)) and not isinstance(v, bool):
979
+ return float(v)
980
+ return None
981
+
982
+ def _resolve_uniform_tool_timeout(self, config):
983
+ """Return a single timeout to wrap every tool with, or ``None``.
984
+
985
+ A uniform value exists when the CLI sets ``tool_timeout`` (applies to all
986
+ agents), or when *every* agent/role declares ``tool_timeout`` and they
987
+ all declare the *same* value. If any agent omits ``tool_timeout``, or
988
+ declared values differ, returns ``None`` so the shared dict stays
989
+ unwrapped and the per-agent resolver becomes the sole guard — this
990
+ avoids both the old "tightest wins for everyone" downgrade and forcing a
991
+ lone declared budget onto agents that never asked for one (greptile P1).
992
+ """
993
+ cli_timeout = (self.cli_config or {}).get("tool_timeout")
994
+ if isinstance(cli_timeout, (int, float)) and not isinstance(cli_timeout, bool):
995
+ return float(cli_timeout)
996
+
997
+ entities = {**(config.get("roles") or {}), **(config.get("agents") or {})}
998
+ if not entities:
999
+ return None
1000
+
1001
+ values = set()
1002
+ for entity in entities.values():
1003
+ t = self._declared_agent_timeout(entity)
1004
+ if t is None:
1005
+ # An agent without a declared budget must not inherit another
1006
+ # agent's timeout via the shared-dict wrap. Defer entirely to the
1007
+ # per-agent resolver.
1008
+ return None
1009
+ values.add(t)
1010
+ if len(values) == 1:
1011
+ return next(iter(values))
1012
+ return None
1013
+
1014
+ def resolve_agent_tool_timeout(self, agent_key, config):
1015
+ """Per-agent effective timeout: agent value > CLI value > ``None``.
1016
+
1017
+ Never downgrades across agents — each agent gets its own declared budget
1018
+ (or the CLI default, or nothing).
1019
+ """
1020
+ entities = {**(config.get("roles") or {}), **(config.get("agents") or {})}
1021
+ val = self._declared_agent_timeout(entities.get(agent_key) or {})
1022
+ if val is not None:
1023
+ return val
1024
+ cli_timeout = (self.cli_config or {}).get("tool_timeout")
1025
+ if isinstance(cli_timeout, (int, float)) and not isinstance(cli_timeout, bool):
1026
+ return float(cli_timeout)
1027
+ return None
1028
+
1029
+ def make_agent_tool_wrap_resolver(self, config):
1030
+ """Return ``resolver(agent_key) -> wrap|None`` for heterogeneous budgets.
1031
+
1032
+ Returns ``None`` when no agent declares a per-agent ``tool_timeout`` (so
1033
+ adapters skip per-agent wrapping entirely). The returned ``wrap`` closes
1034
+ over that agent's timeout; tool objects stay shared, only the guard
1035
+ closure differs per agent.
1036
+ """
1037
+ entities = {**(config.get("roles") or {}), **(config.get("agents") or {})}
1038
+ declared_any = any(
1039
+ self._declared_agent_timeout(e) is not None for e in entities.values()
1040
+ )
1041
+ if not declared_any:
1042
+ return None
1043
+
1044
+ def resolver(agent_key):
1045
+ t = self.resolve_agent_tool_timeout(agent_key, config)
1046
+ if not t or t <= 0:
1047
+ return None
1048
+ return lambda tool, _sec=t: self._wrap_tool_with_timeout(tool, _sec)
1049
+
1050
+ return resolver
1051
+
946
1052
  # Mirror the legacy CLI's --tool-timeout argparse default so the workflow
947
1053
  # validation can tell an implicit default apart from a user request.
948
1054
  _CLI_TOOL_TIMEOUT_DEFAULT = 60
@@ -1527,21 +1633,23 @@ class AgentsGenerator:
1527
1633
  def safe_format(template, **kwargs):
1528
1634
  """
1529
1635
  Safe string formatting that preserves JSON/dict literals while substituting variables.
1530
-
1636
+
1531
1637
  This function only substitutes placeholders that look like identifiers (e.g., {topic})
1532
1638
  while preserving JSON structures like {"level": 2}.
1533
-
1639
+
1640
+ Delegates to the single source of truth,
1641
+ ``BaseFrameworkAdapter._format_template`` in the core SDK, so the wrapper
1642
+ and core cannot drift (non-string short-circuit, regex, missing-key
1643
+ handling). ``_format_template`` is stateless; a fresh instance is free.
1644
+
1534
1645
  Args:
1535
1646
  template (str): Template string with placeholders
1536
1647
  **kwargs: Values to substitute
1537
-
1648
+
1538
1649
  Returns:
1539
1650
  str: Formatted string with safe substitutions
1540
1651
  """
1541
- # Use the same regex-based substitution logic as BaseFrameworkAdapter._format_template
1542
- def replace_placeholder(match):
1543
- placeholder = match.group(1)
1544
- return str(kwargs.get(placeholder, match.group(0)))
1545
-
1546
- # Only replace placeholders that look like identifiers
1547
- return re.sub(r'\{([a-zA-Z_][a-zA-Z0-9_]*)\}', replace_placeholder, template)
1652
+ from praisonaiagents.frameworks.base import BaseFrameworkAdapter
1653
+ return BaseFrameworkAdapter._format_template(
1654
+ BaseFrameworkAdapter(), template, **kwargs
1655
+ )
@@ -311,9 +311,17 @@ def resolve_session_agent(agent_id: str, session_id: Optional[str]) -> Any:
311
311
  return agent
312
312
 
313
313
 
314
+ # Fields whose swap requires side-effects the core SDK owns and the wrapper
315
+ # must not open-code: a bare ``setattr(agent, 'llm', value)`` leaves the cached
316
+ # ``_llm_instance`` / ``_unified_dispatcher`` / ``_llm_init_params`` bound to the
317
+ # previous model, so the request keeps running on the OLD LLM while ``agent.llm``
318
+ # (and the response metadata) reports the new one. Route through the SDK's own
319
+ # invalidator instead (praisonaiagents.Agent._apply_default_llm).
320
+ _SIDE_EFFECT_OVERRIDES = frozenset({"llm"})
321
+
314
322
  _APPLYABLE_OVERRIDES = frozenset({
315
323
  "instructions", "goal", "role", "backstory",
316
- "llm", "max_iter",
324
+ "max_iter",
317
325
  "verbose", "markdown",
318
326
  })
319
327
 
@@ -322,6 +330,46 @@ class AgentConfigError(ValueError):
322
330
  """Raised when an agent_config override is unsupported or cannot be applied."""
323
331
 
324
332
 
333
+ def _swap_llm(agent: Any, model: Any) -> None:
334
+ """Swap the agent's model, invalidating the SDK's cached LLM state.
335
+
336
+ Prefers the SDK's own ``_apply_default_llm`` (which drops ``_llm_instance``,
337
+ ``_unified_dispatcher`` and re-seeds ``_llm_init_params`` atomically). That
338
+ method self-guards when the agent explicitly chose a model *or* was built
339
+ with a panel descriptor, so both guards are temporarily cleared — an API
340
+ override IS an explicit choice that supersedes a panel selection. Without
341
+ clearing ``_panel_descriptor`` the SDK returns early and the request would
342
+ silently continue on the panel model. Falls back to mirroring the SDK's
343
+ invalidation contract when the method is absent.
344
+ """
345
+ apply = getattr(agent, "_apply_default_llm", None)
346
+ if callable(apply):
347
+ had_explicit = getattr(agent, "_llm_explicit", None)
348
+ had_panel = getattr(agent, "_panel_descriptor", None)
349
+ agent._llm_explicit = False
350
+ if had_panel is not None:
351
+ agent._panel_descriptor = None
352
+ try:
353
+ apply(model)
354
+ finally:
355
+ if had_explicit is not None:
356
+ agent._llm_explicit = had_explicit
357
+ # ``_panel_descriptor`` is intentionally NOT restored: the override
358
+ # replaces the panel selection for the lifetime of this isolated
359
+ # clone. Restoring it would let ``_ensure_llm_instance`` rebuild the
360
+ # panel LLM and drift back to the old model.
361
+ return
362
+ # Fallback: mirror the SDK invalidation contract manually.
363
+ agent.llm = model
364
+ if getattr(agent, "_panel_descriptor", None) is not None:
365
+ agent._panel_descriptor = None
366
+ for attr in ("_llm_instance", "_unified_dispatcher"):
367
+ if hasattr(agent, attr):
368
+ setattr(agent, attr, None)
369
+ if getattr(agent, "_llm_init_params", None):
370
+ agent._llm_init_params = {**agent._llm_init_params, "model": model}
371
+
372
+
325
373
  def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> None:
326
374
  """Apply per-request overrides to an isolated agent clone.
327
375
 
@@ -333,6 +381,10 @@ def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> N
333
381
  the shared-instance fallback): writing overrides onto a registry-shared
334
382
  object would leak this request's config into subsequent/concurrent requests.
335
383
  In that case the override is rejected rather than silently applied globally.
384
+
385
+ ``llm`` is a side-effecting swap routed through :func:`_swap_llm` so the
386
+ cached LLM is invalidated — a plain ``setattr`` would leave the request
387
+ running on the previously cached model.
336
388
  """
337
389
  if not agent_config:
338
390
  return
@@ -342,13 +394,18 @@ def _apply_agent_config(agent: Any, agent_config: Optional[Dict[str, Any]]) -> N
342
394
  "agent is shared across requests and cannot be safely overridden "
343
395
  "per request."
344
396
  )
345
- unknown = set(agent_config) - _APPLYABLE_OVERRIDES
397
+ allowed = _APPLYABLE_OVERRIDES | _SIDE_EFFECT_OVERRIDES
398
+ unknown = set(agent_config) - allowed
346
399
  if unknown:
347
400
  raise AgentConfigError(
348
401
  f"Unsupported agent_config override(s): {sorted(unknown)}. "
349
- f"Allowed: {sorted(_APPLYABLE_OVERRIDES)}"
402
+ f"Allowed: {sorted(allowed)}"
350
403
  )
404
+ if "llm" in agent_config:
405
+ _swap_llm(agent, agent_config["llm"])
351
406
  for key, value in agent_config.items():
407
+ if key in _SIDE_EFFECT_OVERRIDES:
408
+ continue
352
409
  if not hasattr(agent, key):
353
410
  raise AgentConfigError(
354
411
  f"Agent has no attribute {key!r}; cannot override."