prompture 1.6.1.dev1__tar.gz → 1.7.1.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 (469) hide show
  1. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/PKG-INFO +4 -2
  2. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/_version.py +2 -2
  3. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/agent.py +269 -57
  4. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/async_agent.py +377 -145
  5. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/async_conversation.py +280 -63
  6. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/conversation.py +276 -42
  7. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/live_events.py +14 -3
  8. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/tool_grammars.py +17 -4
  9. prompture-1.7.1.dev1/prompture/agents/tools_schema.py +1181 -0
  10. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/types.py +10 -7
  11. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_openai_compat_stream.py +84 -18
  12. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_prompted_tool_stream.py +21 -17
  13. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_base.py +9 -2
  14. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_claude_driver.py +40 -9
  15. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_google_driver.py +31 -17
  16. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_driver.py +6 -2
  17. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/base.py +265 -13
  18. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/claude_driver.py +40 -10
  19. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/google_driver.py +40 -20
  20. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/groq_driver.py +8 -8
  21. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_driver.py +7 -9
  22. {prompture-1.6.1.dev1/prompture/integrations → prompture-1.7.1.dev1/prompture/extraction}/tukuy_bridge.py +77 -3
  23. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/integrations/__init__.py +19 -0
  24. prompture-1.7.1.dev1/prompture/integrations/mcp_bridge.py +224 -0
  25. prompture-1.7.1.dev1/prompture/integrations/tukuy_bridge.py +42 -0
  26. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/PKG-INFO +4 -2
  27. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/SOURCES.txt +1 -0
  28. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/requires.txt +4 -1
  29. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/pyproject.toml +2 -1
  30. prompture-1.6.1.dev1/prompture/agents/tools_schema.py +0 -572
  31. prompture-1.6.1.dev1/prompture/extraction/tukuy_bridge.py +0 -476
  32. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
  33. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
  34. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-example/SKILL.md +0 -0
  35. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-field/SKILL.md +0 -0
  36. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
  37. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-test/SKILL.md +0 -0
  38. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
  39. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
  40. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
  41. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  42. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
  43. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.env.copy +0 -0
  44. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/FUNDING.yml +0 -0
  45. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  46. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
  47. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
  48. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
  49. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/scripts/update_docs_version.py +0 -0
  50. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/scripts/update_wrapper_version.py +0 -0
  51. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/dev.yml +0 -0
  52. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/documentation.yml +0 -0
  53. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/pricing-freshness.yml +0 -0
  54. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/publish.yml +0 -0
  55. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/security.yml +0 -0
  56. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.safety-project.ini +0 -0
  57. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/AGENTS.md +0 -0
  58. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/BREAKING_CHANGES.md +0 -0
  59. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/CLAUDE.md +0 -0
  60. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/CONTRIBUTING.md +0 -0
  61. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/LICENSE +0 -0
  62. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/MANIFEST.in +0 -0
  63. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/README.md +0 -0
  64. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/ROADMAP.md +0 -0
  65. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/SECURITY.md +0 -0
  66. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/dev.ps1 +0 -0
  67. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/dev.sh +0 -0
  68. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/mypy_errors.txt +0 -0
  69. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/README.md +0 -0
  70. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/README.md +0 -0
  71. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  72. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/pyproject.toml +0 -0
  73. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/test.py +0 -0
  74. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/README.md +0 -0
  75. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  76. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
  77. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/test.py +0 -0
  78. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/__init__.py +0 -0
  79. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/_internal/__init__.py +0 -0
  80. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/_internal/json_encoder.py +0 -0
  81. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/__init__.py +0 -0
  82. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/assistant.py +0 -0
  83. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/async_deep_agent.py +0 -0
  84. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/__init__.py +0 -0
  85. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/planner.py +0 -0
  86. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/subagents.py +0 -0
  87. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/summarizer.py +0 -0
  88. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/vfs.py +0 -0
  89. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep_agent.py +0 -0
  90. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep_prompts.py +0 -0
  91. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep_state.py +0 -0
  92. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/persona.py +0 -0
  93. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/review_loop.py +0 -0
  94. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/simulated_tools.py +0 -0
  95. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/skills.py +0 -0
  96. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/aio/__init__.py +0 -0
  97. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/bridges/__init__.py +0 -0
  98. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/bridges/tukuy_backend.py +0 -0
  99. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/__init__.py +0 -0
  100. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/core.py +0 -0
  101. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/stores.py +0 -0
  102. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/types.py +0 -0
  103. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/citations/__init__.py +0 -0
  104. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/citations/core.py +0 -0
  105. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/citations/types.py +0 -0
  106. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/__init__.py +0 -0
  107. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/cli.py +0 -0
  108. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/formatters.py +0 -0
  109. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/runner.py +0 -0
  110. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/server.py +0 -0
  111. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/__init__.py +0 -0
  112. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/dedup.py +0 -0
  113. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/evol.py +0 -0
  114. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/filters.py +0 -0
  115. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/formats.py +0 -0
  116. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/schemas.py +0 -0
  117. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/seed.py +0 -0
  118. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/synth.py +0 -0
  119. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/__init__.py +0 -0
  120. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_openai_compat.py +0 -0
  121. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_prompt_cache.py +0 -0
  122. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/airllm_driver.py +0 -0
  123. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
  124. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
  125. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
  126. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_azure_driver.py +0 -0
  127. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
  128. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
  129. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
  130. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
  131. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
  132. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
  133. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
  134. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
  135. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
  136. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
  137. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
  138. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
  139. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_embedding_base.py +0 -0
  140. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
  141. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
  142. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
  143. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
  144. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_grok_driver.py +0 -0
  145. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
  146. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
  147. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_groq_driver.py +0 -0
  148. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
  149. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
  150. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
  151. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
  152. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
  153. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
  154. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
  155. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
  156. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
  157. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
  158. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
  159. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
  160. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
  161. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
  162. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
  163. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
  164. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
  165. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
  166. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
  167. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
  168. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
  169. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_compatible_driver.py +0 -0
  170. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
  171. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
  172. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
  173. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
  174. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
  175. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
  176. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
  177. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_registry.py +0 -0
  178. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
  179. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
  180. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
  181. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
  182. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_stt_base.py +0 -0
  183. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_tts_base.py +0 -0
  184. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
  185. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
  186. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
  187. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_zai_driver.py +0 -0
  188. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/audio_registry.py +0 -0
  189. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/azure_config.py +0 -0
  190. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/azure_driver.py +0 -0
  191. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/bedrock_driver.py +0 -0
  192. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
  193. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cachibot_driver.py +0 -0
  194. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
  195. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cohere_driver.py +0 -0
  196. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
  197. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
  198. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
  199. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
  200. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/deepseek_driver.py +0 -0
  201. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/driver_registry.py +0 -0
  202. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
  203. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
  204. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/embedding_base.py +0 -0
  205. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/embedding_registry.py +0 -0
  206. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
  207. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
  208. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
  209. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
  210. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/grok_driver.py +0 -0
  211. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
  212. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
  213. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/hugging_driver.py +0 -0
  214. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
  215. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/img_gen_base.py +0 -0
  216. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/img_gen_registry.py +0 -0
  217. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
  218. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
  219. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
  220. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
  221. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
  222. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/local_http_driver.py +0 -0
  223. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
  224. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/minimax_driver.py +0 -0
  225. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
  226. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mistral_driver.py +0 -0
  227. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
  228. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/modelscope_driver.py +0 -0
  229. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/moderation_base.py +0 -0
  230. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/moderation_registry.py +0 -0
  231. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/moonshot_driver.py +0 -0
  232. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
  233. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
  234. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
  235. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/ollama_driver.py +0 -0
  236. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
  237. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_compatible_driver.py +0 -0
  238. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
  239. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
  240. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
  241. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
  242. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
  243. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openrouter_driver.py +0 -0
  244. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
  245. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/provider_descriptors.py +0 -0
  246. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/registry.py +0 -0
  247. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/rerank_base.py +0 -0
  248. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/rerank_registry.py +0 -0
  249. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
  250. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_capabilities.py +0 -0
  251. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
  252. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
  253. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
  254. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
  255. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/stt_base.py +0 -0
  256. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/tts_base.py +0 -0
  257. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
  258. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/video_gen_base.py +0 -0
  259. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/video_gen_registry.py +0 -0
  260. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/vision_helpers.py +0 -0
  261. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
  262. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
  263. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/zai_driver.py +0 -0
  264. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/__init__.py +0 -0
  265. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/base.py +0 -0
  266. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/faithfulness.py +0 -0
  267. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/judge.py +0 -0
  268. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/pairwise.py +0 -0
  269. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/self_consistency.py +0 -0
  270. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/exceptions.py +0 -0
  271. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/__init__.py +0 -0
  272. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/async_core.py +0 -0
  273. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/code_extraction.py +0 -0
  274. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/core.py +0 -0
  275. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/few_shot.py +0 -0
  276. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/fields.py +0 -0
  277. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/reasoning.py +0 -0
  278. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/strategy.py +0 -0
  279. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/streaming.py +0 -0
  280. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/tools.py +0 -0
  281. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/validator.py +0 -0
  282. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/__init__.py +0 -0
  283. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/async_groups.py +0 -0
  284. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/consensus.py +0 -0
  285. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/debate.py +0 -0
  286. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/groups.py +0 -0
  287. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/types.py +0 -0
  288. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/__init__.py +0 -0
  289. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/budget.py +0 -0
  290. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/cache.py +0 -0
  291. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/callbacks.py +0 -0
  292. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/capabilities.py +0 -0
  293. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/coding_agent_events.py +0 -0
  294. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/coding_agent_specs.py +0 -0
  295. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/coding_agents.py +0 -0
  296. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/cost_mixin.py +0 -0
  297. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/discovery.py +0 -0
  298. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/ledger.py +0 -0
  299. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/logging.py +0 -0
  300. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/model_rates.py +0 -0
  301. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/pricing.py +0 -0
  302. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/provider_env.py +0 -0
  303. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/anthropic.json +0 -0
  304. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/azure.json +0 -0
  305. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/bedrock.json +0 -0
  306. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/cerebras.json +0 -0
  307. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/cohere.json +0 -0
  308. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/deepinfra.json +0 -0
  309. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/deepseek.json +0 -0
  310. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/fireworks.json +0 -0
  311. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/google.json +0 -0
  312. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
  313. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/groq.json +0 -0
  314. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/jina.json +0 -0
  315. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/mistral.json +0 -0
  316. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/mixedbread.json +0 -0
  317. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/moonshot.json +0 -0
  318. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/nomic.json +0 -0
  319. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/nvidia.json +0 -0
  320. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/openai.json +0 -0
  321. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/openrouter.json +0 -0
  322. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/perplexity.json +0 -0
  323. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/sambanova.json +0 -0
  324. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/siliconflow.json +0 -0
  325. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/together.json +0 -0
  326. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/voyage.json +0 -0
  327. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/xai.json +0 -0
  328. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/session.py +0 -0
  329. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/settings.py +0 -0
  330. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/tracker.py +0 -0
  331. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/tukuy_backend.py +0 -0
  332. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/__init__.py +0 -0
  333. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/chunking.py +0 -0
  334. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/detect.py +0 -0
  335. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/document.py +0 -0
  336. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
  337. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/base.py +0 -0
  338. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
  339. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/docx.py +0 -0
  340. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/html.py +0 -0
  341. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
  342. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
  343. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
  344. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/__init__.py +0 -0
  345. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/core.py +0 -0
  346. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/stores.py +0 -0
  347. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/types.py +0 -0
  348. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/__init__.py +0 -0
  349. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/audio.py +0 -0
  350. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/image.py +0 -0
  351. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/video.py +0 -0
  352. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/01-why-prompture.md +0 -0
  353. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/02-installation.md +0 -0
  354. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/03-quickstart.md +0 -0
  355. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/04-toon-input.md +0 -0
  356. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/05-test-harness.md +0 -0
  357. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/06-stability.md +0 -0
  358. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/07-migration.md +0 -0
  359. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/__init__.py +0 -0
  360. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/history.py +0 -0
  361. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/serialization.py +0 -0
  362. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/store.py +0 -0
  363. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/__init__.py +0 -0
  364. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/pipeline.py +0 -0
  365. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/resolver.py +0 -0
  366. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/routing.py +0 -0
  367. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/__init__.py +0 -0
  368. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/base.py +0 -0
  369. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/__init__.py +0 -0
  370. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
  371. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
  372. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
  373. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
  374. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
  375. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
  376. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
  377. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
  378. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
  379. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
  380. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
  381. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
  382. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/discovery.py +0 -0
  383. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/py.typed +0 -0
  384. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/__init__.py +0 -0
  385. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/__init__.py +0 -0
  386. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/base.py +0 -0
  387. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/character.py +0 -0
  388. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
  389. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/contextual.py +0 -0
  390. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/markdown.py +0 -0
  391. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/recursive.py +0 -0
  392. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/semantic.py +0 -0
  393. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/token.py +0 -0
  394. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/documents.py +0 -0
  395. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loader_registry.py +0 -0
  396. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/__init__.py +0 -0
  397. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
  398. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
  399. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
  400. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/html_loader.py +0 -0
  401. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/json_loader.py +0 -0
  402. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
  403. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
  404. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/text_loader.py +0 -0
  405. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
  406. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/pipeline.py +0 -0
  407. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/__init__.py +0 -0
  408. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
  409. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/base.py +0 -0
  410. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
  411. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/hyde.py +0 -0
  412. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/mmr.py +0 -0
  413. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
  414. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
  415. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/similarity.py +0 -0
  416. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/step_back.py +0 -0
  417. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
  418. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/base.py +0 -0
  419. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
  420. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
  421. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
  422. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
  423. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
  424. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
  425. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
  426. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/__init__.py +0 -0
  427. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/detector.py +0 -0
  428. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/evaluator.py +0 -0
  429. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/markers.py +0 -0
  430. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/__init__.py +0 -0
  431. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/generator.py +0 -0
  432. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  433. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
  434. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
  435. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
  436. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
  437. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
  438. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  439. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/security/__init__.py +0 -0
  440. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/security/injection.py +0 -0
  441. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/security/redaction.py +0 -0
  442. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/__init__.py +0 -0
  443. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/core.py +0 -0
  444. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/stores.py +0 -0
  445. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/types.py +0 -0
  446. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/__init__.py +0 -0
  447. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/environment.py +0 -0
  448. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/memory.py +0 -0
  449. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/scheduler.py +0 -0
  450. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/swarm.py +0 -0
  451. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/swarm_agent.py +0 -0
  452. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/types.py +0 -0
  453. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/testing/__init__.py +0 -0
  454. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/testing/driver_contract.py +0 -0
  455. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/tools/__init__.py +0 -0
  456. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/tools/code_exec.py +0 -0
  457. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/tools/web_search.py +0 -0
  458. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/dependency_links.txt +0 -0
  459. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/entry_points.txt +0 -0
  460. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/top_level.txt +0 -0
  461. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture_cost_tracking.md +0 -0
  462. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/requirements.txt +0 -0
  463. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/scripts/check_pricing_freshness.py +0 -0
  464. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/setup.cfg +0 -0
  465. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/specs/basic_extraction.json +0 -0
  466. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/specs/schema_validation.json +0 -0
  467. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/specs/strategy_comparison.json +0 -0
  468. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/test.py +0 -0
  469. {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/test_version_diagnosis.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 1.6.1.dev1
3
+ Version: 1.7.1.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
@@ -34,8 +34,10 @@ Provides-Extra: pandas
34
34
  Requires-Dist: pandas>=1.3.0; extra == "pandas"
35
35
  Provides-Extra: sandbox
36
36
  Requires-Dist: tukuy>=0.0.30; extra == "sandbox"
37
+ Provides-Extra: mcp
38
+ Requires-Dist: mcp>=1.0; extra == "mcp"
37
39
  Provides-Extra: all
38
- Requires-Dist: prompture[anthropic,google,groq,openai,pandas,sandbox,toon]; extra == "all"
40
+ Requires-Dist: prompture[anthropic,google,groq,mcp,openai,pandas,sandbox,toon]; extra == "all"
39
41
  Provides-Extra: test
40
42
  Requires-Dist: pytest>=7.0; extra == "test"
41
43
  Requires-Dist: pytest-asyncio>=0.23.0; extra == "test"
@@ -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.6.1.dev1'
22
- __version_tuple__ = version_tuple = (1, 6, 1, 'dev1')
21
+ __version__ = version = '1.7.1.dev1'
22
+ __version_tuple__ = version_tuple = (1, 7, 1, 'dev1')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -26,6 +26,8 @@ Example::
26
26
 
27
27
  from __future__ import annotations
28
28
 
29
+ import asyncio
30
+ import concurrent.futures
29
31
  import contextvars
30
32
  import inspect
31
33
  import json
@@ -39,7 +41,7 @@ from pydantic import BaseModel
39
41
 
40
42
  from ..drivers.base import Driver
41
43
  from ..extraction.tools import clean_json_text
42
- from ..infra.budget import BudgetPolicy, BudgetState, enforce_budget, resolve_budget_policy
44
+ from ..infra.budget import BudgetPolicy, resolve_budget_policy
43
45
  from ..infra.callbacks import DriverCallbacks
44
46
  from ..infra.provider_env import ProviderEnvironment
45
47
  from ..infra.session import UsageSession
@@ -131,6 +133,34 @@ def _get_first_param_name(fn: Callable[..., Any]) -> str:
131
133
  return ""
132
134
 
133
135
 
136
+ def _invoke_cb_sync(callback: Callable[..., Any], *cb_args: Any) -> Any:
137
+ """Invoke *callback* from sync code, driving awaitables to completion.
138
+
139
+ Async callbacks (e.g. ``async def on_approval_needed(...)``) return a
140
+ coroutine when called bare — which is always truthy and previously
141
+ caused silent auto-approval. This bridge detects awaitables and runs
142
+ them: directly with :func:`asyncio.run` when no loop is running, or on
143
+ a worker thread (carrying over ``contextvars``) when a loop is already
144
+ running in the current thread.
145
+ """
146
+ result = callback(*cb_args)
147
+ if not inspect.isawaitable(result):
148
+ return result
149
+
150
+ async def _await_result() -> Any:
151
+ return await result
152
+
153
+ try:
154
+ loop = asyncio.get_running_loop()
155
+ except RuntimeError:
156
+ loop = None
157
+ if loop is not None and loop.is_running():
158
+ ctx_snapshot = contextvars.copy_context()
159
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
160
+ return pool.submit(ctx_snapshot.run, lambda: asyncio.run(_await_result())).result()
161
+ return asyncio.run(_await_result())
162
+
163
+
134
164
  # ------------------------------------------------------------------
135
165
  # Agent
136
166
  # ------------------------------------------------------------------
@@ -180,6 +210,11 @@ class Agent(Generic[DepsType]):
180
210
  skill_config: Optional configuration dict injected as a
181
211
  :class:`SkillContext` into tukuy skill ``invoke()`` calls.
182
212
  When ``None`` (default) no config is injected.
213
+ tool_timeout: Per-tool wall-clock budget in seconds. A tool that
214
+ overruns it yields an error result the model can react to
215
+ instead of wedging the run forever. ``None`` (default) means
216
+ no timeout. Can be overridden per call via
217
+ ``options={"tool_timeout": ...}``.
183
218
  """
184
219
 
185
220
  def __init__(
@@ -209,6 +244,7 @@ class Agent(Generic[DepsType]):
209
244
  auto_approve_safe_only: bool = False,
210
245
  skill_config: dict[str, Any] | None = None,
211
246
  max_tool_result_length: int | None = None,
247
+ tool_timeout: float | None = None,
212
248
  max_depth: int = _DEFAULT_MAX_AGENT_DEPTH,
213
249
  env: ProviderEnvironment | None = None,
214
250
  ) -> None:
@@ -240,7 +276,12 @@ class Agent(Generic[DepsType]):
240
276
  self._auto_approve_safe_only = auto_approve_safe_only
241
277
  self._skill_config = skill_config
242
278
  self._max_tool_result_length = max_tool_result_length
279
+ self._tool_timeout = tool_timeout
243
280
  self._conversation: Conversation | None = None
281
+ # The conversation driving the current run. Tracked separately from
282
+ # ``_conversation`` (which only holds persistent ones) so that
283
+ # ``stop()`` can reach the loop of a non-persistent run too.
284
+ self._active_conversation: Conversation | None = None
244
285
 
245
286
  # Build internal tool registry
246
287
  self._tools = ToolRegistry()
@@ -279,8 +320,21 @@ class Agent(Generic[DepsType]):
279
320
  return self._lifecycle
280
321
 
281
322
  def stop(self) -> None:
282
- """Request graceful shutdown after the current iteration."""
323
+ """Request graceful shutdown after the current iteration.
324
+
325
+ Sets the agent-level flag and forwards the request to the
326
+ conversation driving the current run (cooperative stop) so its
327
+ tool-round loop exits gracefully between rounds instead of starting
328
+ another round. Works for non-persistent agents too: the in-flight
329
+ conversation is tracked in ``_active_conversation`` for the duration
330
+ of the run, so the flag is never merely decorative.
331
+
332
+ Safe to call from a tool, a callback, or another thread.
333
+ """
283
334
  self._stop_requested = True
335
+ conv = self._active_conversation or self._conversation
336
+ if conv is not None:
337
+ conv.request_stop()
284
338
 
285
339
  @property
286
340
  def callbacks(self) -> AgentCallbacks:
@@ -375,6 +429,7 @@ class Agent(Generic[DepsType]):
375
429
  token = _agent_depth.set(current_depth + 1)
376
430
  self._lifecycle = AgentState.running
377
431
  self._stop_requested = False
432
+ self._active_conversation = None
378
433
  steps: list[AgentStep] = []
379
434
 
380
435
  try:
@@ -409,20 +464,61 @@ class Agent(Generic[DepsType]):
409
464
  prompt=prompt,
410
465
  )
411
466
 
467
+ def _make_live_ctx_fn(
468
+ self,
469
+ prompt: str,
470
+ deps: Any,
471
+ session: UsageSession,
472
+ run_state: dict[str, Any],
473
+ ) -> Callable[[], RunContext[Any]]:
474
+ """Return a factory that builds a fresh :class:`RunContext` per call.
475
+
476
+ The factory reads the current conversation from *run_state* (key
477
+ ``"conv"``) so tools invoked in later tool rounds see live
478
+ ``iteration``/``messages``/``usage`` instead of the snapshot taken
479
+ at the start of the run. ``run_state["conv"]`` must be assigned
480
+ once the conversation is built; before that, an empty context is
481
+ produced.
482
+ """
483
+
484
+ def _live_ctx() -> RunContext[Any]:
485
+ conv = run_state.get("conv")
486
+ messages = conv.messages if conv is not None else []
487
+ iteration = max(
488
+ 0,
489
+ sum(1 for m in messages if m.get("role") == "assistant" and m.get("tool_calls")) - 1,
490
+ )
491
+ return self._build_run_context(prompt, deps, session, messages, iteration)
492
+
493
+ return _live_ctx
494
+
412
495
  # ------------------------------------------------------------------
413
496
  # Tool wrapping (RunContext injection + ModelRetry + callbacks)
414
497
  # ------------------------------------------------------------------
415
498
 
416
- def _wrap_tools_with_context(self, ctx: RunContext[Any], session: UsageSession | None = None) -> ToolRegistry:
499
+ def _wrap_tools_with_context(
500
+ self,
501
+ ctx: RunContext[Any],
502
+ session: UsageSession | None = None,
503
+ ctx_fn: Callable[[], RunContext[Any]] | None = None,
504
+ tool_timings: list[dict[str, Any]] | None = None,
505
+ ) -> ToolRegistry:
417
506
  """Return a new :class:`ToolRegistry` with wrapped tool functions.
418
507
 
419
508
  For each registered tool:
420
- - If the tool's first param is ``RunContext``, inject *ctx* automatically.
509
+ - If the tool's first param is ``RunContext``, inject the live context
510
+ automatically. When *ctx_fn* is provided it is called at each tool
511
+ invocation so tools see the current iteration/messages; otherwise the
512
+ static *ctx* snapshot is used.
421
513
  - Catch :class:`ModelRetry` and convert to an error string.
422
- - Fire ``agent_callbacks.on_tool_start`` / ``on_tool_end``.
514
+ - Fire ``agent_callbacks.on_tool_start`` / ``on_tool_end`` (awaitable
515
+ callbacks are driven to completion via :func:`_invoke_cb_sync`).
423
516
  - Strip the ``RunContext`` parameter from the JSON schema sent to the LLM.
424
517
  - If the tool wraps a child agent (via ``as_tool``), aggregate its
425
518
  usage into the parent *session*.
519
+ - When *tool_timings* is provided, append a
520
+ ``{"name", "timestamp", "duration_ms"}`` record per invocation so
521
+ step extraction can populate ``AgentStep.duration_ms``.
426
522
  """
427
523
  if not self._tools:
428
524
  return ToolRegistry()
@@ -442,10 +538,14 @@ class Agent(Generic[DepsType]):
442
538
  _name: str,
443
539
  _cb: AgentCallbacks = cb,
444
540
  _session: UsageSession | None = session,
541
+ _ctx_fn: Callable[[], RunContext[Any]] | None = ctx_fn,
542
+ _timings: list[dict[str, Any]] | None = tool_timings,
445
543
  ) -> Callable[..., Any]:
446
544
  def wrapper(**kwargs: Any) -> Any:
545
+ call_ctx = _ctx_fn() if _ctx_fn is not None else ctx
546
+ start = time.perf_counter()
447
547
  if _cb.on_tool_start:
448
- _cb.on_tool_start(_name, kwargs)
548
+ _invoke_cb_sync(_cb.on_tool_start, _name, kwargs)
449
549
  try:
450
550
  # Inject skill config via SkillContext for tukuy skills
451
551
  if self._skill_config is not None:
@@ -474,18 +574,18 @@ class Agent(Generic[DepsType]):
474
574
  )
475
575
 
476
576
  if _wants:
477
- result = _fn(ctx, **kwargs)
577
+ result = _fn(call_ctx, **kwargs)
478
578
  else:
479
579
  result = _fn(**kwargs)
480
580
  except ApprovalRequired as exc:
481
581
  # Handle approval request
482
582
  if _cb.on_approval_needed:
483
- approved = _cb.on_approval_needed(exc.tool_name, exc.action, exc.details)
583
+ approved = _invoke_cb_sync(_cb.on_approval_needed, exc.tool_name, exc.action, exc.details)
484
584
  if approved:
485
585
  # Retry the tool call after approval
486
586
  try:
487
587
  if _wants:
488
- result = _fn(ctx, **kwargs)
588
+ result = _fn(call_ctx, **kwargs)
489
589
  else:
490
590
  result = _fn(**kwargs)
491
591
  except ApprovalRequired:
@@ -518,8 +618,17 @@ class Agent(Generic[DepsType]):
518
618
  }
519
619
  )
520
620
 
621
+ if _timings is not None:
622
+ _timings.append(
623
+ {
624
+ "name": _name,
625
+ "timestamp": time.time(),
626
+ "duration_ms": (time.perf_counter() - start) * 1000,
627
+ }
628
+ )
629
+
521
630
  if _cb.on_tool_end:
522
- _cb.on_tool_end(_name, result)
631
+ _invoke_cb_sync(_cb.on_tool_end, _name, result)
523
632
  return result
524
633
 
525
634
  return wrapper
@@ -718,16 +827,30 @@ class Agent(Generic[DepsType]):
718
827
  # Reuse existing conversation in persistent mode
719
828
  if self._persistent_conversation and self._conversation is not None:
720
829
  conv = self._conversation
721
- # Update tools and callbacks for this run
722
- if tools is not None:
723
- conv._tools = tools
724
- if driver_callbacks is not None:
725
- conv._driver.callbacks = driver_callbacks
726
- # Propagate before_turn hook (subclasses may set this)
727
- hook = getattr(self, "_before_turn_hook", None)
728
- if hook is not None:
729
- conv._before_turn = hook
730
- return conv
830
+ # If the agent's driver was swapped after the conversation was
831
+ # built (e.g. a budget fallback forced a rebuild), the cached
832
+ # conversation still holds the old driver — discard it and fall
833
+ # through to build a fresh one.
834
+ driver_stale = self._driver is not None and getattr(conv, "_driver", None) is not self._driver
835
+ if not driver_stale:
836
+ # Respect the newly resolved system prompt for this run.
837
+ if system_prompt is not None:
838
+ conv.system_prompt = system_prompt
839
+ # Update tools and callbacks for this run.
840
+ # NOTE: assigning ``callbacks`` mutates the driver instance,
841
+ # which may be shared (e.g. passed to several agents). A
842
+ # persistent-conversation agent should treat its driver as
843
+ # exclusively owned by the agent.
844
+ if tools is not None:
845
+ conv._tools = tools
846
+ if driver_callbacks is not None:
847
+ conv._driver.callbacks = driver_callbacks
848
+ # Propagate before_turn hook (subclasses may set this)
849
+ hook = getattr(self, "_before_turn_hook", None)
850
+ if hook is not None:
851
+ conv._before_turn = hook
852
+ return self._track_active(conv)
853
+ self._conversation = None
731
854
 
732
855
  effective_tools = tools if tools is not None else (self._tools if self._tools else None)
733
856
 
@@ -742,6 +865,8 @@ class Agent(Generic[DepsType]):
742
865
  kwargs["before_turn"] = hook
743
866
  if self._max_tool_result_length is not None:
744
867
  kwargs["max_tool_result_length"] = self._max_tool_result_length
868
+ if self._tool_timeout is not None:
869
+ kwargs["tool_timeout"] = self._tool_timeout
745
870
  if self._options:
746
871
  kwargs["options"] = self._options
747
872
  if driver_callbacks is not None:
@@ -769,6 +894,19 @@ class Agent(Generic[DepsType]):
769
894
  conv = Conversation(**kwargs)
770
895
  if self._persistent_conversation:
771
896
  self._conversation = conv
897
+ return self._track_active(conv)
898
+
899
+ def _track_active(self, conv: Conversation) -> Conversation:
900
+ """Record *conv* as the conversation driving the current run.
901
+
902
+ Lets :meth:`stop` reach the tool-round loop of a non-persistent run.
903
+ If ``stop()`` was already called between the run starting and the
904
+ conversation being built, the request is replayed onto *conv* so it
905
+ is not lost to that race.
906
+ """
907
+ self._active_conversation = conv
908
+ if self._stop_requested:
909
+ conv.request_stop()
772
910
  return conv
773
911
 
774
912
  def _execute(self, prompt: str, steps: list[AgentStep], deps: Any) -> AgentResult:
@@ -793,8 +931,16 @@ class Agent(Generic[DepsType]):
793
931
  # 4. Resolve system prompt (call it if callable, passing ctx)
794
932
  resolved_system_prompt = self._resolve_system_prompt(ctx)
795
933
 
796
- # 5. Wrap tools with context (pass session for child agent usage aggregation)
797
- wrapped_tools = self._wrap_tools_with_context(ctx, session)
934
+ # 5. Wrap tools with context (pass session for child agent usage
935
+ # aggregation; ctx_fn refreshes RunContext per tool round)
936
+ run_state: dict[str, Any] = {}
937
+ tool_timings: list[dict[str, Any]] = []
938
+ wrapped_tools = self._wrap_tools_with_context(
939
+ ctx,
940
+ session,
941
+ ctx_fn=self._make_live_ctx_fn(prompt, deps, session, run_state),
942
+ tool_timings=tool_timings,
943
+ )
798
944
 
799
945
  # 6. Build Conversation
800
946
  conv = self._build_conversation(
@@ -802,36 +948,16 @@ class Agent(Generic[DepsType]):
802
948
  tools=wrapped_tools if wrapped_tools else None,
803
949
  driver_callbacks=driver_callbacks,
804
950
  )
951
+ run_state["conv"] = conv
805
952
 
806
953
  # 7. Fire on_iteration callback
807
954
  if self._agent_callbacks.on_iteration:
808
955
  self._agent_callbacks.on_iteration(0)
809
956
 
810
- # 8. Enforce budget policy at the agent level (pre-call)
811
- if self._budget_policy is not None:
812
- state = BudgetState(
813
- cost_used=session.cost,
814
- tokens_used=session.total_tokens,
815
- max_cost=self._max_cost,
816
- max_tokens=self._max_tokens,
817
- )
818
- new_model = enforce_budget(
819
- state,
820
- self._budget_policy,
821
- fallback_models=self._fallback_models,
822
- current_model=self._model,
823
- on_model_fallback=self._on_model_fallback,
824
- )
825
- if new_model is not None:
826
- self._model = new_model
827
- self._driver = None # force rebuild
828
- conv = self._build_conversation(
829
- system_prompt=resolved_system_prompt,
830
- tools=wrapped_tools if wrapped_tools else None,
831
- driver_callbacks=driver_callbacks,
832
- )
833
-
834
- # 9. Ask the conversation (handles full tool loop internally)
957
+ # 8. Ask the conversation (handles full tool loop internally)
958
+ # Note: budget policy is enforced inside the Conversation
959
+ # (``_check_budget``); the agent-level pre-call check was removed
960
+ # because it read a fresh, always-empty UsageSession.
835
961
  agent_name = self.name or self.__class__.__name__
836
962
  with tracker.agent(agent_name):
837
963
  t0 = time.perf_counter()
@@ -856,6 +982,7 @@ class Agent(Generic[DepsType]):
856
982
  steps,
857
983
  all_tool_calls,
858
984
  getattr(conv, "_full_tool_results", None),
985
+ tool_timings,
859
986
  )
860
987
 
861
988
  # Handle output_type parsing
@@ -906,11 +1033,42 @@ class Agent(Generic[DepsType]):
906
1033
  steps: list[AgentStep],
907
1034
  all_tool_calls: list[dict[str, Any]],
908
1035
  full_tool_results: dict[str, str] | None = None,
1036
+ tool_timings: list[dict[str, Any]] | None = None,
909
1037
  ) -> None:
910
- """Scan conversation messages and populate steps and tool_calls."""
1038
+ """Scan conversation messages and populate steps and tool_calls.
1039
+
1040
+ Args:
1041
+ messages: Conversation messages to scan.
1042
+ steps: List to append :class:`AgentStep` records to.
1043
+ all_tool_calls: List to append tool-call dicts to.
1044
+ full_tool_results: Optional map of tool_call_id to the full
1045
+ (pre-truncation) tool result string.
1046
+ tool_timings: Optional list of ``{"name", "timestamp",
1047
+ "duration_ms"}`` records captured by the tool wrappers.
1048
+ Consumed in FIFO order per tool name to populate
1049
+ ``duration_ms`` and a real execution timestamp on
1050
+ ``tool_result`` steps.
1051
+ """
911
1052
 
912
1053
  now = time.time()
913
1054
 
1055
+ # Map tool_call_id -> tool name from assistant tool_calls messages so
1056
+ # tool_result steps record the real tool name, not the call id.
1057
+ id_to_name: dict[str, str] = {}
1058
+ for msg in messages:
1059
+ if msg.get("role") == "assistant":
1060
+ for tc in msg.get("tool_calls") or []:
1061
+ tc_fn = tc.get("function", {})
1062
+ tc_name = tc_fn.get("name", tc.get("name", ""))
1063
+ tc_id = tc.get("id", "")
1064
+ if tc_id and tc_name:
1065
+ id_to_name[tc_id] = tc_name
1066
+
1067
+ # FIFO queues of timing records per tool name
1068
+ timings_by_name: dict[str, list[dict[str, Any]]] = {}
1069
+ for rec in tool_timings or []:
1070
+ timings_by_name.setdefault(rec.get("name", ""), []).append(rec)
1071
+
914
1072
  for msg in messages:
915
1073
  role = msg.get("role", "")
916
1074
  # Extract usage from message meta if present
@@ -981,13 +1139,23 @@ class Agent(Generic[DepsType]):
981
1139
  full_result = None
982
1140
  if full_tool_results and tool_call_id:
983
1141
  full_result = full_tool_results.get(tool_call_id)
1142
+ # Resolve the real tool name from the originating assistant
1143
+ # tool_calls message (fall back to the raw id).
1144
+ tool_name = id_to_name.get(tool_call_id, tool_call_id)
1145
+ # Pop the matching timing record (FIFO) if available.
1146
+ timing = None
1147
+ if tool_name is not None:
1148
+ queue = timings_by_name.get(tool_name)
1149
+ if queue:
1150
+ timing = queue.pop(0)
984
1151
  steps.append(
985
1152
  AgentStep(
986
1153
  step_type=StepType.tool_result,
987
- timestamp=now,
1154
+ timestamp=timing["timestamp"] if timing else now,
988
1155
  content=msg.get("content", ""),
989
- tool_name=tool_call_id,
1156
+ tool_name=tool_name,
990
1157
  tool_result=full_result,
1158
+ duration_ms=timing["duration_ms"] if timing else 0.0,
991
1159
  )
992
1160
  )
993
1161
 
@@ -1081,9 +1249,18 @@ class Agent(Generic[DepsType]):
1081
1249
  return AgentIterator(gen)
1082
1250
 
1083
1251
  def _execute_iter(self, prompt: str, deps: Any) -> Generator[AgentStep, None, AgentResult]:
1084
- """Generator that executes the agent loop and yields each step."""
1252
+ """Generator that executes the agent loop and yields each step.
1253
+
1254
+ Raises:
1255
+ RecursionError: If the agent nesting depth exceeds ``max_depth``.
1256
+ """
1257
+ current_depth = _agent_depth.get()
1258
+ if current_depth >= self._max_depth:
1259
+ raise RecursionError(f"Agent recursion depth exceeded: {current_depth} >= {self._max_depth}")
1260
+ token = _agent_depth.set(current_depth + 1)
1085
1261
  self._lifecycle = AgentState.running
1086
1262
  self._stop_requested = False
1263
+ self._active_conversation = None
1087
1264
  steps: list[AgentStep] = []
1088
1265
 
1089
1266
  try:
@@ -1095,6 +1272,8 @@ class Agent(Generic[DepsType]):
1095
1272
  except Exception:
1096
1273
  self._lifecycle = AgentState.errored
1097
1274
  raise
1275
+ finally:
1276
+ _agent_depth.reset(token)
1098
1277
 
1099
1278
  # ------------------------------------------------------------------
1100
1279
  # run_stream() — streaming output
@@ -1108,17 +1287,29 @@ class Agent(Generic[DepsType]):
1108
1287
  final :class:`AgentResult` is available via
1109
1288
  :attr:`StreamedAgentResult.result`.
1110
1289
 
1111
- When tools are registered, streaming falls back to non-streaming
1112
- ``conv.ask()`` and yields the full response as a single
1113
- ``text_delta`` event.
1290
+ When tools are registered, the tool loop runs via
1291
+ ``conv.ask_with_tool_events()``: ``tool_call`` and ``tool_result``
1292
+ events are emitted as tools execute, and the final LLM response is
1293
+ yielded as a single ``text_delta`` event (per-turn text is not
1294
+ token-streamed in this mode). Without tools, the driver's native
1295
+ streaming is used when available.
1114
1296
  """
1115
1297
  gen = self._execute_stream(prompt, deps)
1116
1298
  return StreamedAgentResult(gen)
1117
1299
 
1118
1300
  def _execute_stream(self, prompt: str, deps: Any) -> Generator[StreamEvent, None, AgentResult]:
1119
- """Generator that executes the agent loop and yields stream events."""
1301
+ """Generator that executes the agent loop and yields stream events.
1302
+
1303
+ Raises:
1304
+ RecursionError: If the agent nesting depth exceeds ``max_depth``.
1305
+ """
1306
+ current_depth = _agent_depth.get()
1307
+ if current_depth >= self._max_depth:
1308
+ raise RecursionError(f"Agent recursion depth exceeded: {current_depth} >= {self._max_depth}")
1309
+ token = _agent_depth.set(current_depth + 1)
1120
1310
  self._lifecycle = AgentState.running
1121
1311
  self._stop_requested = False
1312
+ self._active_conversation = None
1122
1313
  steps: list[AgentStep] = []
1123
1314
 
1124
1315
  try:
@@ -1139,7 +1330,14 @@ class Agent(Generic[DepsType]):
1139
1330
  resolved_system_prompt = self._resolve_system_prompt(ctx)
1140
1331
 
1141
1332
  # 5. Wrap tools with context (pass session for child agent usage aggregation)
1142
- wrapped_tools = self._wrap_tools_with_context(ctx, session)
1333
+ run_state: dict[str, Any] = {}
1334
+ tool_timings: list[dict[str, Any]] = []
1335
+ wrapped_tools = self._wrap_tools_with_context(
1336
+ ctx,
1337
+ session,
1338
+ ctx_fn=self._make_live_ctx_fn(prompt, deps, session, run_state),
1339
+ tool_timings=tool_timings,
1340
+ )
1143
1341
  has_tools = bool(wrapped_tools)
1144
1342
 
1145
1343
  # 6. Build Conversation
@@ -1148,6 +1346,7 @@ class Agent(Generic[DepsType]):
1148
1346
  tools=wrapped_tools if wrapped_tools else None,
1149
1347
  driver_callbacks=driver_callbacks,
1150
1348
  )
1349
+ run_state["conv"] = conv
1151
1350
 
1152
1351
  # 7. Fire on_iteration callback
1153
1352
  if self._agent_callbacks.on_iteration:
@@ -1207,6 +1406,7 @@ class Agent(Generic[DepsType]):
1207
1406
  steps,
1208
1407
  all_tool_calls,
1209
1408
  getattr(conv, "_full_tool_results", None),
1409
+ tool_timings,
1210
1410
  )
1211
1411
 
1212
1412
  # 9. Parse output
@@ -1257,6 +1457,8 @@ class Agent(Generic[DepsType]):
1257
1457
  except Exception:
1258
1458
  self._lifecycle = AgentState.errored
1259
1459
  raise
1460
+ finally:
1461
+ _agent_depth.reset(token)
1260
1462
 
1261
1463
  # ------------------------------------------------------------------
1262
1464
  # run_live() — interleaved tool calling with streaming text deltas
@@ -1292,6 +1494,7 @@ class Agent(Generic[DepsType]):
1292
1494
  token = _agent_depth.set(current_depth + 1)
1293
1495
  self._lifecycle = AgentState.running
1294
1496
  self._stop_requested = False
1497
+ self._active_conversation = None
1295
1498
  steps: list[AgentStep] = []
1296
1499
 
1297
1500
  try:
@@ -1303,13 +1506,21 @@ class Agent(Generic[DepsType]):
1303
1506
  ctx = self._build_run_context(prompt, deps, session, [], 0)
1304
1507
  effective_prompt = self._run_input_guardrails(ctx, prompt)
1305
1508
  resolved_system_prompt = self._resolve_system_prompt(ctx)
1306
- wrapped_tools = self._wrap_tools_with_context(ctx, session)
1509
+ run_state: dict[str, Any] = {}
1510
+ tool_timings: list[dict[str, Any]] = []
1511
+ wrapped_tools = self._wrap_tools_with_context(
1512
+ ctx,
1513
+ session,
1514
+ ctx_fn=self._make_live_ctx_fn(prompt, deps, session, run_state),
1515
+ tool_timings=tool_timings,
1516
+ )
1307
1517
 
1308
1518
  conv = self._build_conversation(
1309
1519
  system_prompt=resolved_system_prompt,
1310
1520
  tools=wrapped_tools if wrapped_tools else None,
1311
1521
  driver_callbacks=driver_callbacks,
1312
1522
  )
1523
+ run_state["conv"] = conv
1313
1524
 
1314
1525
  if self._agent_callbacks.on_iteration:
1315
1526
  self._agent_callbacks.on_iteration(0)
@@ -1346,6 +1557,7 @@ class Agent(Generic[DepsType]):
1346
1557
  steps,
1347
1558
  all_tool_calls,
1348
1559
  getattr(conv, "_full_tool_results", None),
1560
+ tool_timings,
1349
1561
  )
1350
1562
 
1351
1563
  if self._output_type is not None: