prompture 1.12.2.dev1__tar.gz → 1.12.3.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 (571) hide show
  1. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/CLAUDE.md +4 -0
  2. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/PKG-INFO +161 -1
  3. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/README.md +156 -0
  4. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/__init__.py +14 -0
  5. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/_version.py +2 -2
  6. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/cli.py +35 -0
  7. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/server.py +46 -95
  8. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/__init__.py +7 -0
  9. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_registry.py +7 -0
  10. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/decision_registry.py +11 -6
  11. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/provider_descriptors.py +4 -1
  12. prompture-1.12.3.dev1/prompture/gateway/__init__.py +92 -0
  13. prompture-1.12.3.dev1/prompture/gateway/anthropic_format.py +411 -0
  14. prompture-1.12.3.dev1/prompture/gateway/openai_format.py +462 -0
  15. prompture-1.12.3.dev1/prompture/gateway/reasoning_cache.py +99 -0
  16. prompture-1.12.3.dev1/prompture/gateway/responses_format.py +381 -0
  17. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/__init__.py +7 -0
  18. prompture-1.12.3.dev1/prompture/groups/fusion.py +257 -0
  19. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/__init__.py +6 -0
  20. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/coding_agents.py +16 -2
  21. prompture-1.12.3.dev1/prompture/infra/compression.py +109 -0
  22. prompture-1.12.3.dev1/prompture/infra/otel.py +176 -0
  23. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/routing.py +8 -0
  24. prompture-1.12.3.dev1/prompture/resilience/__init__.py +102 -0
  25. prompture-1.12.3.dev1/prompture/resilience/async_driver.py +254 -0
  26. prompture-1.12.3.dev1/prompture/resilience/backoff.py +48 -0
  27. prompture-1.12.3.dev1/prompture/resilience/breaker.py +207 -0
  28. prompture-1.12.3.dev1/prompture/resilience/driver.py +310 -0
  29. prompture-1.12.3.dev1/prompture/resilience/errors.py +381 -0
  30. prompture-1.12.3.dev1/prompture/resilience/explain.py +72 -0
  31. prompture-1.12.3.dev1/prompture/resilience/keys.py +100 -0
  32. prompture-1.12.3.dev1/prompture/resilience/router.py +289 -0
  33. prompture-1.12.3.dev1/prompture/resilience/strategies.py +201 -0
  34. prompture-1.12.3.dev1/prompture/resilience/virtual.py +387 -0
  35. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/PKG-INFO +161 -1
  36. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/SOURCES.txt +19 -0
  37. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/requires.txt +6 -0
  38. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/scm_file_list.json +27 -0
  39. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/pyproject.toml +3 -0
  40. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
  41. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
  42. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-example/SKILL.md +0 -0
  43. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-field/SKILL.md +0 -0
  44. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
  45. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-test/SKILL.md +0 -0
  46. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
  47. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
  48. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
  49. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  50. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
  51. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.env.copy +0 -0
  52. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/FUNDING.yml +0 -0
  53. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  54. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
  55. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
  56. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
  57. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/scripts/update_docs_version.py +0 -0
  58. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/scripts/update_wrapper_version.py +0 -0
  59. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/dev.yml +0 -0
  60. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/documentation.yml +0 -0
  61. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/pricing-freshness.yml +0 -0
  62. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/publish.yml +0 -0
  63. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/security.yml +0 -0
  64. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.safety-project.ini +0 -0
  65. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/AGENTS.md +0 -0
  66. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/BREAKING_CHANGES.md +0 -0
  67. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/CONTRIBUTING.md +0 -0
  68. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/LICENSE +0 -0
  69. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/MANIFEST.in +0 -0
  70. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/ROADMAP.md +0 -0
  71. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/SECURITY.md +0 -0
  72. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/VERSION +0 -0
  73. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/dev.ps1 +0 -0
  74. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/dev.sh +0 -0
  75. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/mypy_errors.txt +0 -0
  76. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/README.md +0 -0
  77. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/README.md +0 -0
  78. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  79. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/pyproject.toml +0 -0
  80. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/test.py +0 -0
  81. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/README.md +0 -0
  82. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  83. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
  84. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/test.py +0 -0
  85. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/_internal/__init__.py +0 -0
  86. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/_internal/json_encoder.py +0 -0
  87. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/__init__.py +0 -0
  88. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/agent.py +0 -0
  89. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/assistant.py +0 -0
  90. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/async_agent.py +0 -0
  91. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/async_conversation.py +0 -0
  92. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/async_deep_agent.py +0 -0
  93. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/conversation.py +0 -0
  94. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/__init__.py +0 -0
  95. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/planner.py +0 -0
  96. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/subagents.py +0 -0
  97. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/summarizer.py +0 -0
  98. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/vfs.py +0 -0
  99. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep_agent.py +0 -0
  100. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep_prompts.py +0 -0
  101. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep_state.py +0 -0
  102. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/live_events.py +0 -0
  103. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/persona.py +0 -0
  104. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/review_loop.py +0 -0
  105. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/simulated_tools.py +0 -0
  106. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/skill_miner.py +0 -0
  107. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/skills.py +0 -0
  108. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/tool_grammars.py +0 -0
  109. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/tools_schema.py +0 -0
  110. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/types.py +0 -0
  111. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/aio/__init__.py +0 -0
  112. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/bridges/__init__.py +0 -0
  113. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/bridges/tukuy_backend.py +0 -0
  114. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/__init__.py +0 -0
  115. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/core.py +0 -0
  116. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/stores.py +0 -0
  117. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/types.py +0 -0
  118. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/citations/__init__.py +0 -0
  119. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/citations/core.py +0 -0
  120. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/citations/types.py +0 -0
  121. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/__init__.py +0 -0
  122. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/formatters.py +0 -0
  123. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/runner.py +0 -0
  124. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/__init__.py +0 -0
  125. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/dedup.py +0 -0
  126. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/evol.py +0 -0
  127. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/filters.py +0 -0
  128. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/formats.py +0 -0
  129. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/schemas.py +0 -0
  130. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/seed.py +0 -0
  131. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/synth.py +0 -0
  132. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_media_usage.py +0 -0
  133. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_openai_compat.py +0 -0
  134. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_openai_compat_stream.py +0 -0
  135. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_openai_responses.py +0 -0
  136. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_prompt_cache.py +0 -0
  137. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_prompted_tool_stream.py +0 -0
  138. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_usage_reporting.py +0 -0
  139. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/aggregator_base.py +0 -0
  140. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/airllm_driver.py +0 -0
  141. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
  142. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_aggregator_base.py +0 -0
  143. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
  144. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
  145. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_azure_driver.py +0 -0
  146. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_base.py +0 -0
  147. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
  148. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
  149. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
  150. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
  151. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_claude_driver.py +0 -0
  152. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
  153. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
  154. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
  155. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
  156. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
  157. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
  158. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
  159. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
  160. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_embedding_base.py +0 -0
  161. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
  162. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
  163. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_google_driver.py +0 -0
  164. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
  165. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
  166. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_grok_driver.py +0 -0
  167. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
  168. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
  169. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_groq_driver.py +0 -0
  170. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
  171. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
  172. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
  173. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
  174. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
  175. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_kev_decision_driver.py +0 -0
  176. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
  177. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
  178. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_laya_decision_driver.py +0 -0
  179. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
  180. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
  181. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
  182. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
  183. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
  184. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
  185. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
  186. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
  187. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
  188. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
  189. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
  190. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
  191. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
  192. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
  193. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
  194. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_compatible_driver.py +0 -0
  195. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_driver.py +0 -0
  196. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
  197. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
  198. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
  199. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
  200. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
  201. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
  202. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
  203. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
  204. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
  205. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
  206. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
  207. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_stt_base.py +0 -0
  208. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
  209. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_tts_base.py +0 -0
  210. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
  211. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
  212. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
  213. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
  214. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_zai_driver.py +0 -0
  215. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/audio_registry.py +0 -0
  216. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/azure_config.py +0 -0
  217. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/azure_driver.py +0 -0
  218. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/base.py +0 -0
  219. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/bedrock_driver.py +0 -0
  220. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
  221. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cachibot_driver.py +0 -0
  222. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
  223. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/claude_driver.py +0 -0
  224. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cohere_driver.py +0 -0
  225. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
  226. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
  227. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/decision_base.py +0 -0
  228. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
  229. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
  230. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/deepseek_driver.py +0 -0
  231. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/driver_registry.py +0 -0
  232. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
  233. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
  234. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/embedding_base.py +0 -0
  235. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/embedding_registry.py +0 -0
  236. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
  237. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
  238. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/google_driver.py +0 -0
  239. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
  240. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
  241. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/grok_driver.py +0 -0
  242. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
  243. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
  244. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/groq_driver.py +0 -0
  245. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/hugging_driver.py +0 -0
  246. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
  247. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/img_gen_base.py +0 -0
  248. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/img_gen_registry.py +0 -0
  249. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
  250. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
  251. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/job_runner.py +0 -0
  252. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/kev_decision_driver.py +0 -0
  253. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
  254. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
  255. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/laya_decision_driver.py +0 -0
  256. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/lipsync_base.py +0 -0
  257. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/lipsync_registry.py +0 -0
  258. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
  259. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/local_http_driver.py +0 -0
  260. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
  261. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/media_capabilities.py +0 -0
  262. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/minimax_driver.py +0 -0
  263. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
  264. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mistral_driver.py +0 -0
  265. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
  266. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/modelscope_driver.py +0 -0
  267. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/moderation_base.py +0 -0
  268. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/moderation_registry.py +0 -0
  269. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/moonshot_driver.py +0 -0
  270. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/muapi_aggregator_driver.py +0 -0
  271. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/music_base.py +0 -0
  272. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/music_registry.py +0 -0
  273. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
  274. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
  275. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
  276. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/ollama_driver.py +0 -0
  277. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
  278. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_compatible_driver.py +0 -0
  279. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_driver.py +0 -0
  280. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
  281. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
  282. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
  283. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
  284. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
  285. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openrouter_driver.py +0 -0
  286. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
  287. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/provider_branding.py +0 -0
  288. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/registry.py +0 -0
  289. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/rerank_base.py +0 -0
  290. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/rerank_registry.py +0 -0
  291. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
  292. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_capabilities.py +0 -0
  293. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
  294. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
  295. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
  296. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
  297. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/stt_base.py +0 -0
  298. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/systemone_compatible_driver.py +0 -0
  299. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/tts_base.py +0 -0
  300. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/typesafe_decision_driver.py +0 -0
  301. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
  302. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/video_gen_base.py +0 -0
  303. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/video_gen_registry.py +0 -0
  304. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/vision_helpers.py +0 -0
  305. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
  306. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
  307. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/zai_driver.py +0 -0
  308. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/__init__.py +0 -0
  309. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/base.py +0 -0
  310. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/faithfulness.py +0 -0
  311. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/judge.py +0 -0
  312. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/pairwise.py +0 -0
  313. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/self_consistency.py +0 -0
  314. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/exceptions.py +0 -0
  315. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/__init__.py +0 -0
  316. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/context.py +0 -0
  317. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/context_eval.py +0 -0
  318. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/data/document_qa_policies.json +0 -0
  319. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/data/extraction_contacts.json +0 -0
  320. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/data/tool_task_inventory.json +0 -0
  321. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/fixtures.py +0 -0
  322. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/gates.py +0 -0
  323. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/harness.py +0 -0
  324. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/__init__.py +0 -0
  325. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/candidates.py +0 -0
  326. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/optimizer.py +0 -0
  327. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/promotion.py +0 -0
  328. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/scorecard.py +0 -0
  329. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/integration.py +0 -0
  330. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/outcomes.py +0 -0
  331. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/policy.py +0 -0
  332. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/sandbox.py +0 -0
  333. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/scoring.py +0 -0
  334. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/__init__.py +0 -0
  335. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/base.py +0 -0
  336. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/critique.py +0 -0
  337. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/direct.py +0 -0
  338. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/registry.py +0 -0
  339. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/retrieve.py +0 -0
  340. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/types.py +0 -0
  341. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/__init__.py +0 -0
  342. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/_usage.py +0 -0
  343. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/async_core.py +0 -0
  344. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/code_extraction.py +0 -0
  345. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/core.py +0 -0
  346. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/few_shot.py +0 -0
  347. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/fields.py +0 -0
  348. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/reasoning.py +0 -0
  349. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/strategy.py +0 -0
  350. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/streaming.py +0 -0
  351. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/tools.py +0 -0
  352. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/tukuy_bridge.py +0 -0
  353. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/validator.py +0 -0
  354. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/async_groups.py +0 -0
  355. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/consensus.py +0 -0
  356. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/debate.py +0 -0
  357. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/groups.py +0 -0
  358. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/types.py +0 -0
  359. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/__init__.py +0 -0
  360. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/enhance.py +0 -0
  361. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/negative.py +0 -0
  362. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/set_planner.py +0 -0
  363. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/style_presets.py +0 -0
  364. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/billing.py +0 -0
  365. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/budget.py +0 -0
  366. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/cache.py +0 -0
  367. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/callbacks.py +0 -0
  368. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/capabilities.py +0 -0
  369. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/coding_agent_events.py +0 -0
  370. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/coding_agent_specs.py +0 -0
  371. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/cost_mixin.py +0 -0
  372. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/discovery.py +0 -0
  373. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/ledger.py +0 -0
  374. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/logging.py +0 -0
  375. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/media_pricing.py +0 -0
  376. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/media_rates.json +0 -0
  377. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/model_rates.py +0 -0
  378. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/pricing.py +0 -0
  379. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/provider_env.py +0 -0
  380. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/anthropic.json +0 -0
  381. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/azure.json +0 -0
  382. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/bedrock.json +0 -0
  383. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/cerebras.json +0 -0
  384. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/cohere.json +0 -0
  385. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/deepinfra.json +0 -0
  386. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/deepseek.json +0 -0
  387. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/fireworks.json +0 -0
  388. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/google.json +0 -0
  389. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
  390. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/groq.json +0 -0
  391. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/jina.json +0 -0
  392. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/kev.json +0 -0
  393. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/laya.json +0 -0
  394. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/mistral.json +0 -0
  395. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/mixedbread.json +0 -0
  396. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/moonshot.json +0 -0
  397. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/nomic.json +0 -0
  398. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/nvidia.json +0 -0
  399. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/openai.json +0 -0
  400. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/openrouter.json +0 -0
  401. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/perplexity.json +0 -0
  402. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/sambanova.json +0 -0
  403. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/siliconflow.json +0 -0
  404. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/together.json +0 -0
  405. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/typesafe.json +0 -0
  406. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/voyage.json +0 -0
  407. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/xai.json +0 -0
  408. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/session.py +0 -0
  409. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/settings.py +0 -0
  410. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/token_counting.py +0 -0
  411. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/tracker.py +0 -0
  412. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/tukuy_backend.py +0 -0
  413. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/__init__.py +0 -0
  414. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/chunking.py +0 -0
  415. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/detect.py +0 -0
  416. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/document.py +0 -0
  417. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
  418. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/base.py +0 -0
  419. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
  420. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/docx.py +0 -0
  421. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/html.py +0 -0
  422. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
  423. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
  424. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
  425. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/integrations/__init__.py +0 -0
  426. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/integrations/mcp_bridge.py +0 -0
  427. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/integrations/tukuy_bridge.py +0 -0
  428. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/jobs.py +0 -0
  429. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/__init__.py +0 -0
  430. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/core.py +0 -0
  431. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/stores.py +0 -0
  432. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/types.py +0 -0
  433. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/__init__.py +0 -0
  434. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/client.py +0 -0
  435. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/server.py +0 -0
  436. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/tools.py +0 -0
  437. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/__init__.py +0 -0
  438. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/agent_tools.py +0 -0
  439. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/audio.py +0 -0
  440. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/hosting.py +0 -0
  441. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/image.py +0 -0
  442. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/video.py +0 -0
  443. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/01-why-prompture.md +0 -0
  444. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/02-installation.md +0 -0
  445. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/03-quickstart.md +0 -0
  446. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/04-toon-input.md +0 -0
  447. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/05-test-harness.md +0 -0
  448. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/06-stability.md +0 -0
  449. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/07-migration.md +0 -0
  450. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/__init__.py +0 -0
  451. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/history.py +0 -0
  452. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/serialization.py +0 -0
  453. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/store.py +0 -0
  454. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/__init__.py +0 -0
  455. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/pipeline.py +0 -0
  456. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/resolver.py +0 -0
  457. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/__init__.py +0 -0
  458. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/base.py +0 -0
  459. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/__init__.py +0 -0
  460. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
  461. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
  462. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
  463. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
  464. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/decision_plugin.py +0 -0
  465. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
  466. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
  467. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
  468. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
  469. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
  470. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
  471. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
  472. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
  473. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/discovery.py +0 -0
  474. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/py.typed +0 -0
  475. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/__init__.py +0 -0
  476. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/__init__.py +0 -0
  477. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/base.py +0 -0
  478. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/character.py +0 -0
  479. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
  480. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/contextual.py +0 -0
  481. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/markdown.py +0 -0
  482. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/recursive.py +0 -0
  483. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/semantic.py +0 -0
  484. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/token.py +0 -0
  485. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/documents.py +0 -0
  486. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loader_registry.py +0 -0
  487. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/__init__.py +0 -0
  488. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
  489. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
  490. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
  491. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/html_loader.py +0 -0
  492. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/json_loader.py +0 -0
  493. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
  494. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
  495. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/text_loader.py +0 -0
  496. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
  497. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/pipeline.py +0 -0
  498. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/__init__.py +0 -0
  499. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
  500. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/base.py +0 -0
  501. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
  502. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/hyde.py +0 -0
  503. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/mmr.py +0 -0
  504. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
  505. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
  506. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/similarity.py +0 -0
  507. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/step_back.py +0 -0
  508. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
  509. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/base.py +0 -0
  510. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
  511. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
  512. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
  513. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
  514. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
  515. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
  516. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
  517. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/__init__.py +0 -0
  518. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/detector.py +0 -0
  519. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/evaluator.py +0 -0
  520. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/markers.py +0 -0
  521. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/__init__.py +0 -0
  522. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/generator.py +0 -0
  523. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  524. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
  525. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
  526. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
  527. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
  528. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
  529. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  530. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/security/__init__.py +0 -0
  531. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/security/injection.py +0 -0
  532. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/security/redaction.py +0 -0
  533. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/__init__.py +0 -0
  534. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/core.py +0 -0
  535. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/stores.py +0 -0
  536. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/types.py +0 -0
  537. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/__init__.py +0 -0
  538. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/environment.py +0 -0
  539. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/memory.py +0 -0
  540. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/scheduler.py +0 -0
  541. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/swarm.py +0 -0
  542. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/swarm_agent.py +0 -0
  543. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/types.py +0 -0
  544. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/testing/__init__.py +0 -0
  545. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/testing/driver_contract.py +0 -0
  546. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/tools/__init__.py +0 -0
  547. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/tools/code_exec.py +0 -0
  548. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/tools/web_search.py +0 -0
  549. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/__init__.py +0 -0
  550. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/architect.py +0 -0
  551. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/engine.py +0 -0
  552. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/errors.py +0 -0
  553. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/model.py +0 -0
  554. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/nodes.py +0 -0
  555. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/recovery.py +0 -0
  556. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/references.py +0 -0
  557. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/registry.py +0 -0
  558. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/scheduler.py +0 -0
  559. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/state.py +0 -0
  560. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/dependency_links.txt +0 -0
  561. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/entry_points.txt +0 -0
  562. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/top_level.txt +0 -0
  563. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture_cost_tracking.md +0 -0
  564. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/requirements.txt +0 -0
  565. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/scripts/check_pricing_freshness.py +0 -0
  566. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/setup.cfg +0 -0
  567. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/specs/basic_extraction.json +0 -0
  568. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/specs/schema_validation.json +0 -0
  569. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/specs/strategy_comparison.json +0 -0
  570. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/test.py +0 -0
  571. {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/test_version_diagnosis.py +0 -0
@@ -70,6 +70,10 @@ Configuration is in `pyproject.toml` under `[tool.ruff]`.
70
70
  - **`prompture/field_definitions.py`** — Thread-safe global field registry with 50+ predefined fields, template variable substitution (`{{current_year}}`, `{{current_date}}`), and Pydantic Field generation via `field_from_registry()`.
71
71
  - **`prompture/infra/settings.py`** — Pydantic-settings `Settings` class loading provider API keys/endpoints from `.env`.
72
72
  - **`prompture/infra/discovery.py`** — `get_available_models()` plus per-modality helpers (`get_available_image_gen_models`, `get_available_video_gen_models`, `get_available_audio_models`). Auto-detects models from configured providers via static `*_PRICING` / `KNOWN_MODELS` tables, dynamic provider listing endpoints (Ollama, ElevenLabs), and models.dev capability fallback.
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
+ - **`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
+ - **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/otel.py`** / **`infra/compression.py`** — GenAI-convention OpenTelemetry spans via `DriverCallbacks`; conservative message compression for agent loops.
73
77
  - **`prompture/runner.py`** — Spec-driven test suite runner for cross-model comparison.
74
78
  - **`prompture/validator.py`** — JSON schema validation via jsonschema with fallback.
75
79
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 1.12.2.dev1
3
+ Version: 1.12.3.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
@@ -67,6 +67,10 @@ Requires-Dist: fastapi>=0.100; extra == "serve"
67
67
  Requires-Dist: uvicorn[standard]>=0.20; extra == "serve"
68
68
  Requires-Dist: sse-starlette>=1.6; extra == "serve"
69
69
  Requires-Dist: python-multipart>=0.0.9; extra == "serve"
70
+ Provides-Extra: hub
71
+ Requires-Dist: prompture-hub>=0.0.3; extra == "hub"
72
+ Provides-Extra: otel
73
+ Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
70
74
  Provides-Extra: scaffold
71
75
  Requires-Dist: jinja2>=3.0; extra == "scaffold"
72
76
  Provides-Extra: rag-pdf
@@ -177,6 +181,8 @@ print(person.name) # Maria
177
181
  - `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
178
182
 
179
183
  **Ops**
184
+ - Resilient routing — `resilient()` retries transient errors, honors `Retry-After`, rotates API keys, trips circuit breakers and fails over across models; every response records who served it — see [Resilient Routing](#resilient-routing)
185
+ - [prompture-hub](#prompture-hub-gateway--dashboard) — optional companion app: web dashboard, scoped per-app keys, spend caps and per-call metering (`pip install prompture[hub]`)
180
186
  - `prompture serve` — OpenAI-compatible server (`/v1/chat/completions`, `/v1/embeddings`, `/v1/coding-agents`, …) routes any client to any provider
181
187
  - Usage tracking — tokens + cost on every call
182
188
  - Response cache — memory, SQLite, Redis backends
@@ -210,6 +216,7 @@ use.
210
216
  |---|---|---|
211
217
  | `redis` | Redis cache backend | `pip install prompture[redis]` |
212
218
  | `serve` | FastAPI server mode (`prompture serve`) | `pip install prompture[serve]` |
219
+ | `hub` | [prompture-hub](#prompture-hub-gateway--dashboard) — gateway + dashboard with scoped keys and spend caps | `pip install prompture[hub]` |
213
220
  | `airllm` | AirLLM local inference | `pip install prompture[airllm]` |
214
221
  | `bedrock` | AWS Bedrock driver (`boto3`) | `pip install prompture[bedrock]` |
215
222
  | `sandbox` | Sandboxed Python execution tool (`tukuy`) | `pip install prompture[sandbox]` |
@@ -1106,6 +1113,126 @@ for attempt in result["attempts"]:
1106
1113
 
1107
1114
  If every model fails and no `fallback` is provided, an `ExtractionError` is raised with the full `attempts` list, `total_cost`, and `total_tokens` attached as attributes.
1108
1115
 
1116
+ ### Resilient Routing
1117
+
1118
+ `resilient()` wraps several models (and several API keys) into **one driver**. It retries transient failures, waits out short rate limits, parks broken or throttled targets, and fails over to the next model — while exposing the normal driver interface, so it drops into `Conversation`, `Agent`, `ask_for_json`, `extract_with_model` and `prompture serve` unchanged.
1119
+
1120
+ ```python
1121
+ from prompture import Conversation, resilient
1122
+
1123
+ driver = resilient(
1124
+ "openai/gpt-4o", # preferred
1125
+ "claude/claude-sonnet-4-5", # if OpenAI is down / rate limited
1126
+ "ollama/llama3.1:8b", # local last resort
1127
+ )
1128
+
1129
+ conv = Conversation(driver=driver)
1130
+ print(conv.ask("Summarize this ticket: ..."))
1131
+
1132
+ resp = driver.generate_messages([{"role": "user", "content": "hi"}], {})
1133
+ resp["meta"]["route"]
1134
+ # {"served_by": "claude/claude-sonnet-4-5", "fallback": True, "key_id": None,
1135
+ # "attempts": [{"model": "openai/gpt-4o", "outcome": "error",
1136
+ # "error": {"category": "rate_limit", "status_code": 429, "retry_after": 20.0, ...}},
1137
+ # {"model": "claude/claude-sonnet-4-5", "outcome": "ok", "elapsed_ms": 812.4}]}
1138
+ ```
1139
+
1140
+ What happens on each failure is decided by a small, extensible table (`prompture.resilience.classify_error`), which understands `DriverHTTPError`, `requests`/`httpx` errors, OpenAI/Anthropic SDK errors and wrapped exceptions:
1141
+
1142
+ | Error | Action |
1143
+ |---|---|
1144
+ | Timeout, connection reset, 500/502/504 | Retry the same model with exponential backoff |
1145
+ | 429, 503/529 overloaded | Park that model/key for `Retry-After` and move on (wait inline if it's the last option) |
1146
+ | 401/402, `insufficient_quota` | Disable that key for an hour and move on |
1147
+ | 404, context length exceeded, content filter, unsupported feature | Skip to the next model without penalizing its health |
1148
+ | Other 400/422 | Raise immediately — no model will fix a bad request |
1149
+
1150
+ **Key rotation** — set several keys and each model expands to one target per key, rotated round-robin; a key that returns 401 or runs out of quota is parked while the others keep serving:
1151
+
1152
+ ```bash
1153
+ OPENAI_API_KEYS=sk-one,sk-two,sk-three
1154
+ ```
1155
+
1156
+ Or in code: `register_key_pool("openai", ["sk-one", "sk-two"])`.
1157
+
1158
+ **Circuit breakers** are shared process-wide per provider, model and key, and recover lazily (no background threads): after repeated failures a target is skipped until its recovery window passes, then a single probe request decides whether it comes back. Inspect them with `prompture.resilience.get_breaker_registry().snapshot()`.
1159
+
1160
+ Tune timings with `RetryPolicy(max_attempts=3, max_wait=10, ...)`, add provider-specific rules with `register_error_rule(ErrorRule(...))`, and use `async_resilient()` for async drivers. Streams fail over transparently until the first chunk is sent.
1161
+
1162
+ **Combos, aliases and `auto/` models** — give a routing policy a name and use it anywhere a model string goes (`get_driver_for_model`, `Conversation(model_name=...)`, `prompture serve`, prompture-hub):
1163
+
1164
+ ```python
1165
+ from prompture import Conversation, register_combo, register_model_alias
1166
+
1167
+ register_combo(
1168
+ "chat",
1169
+ ["openai/gpt-4o", "claude/claude-sonnet-4-5", "groq/llama-3.3-70b-versatile"],
1170
+ strategy="latency", # priority | round_robin | weighted | latency | p2c | last_good | cheapest
1171
+ sticky=True, # keep a conversation on one API key so prompt caches stay warm
1172
+ )
1173
+ register_model_alias("default", "combo/chat")
1174
+
1175
+ Conversation(model_name="default").ask("hi") # routed through the combo
1176
+ Conversation(model_name="auto/cheap").ask("hi") # cheapest configured chat models, across providers
1177
+ ```
1178
+
1179
+ `auto/<mode>` builds a fallback chain from whichever providers you have keys for — `auto/cheap`, `auto/fast`, `auto/best`, `auto/balanced`, or a pricing tier `auto/budget` / `auto/standard` / `auto/premium`. Combos and aliases can also live in JSON, loaded with `load_combos(path)` or automatically from `PROMPTURE_COMBOS_FILE`:
1180
+
1181
+ ```json
1182
+ {
1183
+ "combos": {"chat": {"targets": ["openai/gpt-4o", "claude/claude-sonnet-4-5"], "strategy": "latency"}},
1184
+ "aliases": {"default": "combo/chat", "fast": "groq/llama-3.3-70b-versatile"}
1185
+ }
1186
+ ```
1187
+
1188
+ **Why did it route there?** `explain_route(resp["meta"]["route"])` turns the trace into plain text:
1189
+
1190
+ ```
1191
+ Served by claude/claude-sonnet-4-5 after 2 attempts — strategy: latency
1192
+ 1. openai/gpt-4o — rate_limit (429), retry after 20s, parked, 312 ms
1193
+ 2. claude/claude-sonnet-4-5 — ok, 812 ms
1194
+ ```
1195
+
1196
+ ### Fusion (panel + judge)
1197
+
1198
+ Ask several models in parallel and have a judge write one answer from their (anonymized, shuffled) responses. Failed or slow panelists are skipped; with one surviving answer the judge is bypassed. It's a driver too, so it works as a model name:
1199
+
1200
+ ```python
1201
+ from prompture import Conversation
1202
+ from prompture.groups import register_fusion
1203
+
1204
+ register_fusion(
1205
+ "council",
1206
+ panel=["openai/gpt-4o", "claude/claude-sonnet-4-5", "google/gemini-2.5-pro"],
1207
+ judge="claude/claude-opus-4-6",
1208
+ timeout=60,
1209
+ )
1210
+ Conversation(model_name="fusion/council").ask("Design a rate limiter for a multi-tenant API.")
1211
+ ```
1212
+
1213
+ `resp["meta"]["fusion"]` lists each panelist's outcome, latency and cost; token and cost totals include the judge.
1214
+
1215
+ ### Prompt Compression
1216
+
1217
+ `compress_messages()` makes conservative, meaning-preserving cuts that matter most in agent loops, where tool output dominates the bill. It trims older oversized tool results to a head+tail window, collapses whitespace in system/tool text and drops repeated system prompts. User and assistant prose, and the latest tool result, are left alone.
1218
+
1219
+ ```python
1220
+ from prompture.infra import compress_messages
1221
+
1222
+ messages, stats = compress_messages(messages, max_tool_chars=6000)
1223
+ stats.saved_chars, stats.tool_results_trimmed
1224
+ ```
1225
+
1226
+ ### Observability — OpenTelemetry
1227
+
1228
+ `instrument_driver()` emits one span per driver call following the GenAI semantic conventions (`gen_ai.request.model`, `gen_ai.usage.input_tokens`, …) plus `prompture.cost_usd` and, for resilient drivers, who served the call and whether it fell back. Prompt/completion text is only recorded with `capture_content=True`.
1229
+
1230
+ ```python
1231
+ from prompture import instrument_driver, resilient # pip install "prompture[otel]"
1232
+
1233
+ driver = instrument_driver(resilient("openai/gpt-4o", "claude/claude-sonnet-4-5"))
1234
+ ```
1235
+
1109
1236
  ### TOON Input — Token Savings
1110
1237
 
1111
1238
  Analyze structured data with automatic TOON conversion for 45-60% fewer tokens:
@@ -1980,6 +2107,39 @@ Selected flags:
1980
2107
 
1981
2108
  Full example walkthrough: [`examples/openai_server_example.md`](examples/openai_server_example.md).
1982
2109
 
2110
+ ## prompture-hub: Gateway + Dashboard
2111
+
2112
+ Want a UI, or want to let other apps use your provider keys without handing them out? **[prompture-hub](https://github.com/jhd3197/prompture-hub)** is the companion app: a self-hosted gateway and web dashboard built on Prompture.
2113
+
2114
+ ```
2115
+ your apps / Cursor / Claude Code / scripts
2116
+ │ hub-issued keys (ph_…)
2117
+ ▼
2118
+ ┌─────────────────────────────┐
2119
+ │ prompture-hub │ dashboard · scoped keys · spend caps
2120
+ │ (FastAPI + React, SQLite) │ rate limits · usage + cost per call
2121
+ └──────────────┬──────────────┘
2122
+ │ Prompture drivers, resilience, gateway format
2123
+ ▼
2124
+ OpenAI · Anthropic · Google · Groq · Ollama · … (real keys stay here)
2125
+ ```
2126
+
2127
+ ```bash
2128
+ pip install "prompture[hub]"
2129
+ prompture hub # dashboard at http://localhost:1984/
2130
+ ```
2131
+
2132
+ | | `prompture serve` | prompture-hub |
2133
+ |---|---|---|
2134
+ | Use it for | One app / local dev, one shared bearer token | Many apps or people sharing your provider keys |
2135
+ | Keys | Single optional `--api-key` | Per-app hub keys, revocable, hashed at rest |
2136
+ | Limits | Model allowlist, per-IP rate limit | Per-key model allowlist, spend caps (day/week/month), rate limits |
2137
+ | Visibility | Logs | Dashboard: usage, cost, latency, conversations |
2138
+ | Protocols | OpenAI chat completions, embeddings, media | OpenAI chat completions + Responses API, Anthropic Messages API (Claude Code), embeddings |
2139
+ | Extras | Server-side tools (`--sandbox`, `--web-search`), media endpoints | Analytics dashboard, `prompture-hub setup <tool>` for Claude Code / Codex / Cursor / Aider, key expiry + IP allowlists, OAuth login |
2140
+
2141
+ Both build on the same wire-format code in `prompture.gateway` (OpenAI chat completions, OpenAI Responses, Anthropic Messages), so responses, streaming events and usage blocks are identical — and both accept `combo/`, `auto/`, `fusion/` and alias model names.
2142
+
1983
2143
  ## Integrating & Extending
1984
2144
 
1985
2145
  - **FastAPI integration patterns** (AsyncAgent + tools, SSE streaming, structured endpoints, error handling) — see [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md#integrating-prompture-into-your-project)
@@ -70,6 +70,8 @@ print(person.name) # Maria
70
70
  - `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
71
71
 
72
72
  **Ops**
73
+ - Resilient routing — `resilient()` retries transient errors, honors `Retry-After`, rotates API keys, trips circuit breakers and fails over across models; every response records who served it — see [Resilient Routing](#resilient-routing)
74
+ - [prompture-hub](#prompture-hub-gateway--dashboard) — optional companion app: web dashboard, scoped per-app keys, spend caps and per-call metering (`pip install prompture[hub]`)
73
75
  - `prompture serve` — OpenAI-compatible server (`/v1/chat/completions`, `/v1/embeddings`, `/v1/coding-agents`, …) routes any client to any provider
74
76
  - Usage tracking — tokens + cost on every call
75
77
  - Response cache — memory, SQLite, Redis backends
@@ -103,6 +105,7 @@ use.
103
105
  |---|---|---|
104
106
  | `redis` | Redis cache backend | `pip install prompture[redis]` |
105
107
  | `serve` | FastAPI server mode (`prompture serve`) | `pip install prompture[serve]` |
108
+ | `hub` | [prompture-hub](#prompture-hub-gateway--dashboard) — gateway + dashboard with scoped keys and spend caps | `pip install prompture[hub]` |
106
109
  | `airllm` | AirLLM local inference | `pip install prompture[airllm]` |
107
110
  | `bedrock` | AWS Bedrock driver (`boto3`) | `pip install prompture[bedrock]` |
108
111
  | `sandbox` | Sandboxed Python execution tool (`tukuy`) | `pip install prompture[sandbox]` |
@@ -999,6 +1002,126 @@ for attempt in result["attempts"]:
999
1002
 
1000
1003
  If every model fails and no `fallback` is provided, an `ExtractionError` is raised with the full `attempts` list, `total_cost`, and `total_tokens` attached as attributes.
1001
1004
 
1005
+ ### Resilient Routing
1006
+
1007
+ `resilient()` wraps several models (and several API keys) into **one driver**. It retries transient failures, waits out short rate limits, parks broken or throttled targets, and fails over to the next model — while exposing the normal driver interface, so it drops into `Conversation`, `Agent`, `ask_for_json`, `extract_with_model` and `prompture serve` unchanged.
1008
+
1009
+ ```python
1010
+ from prompture import Conversation, resilient
1011
+
1012
+ driver = resilient(
1013
+ "openai/gpt-4o", # preferred
1014
+ "claude/claude-sonnet-4-5", # if OpenAI is down / rate limited
1015
+ "ollama/llama3.1:8b", # local last resort
1016
+ )
1017
+
1018
+ conv = Conversation(driver=driver)
1019
+ print(conv.ask("Summarize this ticket: ..."))
1020
+
1021
+ resp = driver.generate_messages([{"role": "user", "content": "hi"}], {})
1022
+ resp["meta"]["route"]
1023
+ # {"served_by": "claude/claude-sonnet-4-5", "fallback": True, "key_id": None,
1024
+ # "attempts": [{"model": "openai/gpt-4o", "outcome": "error",
1025
+ # "error": {"category": "rate_limit", "status_code": 429, "retry_after": 20.0, ...}},
1026
+ # {"model": "claude/claude-sonnet-4-5", "outcome": "ok", "elapsed_ms": 812.4}]}
1027
+ ```
1028
+
1029
+ What happens on each failure is decided by a small, extensible table (`prompture.resilience.classify_error`), which understands `DriverHTTPError`, `requests`/`httpx` errors, OpenAI/Anthropic SDK errors and wrapped exceptions:
1030
+
1031
+ | Error | Action |
1032
+ |---|---|
1033
+ | Timeout, connection reset, 500/502/504 | Retry the same model with exponential backoff |
1034
+ | 429, 503/529 overloaded | Park that model/key for `Retry-After` and move on (wait inline if it's the last option) |
1035
+ | 401/402, `insufficient_quota` | Disable that key for an hour and move on |
1036
+ | 404, context length exceeded, content filter, unsupported feature | Skip to the next model without penalizing its health |
1037
+ | Other 400/422 | Raise immediately — no model will fix a bad request |
1038
+
1039
+ **Key rotation** — set several keys and each model expands to one target per key, rotated round-robin; a key that returns 401 or runs out of quota is parked while the others keep serving:
1040
+
1041
+ ```bash
1042
+ OPENAI_API_KEYS=sk-one,sk-two,sk-three
1043
+ ```
1044
+
1045
+ Or in code: `register_key_pool("openai", ["sk-one", "sk-two"])`.
1046
+
1047
+ **Circuit breakers** are shared process-wide per provider, model and key, and recover lazily (no background threads): after repeated failures a target is skipped until its recovery window passes, then a single probe request decides whether it comes back. Inspect them with `prompture.resilience.get_breaker_registry().snapshot()`.
1048
+
1049
+ Tune timings with `RetryPolicy(max_attempts=3, max_wait=10, ...)`, add provider-specific rules with `register_error_rule(ErrorRule(...))`, and use `async_resilient()` for async drivers. Streams fail over transparently until the first chunk is sent.
1050
+
1051
+ **Combos, aliases and `auto/` models** — give a routing policy a name and use it anywhere a model string goes (`get_driver_for_model`, `Conversation(model_name=...)`, `prompture serve`, prompture-hub):
1052
+
1053
+ ```python
1054
+ from prompture import Conversation, register_combo, register_model_alias
1055
+
1056
+ register_combo(
1057
+ "chat",
1058
+ ["openai/gpt-4o", "claude/claude-sonnet-4-5", "groq/llama-3.3-70b-versatile"],
1059
+ strategy="latency", # priority | round_robin | weighted | latency | p2c | last_good | cheapest
1060
+ sticky=True, # keep a conversation on one API key so prompt caches stay warm
1061
+ )
1062
+ register_model_alias("default", "combo/chat")
1063
+
1064
+ Conversation(model_name="default").ask("hi") # routed through the combo
1065
+ Conversation(model_name="auto/cheap").ask("hi") # cheapest configured chat models, across providers
1066
+ ```
1067
+
1068
+ `auto/<mode>` builds a fallback chain from whichever providers you have keys for — `auto/cheap`, `auto/fast`, `auto/best`, `auto/balanced`, or a pricing tier `auto/budget` / `auto/standard` / `auto/premium`. Combos and aliases can also live in JSON, loaded with `load_combos(path)` or automatically from `PROMPTURE_COMBOS_FILE`:
1069
+
1070
+ ```json
1071
+ {
1072
+ "combos": {"chat": {"targets": ["openai/gpt-4o", "claude/claude-sonnet-4-5"], "strategy": "latency"}},
1073
+ "aliases": {"default": "combo/chat", "fast": "groq/llama-3.3-70b-versatile"}
1074
+ }
1075
+ ```
1076
+
1077
+ **Why did it route there?** `explain_route(resp["meta"]["route"])` turns the trace into plain text:
1078
+
1079
+ ```
1080
+ Served by claude/claude-sonnet-4-5 after 2 attempts — strategy: latency
1081
+ 1. openai/gpt-4o — rate_limit (429), retry after 20s, parked, 312 ms
1082
+ 2. claude/claude-sonnet-4-5 — ok, 812 ms
1083
+ ```
1084
+
1085
+ ### Fusion (panel + judge)
1086
+
1087
+ Ask several models in parallel and have a judge write one answer from their (anonymized, shuffled) responses. Failed or slow panelists are skipped; with one surviving answer the judge is bypassed. It's a driver too, so it works as a model name:
1088
+
1089
+ ```python
1090
+ from prompture import Conversation
1091
+ from prompture.groups import register_fusion
1092
+
1093
+ register_fusion(
1094
+ "council",
1095
+ panel=["openai/gpt-4o", "claude/claude-sonnet-4-5", "google/gemini-2.5-pro"],
1096
+ judge="claude/claude-opus-4-6",
1097
+ timeout=60,
1098
+ )
1099
+ Conversation(model_name="fusion/council").ask("Design a rate limiter for a multi-tenant API.")
1100
+ ```
1101
+
1102
+ `resp["meta"]["fusion"]` lists each panelist's outcome, latency and cost; token and cost totals include the judge.
1103
+
1104
+ ### Prompt Compression
1105
+
1106
+ `compress_messages()` makes conservative, meaning-preserving cuts that matter most in agent loops, where tool output dominates the bill. It trims older oversized tool results to a head+tail window, collapses whitespace in system/tool text and drops repeated system prompts. User and assistant prose, and the latest tool result, are left alone.
1107
+
1108
+ ```python
1109
+ from prompture.infra import compress_messages
1110
+
1111
+ messages, stats = compress_messages(messages, max_tool_chars=6000)
1112
+ stats.saved_chars, stats.tool_results_trimmed
1113
+ ```
1114
+
1115
+ ### Observability — OpenTelemetry
1116
+
1117
+ `instrument_driver()` emits one span per driver call following the GenAI semantic conventions (`gen_ai.request.model`, `gen_ai.usage.input_tokens`, …) plus `prompture.cost_usd` and, for resilient drivers, who served the call and whether it fell back. Prompt/completion text is only recorded with `capture_content=True`.
1118
+
1119
+ ```python
1120
+ from prompture import instrument_driver, resilient # pip install "prompture[otel]"
1121
+
1122
+ driver = instrument_driver(resilient("openai/gpt-4o", "claude/claude-sonnet-4-5"))
1123
+ ```
1124
+
1002
1125
  ### TOON Input — Token Savings
1003
1126
 
1004
1127
  Analyze structured data with automatic TOON conversion for 45-60% fewer tokens:
@@ -1873,6 +1996,39 @@ Selected flags:
1873
1996
 
1874
1997
  Full example walkthrough: [`examples/openai_server_example.md`](examples/openai_server_example.md).
1875
1998
 
1999
+ ## prompture-hub: Gateway + Dashboard
2000
+
2001
+ Want a UI, or want to let other apps use your provider keys without handing them out? **[prompture-hub](https://github.com/jhd3197/prompture-hub)** is the companion app: a self-hosted gateway and web dashboard built on Prompture.
2002
+
2003
+ ```
2004
+ your apps / Cursor / Claude Code / scripts
2005
+ │ hub-issued keys (ph_…)
2006
+ ▼
2007
+ ┌─────────────────────────────┐
2008
+ │ prompture-hub │ dashboard · scoped keys · spend caps
2009
+ │ (FastAPI + React, SQLite) │ rate limits · usage + cost per call
2010
+ └──────────────┬──────────────┘
2011
+ │ Prompture drivers, resilience, gateway format
2012
+ ▼
2013
+ OpenAI · Anthropic · Google · Groq · Ollama · … (real keys stay here)
2014
+ ```
2015
+
2016
+ ```bash
2017
+ pip install "prompture[hub]"
2018
+ prompture hub # dashboard at http://localhost:1984/
2019
+ ```
2020
+
2021
+ | | `prompture serve` | prompture-hub |
2022
+ |---|---|---|
2023
+ | Use it for | One app / local dev, one shared bearer token | Many apps or people sharing your provider keys |
2024
+ | Keys | Single optional `--api-key` | Per-app hub keys, revocable, hashed at rest |
2025
+ | Limits | Model allowlist, per-IP rate limit | Per-key model allowlist, spend caps (day/week/month), rate limits |
2026
+ | Visibility | Logs | Dashboard: usage, cost, latency, conversations |
2027
+ | Protocols | OpenAI chat completions, embeddings, media | OpenAI chat completions + Responses API, Anthropic Messages API (Claude Code), embeddings |
2028
+ | Extras | Server-side tools (`--sandbox`, `--web-search`), media endpoints | Analytics dashboard, `prompture-hub setup <tool>` for Claude Code / Codex / Cursor / Aider, key expiry + IP allowlists, OAuth login |
2029
+
2030
+ Both build on the same wire-format code in `prompture.gateway` (OpenAI chat completions, OpenAI Responses, Anthropic Messages), so responses, streaming events and usage blocks are identical — and both accept `combo/`, `auto/`, `fusion/` and alias model names.
2031
+
1876
2032
  ## Integrating & Extending
1877
2033
 
1878
2034
  - **FastAPI integration patterns** (AsyncAgent + tools, SSE streaming, structured endpoints, error handling) — see [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md#integrating-prompture-into-your-project)
@@ -107,6 +107,20 @@ from .refusal import (
107
107
  RefusalResult,
108
108
  is_refusal,
109
109
  )
110
+ from .resilience import (
111
+ AllTargetsFailedError,
112
+ AsyncResilientDriver,
113
+ ResilientDriver,
114
+ RetryPolicy,
115
+ async_resilient,
116
+ classify_error,
117
+ explain_route,
118
+ load_combos,
119
+ register_combo,
120
+ register_key_pool,
121
+ register_model_alias,
122
+ resilient,
123
+ )
110
124
  from .security import (
111
125
  InjectionCategory,
112
126
  InjectionResult,
@@ -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.2.dev1'
22
- __version_tuple__ = version_tuple = (1, 12, 2, 'dev1')
21
+ __version__ = version = '1.12.3.dev1'
22
+ __version_tuple__ = version_tuple = (1, 12, 3, 'dev1')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -200,6 +200,41 @@ def test_suite(specfile: str, providers: str | None, models: str | None, fmt: st
200
200
  click.echo(json.dumps(report, indent=2, ensure_ascii=False))
201
201
 
202
202
 
203
+ @cli.command()
204
+ @click.option("--host", default=None, help="Bind host (default 127.0.0.1, or HUB_HOST).")
205
+ @click.option("--port", default=None, type=int, help="Bind port (default 1984, or HUB_PORT).")
206
+ def hub(host: str | None, port: int | None) -> None:
207
+ """Launch prompture-hub: gateway + dashboard with scoped keys and spend caps.
208
+
209
+ Needs the companion package: pip install "prompture[hub]".
210
+ Unlike `prompture serve`, the hub keeps provider keys server-side, issues
211
+ per-app keys with model allowlists, spend caps and rate limits, and
212
+ records every call in a dashboard.
213
+ """
214
+ import os
215
+
216
+ try:
217
+ from prompture_hub.main import cli as hub_cli
218
+ except ImportError:
219
+ raise click.ClickException(
220
+ "prompture-hub is not installed. Install it with:\n\n"
221
+ ' pip install "prompture[hub]"\n\n'
222
+ "or run the lightweight single-key server instead: prompture serve"
223
+ ) from None
224
+
225
+ if host:
226
+ os.environ["HUB_HOST"] = host
227
+ if port:
228
+ os.environ["HUB_PORT"] = str(port)
229
+ try:
230
+ from prompture_hub.settings import get_settings
231
+
232
+ get_settings.cache_clear()
233
+ except (ImportError, AttributeError):
234
+ pass
235
+ hub_cli()
236
+
237
+
203
238
  @cli.command()
204
239
  @click.option("--model", default="openai/gpt-4o-mini", help="Default model string (provider/model).")
205
240
  @click.option("--system-prompt", default=None, help="System prompt injected when the client doesn't supply one.")