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.
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/PKG-INFO +4 -2
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/_version.py +2 -2
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/agent.py +269 -57
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/async_agent.py +377 -145
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/async_conversation.py +280 -63
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/conversation.py +276 -42
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/live_events.py +14 -3
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/tool_grammars.py +17 -4
- prompture-1.7.1.dev1/prompture/agents/tools_schema.py +1181 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/types.py +10 -7
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_openai_compat_stream.py +84 -18
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_prompted_tool_stream.py +21 -17
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_base.py +9 -2
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_claude_driver.py +40 -9
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_google_driver.py +31 -17
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_driver.py +6 -2
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/base.py +265 -13
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/claude_driver.py +40 -10
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/google_driver.py +40 -20
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/groq_driver.py +8 -8
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_driver.py +7 -9
- {prompture-1.6.1.dev1/prompture/integrations → prompture-1.7.1.dev1/prompture/extraction}/tukuy_bridge.py +77 -3
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/integrations/__init__.py +19 -0
- prompture-1.7.1.dev1/prompture/integrations/mcp_bridge.py +224 -0
- prompture-1.7.1.dev1/prompture/integrations/tukuy_bridge.py +42 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/PKG-INFO +4 -2
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/SOURCES.txt +1 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/requires.txt +4 -1
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/pyproject.toml +2 -1
- prompture-1.6.1.dev1/prompture/agents/tools_schema.py +0 -572
- prompture-1.6.1.dev1/prompture/extraction/tukuy_bridge.py +0 -476
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.env.copy +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/FUNDING.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/dev.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/documentation.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/publish.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.github/workflows/security.yml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/.safety-project.ini +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/AGENTS.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/BREAKING_CHANGES.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/CLAUDE.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/CONTRIBUTING.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/LICENSE +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/MANIFEST.in +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/README.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/ROADMAP.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/SECURITY.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/dev.ps1 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/dev.sh +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/mypy_errors.txt +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/README.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/README.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_json/test.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/_internal/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/_internal/json_encoder.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/assistant.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/deep_state.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/persona.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/review_loop.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/agents/skills.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/aio/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/bridges/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/core.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/stores.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/checkpoints/types.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/citations/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/citations/core.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/citations/types.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/cli.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/formatters.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/runner.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/cli/server.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/dedup.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/evol.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/filters.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/formats.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/schemas.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/seed.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/dataset/synth.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_openai_compat.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/_prompt_cache.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_compatible_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/azure_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_compatible_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/provider_descriptors.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/faithfulness.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/judge.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/pairwise.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/eval/self_consistency.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/exceptions.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/async_core.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/code_extraction.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/core.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/few_shot.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/fields.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/strategy.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/streaming.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/tools.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/extraction/validator.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/async_groups.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/consensus.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/debate.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/groups.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/groups/types.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/budget.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/cache.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/callbacks.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/capabilities.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/coding_agent_events.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/coding_agent_specs.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/coding_agents.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/discovery.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/ledger.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/logging.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/model_rates.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/pricing.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/provider_env.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/google.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/together.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/session.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/settings.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/tracker.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/detect.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/document.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/core.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/stores.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/kg/types.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/audio.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/image.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/media/video.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/02-installation.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/06-stability.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pages/07-migration.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/history.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/serialization.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/persistence/store.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/pipeline/routing.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/plugins/discovery.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/py.typed +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/contextual.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/documents.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/pipeline.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/hyde.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/retrievers/step_back.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/detector.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/refusal/markers.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/generator.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/security/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/security/injection.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/security/redaction.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/core.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/stores.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/session_memory/types.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/environment.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/memory.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/scheduler.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/swarm.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/swarm_agent.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/swarm/types.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/testing/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/tools/__init__.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/tools/code_exec.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture/tools/web_search.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/prompture_cost_tracking.md +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/requirements.txt +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/setup.cfg +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/specs/basic_extraction.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/specs/schema_validation.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/specs/strategy_comparison.json +0 -0
- {prompture-1.6.1.dev1 → prompture-1.7.1.dev1}/test.py +0 -0
- {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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1,
|
|
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,
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
#
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
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
|
|
797
|
-
|
|
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.
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
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=
|
|
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,
|
|
1112
|
-
``conv.
|
|
1113
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|