prompture 1.12.3.dev1__tar.gz → 1.12.4.dev1__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. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/CLAUDE.md +3 -0
  2. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/PKG-INFO +1 -1
  3. prompture-1.12.4.dev1/prompture/__main__.py +6 -0
  4. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/_version.py +2 -2
  5. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/cli.py +38 -0
  6. prompture-1.12.4.dev1/prompture/companion/__init__.py +47 -0
  7. prompture-1.12.4.dev1/prompture/companion/live.py +154 -0
  8. prompture-1.12.4.dev1/prompture/companion/local.py +153 -0
  9. prompture-1.12.4.dev1/prompture/companion/server.py +317 -0
  10. prompture-1.12.4.dev1/prompture/companion/summary.py +137 -0
  11. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_openai_compat_stream.py +12 -2
  12. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_openai_responses.py +25 -7
  13. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_azure_driver.py +17 -8
  14. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_base.py +10 -0
  15. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_claude_driver.py +26 -16
  16. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_groq_driver.py +8 -2
  17. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_compatible_driver.py +11 -1
  18. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_driver.py +9 -2
  19. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/azure_driver.py +18 -9
  20. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/base.py +10 -0
  21. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/claude_driver.py +29 -16
  22. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/groq_driver.py +8 -2
  23. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_compatible_driver.py +11 -1
  24. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_driver.py +9 -2
  25. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/__init__.py +30 -0
  26. prompture-1.12.4.dev1/prompture/infra/accounts.py +430 -0
  27. prompture-1.12.4.dev1/prompture/infra/rate_limits.py +316 -0
  28. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/tracker.py +82 -0
  29. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/__init__.py +4 -0
  30. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/async_driver.py +18 -8
  31. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/backoff.py +4 -0
  32. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/driver.py +16 -8
  33. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/explain.py +3 -0
  34. prompture-1.12.4.dev1/prompture/resilience/headroom.py +137 -0
  35. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/router.py +32 -3
  36. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/PKG-INFO +1 -1
  37. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/SOURCES.txt +9 -0
  38. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/scm_file_list.json +13 -0
  39. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
  40. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
  41. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-example/SKILL.md +0 -0
  42. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-field/SKILL.md +0 -0
  43. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
  44. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-test/SKILL.md +0 -0
  45. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
  46. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
  47. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
  48. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  49. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
  50. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.env.copy +0 -0
  51. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/FUNDING.yml +0 -0
  52. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  53. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
  54. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
  55. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
  56. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/scripts/update_docs_version.py +0 -0
  57. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/scripts/update_wrapper_version.py +0 -0
  58. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/dev.yml +0 -0
  59. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/documentation.yml +0 -0
  60. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/pricing-freshness.yml +0 -0
  61. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/publish.yml +0 -0
  62. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/security.yml +0 -0
  63. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.safety-project.ini +0 -0
  64. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/AGENTS.md +0 -0
  65. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/BREAKING_CHANGES.md +0 -0
  66. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/CONTRIBUTING.md +0 -0
  67. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/LICENSE +0 -0
  68. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/MANIFEST.in +0 -0
  69. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/README.md +0 -0
  70. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/ROADMAP.md +0 -0
  71. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/SECURITY.md +0 -0
  72. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/VERSION +0 -0
  73. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/dev.ps1 +0 -0
  74. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/dev.sh +0 -0
  75. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/mypy_errors.txt +0 -0
  76. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/README.md +0 -0
  77. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/README.md +0 -0
  78. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  79. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/pyproject.toml +0 -0
  80. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/test.py +0 -0
  81. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/README.md +0 -0
  82. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  83. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
  84. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/test.py +0 -0
  85. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/__init__.py +0 -0
  86. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/_internal/__init__.py +0 -0
  87. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/_internal/json_encoder.py +0 -0
  88. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/__init__.py +0 -0
  89. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/agent.py +0 -0
  90. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/assistant.py +0 -0
  91. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/async_agent.py +0 -0
  92. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/async_conversation.py +0 -0
  93. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/async_deep_agent.py +0 -0
  94. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/conversation.py +0 -0
  95. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/__init__.py +0 -0
  96. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/planner.py +0 -0
  97. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/subagents.py +0 -0
  98. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/summarizer.py +0 -0
  99. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/vfs.py +0 -0
  100. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep_agent.py +0 -0
  101. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep_prompts.py +0 -0
  102. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep_state.py +0 -0
  103. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/live_events.py +0 -0
  104. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/persona.py +0 -0
  105. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/review_loop.py +0 -0
  106. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/simulated_tools.py +0 -0
  107. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/skill_miner.py +0 -0
  108. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/skills.py +0 -0
  109. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/tool_grammars.py +0 -0
  110. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/tools_schema.py +0 -0
  111. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/types.py +0 -0
  112. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/aio/__init__.py +0 -0
  113. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/bridges/__init__.py +0 -0
  114. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/bridges/tukuy_backend.py +0 -0
  115. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/__init__.py +0 -0
  116. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/core.py +0 -0
  117. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/stores.py +0 -0
  118. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/types.py +0 -0
  119. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/citations/__init__.py +0 -0
  120. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/citations/core.py +0 -0
  121. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/citations/types.py +0 -0
  122. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/__init__.py +0 -0
  123. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/formatters.py +0 -0
  124. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/runner.py +0 -0
  125. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/server.py +0 -0
  126. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/__init__.py +0 -0
  127. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/dedup.py +0 -0
  128. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/evol.py +0 -0
  129. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/filters.py +0 -0
  130. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/formats.py +0 -0
  131. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/schemas.py +0 -0
  132. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/seed.py +0 -0
  133. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/synth.py +0 -0
  134. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/__init__.py +0 -0
  135. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_media_usage.py +0 -0
  136. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_openai_compat.py +0 -0
  137. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_prompt_cache.py +0 -0
  138. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_prompted_tool_stream.py +0 -0
  139. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_usage_reporting.py +0 -0
  140. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/aggregator_base.py +0 -0
  141. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/airllm_driver.py +0 -0
  142. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
  143. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_aggregator_base.py +0 -0
  144. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
  145. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
  146. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
  147. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
  148. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
  149. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
  150. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
  151. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
  152. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
  153. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
  154. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
  155. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
  156. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
  157. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
  158. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_embedding_base.py +0 -0
  159. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
  160. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
  161. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_google_driver.py +0 -0
  162. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
  163. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
  164. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_grok_driver.py +0 -0
  165. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
  166. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
  167. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
  168. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
  169. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
  170. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
  171. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
  172. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_kev_decision_driver.py +0 -0
  173. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
  174. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
  175. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_laya_decision_driver.py +0 -0
  176. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
  177. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
  178. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
  179. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
  180. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
  181. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
  182. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
  183. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
  184. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
  185. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
  186. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
  187. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
  188. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
  189. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
  190. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
  191. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
  192. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
  193. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
  194. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
  195. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
  196. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
  197. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
  198. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_registry.py +0 -0
  199. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
  200. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
  201. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
  202. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
  203. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_stt_base.py +0 -0
  204. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
  205. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_tts_base.py +0 -0
  206. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
  207. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
  208. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
  209. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
  210. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_zai_driver.py +0 -0
  211. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/audio_registry.py +0 -0
  212. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/azure_config.py +0 -0
  213. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/bedrock_driver.py +0 -0
  214. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
  215. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cachibot_driver.py +0 -0
  216. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
  217. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cohere_driver.py +0 -0
  218. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
  219. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
  220. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/decision_base.py +0 -0
  221. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/decision_registry.py +0 -0
  222. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
  223. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
  224. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/deepseek_driver.py +0 -0
  225. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/driver_registry.py +0 -0
  226. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
  227. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
  228. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/embedding_base.py +0 -0
  229. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/embedding_registry.py +0 -0
  230. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
  231. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
  232. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/google_driver.py +0 -0
  233. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
  234. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
  235. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/grok_driver.py +0 -0
  236. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
  237. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
  238. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/hugging_driver.py +0 -0
  239. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
  240. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/img_gen_base.py +0 -0
  241. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/img_gen_registry.py +0 -0
  242. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
  243. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
  244. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/job_runner.py +0 -0
  245. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/kev_decision_driver.py +0 -0
  246. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
  247. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
  248. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/laya_decision_driver.py +0 -0
  249. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/lipsync_base.py +0 -0
  250. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/lipsync_registry.py +0 -0
  251. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
  252. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/local_http_driver.py +0 -0
  253. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
  254. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/media_capabilities.py +0 -0
  255. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/minimax_driver.py +0 -0
  256. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
  257. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mistral_driver.py +0 -0
  258. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
  259. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/modelscope_driver.py +0 -0
  260. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/moderation_base.py +0 -0
  261. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/moderation_registry.py +0 -0
  262. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/moonshot_driver.py +0 -0
  263. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/muapi_aggregator_driver.py +0 -0
  264. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/music_base.py +0 -0
  265. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/music_registry.py +0 -0
  266. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
  267. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
  268. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
  269. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/ollama_driver.py +0 -0
  270. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
  271. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
  272. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
  273. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
  274. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
  275. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
  276. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openrouter_driver.py +0 -0
  277. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
  278. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/provider_branding.py +0 -0
  279. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/provider_descriptors.py +0 -0
  280. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/registry.py +0 -0
  281. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/rerank_base.py +0 -0
  282. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/rerank_registry.py +0 -0
  283. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
  284. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_capabilities.py +0 -0
  285. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
  286. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
  287. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
  288. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
  289. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/stt_base.py +0 -0
  290. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/systemone_compatible_driver.py +0 -0
  291. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/tts_base.py +0 -0
  292. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/typesafe_decision_driver.py +0 -0
  293. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
  294. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/video_gen_base.py +0 -0
  295. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/video_gen_registry.py +0 -0
  296. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/vision_helpers.py +0 -0
  297. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
  298. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
  299. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/zai_driver.py +0 -0
  300. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/__init__.py +0 -0
  301. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/base.py +0 -0
  302. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/faithfulness.py +0 -0
  303. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/judge.py +0 -0
  304. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/pairwise.py +0 -0
  305. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/self_consistency.py +0 -0
  306. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/exceptions.py +0 -0
  307. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/__init__.py +0 -0
  308. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/context.py +0 -0
  309. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/context_eval.py +0 -0
  310. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/data/document_qa_policies.json +0 -0
  311. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/data/extraction_contacts.json +0 -0
  312. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/data/tool_task_inventory.json +0 -0
  313. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/fixtures.py +0 -0
  314. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/gates.py +0 -0
  315. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/harness.py +0 -0
  316. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/__init__.py +0 -0
  317. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/candidates.py +0 -0
  318. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/optimizer.py +0 -0
  319. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/promotion.py +0 -0
  320. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/scorecard.py +0 -0
  321. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/integration.py +0 -0
  322. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/outcomes.py +0 -0
  323. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/policy.py +0 -0
  324. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/sandbox.py +0 -0
  325. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/scoring.py +0 -0
  326. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/__init__.py +0 -0
  327. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/base.py +0 -0
  328. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/critique.py +0 -0
  329. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/direct.py +0 -0
  330. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/registry.py +0 -0
  331. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/retrieve.py +0 -0
  332. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/types.py +0 -0
  333. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/__init__.py +0 -0
  334. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/_usage.py +0 -0
  335. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/async_core.py +0 -0
  336. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/code_extraction.py +0 -0
  337. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/core.py +0 -0
  338. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/few_shot.py +0 -0
  339. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/fields.py +0 -0
  340. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/reasoning.py +0 -0
  341. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/strategy.py +0 -0
  342. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/streaming.py +0 -0
  343. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/tools.py +0 -0
  344. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/tukuy_bridge.py +0 -0
  345. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/validator.py +0 -0
  346. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/__init__.py +0 -0
  347. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/anthropic_format.py +0 -0
  348. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/openai_format.py +0 -0
  349. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/reasoning_cache.py +0 -0
  350. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/responses_format.py +0 -0
  351. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/__init__.py +0 -0
  352. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/async_groups.py +0 -0
  353. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/consensus.py +0 -0
  354. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/debate.py +0 -0
  355. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/fusion.py +0 -0
  356. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/groups.py +0 -0
  357. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/types.py +0 -0
  358. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/__init__.py +0 -0
  359. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/enhance.py +0 -0
  360. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/negative.py +0 -0
  361. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/set_planner.py +0 -0
  362. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/style_presets.py +0 -0
  363. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/billing.py +0 -0
  364. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/budget.py +0 -0
  365. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/cache.py +0 -0
  366. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/callbacks.py +0 -0
  367. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/capabilities.py +0 -0
  368. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/coding_agent_events.py +0 -0
  369. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/coding_agent_specs.py +0 -0
  370. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/coding_agents.py +0 -0
  371. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/compression.py +0 -0
  372. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/cost_mixin.py +0 -0
  373. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/discovery.py +0 -0
  374. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/ledger.py +0 -0
  375. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/logging.py +0 -0
  376. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/media_pricing.py +0 -0
  377. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/media_rates.json +0 -0
  378. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/model_rates.py +0 -0
  379. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/otel.py +0 -0
  380. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/pricing.py +0 -0
  381. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/provider_env.py +0 -0
  382. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/anthropic.json +0 -0
  383. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/azure.json +0 -0
  384. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/bedrock.json +0 -0
  385. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/cerebras.json +0 -0
  386. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/cohere.json +0 -0
  387. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/deepinfra.json +0 -0
  388. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/deepseek.json +0 -0
  389. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/fireworks.json +0 -0
  390. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/google.json +0 -0
  391. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
  392. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/groq.json +0 -0
  393. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/jina.json +0 -0
  394. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/kev.json +0 -0
  395. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/laya.json +0 -0
  396. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/mistral.json +0 -0
  397. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/mixedbread.json +0 -0
  398. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/moonshot.json +0 -0
  399. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/nomic.json +0 -0
  400. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/nvidia.json +0 -0
  401. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/openai.json +0 -0
  402. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/openrouter.json +0 -0
  403. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/perplexity.json +0 -0
  404. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/sambanova.json +0 -0
  405. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/siliconflow.json +0 -0
  406. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/together.json +0 -0
  407. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/typesafe.json +0 -0
  408. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/voyage.json +0 -0
  409. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/xai.json +0 -0
  410. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/session.py +0 -0
  411. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/settings.py +0 -0
  412. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/token_counting.py +0 -0
  413. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/tukuy_backend.py +0 -0
  414. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/__init__.py +0 -0
  415. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/chunking.py +0 -0
  416. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/detect.py +0 -0
  417. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/document.py +0 -0
  418. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
  419. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/base.py +0 -0
  420. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
  421. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/docx.py +0 -0
  422. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/html.py +0 -0
  423. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
  424. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
  425. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
  426. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/integrations/__init__.py +0 -0
  427. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/integrations/mcp_bridge.py +0 -0
  428. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/integrations/tukuy_bridge.py +0 -0
  429. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/jobs.py +0 -0
  430. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/__init__.py +0 -0
  431. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/core.py +0 -0
  432. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/stores.py +0 -0
  433. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/types.py +0 -0
  434. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/__init__.py +0 -0
  435. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/client.py +0 -0
  436. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/server.py +0 -0
  437. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/tools.py +0 -0
  438. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/__init__.py +0 -0
  439. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/agent_tools.py +0 -0
  440. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/audio.py +0 -0
  441. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/hosting.py +0 -0
  442. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/image.py +0 -0
  443. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/video.py +0 -0
  444. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/01-why-prompture.md +0 -0
  445. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/02-installation.md +0 -0
  446. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/03-quickstart.md +0 -0
  447. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/04-toon-input.md +0 -0
  448. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/05-test-harness.md +0 -0
  449. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/06-stability.md +0 -0
  450. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/07-migration.md +0 -0
  451. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/__init__.py +0 -0
  452. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/history.py +0 -0
  453. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/serialization.py +0 -0
  454. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/store.py +0 -0
  455. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/__init__.py +0 -0
  456. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/pipeline.py +0 -0
  457. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/resolver.py +0 -0
  458. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/routing.py +0 -0
  459. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/__init__.py +0 -0
  460. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/base.py +0 -0
  461. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/__init__.py +0 -0
  462. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
  463. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
  464. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
  465. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
  466. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/decision_plugin.py +0 -0
  467. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
  468. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
  469. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
  470. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
  471. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
  472. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
  473. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
  474. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
  475. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/discovery.py +0 -0
  476. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/py.typed +0 -0
  477. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/__init__.py +0 -0
  478. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/__init__.py +0 -0
  479. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/base.py +0 -0
  480. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/character.py +0 -0
  481. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
  482. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/contextual.py +0 -0
  483. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/markdown.py +0 -0
  484. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/recursive.py +0 -0
  485. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/semantic.py +0 -0
  486. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/token.py +0 -0
  487. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/documents.py +0 -0
  488. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loader_registry.py +0 -0
  489. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/__init__.py +0 -0
  490. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
  491. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
  492. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
  493. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/html_loader.py +0 -0
  494. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/json_loader.py +0 -0
  495. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
  496. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
  497. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/text_loader.py +0 -0
  498. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
  499. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/pipeline.py +0 -0
  500. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/__init__.py +0 -0
  501. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
  502. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/base.py +0 -0
  503. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
  504. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/hyde.py +0 -0
  505. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/mmr.py +0 -0
  506. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
  507. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
  508. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/similarity.py +0 -0
  509. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/step_back.py +0 -0
  510. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
  511. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/base.py +0 -0
  512. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
  513. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
  514. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
  515. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
  516. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
  517. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
  518. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
  519. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/__init__.py +0 -0
  520. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/detector.py +0 -0
  521. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/evaluator.py +0 -0
  522. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/markers.py +0 -0
  523. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/breaker.py +0 -0
  524. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/errors.py +0 -0
  525. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/keys.py +0 -0
  526. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/strategies.py +0 -0
  527. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/virtual.py +0 -0
  528. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/__init__.py +0 -0
  529. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/generator.py +0 -0
  530. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  531. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
  532. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
  533. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
  534. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
  535. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
  536. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  537. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/security/__init__.py +0 -0
  538. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/security/injection.py +0 -0
  539. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/security/redaction.py +0 -0
  540. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/__init__.py +0 -0
  541. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/core.py +0 -0
  542. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/stores.py +0 -0
  543. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/types.py +0 -0
  544. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/__init__.py +0 -0
  545. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/environment.py +0 -0
  546. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/memory.py +0 -0
  547. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/scheduler.py +0 -0
  548. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/swarm.py +0 -0
  549. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/swarm_agent.py +0 -0
  550. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/types.py +0 -0
  551. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/testing/__init__.py +0 -0
  552. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/testing/driver_contract.py +0 -0
  553. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/tools/__init__.py +0 -0
  554. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/tools/code_exec.py +0 -0
  555. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/tools/web_search.py +0 -0
  556. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/__init__.py +0 -0
  557. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/architect.py +0 -0
  558. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/engine.py +0 -0
  559. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/errors.py +0 -0
  560. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/model.py +0 -0
  561. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/nodes.py +0 -0
  562. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/recovery.py +0 -0
  563. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/references.py +0 -0
  564. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/registry.py +0 -0
  565. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/scheduler.py +0 -0
  566. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/state.py +0 -0
  567. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/dependency_links.txt +0 -0
  568. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/entry_points.txt +0 -0
  569. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/requires.txt +0 -0
  570. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/top_level.txt +0 -0
  571. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture_cost_tracking.md +0 -0
  572. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/pyproject.toml +0 -0
  573. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/requirements.txt +0 -0
  574. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/scripts/check_pricing_freshness.py +0 -0
  575. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/setup.cfg +0 -0
  576. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/specs/basic_extraction.json +0 -0
  577. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/specs/schema_validation.json +0 -0
  578. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/specs/strategy_comparison.json +0 -0
  579. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/test.py +0 -0
  580. {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/test_version_diagnosis.py +0 -0
@@ -73,6 +73,9 @@ Configuration is in `pyproject.toml` under `[tool.ruff]`.
73
73
  - **`prompture/resilience/`** — `resilient()` / `ResilientDriver` (+ async): a composite Driver that retries, parks, rotates keys and fails over across targets. `errors.py` is the error→action decision table (`classify_error`, extensible via `register_error_rule`); `breaker.py` holds lazy-recovery circuit breakers scoped by provider/model/key; `keys.py` builds key pools from `{PROVIDER}_API_KEYS`. Every result carries `meta["route"]` (served_by, fallback, attempts).
74
74
  - **`prompture/gateway/`** — framework-agnostic wire formats. `anthropic_format.py` (Anthropic Messages: `anthropic_to_driver`, `stream_anthropic_events`, `live_events_for`) and `responses_format.py` (OpenAI Responses) sit beside the OpenAI chat format; `reasoning_cache.py` replays `reasoning_content` for stateless clients. OpenAI chat format: request→driver messages/options (`to_driver_messages`, `driver_options` incl. `response_format`→`json_mode`), `run_chat`/`arun_chat`, `chat_completion`/`chat_chunk`, `stream_chat_chunks` (with `on_complete` metering hook), `sse`. Used by `prompture serve` and prompture-hub — keep response shaping here, not in servers.
75
75
  - **Virtual models** — `combo/<name>`, `auto/<mode>`, `fusion/<name>` (`groups/fusion.py`) and aliases resolve in `resilience/virtual.py`, called at the top of `get_driver_for_model` / `get_async_driver_for_model`.
76
+ - **`prompture/infra/rate_limits.py`** — `LimitSnapshot` from documented rate-limit response headers (OpenAI/Groq `x-ratelimit-*`, Anthropic `anthropic-ratelimit-*`). SDK drivers hook their httpx client (`attach_rate_limit_hook`) and wrap calls in `capture_rate_limits()`; streams read `stream.response`. Surfaces as `meta["rate_limits"]` only when headers were present. `resilience/headroom.py` feeds these into routing: `HeadroomTracker` keeps the latest snapshot per target and `RoutePlan` moves targets below `RetryPolicy.min_headroom` (default 5%) to the back (`meta["route"]["deprioritized"]`).
77
+ - **`prompture/infra/accounts.py`** — `AccountSource` registry for balances/spend from documented endpoints (OpenRouter key, DeepSeek, Moonshot, OpenAI/Anthropic admin cost reports). `get_account_snapshots()` only calls configured sources, caches ~60s, and turns failures into `error` snapshots.
78
+ - **`prompture/companion/`** — the companion API that desktop companions (Prompture Desk) read, shared with prompture-hub: `LiveBus` (SSE event bus, asyncio + thread subscribers), `summarize_spend` / `provider_limits` / period windows, `COMPANION_API_VERSION`. `prompture companion` runs a stdlib-only local server over the usage ledger (`LedgerSource`) on 127.0.0.1 with its URL + token in `~/.prompture/companion.json`, so no hub is needed. Usage is tagged per project via `tracker.project()` / `PROMPTURE_PROJECT`.
76
79
  - **`prompture/infra/otel.py`** / **`infra/compression.py`** — GenAI-convention OpenTelemetry spans via `DriverCallbacks`; conservative message compression for agent loops.
77
80
  - **`prompture/runner.py`** — Spec-driven test suite runner for cross-model comparison.
78
81
  - **`prompture/validator.py`** — JSON schema validation via jsonschema with fallback.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 1.12.3.dev1
3
+ Version: 1.12.4.dev1
4
4
  Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
5
5
  Author-email: Juan Denis <juan@vene.co>
6
6
  License-Expression: MIT
@@ -0,0 +1,6 @@
1
+ """``python -m prompture …`` runs the ``prompture`` CLI (useful when its script isn't on PATH)."""
2
+
3
+ from .cli.cli import cli
4
+
5
+ if __name__ == "__main__":
6
+ cli()
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.12.3.dev1'
22
- __version_tuple__ = version_tuple = (1, 12, 3, 'dev1')
21
+ __version__ = version = '1.12.4.dev1'
22
+ __version_tuple__ = version_tuple = (1, 12, 4, 'dev1')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,3 +1,4 @@
1
+ import contextlib
1
2
  import json
2
3
  import shlex
3
4
 
@@ -200,6 +201,43 @@ def test_suite(specfile: str, providers: str | None, models: str | None, fmt: st
200
201
  click.echo(json.dumps(report, indent=2, ensure_ascii=False))
201
202
 
202
203
 
204
+ @cli.command()
205
+ @click.option("--port", default=0, type=int, help="Port on 127.0.0.1 (default: a free one the OS picks).")
206
+ @click.option(
207
+ "--db", "db_path", default=None, type=click.Path(), help="Usage ledger (default ~/.prompture/usage/usage.db)."
208
+ )
209
+ @click.option(
210
+ "--exit-with-pid",
211
+ default=None,
212
+ type=int,
213
+ help="Stop when this process exits (used by apps that start the companion for themselves).",
214
+ )
215
+ def companion(port: int, db_path: str | None, exit_with_pid: int | None) -> None:
216
+ """Serve this machine's Prompture usage to desktop companions (no hub needed).
217
+
218
+ Reads the usage ledger every Prompture call writes to, plus rate-limit
219
+ headroom and provider account balances, and serves them on localhost with
220
+ the same companion API as prompture-hub. The address and a bearer token are
221
+ written to ~/.prompture/companion.json. If a companion is already running,
222
+ this prints its address and exits.
223
+ """
224
+ from ..companion import CompanionServer, LedgerSource, running_instance
225
+
226
+ existing = running_instance()
227
+ if existing:
228
+ click.echo(f"Prompture companion already running at {existing['url']} (pid {existing.get('pid')}).")
229
+ return
230
+ server = CompanionServer(LedgerSource(db_path), port=port)
231
+ click.echo(f"Prompture companion on {server.url} - ledger {server.ledger.db_path}")
232
+ click.echo("Address and token in ~/.prompture/companion.json. Ctrl+C to stop.")
233
+ if exit_with_pid:
234
+ from ..companion.server import stop_when_process_exits
235
+
236
+ stop_when_process_exits(server, exit_with_pid)
237
+ with contextlib.suppress(KeyboardInterrupt):
238
+ server.run()
239
+
240
+
203
241
  @cli.command()
204
242
  @click.option("--host", default=None, help="Bind host (default 127.0.0.1, or HUB_HOST).")
205
243
  @click.option("--port", default=None, type=int, help="Bind port (default 1984, or HUB_PORT).")
@@ -0,0 +1,47 @@
1
+ """The companion API: what desktop companions (e.g. Prompture Desk) read.
2
+
3
+ Two servers speak it:
4
+
5
+ - **prompture-hub** — the gateway, which sees every call routed through it and
6
+ adds keys, projects, alert rules and controls.
7
+ - **the local companion** (``prompture companion``) — no hub needed; reports
8
+ this machine's Prompture usage from the usage ledger, rate-limit headroom and
9
+ provider account balances.
10
+
11
+ This package holds what both share — the live event bus, the spend / limits
12
+ aggregations and the API version — plus the local server itself.
13
+ """
14
+
15
+ from .live import LiveBus, get_bus, new_request_id, sse_event, visible
16
+ from .local import LedgerSource
17
+ from .server import CompanionServer, read_state, running_instance
18
+ from .summary import (
19
+ COMPANION_API_VERSION,
20
+ PERIODS,
21
+ UsageRow,
22
+ account_limits,
23
+ provider_limits,
24
+ summarize_spend,
25
+ window_end,
26
+ window_start,
27
+ )
28
+
29
+ __all__ = [
30
+ "COMPANION_API_VERSION",
31
+ "PERIODS",
32
+ "CompanionServer",
33
+ "LedgerSource",
34
+ "LiveBus",
35
+ "UsageRow",
36
+ "account_limits",
37
+ "get_bus",
38
+ "new_request_id",
39
+ "provider_limits",
40
+ "read_state",
41
+ "running_instance",
42
+ "sse_event",
43
+ "summarize_spend",
44
+ "visible",
45
+ "window_end",
46
+ "window_start",
47
+ ]
@@ -0,0 +1,154 @@
1
+ """In-process live event bus behind a companion's ``GET /v1/live``.
2
+
3
+ Producers publish an event when a call starts, produces its first token,
4
+ changes activity and finishes. Events carry metadata only: ids, model,
5
+ project, status, tokens, cost, timings — never prompt or completion text.
6
+
7
+ The bus keeps the last :data:`RING_SIZE` events, so a client that reconnects
8
+ with ``Last-Event-ID`` gets what it missed, and the set of in-flight calls, so
9
+ a client that connects mid-request still sees it running. Publishing is
10
+ thread-safe. Subscribers are either asyncio queues (FastAPI servers such as
11
+ prompture-hub) or plain thread queues (the standard-library local server).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import asyncio
17
+ import itertools
18
+ import queue
19
+ import threading
20
+ import time
21
+ import uuid
22
+ from collections import deque
23
+ from collections.abc import Iterable
24
+ from dataclasses import dataclass, field
25
+ from datetime import datetime, timezone
26
+ from typing import Any
27
+
28
+ RING_SIZE = 1000
29
+ SUBSCRIBER_QUEUE = 500
30
+ #: In-flight entries older than this are assumed abandoned (a client that
31
+ #: dropped a stream before the upstream call finished).
32
+ IN_FLIGHT_TTL = 30 * 60
33
+
34
+
35
+ @dataclass(eq=False) # compared and hashed by identity
36
+ class Subscriber:
37
+ """One stream reader. ``loop`` is set for asyncio readers, ``None`` for threads."""
38
+
39
+ queue: Any
40
+ loop: asyncio.AbstractEventLoop | None = None
41
+ overflowed: bool = False
42
+
43
+
44
+ @dataclass
45
+ class LiveBus:
46
+ ring: deque = field(default_factory=lambda: deque(maxlen=RING_SIZE))
47
+ in_flight: dict[str, dict[str, Any]] = field(default_factory=dict)
48
+ _subscribers: set = field(default_factory=set)
49
+ _lock: threading.Lock = field(default_factory=threading.Lock)
50
+ _seq: itertools.count = field(default_factory=lambda: itertools.count(1))
51
+
52
+ def publish(self, type_: str, data: dict[str, Any]) -> dict[str, Any]:
53
+ event = {"type": type_, "ts": data.get("ts") or datetime.now(timezone.utc).isoformat(), **data}
54
+ with self._lock:
55
+ event["id"] = next(self._seq)
56
+ self.ring.append(event)
57
+ request_id = data.get("request_id")
58
+ if type_ == "request.started" and request_id:
59
+ self.in_flight[request_id] = {**event, "_mono": time.monotonic()}
60
+ elif request_id in self.in_flight and type_ in ("request.first_token", "request.activity"):
61
+ self.in_flight[request_id].update({k: v for k, v in data.items() if k != "request_id"})
62
+ elif type_ == "request.finished" and request_id:
63
+ self.in_flight.pop(request_id, None)
64
+ subscribers = list(self._subscribers)
65
+ for sub in subscribers:
66
+ if sub.loop is None:
67
+ self._deliver(sub, event)
68
+ continue
69
+ try:
70
+ sub.loop.call_soon_threadsafe(self._deliver, sub, event)
71
+ except RuntimeError: # loop closed; the subscriber is gone
72
+ self.unsubscribe(sub)
73
+ return event
74
+
75
+ @staticmethod
76
+ def _deliver(sub: Subscriber, event: dict[str, Any]) -> None:
77
+ try:
78
+ sub.queue.put_nowait(event)
79
+ except (asyncio.QueueFull, queue.Full):
80
+ sub.overflowed = True
81
+
82
+ def subscribe(self) -> Subscriber:
83
+ """Subscribe from a running asyncio loop."""
84
+ sub = Subscriber(asyncio.Queue(maxsize=SUBSCRIBER_QUEUE), asyncio.get_running_loop())
85
+ with self._lock:
86
+ self._subscribers.add(sub)
87
+ return sub
88
+
89
+ def subscribe_thread(self) -> Subscriber:
90
+ """Subscribe from a plain thread; read with ``sub.queue.get(timeout=...)``."""
91
+ sub = Subscriber(queue.Queue(maxsize=SUBSCRIBER_QUEUE))
92
+ with self._lock:
93
+ self._subscribers.add(sub)
94
+ return sub
95
+
96
+ def unsubscribe(self, sub: Subscriber) -> None:
97
+ with self._lock:
98
+ self._subscribers.discard(sub)
99
+
100
+ def replay(self, after_id: int) -> list[dict[str, Any]]:
101
+ """Buffered events newer than *after_id* (oldest first)."""
102
+ with self._lock:
103
+ return [e for e in self.ring if e["id"] > after_id]
104
+
105
+ def running(self) -> list[dict[str, Any]]:
106
+ """Calls that started and have not finished, dropping abandoned ones."""
107
+ cutoff = time.monotonic() - IN_FLIGHT_TTL
108
+ with self._lock:
109
+ for rid in [rid for rid, e in self.in_flight.items() if e["_mono"] < cutoff]:
110
+ del self.in_flight[rid]
111
+ return [{k: v for k, v in e.items() if k != "_mono"} for e in self.in_flight.values()]
112
+
113
+ def last_id(self) -> int:
114
+ with self._lock:
115
+ return self.ring[-1]["id"] if self.ring else 0
116
+
117
+ def reset(self) -> None:
118
+ with self._lock:
119
+ self.ring.clear()
120
+ self.in_flight.clear()
121
+ self._subscribers.clear()
122
+ self._seq = itertools.count(1)
123
+
124
+
125
+ _bus = LiveBus()
126
+
127
+
128
+ def get_bus() -> LiveBus:
129
+ """The process-wide bus."""
130
+ return _bus
131
+
132
+
133
+ def new_request_id() -> str:
134
+ return f"req_{uuid.uuid4().hex[:20]}"
135
+
136
+
137
+ def visible(event: dict[str, Any], key_ids: Iterable[int] | None) -> bool:
138
+ """Whether a caller limited to *key_ids* (``None`` = all) may see *event*."""
139
+ if key_ids is None:
140
+ return True
141
+ key_id = event.get("key_id")
142
+ return key_id is None or key_id in key_ids
143
+
144
+
145
+ def sse_event(event: dict[str, Any]) -> str:
146
+ """Format one event as a Server-Sent Events frame."""
147
+ import json
148
+
149
+ lines = []
150
+ if "id" in event:
151
+ lines.append(f"id: {event['id']}")
152
+ lines.append(f"event: {event['type']}")
153
+ lines.append("data: " + json.dumps(event, separators=(",", ":"), default=str))
154
+ return "\n".join(lines) + "\n\n"
@@ -0,0 +1,153 @@
1
+ """The local companion's data: Prompture's own usage ledger.
2
+
3
+ Every Prompture driver call on this machine is recorded in
4
+ ``~/.prompture/usage/usage.db`` (see :mod:`prompture.infra.tracker`). The
5
+ :class:`LedgerSource` reads that file — it never writes to it — to answer the
6
+ companion views, and :meth:`LedgerSource.tail` turns newly written rows into
7
+ ``request.finished`` live events.
8
+
9
+ The ledger only knows about calls once they finish, so the local companion has
10
+ no "running now" view; prompture-hub, which sits in the request path, does.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import json
16
+ import sqlite3
17
+ import threading
18
+ from datetime import datetime
19
+ from pathlib import Path
20
+ from typing import Any
21
+
22
+ from ..infra.tracker import PROJECT_TAG
23
+ from .live import LiveBus
24
+ from .summary import UsageRow, window_start
25
+
26
+ DEFAULT_LEDGER = Path.home() / ".prompture" / "usage" / "usage.db"
27
+ #: How many recent rows are scanned for each model's latest rate-limit snapshot.
28
+ RATE_LIMIT_SCAN = 500
29
+
30
+
31
+ def _project(tags: str | None) -> str | None:
32
+ for tag in json.loads(tags) if tags else []:
33
+ if isinstance(tag, str) and tag.startswith(PROJECT_TAG):
34
+ return tag[len(PROJECT_TAG) :] or None
35
+ return None
36
+
37
+
38
+ def _meta(raw: str | None) -> dict[str, Any]:
39
+ try:
40
+ value = json.loads(raw) if raw else {}
41
+ except ValueError:
42
+ return {}
43
+ return value if isinstance(value, dict) else {}
44
+
45
+
46
+ class LedgerSource:
47
+ """Read-only view of a Prompture usage ledger."""
48
+
49
+ def __init__(self, db_path: str | Path | None = None) -> None:
50
+ self.db_path = Path(db_path) if db_path else DEFAULT_LEDGER
51
+
52
+ def _connect(self) -> sqlite3.Connection | None:
53
+ if not self.db_path.exists():
54
+ return None
55
+ conn = sqlite3.connect(f"file:{self.db_path.as_posix()}?mode=ro", uri=True, timeout=5)
56
+ conn.row_factory = sqlite3.Row
57
+ return conn
58
+
59
+ def _query(self, sql: str, params: tuple = ()) -> list[sqlite3.Row]:
60
+ conn = self._connect()
61
+ if conn is None:
62
+ return []
63
+ try:
64
+ return conn.execute(sql, params).fetchall()
65
+ except sqlite3.OperationalError: # table not created yet
66
+ return []
67
+ finally:
68
+ conn.close()
69
+
70
+ @staticmethod
71
+ def _row(r: sqlite3.Row) -> UsageRow:
72
+ meta = _meta(r["metadata"])
73
+ route = meta.get("route") if isinstance(meta.get("route"), dict) else {}
74
+ return UsageRow(
75
+ model=r["model_name"] or "",
76
+ cost_usd=float(r["cost"] or 0.0),
77
+ tokens=int(r["total_tokens"] or 0),
78
+ status="ok" if r["status"] == "success" else (r["status"] or "ok"),
79
+ served_by=route.get("served_by"),
80
+ project=_project(r["tags"]),
81
+ )
82
+
83
+ def rows(self, period: str = "day", now: datetime | None = None) -> list[UsageRow]:
84
+ """Calls in the current UTC ``period`` window."""
85
+ start = window_start(period, now).isoformat()
86
+ return [
87
+ self._row(r)
88
+ for r in self._query(
89
+ "SELECT model_name, cost, total_tokens, status, tags, metadata FROM usage_events WHERE timestamp >= ?",
90
+ (start,),
91
+ )
92
+ ]
93
+
94
+ def rate_limits(self) -> dict[str, dict[str, Any]]:
95
+ """Latest rate-limit snapshot per model, from recent calls' metadata."""
96
+ out: dict[str, dict[str, Any]] = {}
97
+ for r in self._query(
98
+ "SELECT model_name, metadata FROM usage_events WHERE metadata LIKE '%rate_limits%' "
99
+ "ORDER BY rowid DESC LIMIT ?",
100
+ (RATE_LIMIT_SCAN,),
101
+ ):
102
+ model = r["model_name"]
103
+ data = _meta(r["metadata"]).get("rate_limits")
104
+ if model and model not in out and isinstance(data, dict):
105
+ out[model] = data
106
+ return out
107
+
108
+ def last_rowid(self) -> int:
109
+ rows = self._query("SELECT MAX(rowid) AS last FROM usage_events")
110
+ return int(rows[0]["last"] or 0) if rows else 0
111
+
112
+ def events_after(self, rowid: int) -> list[tuple[int, dict[str, Any]]]:
113
+ """``request.finished`` payloads for rows newer than *rowid*."""
114
+ out = []
115
+ for r in self._query(
116
+ "SELECT rowid, id, timestamp, model_name, cost, prompt_tokens, completion_tokens, total_tokens, "
117
+ "elapsed_ms, status, error_message, tags, metadata FROM usage_events WHERE rowid > ? ORDER BY rowid",
118
+ (rowid,),
119
+ ):
120
+ meta = _meta(r["metadata"])
121
+ route = meta.get("route") if isinstance(meta.get("route"), dict) else {}
122
+ attempts = sum(1 for a in route.get("attempts", []) if a.get("outcome") in ("ok", "error")) or 1
123
+ out.append(
124
+ (
125
+ int(r["rowid"]),
126
+ {
127
+ "request_id": r["id"],
128
+ "ts": r["timestamp"],
129
+ "key_id": None,
130
+ "model": r["model_name"],
131
+ "served_by": route.get("served_by"),
132
+ "project": _project(r["tags"]),
133
+ "status": "ok" if r["status"] == "success" else r["status"],
134
+ "error": (r["error_message"] or "")[:200] or None,
135
+ "prompt_tokens": r["prompt_tokens"],
136
+ "completion_tokens": r["completion_tokens"],
137
+ "cost_usd": r["cost"],
138
+ "latency_ms": int(r["elapsed_ms"] or 0),
139
+ "attempts": attempts,
140
+ "fallback": attempts > 1,
141
+ "deprioritized": route.get("deprioritized") or [],
142
+ },
143
+ )
144
+ )
145
+ return out
146
+
147
+ def tail(self, bus: LiveBus, stop: threading.Event, interval: float = 1.0) -> None:
148
+ """Publish a ``request.finished`` event for every row written from now on."""
149
+ last = self.last_rowid()
150
+ while not stop.wait(interval):
151
+ for rowid, payload in self.events_after(last):
152
+ bus.publish("request.finished", payload)
153
+ last = rowid