prompture 1.1.1.dev5__tar.gz → 1.1.2.dev2__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 (415) hide show
  1. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.env.copy +11 -0
  2. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/PKG-INFO +195 -3
  3. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/README.md +194 -2
  4. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/_version.py +2 -2
  5. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/cli.py +90 -0
  6. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/server.py +101 -0
  7. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/__init__.py +56 -0
  8. prompture-1.1.2.dev2/prompture/infra/coding_agent_events.py +316 -0
  9. prompture-1.1.2.dev2/prompture/infra/coding_agent_specs.py +259 -0
  10. prompture-1.1.2.dev2/prompture/infra/coding_agents.py +569 -0
  11. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/discovery.py +574 -0
  12. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/settings.py +10 -0
  13. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/PKG-INFO +195 -3
  14. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/SOURCES.txt +3 -0
  15. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/pyproject.toml +9 -2
  16. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-driver/SKILL.md +0 -0
  17. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-driver/references/driver-template.md +0 -0
  18. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-example/SKILL.md +0 -0
  19. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-field/SKILL.md +0 -0
  20. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-persona/SKILL.md +0 -0
  21. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-test/SKILL.md +0 -0
  22. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-tool/SKILL.md +0 -0
  23. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/create-pr/SKILL.md +0 -0
  24. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/run-tests/SKILL.md +0 -0
  25. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  26. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/update-pricing/SKILL.md +0 -0
  27. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/FUNDING.yml +0 -0
  28. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  29. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
  30. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
  31. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
  32. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/scripts/update_docs_version.py +0 -0
  33. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/scripts/update_wrapper_version.py +0 -0
  34. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/dev.yml +0 -0
  35. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/documentation.yml +0 -0
  36. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/pricing-freshness.yml +0 -0
  37. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/publish.yml +0 -0
  38. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/security.yml +0 -0
  39. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.safety-project.ini +0 -0
  40. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/AGENTS.md +0 -0
  41. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/BREAKING_CHANGES.md +0 -0
  42. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/CLAUDE.md +0 -0
  43. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/CONTRIBUTING.md +0 -0
  44. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/LICENSE +0 -0
  45. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/MANIFEST.in +0 -0
  46. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/ROADMAP.md +0 -0
  47. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/SECURITY.md +0 -0
  48. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/dev.ps1 +0 -0
  49. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/dev.sh +0 -0
  50. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/mypy_errors.txt +0 -0
  51. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/README.md +0 -0
  52. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/README.md +0 -0
  53. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  54. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/pyproject.toml +0 -0
  55. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/test.py +0 -0
  56. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/README.md +0 -0
  57. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  58. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/pyproject.toml +0 -0
  59. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/test.py +0 -0
  60. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/__init__.py +0 -0
  61. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/__init__.py +0 -0
  62. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/agent.py +0 -0
  63. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/async_agent.py +0 -0
  64. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/async_conversation.py +0 -0
  65. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/async_deep_agent.py +0 -0
  66. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/conversation.py +0 -0
  67. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/__init__.py +0 -0
  68. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/planner.py +0 -0
  69. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/subagents.py +0 -0
  70. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/summarizer.py +0 -0
  71. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/vfs.py +0 -0
  72. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep_agent.py +0 -0
  73. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep_prompts.py +0 -0
  74. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep_state.py +0 -0
  75. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/persona.py +0 -0
  76. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/simulated_tools.py +0 -0
  77. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/skills.py +0 -0
  78. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/tools_schema.py +0 -0
  79. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/types.py +0 -0
  80. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/aio/__init__.py +0 -0
  81. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/bridges/__init__.py +0 -0
  82. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/bridges/tukuy_backend.py +0 -0
  83. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/__init__.py +0 -0
  84. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/formatters.py +0 -0
  85. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/runner.py +0 -0
  86. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/__init__.py +0 -0
  87. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/formats.py +0 -0
  88. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/schemas.py +0 -0
  89. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/synth.py +0 -0
  90. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/__init__.py +0 -0
  91. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/airllm_driver.py +0 -0
  92. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/assemblyai_stt_driver.py +0 -0
  93. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_airllm_driver.py +0 -0
  94. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
  95. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_azure_driver.py +0 -0
  96. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_base.py +0 -0
  97. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_bedrock_driver.py +0 -0
  98. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
  99. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cachibot_driver.py +0 -0
  100. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
  101. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_claude_driver.py +0 -0
  102. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cohere_driver.py +0 -0
  103. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
  104. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
  105. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
  106. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
  107. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_deepseek_driver.py +0 -0
  108. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
  109. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
  110. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_embedding_base.py +0 -0
  111. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
  112. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
  113. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_google_driver.py +0 -0
  114. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_google_img_gen_driver.py +0 -0
  115. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_google_vertexai_driver.py +0 -0
  116. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_grok_driver.py +0 -0
  117. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
  118. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
  119. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_groq_driver.py +0 -0
  120. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_hugging_driver.py +0 -0
  121. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
  122. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_img_gen_base.py +0 -0
  123. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_jina_embedding_driver.py +0 -0
  124. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_jina_rerank_driver.py +0 -0
  125. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
  126. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
  127. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_lmstudio_driver.py +0 -0
  128. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_local_http_driver.py +0 -0
  129. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
  130. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_minimax_driver.py +0 -0
  131. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
  132. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mistral_driver.py +0 -0
  133. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
  134. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_modelscope_driver.py +0 -0
  135. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_moonshot_driver.py +0 -0
  136. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
  137. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
  138. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
  139. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_ollama_driver.py +0 -0
  140. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
  141. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_compatible_driver.py +0 -0
  142. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_driver.py +0 -0
  143. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_embedding_driver.py +0 -0
  144. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
  145. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_moderation_driver.py +0 -0
  146. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_stt_driver.py +0 -0
  147. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_tts_driver.py +0 -0
  148. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openrouter_driver.py +0 -0
  149. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
  150. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_registry.py +0 -0
  151. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
  152. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_runway_tts_driver.py +0 -0
  153. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
  154. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
  155. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_stt_base.py +0 -0
  156. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_tts_base.py +0 -0
  157. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_video_gen_base.py +0 -0
  158. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
  159. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
  160. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_zai_driver.py +0 -0
  161. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/audio_registry.py +0 -0
  162. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/azure_config.py +0 -0
  163. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/azure_driver.py +0 -0
  164. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/base.py +0 -0
  165. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/bedrock_driver.py +0 -0
  166. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/bfl_img_gen_driver.py +0 -0
  167. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cachibot_driver.py +0 -0
  168. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cartesia_tts_driver.py +0 -0
  169. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/claude_driver.py +0 -0
  170. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cohere_driver.py +0 -0
  171. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cohere_embedding_driver.py +0 -0
  172. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cohere_rerank_driver.py +0 -0
  173. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/deepgram_stt_driver.py +0 -0
  174. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/deepgram_tts_driver.py +0 -0
  175. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/deepseek_driver.py +0 -0
  176. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/driver_registry.py +0 -0
  177. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
  178. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
  179. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/embedding_base.py +0 -0
  180. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/embedding_registry.py +0 -0
  181. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/fal_img_gen_driver.py +0 -0
  182. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/fal_video_gen_driver.py +0 -0
  183. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/google_driver.py +0 -0
  184. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/google_img_gen_driver.py +0 -0
  185. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/google_vertexai_driver.py +0 -0
  186. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/grok_driver.py +0 -0
  187. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/grok_img_gen_driver.py +0 -0
  188. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/grok_video_gen_driver.py +0 -0
  189. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/groq_driver.py +0 -0
  190. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/hugging_driver.py +0 -0
  191. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
  192. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/img_gen_base.py +0 -0
  193. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/img_gen_registry.py +0 -0
  194. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/jina_embedding_driver.py +0 -0
  195. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/jina_rerank_driver.py +0 -0
  196. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/kling_img_gen_driver.py +0 -0
  197. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/kling_video_gen_driver.py +0 -0
  198. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/lmstudio_driver.py +0 -0
  199. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/local_http_driver.py +0 -0
  200. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/luma_video_gen_driver.py +0 -0
  201. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/minimax_driver.py +0 -0
  202. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/minimax_video_gen_driver.py +0 -0
  203. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mistral_driver.py +0 -0
  204. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mistral_moderation_driver.py +0 -0
  205. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/modelscope_driver.py +0 -0
  206. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/moderation_base.py +0 -0
  207. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/moderation_registry.py +0 -0
  208. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/moonshot_driver.py +0 -0
  209. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mxbai_embedding_driver.py +0 -0
  210. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mxbai_rerank_driver.py +0 -0
  211. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/nomic_embedding_driver.py +0 -0
  212. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/ollama_driver.py +0 -0
  213. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/ollama_embedding_driver.py +0 -0
  214. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_compatible_driver.py +0 -0
  215. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_driver.py +0 -0
  216. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_embedding_driver.py +0 -0
  217. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_img_gen_driver.py +0 -0
  218. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_moderation_driver.py +0 -0
  219. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_stt_driver.py +0 -0
  220. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_tts_driver.py +0 -0
  221. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openrouter_driver.py +0 -0
  222. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/pika_video_gen_driver.py +0 -0
  223. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/provider_descriptors.py +0 -0
  224. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/registry.py +0 -0
  225. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/rerank_base.py +0 -0
  226. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/rerank_registry.py +0 -0
  227. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_audio_transform_driver.py +0 -0
  228. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_capabilities.py +0 -0
  229. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_img_gen_driver.py +0 -0
  230. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_tts_driver.py +0 -0
  231. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_video_gen_driver.py +0 -0
  232. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/stability_img_gen_driver.py +0 -0
  233. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/stt_base.py +0 -0
  234. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/tts_base.py +0 -0
  235. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/video_gen_base.py +0 -0
  236. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/video_gen_registry.py +0 -0
  237. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/vision_helpers.py +0 -0
  238. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/voyage_embedding_driver.py +0 -0
  239. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/voyage_rerank_driver.py +0 -0
  240. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/zai_driver.py +0 -0
  241. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/exceptions.py +0 -0
  242. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/__init__.py +0 -0
  243. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/async_core.py +0 -0
  244. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/core.py +0 -0
  245. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/fields.py +0 -0
  246. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/reasoning.py +0 -0
  247. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/strategy.py +0 -0
  248. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/tools.py +0 -0
  249. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/tukuy_bridge.py +0 -0
  250. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/validator.py +0 -0
  251. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/__init__.py +0 -0
  252. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/async_groups.py +0 -0
  253. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/consensus.py +0 -0
  254. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/debate.py +0 -0
  255. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/groups.py +0 -0
  256. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/types.py +0 -0
  257. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/budget.py +0 -0
  258. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/cache.py +0 -0
  259. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/callbacks.py +0 -0
  260. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/capabilities.py +0 -0
  261. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/cost_mixin.py +0 -0
  262. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/ledger.py +0 -0
  263. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/logging.py +0 -0
  264. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/model_rates.py +0 -0
  265. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/pricing.py +0 -0
  266. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/provider_env.py +0 -0
  267. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/anthropic.json +0 -0
  268. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/azure.json +0 -0
  269. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/bedrock.json +0 -0
  270. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/cerebras.json +0 -0
  271. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/cohere.json +0 -0
  272. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/deepinfra.json +0 -0
  273. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/deepseek.json +0 -0
  274. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/fireworks.json +0 -0
  275. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/google.json +0 -0
  276. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/google_vertexai.json +0 -0
  277. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/groq.json +0 -0
  278. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/jina.json +0 -0
  279. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/mistral.json +0 -0
  280. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/mixedbread.json +0 -0
  281. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/moonshot.json +0 -0
  282. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/nomic.json +0 -0
  283. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/nvidia.json +0 -0
  284. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/openai.json +0 -0
  285. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/openrouter.json +0 -0
  286. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/perplexity.json +0 -0
  287. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/sambanova.json +0 -0
  288. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/siliconflow.json +0 -0
  289. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/together.json +0 -0
  290. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/voyage.json +0 -0
  291. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/xai.json +0 -0
  292. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/session.py +0 -0
  293. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/tracker.py +0 -0
  294. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/tukuy_backend.py +0 -0
  295. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/__init__.py +0 -0
  296. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/chunking.py +0 -0
  297. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/detect.py +0 -0
  298. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/document.py +0 -0
  299. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/__init__.py +0 -0
  300. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/base.py +0 -0
  301. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/csv_parser.py +0 -0
  302. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/docx.py +0 -0
  303. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/html.py +0 -0
  304. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/markdown.py +0 -0
  305. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/pdf.py +0 -0
  306. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/xlsx.py +0 -0
  307. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/integrations/__init__.py +0 -0
  308. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/integrations/tukuy_bridge.py +0 -0
  309. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/__init__.py +0 -0
  310. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/audio.py +0 -0
  311. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/image.py +0 -0
  312. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/video.py +0 -0
  313. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/01-why-prompture.md +0 -0
  314. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/02-installation.md +0 -0
  315. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/03-quickstart.md +0 -0
  316. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/04-toon-input.md +0 -0
  317. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/05-test-harness.md +0 -0
  318. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/06-stability.md +0 -0
  319. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/07-migration.md +0 -0
  320. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/__init__.py +0 -0
  321. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/history.py +0 -0
  322. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/serialization.py +0 -0
  323. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/store.py +0 -0
  324. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/__init__.py +0 -0
  325. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/pipeline.py +0 -0
  326. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/resolver.py +0 -0
  327. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/routing.py +0 -0
  328. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/__init__.py +0 -0
  329. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/base.py +0 -0
  330. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/__init__.py +0 -0
  331. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/_aliases.py +0 -0
  332. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
  333. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/audio_plugin.py +0 -0
  334. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/cloud_plugin.py +0 -0
  335. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
  336. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/extras_plugin.py +0 -0
  337. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/google_plugin.py +0 -0
  338. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/image_plugin.py +0 -0
  339. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/local_plugin.py +0 -0
  340. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
  341. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/openai_plugin.py +0 -0
  342. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/video_plugin.py +0 -0
  343. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/discovery.py +0 -0
  344. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/py.typed +0 -0
  345. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/__init__.py +0 -0
  346. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/__init__.py +0 -0
  347. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/base.py +0 -0
  348. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/character.py +0 -0
  349. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/chunker_registry.py +0 -0
  350. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/markdown.py +0 -0
  351. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/recursive.py +0 -0
  352. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/semantic.py +0 -0
  353. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/token.py +0 -0
  354. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/documents.py +0 -0
  355. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loader_registry.py +0 -0
  356. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/__init__.py +0 -0
  357. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/csv_loader.py +0 -0
  358. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/docx_loader.py +0 -0
  359. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/epub_loader.py +0 -0
  360. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/html_loader.py +0 -0
  361. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/json_loader.py +0 -0
  362. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/markdown_loader.py +0 -0
  363. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/pdf_loader.py +0 -0
  364. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/text_loader.py +0 -0
  365. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/xlsx_loader.py +0 -0
  366. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/pipeline.py +0 -0
  367. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/__init__.py +0 -0
  368. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/base.py +0 -0
  369. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/hybrid.py +0 -0
  370. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/mmr.py +0 -0
  371. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/retriever_registry.py +0 -0
  372. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/similarity.py +0 -0
  373. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/__init__.py +0 -0
  374. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/base.py +0 -0
  375. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/chroma.py +0 -0
  376. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/faiss.py +0 -0
  377. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/pgvector.py +0 -0
  378. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/pinecone.py +0 -0
  379. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/qdrant.py +0 -0
  380. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
  381. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/weaviate.py +0 -0
  382. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/__init__.py +0 -0
  383. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/detector.py +0 -0
  384. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/evaluator.py +0 -0
  385. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/markers.py +0 -0
  386. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/__init__.py +0 -0
  387. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/generator.py +0 -0
  388. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  389. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/README.md.j2 +0 -0
  390. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/config.py.j2 +0 -0
  391. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/env.example.j2 +0 -0
  392. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/main.py.j2 +0 -0
  393. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/models.py.j2 +0 -0
  394. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  395. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/security/__init__.py +0 -0
  396. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/security/injection.py +0 -0
  397. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/security/redaction.py +0 -0
  398. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/testing/__init__.py +0 -0
  399. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/testing/driver_contract.py +0 -0
  400. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/tools/__init__.py +0 -0
  401. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/tools/code_exec.py +0 -0
  402. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/tools/web_search.py +0 -0
  403. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/dependency_links.txt +0 -0
  404. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/entry_points.txt +0 -0
  405. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/requires.txt +0 -0
  406. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/top_level.txt +0 -0
  407. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture_cost_tracking.md +0 -0
  408. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/requirements.txt +0 -0
  409. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/scripts/check_pricing_freshness.py +0 -0
  410. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/setup.cfg +0 -0
  411. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/specs/basic_extraction.json +0 -0
  412. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/specs/schema_validation.json +0 -0
  413. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/specs/strategy_comparison.json +0 -0
  414. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/test.py +0 -0
  415. {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/test_version_diagnosis.py +0 -0
@@ -211,3 +211,14 @@ SERPER_API_KEY=
211
211
  BRAVE_SEARCH_API_KEY=
212
212
  # SearXNG — self-hosted metasearch engine (no key, set the base URL).
213
213
  SEARXNG_ENDPOINT=
214
+
215
+ # ─── Coding-agent CLI binaries (optional path overrides) ─────────────────────
216
+ # Set if a CLI isn't on PATH or you want to pin a specific install.
217
+ CODING_AGENT_BIN_CLAUDE=
218
+ CODING_AGENT_BIN_CODEX=
219
+ CODING_AGENT_BIN_GEMINI=
220
+ CODING_AGENT_BIN_QWEN=
221
+ CODING_AGENT_BIN_AIDER=
222
+ CODING_AGENT_BIN_OPENCODE=
223
+ CODING_AGENT_BIN_CURSOR_AGENT=
224
+ CODING_AGENT_BIN_CRUSH=
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 1.1.1.dev5
3
+ Version: 1.1.2.dev2
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
@@ -146,7 +146,7 @@ print(person.name) # Maria
146
146
  - **Tool use** — Function calling and streaming across supported providers, with automatic prompt-based simulation for models without native tool support
147
147
  - **Sandboxed Python execution** — Drop-in `python_execute` tool backed by Tukuy's `PythonSandbox` (import whitelist, path restrictions, timeout, memory limit, AST risk gate)
148
148
  - **Web search** — Drop-in `web_search` tool with Tavily, Serper, Brave, and SearXNG backends; returns Markdown so the LLM can cite by URL
149
- - **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
149
+ - **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`, and `/v1/coding-agents`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
150
150
  - **Synthetic datasets** — `generate_qa_dataset()` turns documents into fine-tuning JSONL (Q&A, ShareGPT, or Alpaca) ready for Unsloth, Axolotl, or TRL
151
151
  - **Refusal detection** — `RefusalDetector` + `RefusalEvaluator` flag and score LLM refusals (5 categories, en/es markers, position-weighted confidence); useful for cross-provider alignment comparison and validating abliterated models
152
152
  - **Input safety** — `PromptInjectionDetector` (jailbreak, role-hijack, delimiter attacks, encoded payloads) + `PIIRedactor` (emails, phones, Luhn-checked cards, SSN, IBAN, IPs, API keys, embedded URL credentials)
@@ -1306,6 +1306,198 @@ get_available_video_gen_models() # ['runway/gen4.5', 'runway/gen4_aleph',
1306
1306
  get_available_audio_models(modality="tts") # ['runway/eleven_multilingual_v2', ...]
1307
1307
  ```
1308
1308
 
1309
+ ### Local coding-agent CLIs
1310
+
1311
+ Prompture detects and runs the major terminal coding agents — Claude Code,
1312
+ Codex, Gemini, Qwen Code, Aider, OpenCode, Cursor Agent, and Crush — through
1313
+ one unified interface. Useful when an app wants to delegate code-editing
1314
+ tasks to whatever agent the user already has installed, without reimplementing
1315
+ the per-CLI flag dance for each one.
1316
+
1317
+ | Agent | Binary | Install | Provider |
1318
+ |---|---|---|---|
1319
+ | Claude Code | `claude` | `npm i -g @anthropic-ai/claude-code` | Anthropic |
1320
+ | Codex CLI | `codex` | `npm i -g @openai/codex` | OpenAI |
1321
+ | Gemini CLI | `gemini` | `npm i -g @google/gemini-cli` | Google |
1322
+ | Qwen Code | `qwen` | `npm i -g @qwen-code/qwen-code` | Alibaba (gemini-cli fork) |
1323
+ | Aider | `aider` | `pip install aider-chat` | model-agnostic |
1324
+ | OpenCode | `opencode` | `npm i -g opencode-ai` | model-agnostic (sst) |
1325
+ | Cursor Agent | `cursor-agent` | Cursor installer | Cursor / Anysphere |
1326
+ | Crush | `crush` | `brew install charmbracelet/tap/crush` | model-agnostic (Charm) |
1327
+
1328
+ #### Discover
1329
+
1330
+ ```python
1331
+ from prompture import get_available_coding_agents
1332
+
1333
+ for agent in get_available_coding_agents(verify=True):
1334
+ print(agent.id, agent.available, agent.binary, agent.source)
1335
+ ```
1336
+
1337
+ `verify=True` runs a `--version` health check on each resolved binary and
1338
+ reports the failure reason for broken PATH shims — common after Node version
1339
+ switches on Windows or WSL. Discovery resolves both PATH installs and the
1340
+ underlying `node_modules` package entrypoint, so a working agent can still be
1341
+ found when the npm shim is broken.
1342
+
1343
+ #### Run
1344
+
1345
+ ```python
1346
+ from prompture import run_coding_agent
1347
+
1348
+ result = run_coding_agent(
1349
+ "claude", # claude, codex, gemini, qwen, aider, opencode, cursor-agent, crush
1350
+ "Add focused tests for the discovery helper.",
1351
+ cwd=".",
1352
+ approval_mode="auto", # default | auto | yolo
1353
+ model="sonnet", # optional, passed to CLIs that support --model
1354
+ timeout=600,
1355
+ )
1356
+ print(result.output)
1357
+ print("ok:", result.ok, "exit:", result.returncode, "duration:", result.duration_seconds)
1358
+ ```
1359
+
1360
+ Approval modes:
1361
+
1362
+ - **`default`** — run interactively; the CLI asks for approvals as it edits or runs commands.
1363
+ - **`auto`** — skip approval prompts but stay within the CLI's normal sandboxing where it has one (codex `--sandbox workspace-write`, gemini/qwen `-y`, aider `--yes-always`, crush `--yolo`). Claude Code has no intermediate mode, so `auto` maps to `--dangerously-skip-permissions` there.
1364
+ - **`yolo`** — every CLI's full bypass: claude `--dangerously-skip-permissions`, codex `--dangerously-bypass-approvals-and-sandbox`, gemini/qwen `-y`, crush `--yolo`. Use only inside an environment whose blast radius you already trust.
1365
+
1366
+ Before launching the task, the binary is health-checked by default so a
1367
+ broken shim fails fast with a clear error rather than hanging or producing
1368
+ opaque output. Pass `verify_binary=False` to skip the preflight.
1369
+
1370
+ #### Structured output
1371
+
1372
+ Claude Code (`--output-format stream-json`) and Codex (`exec --json`) emit a
1373
+ JSON event stream that Prompture normalises into a typed `CodingAgentEvent`
1374
+ union — `system`, `message`, `tool_call`, `tool_result`, `done`, `error`. Pass
1375
+ `output_format="json"` to get parsed events, cost, and token counts on the
1376
+ result:
1377
+
1378
+ ```python
1379
+ result = run_coding_agent(
1380
+ "claude",
1381
+ "Find every TODO that references issue #42 and summarise them.",
1382
+ cwd=".",
1383
+ approval_mode="auto",
1384
+ output_format="json",
1385
+ )
1386
+ print(f"${result.cost_usd:.4f} — {result.input_tokens} in / {result.output_tokens} out")
1387
+ for event in result.events:
1388
+ if event.type == "tool_call":
1389
+ print("→", event.tool_name, event.tool_input)
1390
+ elif event.type == "message":
1391
+ print(event.text)
1392
+ ```
1393
+
1394
+ For live progress, use `astream_coding_agent` — an async generator that yields
1395
+ events as the CLI emits them:
1396
+
1397
+ ```python
1398
+ from prompture import astream_coding_agent
1399
+
1400
+ async for event in astream_coding_agent("claude", "refactor X", cwd="."):
1401
+ if event.type == "tool_call":
1402
+ ui.show_pending(event.tool_name, event.tool_input)
1403
+ elif event.type == "done":
1404
+ ui.show_cost(event.cost_usd)
1405
+ ```
1406
+
1407
+ Streaming requires an agent whose spec provides a parser (Claude Code and
1408
+ Codex today). Cancelling the iterator terminates the underlying subprocess.
1409
+
1410
+ #### Detecting clarifying questions
1411
+
1412
+ Coding agents often pause to ask the user a clarifying question ("which
1413
+ approach do you want?", "should I delete this file?") instead of acting. In
1414
+ non-interactive mode this manifests as a final assistant message that ends in
1415
+ a question. Prompture's event parser detects question patterns and emits a
1416
+ typed `question` event alongside the `message`, with extracted numbered /
1417
+ bulleted / lettered choices when present:
1418
+
1419
+ ```python
1420
+ result = run_coding_agent("claude", "refactor X", cwd=".", output_format="json")
1421
+ if (q := result.asked_question):
1422
+ print("Agent asked:", q.text)
1423
+ if q.choices:
1424
+ for i, choice in enumerate(q.choices, 1):
1425
+ print(f" {i}. {choice}")
1426
+ # …then re-run with extra_args=["The answer is option 2"] to continue.
1427
+ ```
1428
+
1429
+ The same `detect_question(text)` helper is exported for callers that want to
1430
+ run their own heuristic over arbitrary agent text.
1431
+
1432
+ #### Budget tracking
1433
+
1434
+ Pass a `UsageSession` and coding-agent runs participate in the same per-model
1435
+ cost / token / latency summary as direct LLM calls:
1436
+
1437
+ ```python
1438
+ from prompture import UsageSession, run_coding_agent
1439
+
1440
+ session = UsageSession()
1441
+ run_coding_agent("claude", "task 1", cwd=".", output_format="json", session=session)
1442
+ run_coding_agent("claude", "task 2", cwd=".", output_format="json", session=session)
1443
+ print(session.summary()["formatted"])
1444
+ # Session: 3,200 tokens across 2 call(s) costing $0.0421 | …
1445
+ ```
1446
+
1447
+ #### Binary path overrides
1448
+
1449
+ When a CLI isn't on PATH, or you want to pin a specific install, set the
1450
+ matching `CODING_AGENT_BIN_*` env var (or field in `Settings`) and discovery
1451
+ will pick it up without threading the path through every call. Hyphenated ids
1452
+ use underscores in the variable name:
1453
+
1454
+ ```bash
1455
+ export CODING_AGENT_BIN_CLAUDE=/opt/claude/claude
1456
+ export CODING_AGENT_BIN_CURSOR_AGENT="/c/Program Files/Cursor/resources/app/bin/cursor-agent.exe"
1457
+ ```
1458
+
1459
+ Explicit `agent_paths={"claude": "..."}` kwargs still override settings when
1460
+ needed.
1461
+
1462
+ #### From the CLI
1463
+
1464
+ ```bash
1465
+ prompture coding-agents --verify
1466
+ prompture code-agent claude --auto-approve "Review this package for release blockers"
1467
+ prompture code-agent codex --auto-approve "Add tests for the pricing cache"
1468
+ prompture code-agent aider --auto-approve --model gpt-4o "Rename foo to bar across the package"
1469
+ ```
1470
+
1471
+ #### From the server
1472
+
1473
+ `prompture serve` exposes coding-agent discovery and execution as HTTP
1474
+ endpoints so any app talking to the OpenAI-compatible server can also drive a
1475
+ local agent:
1476
+
1477
+ ```bash
1478
+ # Discover
1479
+ curl "http://localhost:9471/v1/coding-agents"
1480
+ curl "http://localhost:9471/v1/coding-agents?verify=false"
1481
+
1482
+ # Run, blocking
1483
+ curl -X POST "http://localhost:9471/v1/coding-agents/run" \
1484
+ -H "content-type: application/json" \
1485
+ -d '{"agent": "claude", "task": "summarise CHANGELOG.md", "approval_mode": "auto", "output_format": "json"}'
1486
+
1487
+ # Run, SSE-streaming live events
1488
+ curl -N -X POST "http://localhost:9471/v1/coding-agents/run" \
1489
+ -H "content-type: application/json" \
1490
+ -d '{"agent": "claude", "task": "refactor X", "approval_mode": "auto", "stream": true}'
1491
+ ```
1492
+
1493
+ #### Adding a new agent
1494
+
1495
+ Drop a `CodingAgentSpec` into
1496
+ `prompture.infra.coding_agent_specs.CODING_AGENT_SPECS` with a `build_args`
1497
+ callable that produces the CLI's argv from a task, approval mode, model, and
1498
+ extra args. Discovery, health checks, command construction, the CLI, and the
1499
+ server endpoint all read from this registry — no other changes are needed.
1500
+
1309
1501
  ### Logging and Debugging
1310
1502
 
1311
1503
  ```python
@@ -1345,7 +1537,7 @@ Run spec-driven extraction suites for cross-model comparison.
1345
1537
 
1346
1538
  `prompture serve` exposes an OpenAI-shaped API
1347
1539
  (`/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`,
1348
- `/v1/models`) backed by Prompture's driver registry. Point any
1540
+ `/v1/models`, `/v1/coding-agents`) backed by Prompture's driver registry. Point any
1349
1541
  OpenAI SDK — or any tool that speaks the OpenAI API (Claude Code,
1350
1542
  Codex, Cursor, Aider, LangChain) — at it and route to any of the 36+
1351
1543
  supported providers under one endpoint.
@@ -43,7 +43,7 @@ print(person.name) # Maria
43
43
  - **Tool use** — Function calling and streaming across supported providers, with automatic prompt-based simulation for models without native tool support
44
44
  - **Sandboxed Python execution** — Drop-in `python_execute` tool backed by Tukuy's `PythonSandbox` (import whitelist, path restrictions, timeout, memory limit, AST risk gate)
45
45
  - **Web search** — Drop-in `web_search` tool with Tavily, Serper, Brave, and SearXNG backends; returns Markdown so the LLM can cite by URL
46
- - **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
46
+ - **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`, and `/v1/coding-agents`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
47
47
  - **Synthetic datasets** — `generate_qa_dataset()` turns documents into fine-tuning JSONL (Q&A, ShareGPT, or Alpaca) ready for Unsloth, Axolotl, or TRL
48
48
  - **Refusal detection** — `RefusalDetector` + `RefusalEvaluator` flag and score LLM refusals (5 categories, en/es markers, position-weighted confidence); useful for cross-provider alignment comparison and validating abliterated models
49
49
  - **Input safety** — `PromptInjectionDetector` (jailbreak, role-hijack, delimiter attacks, encoded payloads) + `PIIRedactor` (emails, phones, Luhn-checked cards, SSN, IBAN, IPs, API keys, embedded URL credentials)
@@ -1203,6 +1203,198 @@ get_available_video_gen_models() # ['runway/gen4.5', 'runway/gen4_aleph',
1203
1203
  get_available_audio_models(modality="tts") # ['runway/eleven_multilingual_v2', ...]
1204
1204
  ```
1205
1205
 
1206
+ ### Local coding-agent CLIs
1207
+
1208
+ Prompture detects and runs the major terminal coding agents — Claude Code,
1209
+ Codex, Gemini, Qwen Code, Aider, OpenCode, Cursor Agent, and Crush — through
1210
+ one unified interface. Useful when an app wants to delegate code-editing
1211
+ tasks to whatever agent the user already has installed, without reimplementing
1212
+ the per-CLI flag dance for each one.
1213
+
1214
+ | Agent | Binary | Install | Provider |
1215
+ |---|---|---|---|
1216
+ | Claude Code | `claude` | `npm i -g @anthropic-ai/claude-code` | Anthropic |
1217
+ | Codex CLI | `codex` | `npm i -g @openai/codex` | OpenAI |
1218
+ | Gemini CLI | `gemini` | `npm i -g @google/gemini-cli` | Google |
1219
+ | Qwen Code | `qwen` | `npm i -g @qwen-code/qwen-code` | Alibaba (gemini-cli fork) |
1220
+ | Aider | `aider` | `pip install aider-chat` | model-agnostic |
1221
+ | OpenCode | `opencode` | `npm i -g opencode-ai` | model-agnostic (sst) |
1222
+ | Cursor Agent | `cursor-agent` | Cursor installer | Cursor / Anysphere |
1223
+ | Crush | `crush` | `brew install charmbracelet/tap/crush` | model-agnostic (Charm) |
1224
+
1225
+ #### Discover
1226
+
1227
+ ```python
1228
+ from prompture import get_available_coding_agents
1229
+
1230
+ for agent in get_available_coding_agents(verify=True):
1231
+ print(agent.id, agent.available, agent.binary, agent.source)
1232
+ ```
1233
+
1234
+ `verify=True` runs a `--version` health check on each resolved binary and
1235
+ reports the failure reason for broken PATH shims — common after Node version
1236
+ switches on Windows or WSL. Discovery resolves both PATH installs and the
1237
+ underlying `node_modules` package entrypoint, so a working agent can still be
1238
+ found when the npm shim is broken.
1239
+
1240
+ #### Run
1241
+
1242
+ ```python
1243
+ from prompture import run_coding_agent
1244
+
1245
+ result = run_coding_agent(
1246
+ "claude", # claude, codex, gemini, qwen, aider, opencode, cursor-agent, crush
1247
+ "Add focused tests for the discovery helper.",
1248
+ cwd=".",
1249
+ approval_mode="auto", # default | auto | yolo
1250
+ model="sonnet", # optional, passed to CLIs that support --model
1251
+ timeout=600,
1252
+ )
1253
+ print(result.output)
1254
+ print("ok:", result.ok, "exit:", result.returncode, "duration:", result.duration_seconds)
1255
+ ```
1256
+
1257
+ Approval modes:
1258
+
1259
+ - **`default`** — run interactively; the CLI asks for approvals as it edits or runs commands.
1260
+ - **`auto`** — skip approval prompts but stay within the CLI's normal sandboxing where it has one (codex `--sandbox workspace-write`, gemini/qwen `-y`, aider `--yes-always`, crush `--yolo`). Claude Code has no intermediate mode, so `auto` maps to `--dangerously-skip-permissions` there.
1261
+ - **`yolo`** — every CLI's full bypass: claude `--dangerously-skip-permissions`, codex `--dangerously-bypass-approvals-and-sandbox`, gemini/qwen `-y`, crush `--yolo`. Use only inside an environment whose blast radius you already trust.
1262
+
1263
+ Before launching the task, the binary is health-checked by default so a
1264
+ broken shim fails fast with a clear error rather than hanging or producing
1265
+ opaque output. Pass `verify_binary=False` to skip the preflight.
1266
+
1267
+ #### Structured output
1268
+
1269
+ Claude Code (`--output-format stream-json`) and Codex (`exec --json`) emit a
1270
+ JSON event stream that Prompture normalises into a typed `CodingAgentEvent`
1271
+ union — `system`, `message`, `tool_call`, `tool_result`, `done`, `error`. Pass
1272
+ `output_format="json"` to get parsed events, cost, and token counts on the
1273
+ result:
1274
+
1275
+ ```python
1276
+ result = run_coding_agent(
1277
+ "claude",
1278
+ "Find every TODO that references issue #42 and summarise them.",
1279
+ cwd=".",
1280
+ approval_mode="auto",
1281
+ output_format="json",
1282
+ )
1283
+ print(f"${result.cost_usd:.4f} — {result.input_tokens} in / {result.output_tokens} out")
1284
+ for event in result.events:
1285
+ if event.type == "tool_call":
1286
+ print("→", event.tool_name, event.tool_input)
1287
+ elif event.type == "message":
1288
+ print(event.text)
1289
+ ```
1290
+
1291
+ For live progress, use `astream_coding_agent` — an async generator that yields
1292
+ events as the CLI emits them:
1293
+
1294
+ ```python
1295
+ from prompture import astream_coding_agent
1296
+
1297
+ async for event in astream_coding_agent("claude", "refactor X", cwd="."):
1298
+ if event.type == "tool_call":
1299
+ ui.show_pending(event.tool_name, event.tool_input)
1300
+ elif event.type == "done":
1301
+ ui.show_cost(event.cost_usd)
1302
+ ```
1303
+
1304
+ Streaming requires an agent whose spec provides a parser (Claude Code and
1305
+ Codex today). Cancelling the iterator terminates the underlying subprocess.
1306
+
1307
+ #### Detecting clarifying questions
1308
+
1309
+ Coding agents often pause to ask the user a clarifying question ("which
1310
+ approach do you want?", "should I delete this file?") instead of acting. In
1311
+ non-interactive mode this manifests as a final assistant message that ends in
1312
+ a question. Prompture's event parser detects question patterns and emits a
1313
+ typed `question` event alongside the `message`, with extracted numbered /
1314
+ bulleted / lettered choices when present:
1315
+
1316
+ ```python
1317
+ result = run_coding_agent("claude", "refactor X", cwd=".", output_format="json")
1318
+ if (q := result.asked_question):
1319
+ print("Agent asked:", q.text)
1320
+ if q.choices:
1321
+ for i, choice in enumerate(q.choices, 1):
1322
+ print(f" {i}. {choice}")
1323
+ # …then re-run with extra_args=["The answer is option 2"] to continue.
1324
+ ```
1325
+
1326
+ The same `detect_question(text)` helper is exported for callers that want to
1327
+ run their own heuristic over arbitrary agent text.
1328
+
1329
+ #### Budget tracking
1330
+
1331
+ Pass a `UsageSession` and coding-agent runs participate in the same per-model
1332
+ cost / token / latency summary as direct LLM calls:
1333
+
1334
+ ```python
1335
+ from prompture import UsageSession, run_coding_agent
1336
+
1337
+ session = UsageSession()
1338
+ run_coding_agent("claude", "task 1", cwd=".", output_format="json", session=session)
1339
+ run_coding_agent("claude", "task 2", cwd=".", output_format="json", session=session)
1340
+ print(session.summary()["formatted"])
1341
+ # Session: 3,200 tokens across 2 call(s) costing $0.0421 | …
1342
+ ```
1343
+
1344
+ #### Binary path overrides
1345
+
1346
+ When a CLI isn't on PATH, or you want to pin a specific install, set the
1347
+ matching `CODING_AGENT_BIN_*` env var (or field in `Settings`) and discovery
1348
+ will pick it up without threading the path through every call. Hyphenated ids
1349
+ use underscores in the variable name:
1350
+
1351
+ ```bash
1352
+ export CODING_AGENT_BIN_CLAUDE=/opt/claude/claude
1353
+ export CODING_AGENT_BIN_CURSOR_AGENT="/c/Program Files/Cursor/resources/app/bin/cursor-agent.exe"
1354
+ ```
1355
+
1356
+ Explicit `agent_paths={"claude": "..."}` kwargs still override settings when
1357
+ needed.
1358
+
1359
+ #### From the CLI
1360
+
1361
+ ```bash
1362
+ prompture coding-agents --verify
1363
+ prompture code-agent claude --auto-approve "Review this package for release blockers"
1364
+ prompture code-agent codex --auto-approve "Add tests for the pricing cache"
1365
+ prompture code-agent aider --auto-approve --model gpt-4o "Rename foo to bar across the package"
1366
+ ```
1367
+
1368
+ #### From the server
1369
+
1370
+ `prompture serve` exposes coding-agent discovery and execution as HTTP
1371
+ endpoints so any app talking to the OpenAI-compatible server can also drive a
1372
+ local agent:
1373
+
1374
+ ```bash
1375
+ # Discover
1376
+ curl "http://localhost:9471/v1/coding-agents"
1377
+ curl "http://localhost:9471/v1/coding-agents?verify=false"
1378
+
1379
+ # Run, blocking
1380
+ curl -X POST "http://localhost:9471/v1/coding-agents/run" \
1381
+ -H "content-type: application/json" \
1382
+ -d '{"agent": "claude", "task": "summarise CHANGELOG.md", "approval_mode": "auto", "output_format": "json"}'
1383
+
1384
+ # Run, SSE-streaming live events
1385
+ curl -N -X POST "http://localhost:9471/v1/coding-agents/run" \
1386
+ -H "content-type: application/json" \
1387
+ -d '{"agent": "claude", "task": "refactor X", "approval_mode": "auto", "stream": true}'
1388
+ ```
1389
+
1390
+ #### Adding a new agent
1391
+
1392
+ Drop a `CodingAgentSpec` into
1393
+ `prompture.infra.coding_agent_specs.CODING_AGENT_SPECS` with a `build_args`
1394
+ callable that produces the CLI's argv from a task, approval mode, model, and
1395
+ extra args. Discovery, health checks, command construction, the CLI, and the
1396
+ server endpoint all read from this registry — no other changes are needed.
1397
+
1206
1398
  ### Logging and Debugging
1207
1399
 
1208
1400
  ```python
@@ -1242,7 +1434,7 @@ Run spec-driven extraction suites for cross-model comparison.
1242
1434
 
1243
1435
  `prompture serve` exposes an OpenAI-shaped API
1244
1436
  (`/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`,
1245
- `/v1/models`) backed by Prompture's driver registry. Point any
1437
+ `/v1/models`, `/v1/coding-agents`) backed by Prompture's driver registry. Point any
1246
1438
  OpenAI SDK — or any tool that speaks the OpenAI API (Claude Code,
1247
1439
  Codex, Cursor, Aider, LangChain) — at it and route to any of the 36+
1248
1440
  supported providers under one endpoint.
@@ -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.1.1.dev5'
22
- __version_tuple__ = version_tuple = (1, 1, 1, 'dev5')
21
+ __version__ = version = '1.1.2.dev2'
22
+ __version_tuple__ = version_tuple = (1, 1, 2, 'dev2')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import shlex
2
3
 
3
4
  import click
4
5
 
@@ -39,6 +40,95 @@ def _build_drivers(providers: list[str]) -> dict[str, object]:
39
40
  return drivers
40
41
 
41
42
 
43
+ @cli.command("coding-agents")
44
+ @click.option("--json", "json_output", is_flag=True, help="Output machine-readable JSON.")
45
+ @click.option("--verify", is_flag=True, help="Run a lightweight health check for each detected CLI.")
46
+ def coding_agents(json_output: bool, verify: bool) -> None:
47
+ """List detected local coding-agent CLIs."""
48
+ from dataclasses import asdict
49
+
50
+ from ..infra import get_available_coding_agents
51
+
52
+ agents = get_available_coding_agents(verify=verify)
53
+ if json_output:
54
+ click.echo(json.dumps([asdict(agent) for agent in agents], indent=2))
55
+ return
56
+
57
+ for agent in agents:
58
+ if verify:
59
+ status = "healthy" if agent.available else "failed"
60
+ else:
61
+ status = "available" if agent.available else "missing"
62
+ source = "custom" if agent.custom_path else (agent.source or "missing")
63
+ detail = f" {agent.error}" if agent.error else ""
64
+ click.echo(f"{agent.id:<7} {status:<9} {source:<12} {agent.binary}{detail}")
65
+
66
+
67
+ @cli.command("code-agent")
68
+ @click.argument("agent", type=click.Choice(["claude", "codex", "gemini"]))
69
+ @click.argument("task", nargs=-1, required=True)
70
+ @click.option("--cwd", default=".", type=click.Path(exists=True, file_okay=False), help="Working directory.")
71
+ @click.option("--model", default=None, help="Model passed through to the agent CLI.")
72
+ @click.option("--binary", default=None, help="Explicit binary path for this run.")
73
+ @click.option("--auto-approve", is_flag=True, help="Avoid repeated approval prompts where the CLI supports it.")
74
+ @click.option("--yolo", is_flag=True, help="Use the CLI's dangerous no-approval/no-sandbox mode.")
75
+ @click.option("--timeout", default=600, type=int, help="Timeout in seconds.")
76
+ @click.option("--max-output", default=50000, type=int, help="Maximum output characters to print.")
77
+ @click.option("--verify/--no-verify", default=True, help="Health-check the CLI before running.")
78
+ @click.option("--dry-run", is_flag=True, help="Print the resolved command without running it.")
79
+ def code_agent(
80
+ agent: str,
81
+ task: tuple[str, ...],
82
+ cwd: str,
83
+ model: str | None,
84
+ binary: str | None,
85
+ auto_approve: bool,
86
+ yolo: bool,
87
+ timeout: int,
88
+ max_output: int,
89
+ verify: bool,
90
+ dry_run: bool,
91
+ ) -> None:
92
+ """Run Claude Code, Codex CLI, or Gemini CLI from Prompture."""
93
+ from ..infra import build_coding_agent_command, run_coding_agent
94
+
95
+ if auto_approve and yolo:
96
+ click.echo("Error: choose either --auto-approve or --yolo, not both.", err=True)
97
+ raise SystemExit(2)
98
+
99
+ approval_mode = "yolo" if yolo else ("auto" if auto_approve else "default")
100
+ task_text = " ".join(task).strip()
101
+
102
+ if dry_run:
103
+ command = build_coding_agent_command(
104
+ agent,
105
+ task_text,
106
+ cwd=cwd,
107
+ approval_mode=approval_mode,
108
+ binary=binary,
109
+ model=model,
110
+ )
111
+ click.echo(shlex.join(command.argv))
112
+ return
113
+
114
+ result = run_coding_agent(
115
+ agent,
116
+ task_text,
117
+ cwd=cwd,
118
+ approval_mode=approval_mode,
119
+ binary=binary,
120
+ model=model,
121
+ timeout=timeout,
122
+ max_output_chars=max_output,
123
+ verify_binary=verify,
124
+ )
125
+
126
+ if result.output:
127
+ click.echo(result.output)
128
+ if not result.ok:
129
+ raise SystemExit(result.returncode if result.returncode > 0 else 1)
130
+
131
+
42
132
  @cli.command("test-suite")
43
133
  @click.argument("specfile", type=click.Path(exists=True))
44
134
  @click.option("--providers", default=None, help="Comma-separated provider names (e.g., openai,ollama,groq).")