prompture 1.9.1.dev1__tar.gz → 1.9.1.dev3__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 (505) hide show
  1. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/PKG-INFO +1 -1
  2. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/_version.py +2 -2
  3. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/agent.py +58 -6
  4. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/assistant.py +15 -3
  5. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/async_agent.py +86 -7
  6. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/async_conversation.py +19 -6
  7. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/conversation.py +19 -6
  8. prompture-1.9.1.dev3/prompture/drivers/_media_usage.py +118 -0
  9. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/aggregator_base.py +60 -8
  10. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_aggregator_base.py +60 -8
  11. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_base.py +6 -1
  12. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_cohere_embedding_driver.py +1 -1
  13. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_embedding_base.py +6 -0
  14. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_img_gen_base.py +6 -0
  15. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_jina_embedding_driver.py +1 -1
  16. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_mxbai_embedding_driver.py +1 -1
  17. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_nomic_embedding_driver.py +1 -1
  18. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_embedding_driver.py +1 -1
  19. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_video_gen_base.py +6 -0
  20. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_voyage_embedding_driver.py +1 -1
  21. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/base.py +5 -1
  22. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/cohere_embedding_driver.py +1 -1
  23. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/embedding_base.py +6 -0
  24. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/img_gen_base.py +6 -0
  25. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/jina_embedding_driver.py +1 -1
  26. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/lipsync_base.py +44 -0
  27. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/music_base.py +41 -0
  28. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/mxbai_embedding_driver.py +1 -1
  29. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/nomic_embedding_driver.py +1 -1
  30. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_embedding_driver.py +1 -1
  31. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/video_gen_base.py +6 -0
  32. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/voyage_embedding_driver.py +1 -1
  33. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/groups/debate.py +12 -4
  34. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/__init__.py +4 -1
  35. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/cost_mixin.py +5 -2
  36. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/tracker.py +63 -2
  37. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/jobs.py +8 -1
  38. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/semantic.py +2 -1
  39. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/base.py +25 -2
  40. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/chroma.py +3 -3
  41. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/faiss.py +3 -3
  42. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/pgvector.py +3 -3
  43. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/pinecone.py +3 -3
  44. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/qdrant.py +3 -3
  45. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/weaviate.py +3 -3
  46. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/nodes.py +16 -2
  47. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture.egg-info/PKG-INFO +1 -1
  48. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture.egg-info/SOURCES.txt +1 -0
  49. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-driver/SKILL.md +0 -0
  50. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-driver/references/driver-template.md +0 -0
  51. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-example/SKILL.md +0 -0
  52. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-field/SKILL.md +0 -0
  53. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-persona/SKILL.md +0 -0
  54. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-test/SKILL.md +0 -0
  55. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/add-tool/SKILL.md +0 -0
  56. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/create-pr/SKILL.md +0 -0
  57. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/run-tests/SKILL.md +0 -0
  58. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  59. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.claude/skills/update-pricing/SKILL.md +0 -0
  60. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.env.copy +0 -0
  61. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/FUNDING.yml +0 -0
  62. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  63. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
  64. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
  65. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
  66. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/scripts/update_docs_version.py +0 -0
  67. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/scripts/update_wrapper_version.py +0 -0
  68. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/workflows/dev.yml +0 -0
  69. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/workflows/documentation.yml +0 -0
  70. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/workflows/pricing-freshness.yml +0 -0
  71. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/workflows/publish.yml +0 -0
  72. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.github/workflows/security.yml +0 -0
  73. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/.safety-project.ini +0 -0
  74. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/AGENTS.md +0 -0
  75. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/BREAKING_CHANGES.md +0 -0
  76. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/CLAUDE.md +0 -0
  77. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/CONTRIBUTING.md +0 -0
  78. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/LICENSE +0 -0
  79. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/MANIFEST.in +0 -0
  80. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/README.md +0 -0
  81. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/ROADMAP.md +0 -0
  82. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/SECURITY.md +0 -0
  83. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/VERSION +0 -0
  84. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/dev.ps1 +0 -0
  85. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/dev.sh +0 -0
  86. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/mypy_errors.txt +0 -0
  87. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/README.md +0 -0
  88. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_json/README.md +0 -0
  89. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  90. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_json/pyproject.toml +0 -0
  91. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_json/test.py +0 -0
  92. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_toon/README.md +0 -0
  93. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  94. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_toon/pyproject.toml +0 -0
  95. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/packages/llm_to_toon/test.py +0 -0
  96. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/__init__.py +0 -0
  97. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/_internal/__init__.py +0 -0
  98. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/_internal/json_encoder.py +0 -0
  99. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/__init__.py +0 -0
  100. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/async_deep_agent.py +0 -0
  101. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep/__init__.py +0 -0
  102. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep/planner.py +0 -0
  103. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep/subagents.py +0 -0
  104. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep/summarizer.py +0 -0
  105. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep/vfs.py +0 -0
  106. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep_agent.py +0 -0
  107. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep_prompts.py +0 -0
  108. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/deep_state.py +0 -0
  109. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/live_events.py +0 -0
  110. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/persona.py +0 -0
  111. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/review_loop.py +0 -0
  112. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/simulated_tools.py +0 -0
  113. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/skill_miner.py +0 -0
  114. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/skills.py +0 -0
  115. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/tool_grammars.py +0 -0
  116. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/tools_schema.py +0 -0
  117. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/agents/types.py +0 -0
  118. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/aio/__init__.py +0 -0
  119. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/bridges/__init__.py +0 -0
  120. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/bridges/tukuy_backend.py +0 -0
  121. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/checkpoints/__init__.py +0 -0
  122. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/checkpoints/core.py +0 -0
  123. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/checkpoints/stores.py +0 -0
  124. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/checkpoints/types.py +0 -0
  125. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/citations/__init__.py +0 -0
  126. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/citations/core.py +0 -0
  127. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/citations/types.py +0 -0
  128. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/cli/__init__.py +0 -0
  129. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/cli/cli.py +0 -0
  130. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/cli/formatters.py +0 -0
  131. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/cli/runner.py +0 -0
  132. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/cli/server.py +0 -0
  133. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/__init__.py +0 -0
  134. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/dedup.py +0 -0
  135. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/evol.py +0 -0
  136. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/filters.py +0 -0
  137. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/formats.py +0 -0
  138. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/schemas.py +0 -0
  139. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/seed.py +0 -0
  140. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/dataset/synth.py +0 -0
  141. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/__init__.py +0 -0
  142. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/_openai_compat.py +0 -0
  143. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/_openai_compat_stream.py +0 -0
  144. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/_prompt_cache.py +0 -0
  145. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/_prompted_tool_stream.py +0 -0
  146. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/airllm_driver.py +0 -0
  147. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/assemblyai_stt_driver.py +0 -0
  148. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_airllm_driver.py +0 -0
  149. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
  150. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_azure_driver.py +0 -0
  151. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_bedrock_driver.py +0 -0
  152. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
  153. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_cachibot_driver.py +0 -0
  154. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
  155. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_claude_driver.py +0 -0
  156. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_cohere_driver.py +0 -0
  157. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
  158. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
  159. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
  160. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_deepseek_driver.py +0 -0
  161. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
  162. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
  163. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
  164. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
  165. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_google_driver.py +0 -0
  166. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_google_img_gen_driver.py +0 -0
  167. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_google_vertexai_driver.py +0 -0
  168. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_grok_driver.py +0 -0
  169. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
  170. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
  171. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_groq_driver.py +0 -0
  172. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_hugging_driver.py +0 -0
  173. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
  174. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_jina_rerank_driver.py +0 -0
  175. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
  176. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
  177. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_lmstudio_driver.py +0 -0
  178. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_local_http_driver.py +0 -0
  179. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
  180. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_minimax_driver.py +0 -0
  181. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
  182. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_mistral_driver.py +0 -0
  183. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
  184. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_modelscope_driver.py +0 -0
  185. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_moonshot_driver.py +0 -0
  186. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
  187. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
  188. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_ollama_driver.py +0 -0
  189. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
  190. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_compatible_driver.py +0 -0
  191. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_driver.py +0 -0
  192. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
  193. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_moderation_driver.py +0 -0
  194. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_stt_driver.py +0 -0
  195. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openai_tts_driver.py +0 -0
  196. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_openrouter_driver.py +0 -0
  197. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
  198. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_registry.py +0 -0
  199. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
  200. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_runway_tts_driver.py +0 -0
  201. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
  202. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
  203. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_stt_base.py +0 -0
  204. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_tts_base.py +0 -0
  205. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
  206. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/async_zai_driver.py +0 -0
  207. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/audio_registry.py +0 -0
  208. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/azure_config.py +0 -0
  209. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/azure_driver.py +0 -0
  210. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/bedrock_driver.py +0 -0
  211. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/bfl_img_gen_driver.py +0 -0
  212. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/cachibot_driver.py +0 -0
  213. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/cartesia_tts_driver.py +0 -0
  214. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/claude_driver.py +0 -0
  215. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/cohere_driver.py +0 -0
  216. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/cohere_rerank_driver.py +0 -0
  217. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/deepgram_stt_driver.py +0 -0
  218. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/deepgram_tts_driver.py +0 -0
  219. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/deepseek_driver.py +0 -0
  220. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/driver_registry.py +0 -0
  221. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
  222. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
  223. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/embedding_registry.py +0 -0
  224. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/fal_img_gen_driver.py +0 -0
  225. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/fal_video_gen_driver.py +0 -0
  226. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/google_driver.py +0 -0
  227. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/google_img_gen_driver.py +0 -0
  228. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/google_vertexai_driver.py +0 -0
  229. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/grok_driver.py +0 -0
  230. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/grok_img_gen_driver.py +0 -0
  231. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/grok_video_gen_driver.py +0 -0
  232. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/groq_driver.py +0 -0
  233. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/hugging_driver.py +0 -0
  234. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
  235. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/img_gen_registry.py +0 -0
  236. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/jina_rerank_driver.py +0 -0
  237. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/job_runner.py +0 -0
  238. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/kling_img_gen_driver.py +0 -0
  239. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/kling_video_gen_driver.py +0 -0
  240. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/lipsync_registry.py +0 -0
  241. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/lmstudio_driver.py +0 -0
  242. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/local_http_driver.py +0 -0
  243. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/luma_video_gen_driver.py +0 -0
  244. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/media_capabilities.py +0 -0
  245. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/minimax_driver.py +0 -0
  246. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/minimax_video_gen_driver.py +0 -0
  247. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/mistral_driver.py +0 -0
  248. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/mistral_moderation_driver.py +0 -0
  249. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/modelscope_driver.py +0 -0
  250. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/moderation_base.py +0 -0
  251. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/moderation_registry.py +0 -0
  252. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/moonshot_driver.py +0 -0
  253. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/muapi_aggregator_driver.py +0 -0
  254. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/music_registry.py +0 -0
  255. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/mxbai_rerank_driver.py +0 -0
  256. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/ollama_driver.py +0 -0
  257. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/ollama_embedding_driver.py +0 -0
  258. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_compatible_driver.py +0 -0
  259. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_driver.py +0 -0
  260. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_img_gen_driver.py +0 -0
  261. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_moderation_driver.py +0 -0
  262. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_stt_driver.py +0 -0
  263. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openai_tts_driver.py +0 -0
  264. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/openrouter_driver.py +0 -0
  265. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/pika_video_gen_driver.py +0 -0
  266. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/provider_branding.py +0 -0
  267. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/provider_descriptors.py +0 -0
  268. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/registry.py +0 -0
  269. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/rerank_base.py +0 -0
  270. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/rerank_registry.py +0 -0
  271. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/runway_audio_transform_driver.py +0 -0
  272. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/runway_capabilities.py +0 -0
  273. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/runway_img_gen_driver.py +0 -0
  274. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/runway_tts_driver.py +0 -0
  275. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/runway_video_gen_driver.py +0 -0
  276. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/stability_img_gen_driver.py +0 -0
  277. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/stt_base.py +0 -0
  278. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/tts_base.py +0 -0
  279. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/vertex_img_gen_driver.py +0 -0
  280. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/video_gen_registry.py +0 -0
  281. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/vision_helpers.py +0 -0
  282. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/voyage_rerank_driver.py +0 -0
  283. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/drivers/zai_driver.py +0 -0
  284. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/eval/__init__.py +0 -0
  285. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/eval/base.py +0 -0
  286. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/eval/faithfulness.py +0 -0
  287. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/eval/judge.py +0 -0
  288. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/eval/pairwise.py +0 -0
  289. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/eval/self_consistency.py +0 -0
  290. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/exceptions.py +0 -0
  291. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/__init__.py +0 -0
  292. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/async_core.py +0 -0
  293. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/code_extraction.py +0 -0
  294. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/core.py +0 -0
  295. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/few_shot.py +0 -0
  296. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/fields.py +0 -0
  297. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/reasoning.py +0 -0
  298. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/strategy.py +0 -0
  299. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/streaming.py +0 -0
  300. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/tools.py +0 -0
  301. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/tukuy_bridge.py +0 -0
  302. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/extraction/validator.py +0 -0
  303. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/groups/__init__.py +0 -0
  304. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/groups/async_groups.py +0 -0
  305. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/groups/consensus.py +0 -0
  306. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/groups/groups.py +0 -0
  307. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/groups/types.py +0 -0
  308. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/imaging/__init__.py +0 -0
  309. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/imaging/enhance.py +0 -0
  310. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/imaging/negative.py +0 -0
  311. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/imaging/set_planner.py +0 -0
  312. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/imaging/style_presets.py +0 -0
  313. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/budget.py +0 -0
  314. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/cache.py +0 -0
  315. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/callbacks.py +0 -0
  316. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/capabilities.py +0 -0
  317. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/coding_agent_events.py +0 -0
  318. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/coding_agent_specs.py +0 -0
  319. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/coding_agents.py +0 -0
  320. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/discovery.py +0 -0
  321. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/ledger.py +0 -0
  322. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/logging.py +0 -0
  323. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/media_pricing.py +0 -0
  324. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/media_rates.json +0 -0
  325. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/model_rates.py +0 -0
  326. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/pricing.py +0 -0
  327. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/provider_env.py +0 -0
  328. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/anthropic.json +0 -0
  329. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/azure.json +0 -0
  330. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/bedrock.json +0 -0
  331. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/cerebras.json +0 -0
  332. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/cohere.json +0 -0
  333. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/deepinfra.json +0 -0
  334. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/deepseek.json +0 -0
  335. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/fireworks.json +0 -0
  336. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/google.json +0 -0
  337. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/google_vertexai.json +0 -0
  338. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/groq.json +0 -0
  339. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/jina.json +0 -0
  340. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/mistral.json +0 -0
  341. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/mixedbread.json +0 -0
  342. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/moonshot.json +0 -0
  343. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/nomic.json +0 -0
  344. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/nvidia.json +0 -0
  345. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/openai.json +0 -0
  346. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/openrouter.json +0 -0
  347. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/perplexity.json +0 -0
  348. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/sambanova.json +0 -0
  349. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/siliconflow.json +0 -0
  350. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/together.json +0 -0
  351. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/voyage.json +0 -0
  352. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/rates/xai.json +0 -0
  353. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/session.py +0 -0
  354. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/settings.py +0 -0
  355. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/infra/tukuy_backend.py +0 -0
  356. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/__init__.py +0 -0
  357. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/chunking.py +0 -0
  358. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/detect.py +0 -0
  359. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/document.py +0 -0
  360. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/__init__.py +0 -0
  361. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/base.py +0 -0
  362. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/csv_parser.py +0 -0
  363. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/docx.py +0 -0
  364. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/html.py +0 -0
  365. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/markdown.py +0 -0
  366. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/pdf.py +0 -0
  367. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/ingestion/parsers/xlsx.py +0 -0
  368. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/integrations/__init__.py +0 -0
  369. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/integrations/mcp_bridge.py +0 -0
  370. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/integrations/tukuy_bridge.py +0 -0
  371. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/kg/__init__.py +0 -0
  372. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/kg/core.py +0 -0
  373. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/kg/stores.py +0 -0
  374. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/kg/types.py +0 -0
  375. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/mcp/__init__.py +0 -0
  376. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/mcp/client.py +0 -0
  377. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/mcp/server.py +0 -0
  378. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/mcp/tools.py +0 -0
  379. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/media/__init__.py +0 -0
  380. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/media/agent_tools.py +0 -0
  381. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/media/audio.py +0 -0
  382. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/media/hosting.py +0 -0
  383. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/media/image.py +0 -0
  384. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/media/video.py +0 -0
  385. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/01-why-prompture.md +0 -0
  386. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/02-installation.md +0 -0
  387. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/03-quickstart.md +0 -0
  388. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/04-toon-input.md +0 -0
  389. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/05-test-harness.md +0 -0
  390. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/06-stability.md +0 -0
  391. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pages/07-migration.md +0 -0
  392. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/persistence/__init__.py +0 -0
  393. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/persistence/history.py +0 -0
  394. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/persistence/serialization.py +0 -0
  395. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/persistence/store.py +0 -0
  396. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pipeline/__init__.py +0 -0
  397. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pipeline/pipeline.py +0 -0
  398. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pipeline/resolver.py +0 -0
  399. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/pipeline/routing.py +0 -0
  400. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/__init__.py +0 -0
  401. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/base.py +0 -0
  402. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/__init__.py +0 -0
  403. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/_aliases.py +0 -0
  404. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
  405. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/audio_plugin.py +0 -0
  406. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/cloud_plugin.py +0 -0
  407. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
  408. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/extras_plugin.py +0 -0
  409. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/google_plugin.py +0 -0
  410. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/image_plugin.py +0 -0
  411. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/local_plugin.py +0 -0
  412. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
  413. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/openai_plugin.py +0 -0
  414. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/builtins/video_plugin.py +0 -0
  415. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/plugins/discovery.py +0 -0
  416. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/py.typed +0 -0
  417. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/__init__.py +0 -0
  418. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/__init__.py +0 -0
  419. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/base.py +0 -0
  420. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/character.py +0 -0
  421. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/chunker_registry.py +0 -0
  422. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/contextual.py +0 -0
  423. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/markdown.py +0 -0
  424. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/recursive.py +0 -0
  425. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/chunkers/token.py +0 -0
  426. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/documents.py +0 -0
  427. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loader_registry.py +0 -0
  428. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/__init__.py +0 -0
  429. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/csv_loader.py +0 -0
  430. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/docx_loader.py +0 -0
  431. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/epub_loader.py +0 -0
  432. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/html_loader.py +0 -0
  433. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/json_loader.py +0 -0
  434. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/markdown_loader.py +0 -0
  435. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/pdf_loader.py +0 -0
  436. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/text_loader.py +0 -0
  437. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/loaders/xlsx_loader.py +0 -0
  438. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/pipeline.py +0 -0
  439. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/__init__.py +0 -0
  440. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/_fusion.py +0 -0
  441. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/base.py +0 -0
  442. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/hybrid.py +0 -0
  443. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/hyde.py +0 -0
  444. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/mmr.py +0 -0
  445. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/multi_query.py +0 -0
  446. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/retriever_registry.py +0 -0
  447. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/similarity.py +0 -0
  448. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/retrievers/step_back.py +0 -0
  449. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/__init__.py +0 -0
  450. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
  451. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/refusal/__init__.py +0 -0
  452. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/refusal/detector.py +0 -0
  453. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/refusal/evaluator.py +0 -0
  454. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/refusal/markers.py +0 -0
  455. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/__init__.py +0 -0
  456. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/generator.py +0 -0
  457. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  458. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/README.md.j2 +0 -0
  459. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/config.py.j2 +0 -0
  460. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/env.example.j2 +0 -0
  461. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/main.py.j2 +0 -0
  462. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/models.py.j2 +0 -0
  463. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  464. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/security/__init__.py +0 -0
  465. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/security/injection.py +0 -0
  466. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/security/redaction.py +0 -0
  467. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/session_memory/__init__.py +0 -0
  468. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/session_memory/core.py +0 -0
  469. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/session_memory/stores.py +0 -0
  470. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/session_memory/types.py +0 -0
  471. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/__init__.py +0 -0
  472. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/environment.py +0 -0
  473. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/memory.py +0 -0
  474. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/scheduler.py +0 -0
  475. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/swarm.py +0 -0
  476. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/swarm_agent.py +0 -0
  477. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/swarm/types.py +0 -0
  478. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/testing/__init__.py +0 -0
  479. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/testing/driver_contract.py +0 -0
  480. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/tools/__init__.py +0 -0
  481. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/tools/code_exec.py +0 -0
  482. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/tools/web_search.py +0 -0
  483. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/__init__.py +0 -0
  484. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/architect.py +0 -0
  485. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/engine.py +0 -0
  486. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/errors.py +0 -0
  487. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/model.py +0 -0
  488. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/references.py +0 -0
  489. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/registry.py +0 -0
  490. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/scheduler.py +0 -0
  491. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture/workflow/state.py +0 -0
  492. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture.egg-info/dependency_links.txt +0 -0
  493. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture.egg-info/entry_points.txt +0 -0
  494. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture.egg-info/requires.txt +0 -0
  495. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture.egg-info/top_level.txt +0 -0
  496. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/prompture_cost_tracking.md +0 -0
  497. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/pyproject.toml +0 -0
  498. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/requirements.txt +0 -0
  499. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/scripts/check_pricing_freshness.py +0 -0
  500. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/setup.cfg +0 -0
  501. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/specs/basic_extraction.json +0 -0
  502. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/specs/schema_validation.json +0 -0
  503. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/specs/strategy_comparison.json +0 -0
  504. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/test.py +0 -0
  505. {prompture-1.9.1.dev1 → prompture-1.9.1.dev3}/test_version_diagnosis.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 1.9.1.dev1
3
+ Version: 1.9.1.dev3
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
@@ -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.9.1.dev1'
22
- __version_tuple__ = version_tuple = (1, 9, 1, 'dev1')
21
+ __version__ = version = '1.9.1.dev3'
22
+ __version_tuple__ = version_tuple = (1, 9, 1, 'dev3')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -133,7 +133,9 @@ def _get_first_param_name(fn: Callable[..., Any]) -> str:
133
133
  return ""
134
134
 
135
135
 
136
- def _parse_simulated_tool_call(content: str) -> tuple[str, dict[str, Any]] | None:
136
+ def _parse_simulated_tool_call(
137
+ content: str, known_tools: Any | None = None
138
+ ) -> tuple[str, dict[str, Any]] | None:
137
139
  """Recognise a prompted (simulated) tool call recorded as assistant text.
138
140
 
139
141
  Drivers without ``supports_tool_use`` go through
@@ -154,10 +156,17 @@ def _parse_simulated_tool_call(content: str) -> tuple[str, dict[str, Any]] | Non
154
156
  return None
155
157
  if not isinstance(obj, dict):
156
158
  return None
157
- # Explicit discriminator, or the inferred shape parse_simulated_response
158
- # also accepts when the model omits "type".
159
- if obj.get("type") != "tool_call" and not ("name" in obj and "arguments" in obj):
160
- return None
159
+ if obj.get("type") != "tool_call":
160
+ # Inferred shape (no discriminator), which parse_simulated_response
161
+ # also accepts when the model omits "type".
162
+ if not ("name" in obj and "arguments" in obj):
163
+ return None
164
+ # A structured ANSWER can legitimately carry name+arguments keys (a
165
+ # schema echo, a function description). When the caller can tell us
166
+ # which tools exist, only reclassify when the name matches one —
167
+ # otherwise the model's final output would silently vanish.
168
+ if known_tools is not None and obj.get("name") not in known_tools:
169
+ return None
161
170
  name = obj.get("name")
162
171
  args = obj.get("arguments", {})
163
172
  if not isinstance(name, str) or not name or not isinstance(args, dict):
@@ -378,6 +387,44 @@ class Agent(Generic[DepsType]):
378
387
  """Set agent-level callbacks."""
379
388
  self._agent_callbacks = value
380
389
 
390
+ @property
391
+ def driver(self):
392
+ """The driver instance this agent will run against, or ``None``."""
393
+ return self._driver
394
+
395
+ @driver.setter
396
+ def driver(self, value) -> None:
397
+ """Swap the driver (e.g. per-tenant credentials).
398
+
399
+ A persistent conversation built against the old driver is detected as
400
+ stale on the next run and rebuilt, so the swap takes effect there too.
401
+ """
402
+ self._driver = value
403
+
404
+ @property
405
+ def options(self) -> dict[str, Any]:
406
+ """Live per-call options dict (temperature, max_tokens, ...).
407
+
408
+ Mutations (``agent.options["temperature"] = 0.2``) apply from the
409
+ next run onward.
410
+ """
411
+ return self._options
412
+
413
+ @options.setter
414
+ def options(self, value: dict[str, Any] | None) -> None:
415
+ self._options = dict(value) if value else {}
416
+
417
+ @property
418
+ def system_prompt(self):
419
+ """The configured system prompt (str, Persona, or callable)."""
420
+ return self._system_prompt
421
+
422
+ @system_prompt.setter
423
+ def system_prompt(self, value) -> None:
424
+ """Replace the system prompt; re-resolved on every run, including
425
+ for persistent conversations."""
426
+ self._system_prompt = value
427
+
381
428
  @property
382
429
  def conversation(self) -> Conversation | None:
383
430
  """The current persistent conversation, or ``None``."""
@@ -881,6 +928,9 @@ class Agent(Generic[DepsType]):
881
928
  # Respect the newly resolved system prompt for this run.
882
929
  if system_prompt is not None:
883
930
  conv.system_prompt = system_prompt
931
+ # Pick up option mutations made since the conversation was
932
+ # built (agent.options is a live public dict).
933
+ conv._options = dict(self._options)
884
934
  # Update tools and callbacks for this run.
885
935
  # NOTE: assigning ``callbacks`` mutates the driver instance,
886
936
  # which may be shared (e.g. passed to several agents). A
@@ -1176,7 +1226,9 @@ class Agent(Generic[DepsType]):
1176
1226
  )
1177
1227
  all_tool_calls.append({"name": name, "arguments": args, "id": tc.get("id", "")})
1178
1228
  else:
1179
- simulated = _parse_simulated_tool_call(content)
1229
+ simulated = _parse_simulated_tool_call(
1230
+ content, known_tools=(self._tools.names if self._tools else None)
1231
+ )
1180
1232
  if simulated is not None:
1181
1233
  # Prompted tool call: same step shape as the native path
1182
1234
  # so a host sees one run, not two dialects.
@@ -384,13 +384,25 @@ class Assistant:
384
384
  ) -> AssistantResult:
385
385
  agent = self._build_async_agent(call_vars=call_vars)
386
386
  result: AgentResult = await agent.run(prompt, deps=deps)
387
+ # AgentResult.usage is a DICT (prompt_tokens/completion_tokens/cost) —
388
+ # getattr on a dict returns the default, so the attribute-style reads
389
+ # left cost_usd/input_tokens/output_tokens permanently None on the LLM
390
+ # backend and every host that trusted them recorded $0.00 forever.
387
391
  usage = getattr(result, "usage", None)
392
+ if isinstance(usage, dict):
393
+ cost_usd = usage.get("cost")
394
+ input_tokens = usage.get("prompt_tokens")
395
+ output_tokens = usage.get("completion_tokens")
396
+ else:
397
+ cost_usd = getattr(usage, "total_cost_usd", None) if usage else None
398
+ input_tokens = getattr(usage, "input_tokens", None) if usage else None
399
+ output_tokens = getattr(usage, "output_tokens", None) if usage else None
388
400
  return AssistantResult(
389
401
  output=getattr(result, "output", "") or "",
390
402
  backend="llm",
391
- cost_usd=getattr(usage, "total_cost_usd", None) if usage else None,
392
- input_tokens=getattr(usage, "input_tokens", None) if usage else None,
393
- output_tokens=getattr(usage, "output_tokens", None) if usage else None,
403
+ cost_usd=cost_usd,
404
+ input_tokens=input_tokens,
405
+ output_tokens=output_tokens,
394
406
  session_id=None,
395
407
  raw=result,
396
408
  )
@@ -56,7 +56,7 @@ _DEFAULT_MAX_AGENT_DEPTH = 5
56
56
 
57
57
  # Share the same ContextVar with the sync Agent so depth tracking crosses
58
58
  # agent boundaries (e.g. a sync Agent calling an AsyncAgent as a tool).
59
- from .agent import _agent_depth
59
+ from .agent import _agent_depth, _parse_simulated_tool_call
60
60
 
61
61
  # ------------------------------------------------------------------
62
62
  # Helpers
@@ -321,6 +321,44 @@ class AsyncAgent(Generic[DepsType]):
321
321
  """Set agent-level callbacks."""
322
322
  self._agent_callbacks = value
323
323
 
324
+ @property
325
+ def driver(self):
326
+ """The driver instance this agent will run against, or ``None``."""
327
+ return self._driver
328
+
329
+ @driver.setter
330
+ def driver(self, value) -> None:
331
+ """Swap the driver (e.g. per-tenant credentials).
332
+
333
+ A persistent conversation built against the old driver is detected as
334
+ stale on the next run and rebuilt, so the swap takes effect there too.
335
+ """
336
+ self._driver = value
337
+
338
+ @property
339
+ def options(self) -> dict[str, Any]:
340
+ """Live per-call options dict (temperature, max_tokens, ...).
341
+
342
+ Mutations (``agent.options["temperature"] = 0.2``) apply from the
343
+ next run onward.
344
+ """
345
+ return self._options
346
+
347
+ @options.setter
348
+ def options(self, value: dict[str, Any] | None) -> None:
349
+ self._options = dict(value) if value else {}
350
+
351
+ @property
352
+ def system_prompt(self):
353
+ """The configured system prompt (str, Persona, or callable)."""
354
+ return self._system_prompt
355
+
356
+ @system_prompt.setter
357
+ def system_prompt(self, value) -> None:
358
+ """Replace the system prompt; re-resolved on every run, including
359
+ for persistent conversations."""
360
+ self._system_prompt = value
361
+
324
362
  @property
325
363
  def conversation(self) -> Any:
326
364
  """The current persistent conversation, or ``None``."""
@@ -921,6 +959,9 @@ class AsyncAgent(Generic[DepsType]):
921
959
  # Respect the newly resolved system prompt for this run.
922
960
  if system_prompt is not None:
923
961
  conv.system_prompt = system_prompt
962
+ # Pick up option mutations made since the conversation was
963
+ # built (agent.options is a live public dict).
964
+ conv._options = dict(self._options)
924
965
  # NOTE: assigning ``callbacks`` mutates the driver instance,
925
966
  # which may be shared (e.g. passed to several agents). A
926
967
  # persistent-conversation agent should treat its driver as
@@ -1150,8 +1191,15 @@ class AsyncAgent(Generic[DepsType]):
1150
1191
  for rec in tool_timings or []:
1151
1192
  timings_by_name.setdefault(rec.get("name", ""), []).append(rec)
1152
1193
 
1194
+ # Name of a simulated tool call awaiting its result, which the prompted
1195
+ # loop records as the next user message rather than a "tool" message.
1196
+ pending_sim_tool: str | None = None
1197
+
1153
1198
  for msg in messages:
1154
1199
  role = msg.get("role", "")
1200
+ # Claim (and clear) any simulated call left by the previous message.
1201
+ sim_tool = pending_sim_tool
1202
+ pending_sim_tool = None
1155
1203
  # Extract usage from message meta if present
1156
1204
  msg_meta = msg.get("meta")
1157
1205
  step_usage = None
@@ -1204,14 +1252,45 @@ class AsyncAgent(Generic[DepsType]):
1204
1252
  )
1205
1253
  all_tool_calls.append({"name": name, "arguments": args, "id": tc.get("id", "")})
1206
1254
  else:
1207
- steps.append(
1208
- AgentStep(
1209
- step_type=StepType.output,
1210
- timestamp=now,
1211
- content=content,
1212
- usage=step_usage,
1255
+ simulated = _parse_simulated_tool_call(
1256
+ content, known_tools=(self._tools.names if self._tools else None)
1257
+ )
1258
+ if simulated is not None:
1259
+ # Prompted tool call: same step shape as the native path
1260
+ # so a host sees one run, not two dialects.
1261
+ sim_name, sim_args = simulated
1262
+ steps.append(
1263
+ AgentStep(
1264
+ step_type=StepType.tool_call,
1265
+ timestamp=now,
1266
+ content="",
1267
+ tool_name=sim_name,
1268
+ tool_args=sim_args,
1269
+ usage=step_usage,
1270
+ )
1213
1271
  )
1272
+ all_tool_calls.append({"name": sim_name, "arguments": sim_args, "id": ""})
1273
+ pending_sim_tool = sim_name
1274
+ else:
1275
+ steps.append(
1276
+ AgentStep(
1277
+ step_type=StepType.output,
1278
+ timestamp=now,
1279
+ content=content,
1280
+ usage=step_usage,
1281
+ )
1282
+ )
1283
+
1284
+ elif role == "user" and sim_tool is not None:
1285
+ # The prompted loop stores a tool result as a user message.
1286
+ steps.append(
1287
+ AgentStep(
1288
+ step_type=StepType.tool_result,
1289
+ timestamp=now,
1290
+ content=msg.get("content", "") or "",
1291
+ tool_name=sim_tool,
1214
1292
  )
1293
+ )
1215
1294
 
1216
1295
  elif role == "tool":
1217
1296
  tool_call_id = msg.get("tool_call_id")
@@ -187,6 +187,19 @@ class AsyncConversation:
187
187
  """The reasoning/thinking content from the last LLM response, if any."""
188
188
  return self._last_reasoning
189
189
 
190
+ def _assistant_message(self, content: str) -> dict[str, Any]:
191
+ """Assistant history entry for the response just consumed.
192
+
193
+ Attaches ``reasoning_content`` when the response carried it, so the
194
+ trace survives in history on every path (plain ask, tool loop,
195
+ streaming, JSON asks) -- not only the with-tool-calls branch -- and
196
+ providers that require reasoning to be echoed back keep working.
197
+ """
198
+ msg: dict[str, Any] = {"role": "assistant", "content": content}
199
+ if self._last_reasoning:
200
+ msg["reasoning_content"] = self._last_reasoning
201
+ return msg
202
+
190
203
  @property
191
204
  def messages(self) -> list[dict[str, Any]]:
192
205
  """Read-only view of the conversation history."""
@@ -546,7 +559,7 @@ class AsyncConversation:
546
559
  text: str = resp.get("text", "")
547
560
  self._last_reasoning = resp.get("reasoning_content")
548
561
  self._accumulate_usage(resp.get("meta", {}))
549
- self._messages.append({"role": "assistant", "content": text})
562
+ self._messages.append(self._assistant_message(text))
550
563
  return text
551
564
 
552
565
  async def _final_answer_simulated(self, augmented_system: str, merged: dict[str, Any]) -> str:
@@ -642,7 +655,7 @@ class AsyncConversation:
642
655
 
643
656
  user_content = self._build_content_with_images(content, images)
644
657
  self._messages.append({"role": "user", "content": user_content})
645
- self._messages.append({"role": "assistant", "content": text})
658
+ self._messages.append(self._assistant_message(text))
646
659
  self._accumulate_usage(meta)
647
660
 
648
661
  return text
@@ -680,7 +693,7 @@ class AsyncConversation:
680
693
 
681
694
  if not tool_calls:
682
695
  self._last_reasoning = resp.get("reasoning_content")
683
- self._messages.append({"role": "assistant", "content": text})
696
+ self._messages.append(self._assistant_message(text))
684
697
  return text
685
698
 
686
699
  # Ensure every tool call has a usable id so parallel calls
@@ -782,7 +795,7 @@ class AsyncConversation:
782
795
 
783
796
  if not tool_calls:
784
797
  self._last_reasoning = resp.get("reasoning_content")
785
- self._messages.append({"role": "assistant", "content": text})
798
+ self._messages.append(self._assistant_message(text))
786
799
  yield {"type": "text_delta", "text": text}
787
800
  return
788
801
 
@@ -1259,7 +1272,7 @@ class AsyncConversation:
1259
1272
  )
1260
1273
  raise
1261
1274
 
1262
- self._messages.append({"role": "assistant", "content": full_text})
1275
+ self._messages.append(self._assistant_message(full_text))
1263
1276
 
1264
1277
  async def ask_stream(
1265
1278
  self,
@@ -1382,7 +1395,7 @@ class AsyncConversation:
1382
1395
  else:
1383
1396
  raise
1384
1397
 
1385
- self._messages.append({"role": "assistant", "content": cleaned})
1398
+ self._messages.append(self._assistant_message(cleaned))
1386
1399
  self._accumulate_usage(meta)
1387
1400
 
1388
1401
  model_name = self._model_name
@@ -189,6 +189,19 @@ class Conversation:
189
189
  """The reasoning/thinking content from the last LLM response, if any."""
190
190
  return self._last_reasoning
191
191
 
192
+ def _assistant_message(self, content: str) -> dict[str, Any]:
193
+ """Assistant history entry for the response just consumed.
194
+
195
+ Attaches ``reasoning_content`` when the response carried it, so the
196
+ trace survives in history on every path (plain ask, tool loop,
197
+ streaming, JSON asks) -- not only the with-tool-calls branch -- and
198
+ providers that require reasoning to be echoed back keep working.
199
+ """
200
+ msg: dict[str, Any] = {"role": "assistant", "content": content}
201
+ if self._last_reasoning:
202
+ msg["reasoning_content"] = self._last_reasoning
203
+ return msg
204
+
192
205
  @property
193
206
  def messages(self) -> list[dict[str, Any]]:
194
207
  """Read-only view of the conversation history."""
@@ -550,7 +563,7 @@ class Conversation:
550
563
  text: str = resp.get("text", "")
551
564
  self._last_reasoning = resp.get("reasoning_content")
552
565
  self._accumulate_usage(resp.get("meta", {}))
553
- self._messages.append({"role": "assistant", "content": text})
566
+ self._messages.append(self._assistant_message(text))
554
567
  return text
555
568
 
556
569
  def _final_answer_simulated(self, augmented_system: str, merged: dict[str, Any]) -> str:
@@ -656,7 +669,7 @@ class Conversation:
656
669
  # Record in history — store content with images for context
657
670
  user_content = self._build_content_with_images(content, images)
658
671
  self._messages.append({"role": "user", "content": user_content})
659
- self._messages.append({"role": "assistant", "content": text})
672
+ self._messages.append(self._assistant_message(text))
660
673
  self._accumulate_usage(meta)
661
674
 
662
675
  return text
@@ -696,7 +709,7 @@ class Conversation:
696
709
  if not tool_calls:
697
710
  # No tool calls -> final response
698
711
  self._last_reasoning = resp.get("reasoning_content")
699
- self._messages.append({"role": "assistant", "content": text})
712
+ self._messages.append(self._assistant_message(text))
700
713
  return text
701
714
 
702
715
  # Ensure every tool call has a usable id so parallel calls
@@ -808,7 +821,7 @@ class Conversation:
808
821
  if not tool_calls:
809
822
  # Final response — stream it if possible
810
823
  self._last_reasoning = resp.get("reasoning_content")
811
- self._messages.append({"role": "assistant", "content": text})
824
+ self._messages.append(self._assistant_message(text))
812
825
  # Yield final text as deltas (single chunk since we already have the full text)
813
826
  yield {"type": "text_delta", "text": text}
814
827
  return
@@ -1296,7 +1309,7 @@ class Conversation:
1296
1309
  )
1297
1310
  raise
1298
1311
 
1299
- self._messages.append({"role": "assistant", "content": full_text})
1312
+ self._messages.append(self._assistant_message(full_text))
1300
1313
 
1301
1314
  def ask_stream(
1302
1315
  self,
@@ -1517,7 +1530,7 @@ class Conversation:
1517
1530
  raise
1518
1531
 
1519
1532
  # Store assistant response in history
1520
- self._messages.append({"role": "assistant", "content": cleaned})
1533
+ self._messages.append(self._assistant_message(cleaned))
1521
1534
  self._accumulate_usage(meta)
1522
1535
 
1523
1536
  model_name = self._model_name
@@ -0,0 +1,118 @@
1
+ """Shared usage recording for media driver hook wrappers.
2
+
3
+ Media calls bill per image / second / job rather than per token, so the text
4
+ drivers' ``_auto_record_usage`` doesn't fit — but the spend is just as real,
5
+ and until this helper existed it never reached the usage tracker: media cost
6
+ lived only on the immediate response ``meta`` and vanished unless the caller
7
+ kept it. Every media ``*_with_hooks`` wrapper now records one
8
+ :class:`~prompture.infra.tracker.UsageEvent` (zero tokens, ``cost`` from meta,
9
+ unit count in ``metadata``) through the same global tracker as text calls, so
10
+ sinks and the SQLite ledger see the whole picture.
11
+
12
+ Fire-and-forget, mirroring the text bases: recording must never break the
13
+ generation it measures.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ from typing import Any
19
+
20
+
21
+ def record_embedding_driver_usage(
22
+ driver: Any,
23
+ meta: dict[str, Any] | None,
24
+ elapsed_ms: float,
25
+ *,
26
+ text_count: int,
27
+ status: str = "success",
28
+ error: Exception | None = None,
29
+ ) -> None:
30
+ """Record one embedding call as a usage event. Never raises.
31
+
32
+ Embeddings are input-only, so the token count lands on both
33
+ ``prompt_tokens`` and ``total_tokens``.
34
+ """
35
+ try:
36
+ from ..infra.ledger import _resolve_api_key_hash
37
+ from ..infra.tracker import UsageEvent, get_tracker
38
+
39
+ tracker = get_tracker()
40
+ if not tracker._enabled:
41
+ return
42
+
43
+ meta = meta or {}
44
+ driver_name = str(meta.get("model_name") or getattr(driver, "model", driver.__class__.__name__))
45
+
46
+ if "/" in driver_name:
47
+ provider, model = driver_name.split("/", 1)
48
+ else:
49
+ cls_name = driver.__class__.__name__.removeprefix("Async")
50
+ provider = cls_name.removesuffix("Driver").lower()
51
+ model = driver_name
52
+
53
+ model_name = f"{provider}/{model}" if provider else model
54
+ tokens = int(meta.get("total_tokens") or 0)
55
+
56
+ event = UsageEvent(
57
+ model_name=model_name,
58
+ provider=provider,
59
+ api_key_hash=_resolve_api_key_hash(model_name),
60
+ prompt_tokens=tokens,
61
+ total_tokens=tokens,
62
+ cost=float(meta.get("cost") or 0.0),
63
+ elapsed_ms=elapsed_ms,
64
+ status=status,
65
+ error_type=type(error).__name__ if error else None,
66
+ metadata={"modality": "embedding", "count": text_count},
67
+ )
68
+ tracker.record(event)
69
+ except Exception:
70
+ pass # fire-and-forget
71
+
72
+
73
+ def record_media_usage(
74
+ driver: Any,
75
+ meta: dict[str, Any] | None,
76
+ elapsed_ms: float,
77
+ *,
78
+ modality: str,
79
+ count_key: str,
80
+ status: str = "success",
81
+ error: Exception | None = None,
82
+ ) -> None:
83
+ """Record one media generation as a usage event. Never raises."""
84
+ try:
85
+ from ..infra.ledger import _resolve_api_key_hash
86
+ from ..infra.tracker import UsageEvent, get_tracker
87
+
88
+ tracker = get_tracker()
89
+ if not tracker._enabled:
90
+ return
91
+
92
+ meta = meta or {}
93
+ driver_name = str(meta.get("model_name") or getattr(driver, "model", driver.__class__.__name__))
94
+
95
+ if "/" in driver_name:
96
+ provider, model = driver_name.split("/", 1)
97
+ else:
98
+ # Same class-name fallback as the text bases, Async prefix stripped
99
+ # so async twins attribute to the same provider.
100
+ cls_name = driver.__class__.__name__.removeprefix("Async")
101
+ provider = cls_name.removesuffix("Driver").lower()
102
+ model = driver_name
103
+
104
+ model_name = f"{provider}/{model}" if provider else model
105
+
106
+ event = UsageEvent(
107
+ model_name=model_name,
108
+ provider=provider,
109
+ api_key_hash=_resolve_api_key_hash(model_name),
110
+ cost=float(meta.get("cost") or 0.0),
111
+ elapsed_ms=elapsed_ms,
112
+ status=status,
113
+ error_type=type(error).__name__ if error else None,
114
+ metadata={"modality": modality, "count": int(meta.get(count_key) or 0)},
115
+ )
116
+ tracker.record(event)
117
+ except Exception:
118
+ pass # fire-and-forget