prompture 1.12.2.dev1__tar.gz → 1.12.3.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/CLAUDE.md +4 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/PKG-INFO +161 -1
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/README.md +156 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/__init__.py +14 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/_version.py +2 -2
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/cli.py +35 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/server.py +46 -95
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/__init__.py +7 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_registry.py +7 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/decision_registry.py +11 -6
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/provider_descriptors.py +4 -1
- prompture-1.12.3.dev1/prompture/gateway/__init__.py +92 -0
- prompture-1.12.3.dev1/prompture/gateway/anthropic_format.py +411 -0
- prompture-1.12.3.dev1/prompture/gateway/openai_format.py +462 -0
- prompture-1.12.3.dev1/prompture/gateway/reasoning_cache.py +99 -0
- prompture-1.12.3.dev1/prompture/gateway/responses_format.py +381 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/__init__.py +7 -0
- prompture-1.12.3.dev1/prompture/groups/fusion.py +257 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/__init__.py +6 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/coding_agents.py +16 -2
- prompture-1.12.3.dev1/prompture/infra/compression.py +109 -0
- prompture-1.12.3.dev1/prompture/infra/otel.py +176 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/routing.py +8 -0
- prompture-1.12.3.dev1/prompture/resilience/__init__.py +102 -0
- prompture-1.12.3.dev1/prompture/resilience/async_driver.py +254 -0
- prompture-1.12.3.dev1/prompture/resilience/backoff.py +48 -0
- prompture-1.12.3.dev1/prompture/resilience/breaker.py +207 -0
- prompture-1.12.3.dev1/prompture/resilience/driver.py +310 -0
- prompture-1.12.3.dev1/prompture/resilience/errors.py +381 -0
- prompture-1.12.3.dev1/prompture/resilience/explain.py +72 -0
- prompture-1.12.3.dev1/prompture/resilience/keys.py +100 -0
- prompture-1.12.3.dev1/prompture/resilience/router.py +289 -0
- prompture-1.12.3.dev1/prompture/resilience/strategies.py +201 -0
- prompture-1.12.3.dev1/prompture/resilience/virtual.py +387 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/PKG-INFO +161 -1
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/SOURCES.txt +19 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/requires.txt +6 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/scm_file_list.json +27 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/pyproject.toml +3 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.env.copy +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/FUNDING.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/dev.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/documentation.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/publish.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.github/workflows/security.yml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/.safety-project.ini +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/AGENTS.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/BREAKING_CHANGES.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/CONTRIBUTING.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/LICENSE +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/MANIFEST.in +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/ROADMAP.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/SECURITY.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/VERSION +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/dev.ps1 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/dev.sh +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/mypy_errors.txt +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/README.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/README.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_json/test.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/_internal/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/_internal/json_encoder.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/agent.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/assistant.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/async_agent.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/async_conversation.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/conversation.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/deep_state.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/live_events.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/persona.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/review_loop.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/skill_miner.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/skills.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/tool_grammars.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/tools_schema.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/agents/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/aio/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/bridges/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/core.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/stores.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/checkpoints/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/citations/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/citations/core.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/citations/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/formatters.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/cli/runner.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/dedup.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/evol.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/filters.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/formats.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/schemas.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/seed.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/dataset/synth.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_media_usage.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_openai_compat.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_openai_compat_stream.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_openai_responses.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_prompt_cache.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_prompted_tool_stream.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/_usage_reporting.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/aggregator_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_aggregator_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_claude_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_kev_decision_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_laya_decision_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_compatible_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/azure_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/claude_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/decision_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/google_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/groq_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/job_runner.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/kev_decision_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/laya_decision_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/lipsync_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/lipsync_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/media_capabilities.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/muapi_aggregator_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/music_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/music_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_compatible_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/provider_branding.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/systemone_compatible_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/typesafe_decision_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/faithfulness.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/judge.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/pairwise.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/eval/self_consistency.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/exceptions.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/context.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/context_eval.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/data/document_qa_policies.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/data/extraction_contacts.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/data/tool_task_inventory.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/fixtures.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/gates.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/harness.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/candidates.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/optimizer.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/promotion.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/improve/scorecard.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/integration.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/outcomes.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/policy.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/sandbox.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/scoring.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/critique.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/direct.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/strategies/retrieve.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/execution/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/_usage.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/async_core.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/code_extraction.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/core.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/few_shot.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/fields.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/strategy.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/streaming.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/tools.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/tukuy_bridge.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/extraction/validator.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/async_groups.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/consensus.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/debate.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/groups.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/groups/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/enhance.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/negative.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/set_planner.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/imaging/style_presets.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/billing.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/budget.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/cache.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/callbacks.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/capabilities.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/coding_agent_events.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/coding_agent_specs.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/discovery.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/ledger.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/logging.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/media_pricing.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/media_rates.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/model_rates.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/pricing.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/provider_env.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/google.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/kev.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/laya.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/together.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/typesafe.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/session.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/settings.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/token_counting.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/tracker.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/detect.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/document.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/integrations/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/integrations/mcp_bridge.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/integrations/tukuy_bridge.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/jobs.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/core.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/stores.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/kg/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/client.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/server.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/mcp/tools.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/agent_tools.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/audio.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/hosting.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/image.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/media/video.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/02-installation.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/06-stability.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pages/07-migration.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/history.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/serialization.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/persistence/store.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/decision_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/plugins/discovery.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/py.typed +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/contextual.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/documents.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/pipeline.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/hyde.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/retrievers/step_back.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/detector.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/refusal/markers.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/generator.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/security/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/security/injection.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/security/redaction.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/core.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/stores.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/session_memory/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/environment.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/memory.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/scheduler.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/swarm.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/swarm_agent.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/swarm/types.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/testing/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/tools/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/tools/code_exec.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/tools/web_search.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/__init__.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/architect.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/engine.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/errors.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/model.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/nodes.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/recovery.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/references.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/registry.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/scheduler.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture/workflow/state.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/prompture_cost_tracking.md +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/requirements.txt +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/setup.cfg +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/specs/basic_extraction.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/specs/schema_validation.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/specs/strategy_comparison.json +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/test.py +0 -0
- {prompture-1.12.2.dev1 → prompture-1.12.3.dev1}/test_version_diagnosis.py +0 -0
|
@@ -70,6 +70,10 @@ Configuration is in `pyproject.toml` under `[tool.ruff]`.
|
|
|
70
70
|
- **`prompture/field_definitions.py`** — Thread-safe global field registry with 50+ predefined fields, template variable substitution (`{{current_year}}`, `{{current_date}}`), and Pydantic Field generation via `field_from_registry()`.
|
|
71
71
|
- **`prompture/infra/settings.py`** — Pydantic-settings `Settings` class loading provider API keys/endpoints from `.env`.
|
|
72
72
|
- **`prompture/infra/discovery.py`** — `get_available_models()` plus per-modality helpers (`get_available_image_gen_models`, `get_available_video_gen_models`, `get_available_audio_models`). Auto-detects models from configured providers via static `*_PRICING` / `KNOWN_MODELS` tables, dynamic provider listing endpoints (Ollama, ElevenLabs), and models.dev capability fallback.
|
|
73
|
+
- **`prompture/resilience/`** — `resilient()` / `ResilientDriver` (+ async): a composite Driver that retries, parks, rotates keys and fails over across targets. `errors.py` is the error→action decision table (`classify_error`, extensible via `register_error_rule`); `breaker.py` holds lazy-recovery circuit breakers scoped by provider/model/key; `keys.py` builds key pools from `{PROVIDER}_API_KEYS`. Every result carries `meta["route"]` (served_by, fallback, attempts).
|
|
74
|
+
- **`prompture/gateway/`** — framework-agnostic wire formats. `anthropic_format.py` (Anthropic Messages: `anthropic_to_driver`, `stream_anthropic_events`, `live_events_for`) and `responses_format.py` (OpenAI Responses) sit beside the OpenAI chat format; `reasoning_cache.py` replays `reasoning_content` for stateless clients. OpenAI chat format: request→driver messages/options (`to_driver_messages`, `driver_options` incl. `response_format`→`json_mode`), `run_chat`/`arun_chat`, `chat_completion`/`chat_chunk`, `stream_chat_chunks` (with `on_complete` metering hook), `sse`. Used by `prompture serve` and prompture-hub — keep response shaping here, not in servers.
|
|
75
|
+
- **Virtual models** — `combo/<name>`, `auto/<mode>`, `fusion/<name>` (`groups/fusion.py`) and aliases resolve in `resilience/virtual.py`, called at the top of `get_driver_for_model` / `get_async_driver_for_model`.
|
|
76
|
+
- **`prompture/infra/otel.py`** / **`infra/compression.py`** — GenAI-convention OpenTelemetry spans via `DriverCallbacks`; conservative message compression for agent loops.
|
|
73
77
|
- **`prompture/runner.py`** — Spec-driven test suite runner for cross-model comparison.
|
|
74
78
|
- **`prompture/validator.py`** — JSON schema validation via jsonschema with fallback.
|
|
75
79
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prompture
|
|
3
|
-
Version: 1.12.
|
|
3
|
+
Version: 1.12.3.dev1
|
|
4
4
|
Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
|
|
5
5
|
Author-email: Juan Denis <juan@vene.co>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -67,6 +67,10 @@ Requires-Dist: fastapi>=0.100; extra == "serve"
|
|
|
67
67
|
Requires-Dist: uvicorn[standard]>=0.20; extra == "serve"
|
|
68
68
|
Requires-Dist: sse-starlette>=1.6; extra == "serve"
|
|
69
69
|
Requires-Dist: python-multipart>=0.0.9; extra == "serve"
|
|
70
|
+
Provides-Extra: hub
|
|
71
|
+
Requires-Dist: prompture-hub>=0.0.3; extra == "hub"
|
|
72
|
+
Provides-Extra: otel
|
|
73
|
+
Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
|
|
70
74
|
Provides-Extra: scaffold
|
|
71
75
|
Requires-Dist: jinja2>=3.0; extra == "scaffold"
|
|
72
76
|
Provides-Extra: rag-pdf
|
|
@@ -177,6 +181,8 @@ print(person.name) # Maria
|
|
|
177
181
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
178
182
|
|
|
179
183
|
**Ops**
|
|
184
|
+
- Resilient routing — `resilient()` retries transient errors, honors `Retry-After`, rotates API keys, trips circuit breakers and fails over across models; every response records who served it — see [Resilient Routing](#resilient-routing)
|
|
185
|
+
- [prompture-hub](#prompture-hub-gateway--dashboard) — optional companion app: web dashboard, scoped per-app keys, spend caps and per-call metering (`pip install prompture[hub]`)
|
|
180
186
|
- `prompture serve` — OpenAI-compatible server (`/v1/chat/completions`, `/v1/embeddings`, `/v1/coding-agents`, …) routes any client to any provider
|
|
181
187
|
- Usage tracking — tokens + cost on every call
|
|
182
188
|
- Response cache — memory, SQLite, Redis backends
|
|
@@ -210,6 +216,7 @@ use.
|
|
|
210
216
|
|---|---|---|
|
|
211
217
|
| `redis` | Redis cache backend | `pip install prompture[redis]` |
|
|
212
218
|
| `serve` | FastAPI server mode (`prompture serve`) | `pip install prompture[serve]` |
|
|
219
|
+
| `hub` | [prompture-hub](#prompture-hub-gateway--dashboard) — gateway + dashboard with scoped keys and spend caps | `pip install prompture[hub]` |
|
|
213
220
|
| `airllm` | AirLLM local inference | `pip install prompture[airllm]` |
|
|
214
221
|
| `bedrock` | AWS Bedrock driver (`boto3`) | `pip install prompture[bedrock]` |
|
|
215
222
|
| `sandbox` | Sandboxed Python execution tool (`tukuy`) | `pip install prompture[sandbox]` |
|
|
@@ -1106,6 +1113,126 @@ for attempt in result["attempts"]:
|
|
|
1106
1113
|
|
|
1107
1114
|
If every model fails and no `fallback` is provided, an `ExtractionError` is raised with the full `attempts` list, `total_cost`, and `total_tokens` attached as attributes.
|
|
1108
1115
|
|
|
1116
|
+
### Resilient Routing
|
|
1117
|
+
|
|
1118
|
+
`resilient()` wraps several models (and several API keys) into **one driver**. It retries transient failures, waits out short rate limits, parks broken or throttled targets, and fails over to the next model — while exposing the normal driver interface, so it drops into `Conversation`, `Agent`, `ask_for_json`, `extract_with_model` and `prompture serve` unchanged.
|
|
1119
|
+
|
|
1120
|
+
```python
|
|
1121
|
+
from prompture import Conversation, resilient
|
|
1122
|
+
|
|
1123
|
+
driver = resilient(
|
|
1124
|
+
"openai/gpt-4o", # preferred
|
|
1125
|
+
"claude/claude-sonnet-4-5", # if OpenAI is down / rate limited
|
|
1126
|
+
"ollama/llama3.1:8b", # local last resort
|
|
1127
|
+
)
|
|
1128
|
+
|
|
1129
|
+
conv = Conversation(driver=driver)
|
|
1130
|
+
print(conv.ask("Summarize this ticket: ..."))
|
|
1131
|
+
|
|
1132
|
+
resp = driver.generate_messages([{"role": "user", "content": "hi"}], {})
|
|
1133
|
+
resp["meta"]["route"]
|
|
1134
|
+
# {"served_by": "claude/claude-sonnet-4-5", "fallback": True, "key_id": None,
|
|
1135
|
+
# "attempts": [{"model": "openai/gpt-4o", "outcome": "error",
|
|
1136
|
+
# "error": {"category": "rate_limit", "status_code": 429, "retry_after": 20.0, ...}},
|
|
1137
|
+
# {"model": "claude/claude-sonnet-4-5", "outcome": "ok", "elapsed_ms": 812.4}]}
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
What happens on each failure is decided by a small, extensible table (`prompture.resilience.classify_error`), which understands `DriverHTTPError`, `requests`/`httpx` errors, OpenAI/Anthropic SDK errors and wrapped exceptions:
|
|
1141
|
+
|
|
1142
|
+
| Error | Action |
|
|
1143
|
+
|---|---|
|
|
1144
|
+
| Timeout, connection reset, 500/502/504 | Retry the same model with exponential backoff |
|
|
1145
|
+
| 429, 503/529 overloaded | Park that model/key for `Retry-After` and move on (wait inline if it's the last option) |
|
|
1146
|
+
| 401/402, `insufficient_quota` | Disable that key for an hour and move on |
|
|
1147
|
+
| 404, context length exceeded, content filter, unsupported feature | Skip to the next model without penalizing its health |
|
|
1148
|
+
| Other 400/422 | Raise immediately — no model will fix a bad request |
|
|
1149
|
+
|
|
1150
|
+
**Key rotation** — set several keys and each model expands to one target per key, rotated round-robin; a key that returns 401 or runs out of quota is parked while the others keep serving:
|
|
1151
|
+
|
|
1152
|
+
```bash
|
|
1153
|
+
OPENAI_API_KEYS=sk-one,sk-two,sk-three
|
|
1154
|
+
```
|
|
1155
|
+
|
|
1156
|
+
Or in code: `register_key_pool("openai", ["sk-one", "sk-two"])`.
|
|
1157
|
+
|
|
1158
|
+
**Circuit breakers** are shared process-wide per provider, model and key, and recover lazily (no background threads): after repeated failures a target is skipped until its recovery window passes, then a single probe request decides whether it comes back. Inspect them with `prompture.resilience.get_breaker_registry().snapshot()`.
|
|
1159
|
+
|
|
1160
|
+
Tune timings with `RetryPolicy(max_attempts=3, max_wait=10, ...)`, add provider-specific rules with `register_error_rule(ErrorRule(...))`, and use `async_resilient()` for async drivers. Streams fail over transparently until the first chunk is sent.
|
|
1161
|
+
|
|
1162
|
+
**Combos, aliases and `auto/` models** — give a routing policy a name and use it anywhere a model string goes (`get_driver_for_model`, `Conversation(model_name=...)`, `prompture serve`, prompture-hub):
|
|
1163
|
+
|
|
1164
|
+
```python
|
|
1165
|
+
from prompture import Conversation, register_combo, register_model_alias
|
|
1166
|
+
|
|
1167
|
+
register_combo(
|
|
1168
|
+
"chat",
|
|
1169
|
+
["openai/gpt-4o", "claude/claude-sonnet-4-5", "groq/llama-3.3-70b-versatile"],
|
|
1170
|
+
strategy="latency", # priority | round_robin | weighted | latency | p2c | last_good | cheapest
|
|
1171
|
+
sticky=True, # keep a conversation on one API key so prompt caches stay warm
|
|
1172
|
+
)
|
|
1173
|
+
register_model_alias("default", "combo/chat")
|
|
1174
|
+
|
|
1175
|
+
Conversation(model_name="default").ask("hi") # routed through the combo
|
|
1176
|
+
Conversation(model_name="auto/cheap").ask("hi") # cheapest configured chat models, across providers
|
|
1177
|
+
```
|
|
1178
|
+
|
|
1179
|
+
`auto/<mode>` builds a fallback chain from whichever providers you have keys for — `auto/cheap`, `auto/fast`, `auto/best`, `auto/balanced`, or a pricing tier `auto/budget` / `auto/standard` / `auto/premium`. Combos and aliases can also live in JSON, loaded with `load_combos(path)` or automatically from `PROMPTURE_COMBOS_FILE`:
|
|
1180
|
+
|
|
1181
|
+
```json
|
|
1182
|
+
{
|
|
1183
|
+
"combos": {"chat": {"targets": ["openai/gpt-4o", "claude/claude-sonnet-4-5"], "strategy": "latency"}},
|
|
1184
|
+
"aliases": {"default": "combo/chat", "fast": "groq/llama-3.3-70b-versatile"}
|
|
1185
|
+
}
|
|
1186
|
+
```
|
|
1187
|
+
|
|
1188
|
+
**Why did it route there?** `explain_route(resp["meta"]["route"])` turns the trace into plain text:
|
|
1189
|
+
|
|
1190
|
+
```
|
|
1191
|
+
Served by claude/claude-sonnet-4-5 after 2 attempts — strategy: latency
|
|
1192
|
+
1. openai/gpt-4o — rate_limit (429), retry after 20s, parked, 312 ms
|
|
1193
|
+
2. claude/claude-sonnet-4-5 — ok, 812 ms
|
|
1194
|
+
```
|
|
1195
|
+
|
|
1196
|
+
### Fusion (panel + judge)
|
|
1197
|
+
|
|
1198
|
+
Ask several models in parallel and have a judge write one answer from their (anonymized, shuffled) responses. Failed or slow panelists are skipped; with one surviving answer the judge is bypassed. It's a driver too, so it works as a model name:
|
|
1199
|
+
|
|
1200
|
+
```python
|
|
1201
|
+
from prompture import Conversation
|
|
1202
|
+
from prompture.groups import register_fusion
|
|
1203
|
+
|
|
1204
|
+
register_fusion(
|
|
1205
|
+
"council",
|
|
1206
|
+
panel=["openai/gpt-4o", "claude/claude-sonnet-4-5", "google/gemini-2.5-pro"],
|
|
1207
|
+
judge="claude/claude-opus-4-6",
|
|
1208
|
+
timeout=60,
|
|
1209
|
+
)
|
|
1210
|
+
Conversation(model_name="fusion/council").ask("Design a rate limiter for a multi-tenant API.")
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
`resp["meta"]["fusion"]` lists each panelist's outcome, latency and cost; token and cost totals include the judge.
|
|
1214
|
+
|
|
1215
|
+
### Prompt Compression
|
|
1216
|
+
|
|
1217
|
+
`compress_messages()` makes conservative, meaning-preserving cuts that matter most in agent loops, where tool output dominates the bill. It trims older oversized tool results to a head+tail window, collapses whitespace in system/tool text and drops repeated system prompts. User and assistant prose, and the latest tool result, are left alone.
|
|
1218
|
+
|
|
1219
|
+
```python
|
|
1220
|
+
from prompture.infra import compress_messages
|
|
1221
|
+
|
|
1222
|
+
messages, stats = compress_messages(messages, max_tool_chars=6000)
|
|
1223
|
+
stats.saved_chars, stats.tool_results_trimmed
|
|
1224
|
+
```
|
|
1225
|
+
|
|
1226
|
+
### Observability — OpenTelemetry
|
|
1227
|
+
|
|
1228
|
+
`instrument_driver()` emits one span per driver call following the GenAI semantic conventions (`gen_ai.request.model`, `gen_ai.usage.input_tokens`, …) plus `prompture.cost_usd` and, for resilient drivers, who served the call and whether it fell back. Prompt/completion text is only recorded with `capture_content=True`.
|
|
1229
|
+
|
|
1230
|
+
```python
|
|
1231
|
+
from prompture import instrument_driver, resilient # pip install "prompture[otel]"
|
|
1232
|
+
|
|
1233
|
+
driver = instrument_driver(resilient("openai/gpt-4o", "claude/claude-sonnet-4-5"))
|
|
1234
|
+
```
|
|
1235
|
+
|
|
1109
1236
|
### TOON Input — Token Savings
|
|
1110
1237
|
|
|
1111
1238
|
Analyze structured data with automatic TOON conversion for 45-60% fewer tokens:
|
|
@@ -1980,6 +2107,39 @@ Selected flags:
|
|
|
1980
2107
|
|
|
1981
2108
|
Full example walkthrough: [`examples/openai_server_example.md`](examples/openai_server_example.md).
|
|
1982
2109
|
|
|
2110
|
+
## prompture-hub: Gateway + Dashboard
|
|
2111
|
+
|
|
2112
|
+
Want a UI, or want to let other apps use your provider keys without handing them out? **[prompture-hub](https://github.com/jhd3197/prompture-hub)** is the companion app: a self-hosted gateway and web dashboard built on Prompture.
|
|
2113
|
+
|
|
2114
|
+
```
|
|
2115
|
+
your apps / Cursor / Claude Code / scripts
|
|
2116
|
+
│ hub-issued keys (ph_…)
|
|
2117
|
+
▼
|
|
2118
|
+
┌─────────────────────────────┐
|
|
2119
|
+
│ prompture-hub │ dashboard · scoped keys · spend caps
|
|
2120
|
+
│ (FastAPI + React, SQLite) │ rate limits · usage + cost per call
|
|
2121
|
+
└──────────────┬──────────────┘
|
|
2122
|
+
│ Prompture drivers, resilience, gateway format
|
|
2123
|
+
▼
|
|
2124
|
+
OpenAI · Anthropic · Google · Groq · Ollama · … (real keys stay here)
|
|
2125
|
+
```
|
|
2126
|
+
|
|
2127
|
+
```bash
|
|
2128
|
+
pip install "prompture[hub]"
|
|
2129
|
+
prompture hub # dashboard at http://localhost:1984/
|
|
2130
|
+
```
|
|
2131
|
+
|
|
2132
|
+
| | `prompture serve` | prompture-hub |
|
|
2133
|
+
|---|---|---|
|
|
2134
|
+
| Use it for | One app / local dev, one shared bearer token | Many apps or people sharing your provider keys |
|
|
2135
|
+
| Keys | Single optional `--api-key` | Per-app hub keys, revocable, hashed at rest |
|
|
2136
|
+
| Limits | Model allowlist, per-IP rate limit | Per-key model allowlist, spend caps (day/week/month), rate limits |
|
|
2137
|
+
| Visibility | Logs | Dashboard: usage, cost, latency, conversations |
|
|
2138
|
+
| Protocols | OpenAI chat completions, embeddings, media | OpenAI chat completions + Responses API, Anthropic Messages API (Claude Code), embeddings |
|
|
2139
|
+
| Extras | Server-side tools (`--sandbox`, `--web-search`), media endpoints | Analytics dashboard, `prompture-hub setup <tool>` for Claude Code / Codex / Cursor / Aider, key expiry + IP allowlists, OAuth login |
|
|
2140
|
+
|
|
2141
|
+
Both build on the same wire-format code in `prompture.gateway` (OpenAI chat completions, OpenAI Responses, Anthropic Messages), so responses, streaming events and usage blocks are identical — and both accept `combo/`, `auto/`, `fusion/` and alias model names.
|
|
2142
|
+
|
|
1983
2143
|
## Integrating & Extending
|
|
1984
2144
|
|
|
1985
2145
|
- **FastAPI integration patterns** (AsyncAgent + tools, SSE streaming, structured endpoints, error handling) — see [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md#integrating-prompture-into-your-project)
|
|
@@ -70,6 +70,8 @@ print(person.name) # Maria
|
|
|
70
70
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
71
71
|
|
|
72
72
|
**Ops**
|
|
73
|
+
- Resilient routing — `resilient()` retries transient errors, honors `Retry-After`, rotates API keys, trips circuit breakers and fails over across models; every response records who served it — see [Resilient Routing](#resilient-routing)
|
|
74
|
+
- [prompture-hub](#prompture-hub-gateway--dashboard) — optional companion app: web dashboard, scoped per-app keys, spend caps and per-call metering (`pip install prompture[hub]`)
|
|
73
75
|
- `prompture serve` — OpenAI-compatible server (`/v1/chat/completions`, `/v1/embeddings`, `/v1/coding-agents`, …) routes any client to any provider
|
|
74
76
|
- Usage tracking — tokens + cost on every call
|
|
75
77
|
- Response cache — memory, SQLite, Redis backends
|
|
@@ -103,6 +105,7 @@ use.
|
|
|
103
105
|
|---|---|---|
|
|
104
106
|
| `redis` | Redis cache backend | `pip install prompture[redis]` |
|
|
105
107
|
| `serve` | FastAPI server mode (`prompture serve`) | `pip install prompture[serve]` |
|
|
108
|
+
| `hub` | [prompture-hub](#prompture-hub-gateway--dashboard) — gateway + dashboard with scoped keys and spend caps | `pip install prompture[hub]` |
|
|
106
109
|
| `airllm` | AirLLM local inference | `pip install prompture[airllm]` |
|
|
107
110
|
| `bedrock` | AWS Bedrock driver (`boto3`) | `pip install prompture[bedrock]` |
|
|
108
111
|
| `sandbox` | Sandboxed Python execution tool (`tukuy`) | `pip install prompture[sandbox]` |
|
|
@@ -999,6 +1002,126 @@ for attempt in result["attempts"]:
|
|
|
999
1002
|
|
|
1000
1003
|
If every model fails and no `fallback` is provided, an `ExtractionError` is raised with the full `attempts` list, `total_cost`, and `total_tokens` attached as attributes.
|
|
1001
1004
|
|
|
1005
|
+
### Resilient Routing
|
|
1006
|
+
|
|
1007
|
+
`resilient()` wraps several models (and several API keys) into **one driver**. It retries transient failures, waits out short rate limits, parks broken or throttled targets, and fails over to the next model — while exposing the normal driver interface, so it drops into `Conversation`, `Agent`, `ask_for_json`, `extract_with_model` and `prompture serve` unchanged.
|
|
1008
|
+
|
|
1009
|
+
```python
|
|
1010
|
+
from prompture import Conversation, resilient
|
|
1011
|
+
|
|
1012
|
+
driver = resilient(
|
|
1013
|
+
"openai/gpt-4o", # preferred
|
|
1014
|
+
"claude/claude-sonnet-4-5", # if OpenAI is down / rate limited
|
|
1015
|
+
"ollama/llama3.1:8b", # local last resort
|
|
1016
|
+
)
|
|
1017
|
+
|
|
1018
|
+
conv = Conversation(driver=driver)
|
|
1019
|
+
print(conv.ask("Summarize this ticket: ..."))
|
|
1020
|
+
|
|
1021
|
+
resp = driver.generate_messages([{"role": "user", "content": "hi"}], {})
|
|
1022
|
+
resp["meta"]["route"]
|
|
1023
|
+
# {"served_by": "claude/claude-sonnet-4-5", "fallback": True, "key_id": None,
|
|
1024
|
+
# "attempts": [{"model": "openai/gpt-4o", "outcome": "error",
|
|
1025
|
+
# "error": {"category": "rate_limit", "status_code": 429, "retry_after": 20.0, ...}},
|
|
1026
|
+
# {"model": "claude/claude-sonnet-4-5", "outcome": "ok", "elapsed_ms": 812.4}]}
|
|
1027
|
+
```
|
|
1028
|
+
|
|
1029
|
+
What happens on each failure is decided by a small, extensible table (`prompture.resilience.classify_error`), which understands `DriverHTTPError`, `requests`/`httpx` errors, OpenAI/Anthropic SDK errors and wrapped exceptions:
|
|
1030
|
+
|
|
1031
|
+
| Error | Action |
|
|
1032
|
+
|---|---|
|
|
1033
|
+
| Timeout, connection reset, 500/502/504 | Retry the same model with exponential backoff |
|
|
1034
|
+
| 429, 503/529 overloaded | Park that model/key for `Retry-After` and move on (wait inline if it's the last option) |
|
|
1035
|
+
| 401/402, `insufficient_quota` | Disable that key for an hour and move on |
|
|
1036
|
+
| 404, context length exceeded, content filter, unsupported feature | Skip to the next model without penalizing its health |
|
|
1037
|
+
| Other 400/422 | Raise immediately — no model will fix a bad request |
|
|
1038
|
+
|
|
1039
|
+
**Key rotation** — set several keys and each model expands to one target per key, rotated round-robin; a key that returns 401 or runs out of quota is parked while the others keep serving:
|
|
1040
|
+
|
|
1041
|
+
```bash
|
|
1042
|
+
OPENAI_API_KEYS=sk-one,sk-two,sk-three
|
|
1043
|
+
```
|
|
1044
|
+
|
|
1045
|
+
Or in code: `register_key_pool("openai", ["sk-one", "sk-two"])`.
|
|
1046
|
+
|
|
1047
|
+
**Circuit breakers** are shared process-wide per provider, model and key, and recover lazily (no background threads): after repeated failures a target is skipped until its recovery window passes, then a single probe request decides whether it comes back. Inspect them with `prompture.resilience.get_breaker_registry().snapshot()`.
|
|
1048
|
+
|
|
1049
|
+
Tune timings with `RetryPolicy(max_attempts=3, max_wait=10, ...)`, add provider-specific rules with `register_error_rule(ErrorRule(...))`, and use `async_resilient()` for async drivers. Streams fail over transparently until the first chunk is sent.
|
|
1050
|
+
|
|
1051
|
+
**Combos, aliases and `auto/` models** — give a routing policy a name and use it anywhere a model string goes (`get_driver_for_model`, `Conversation(model_name=...)`, `prompture serve`, prompture-hub):
|
|
1052
|
+
|
|
1053
|
+
```python
|
|
1054
|
+
from prompture import Conversation, register_combo, register_model_alias
|
|
1055
|
+
|
|
1056
|
+
register_combo(
|
|
1057
|
+
"chat",
|
|
1058
|
+
["openai/gpt-4o", "claude/claude-sonnet-4-5", "groq/llama-3.3-70b-versatile"],
|
|
1059
|
+
strategy="latency", # priority | round_robin | weighted | latency | p2c | last_good | cheapest
|
|
1060
|
+
sticky=True, # keep a conversation on one API key so prompt caches stay warm
|
|
1061
|
+
)
|
|
1062
|
+
register_model_alias("default", "combo/chat")
|
|
1063
|
+
|
|
1064
|
+
Conversation(model_name="default").ask("hi") # routed through the combo
|
|
1065
|
+
Conversation(model_name="auto/cheap").ask("hi") # cheapest configured chat models, across providers
|
|
1066
|
+
```
|
|
1067
|
+
|
|
1068
|
+
`auto/<mode>` builds a fallback chain from whichever providers you have keys for — `auto/cheap`, `auto/fast`, `auto/best`, `auto/balanced`, or a pricing tier `auto/budget` / `auto/standard` / `auto/premium`. Combos and aliases can also live in JSON, loaded with `load_combos(path)` or automatically from `PROMPTURE_COMBOS_FILE`:
|
|
1069
|
+
|
|
1070
|
+
```json
|
|
1071
|
+
{
|
|
1072
|
+
"combos": {"chat": {"targets": ["openai/gpt-4o", "claude/claude-sonnet-4-5"], "strategy": "latency"}},
|
|
1073
|
+
"aliases": {"default": "combo/chat", "fast": "groq/llama-3.3-70b-versatile"}
|
|
1074
|
+
}
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
**Why did it route there?** `explain_route(resp["meta"]["route"])` turns the trace into plain text:
|
|
1078
|
+
|
|
1079
|
+
```
|
|
1080
|
+
Served by claude/claude-sonnet-4-5 after 2 attempts — strategy: latency
|
|
1081
|
+
1. openai/gpt-4o — rate_limit (429), retry after 20s, parked, 312 ms
|
|
1082
|
+
2. claude/claude-sonnet-4-5 — ok, 812 ms
|
|
1083
|
+
```
|
|
1084
|
+
|
|
1085
|
+
### Fusion (panel + judge)
|
|
1086
|
+
|
|
1087
|
+
Ask several models in parallel and have a judge write one answer from their (anonymized, shuffled) responses. Failed or slow panelists are skipped; with one surviving answer the judge is bypassed. It's a driver too, so it works as a model name:
|
|
1088
|
+
|
|
1089
|
+
```python
|
|
1090
|
+
from prompture import Conversation
|
|
1091
|
+
from prompture.groups import register_fusion
|
|
1092
|
+
|
|
1093
|
+
register_fusion(
|
|
1094
|
+
"council",
|
|
1095
|
+
panel=["openai/gpt-4o", "claude/claude-sonnet-4-5", "google/gemini-2.5-pro"],
|
|
1096
|
+
judge="claude/claude-opus-4-6",
|
|
1097
|
+
timeout=60,
|
|
1098
|
+
)
|
|
1099
|
+
Conversation(model_name="fusion/council").ask("Design a rate limiter for a multi-tenant API.")
|
|
1100
|
+
```
|
|
1101
|
+
|
|
1102
|
+
`resp["meta"]["fusion"]` lists each panelist's outcome, latency and cost; token and cost totals include the judge.
|
|
1103
|
+
|
|
1104
|
+
### Prompt Compression
|
|
1105
|
+
|
|
1106
|
+
`compress_messages()` makes conservative, meaning-preserving cuts that matter most in agent loops, where tool output dominates the bill. It trims older oversized tool results to a head+tail window, collapses whitespace in system/tool text and drops repeated system prompts. User and assistant prose, and the latest tool result, are left alone.
|
|
1107
|
+
|
|
1108
|
+
```python
|
|
1109
|
+
from prompture.infra import compress_messages
|
|
1110
|
+
|
|
1111
|
+
messages, stats = compress_messages(messages, max_tool_chars=6000)
|
|
1112
|
+
stats.saved_chars, stats.tool_results_trimmed
|
|
1113
|
+
```
|
|
1114
|
+
|
|
1115
|
+
### Observability — OpenTelemetry
|
|
1116
|
+
|
|
1117
|
+
`instrument_driver()` emits one span per driver call following the GenAI semantic conventions (`gen_ai.request.model`, `gen_ai.usage.input_tokens`, …) plus `prompture.cost_usd` and, for resilient drivers, who served the call and whether it fell back. Prompt/completion text is only recorded with `capture_content=True`.
|
|
1118
|
+
|
|
1119
|
+
```python
|
|
1120
|
+
from prompture import instrument_driver, resilient # pip install "prompture[otel]"
|
|
1121
|
+
|
|
1122
|
+
driver = instrument_driver(resilient("openai/gpt-4o", "claude/claude-sonnet-4-5"))
|
|
1123
|
+
```
|
|
1124
|
+
|
|
1002
1125
|
### TOON Input — Token Savings
|
|
1003
1126
|
|
|
1004
1127
|
Analyze structured data with automatic TOON conversion for 45-60% fewer tokens:
|
|
@@ -1873,6 +1996,39 @@ Selected flags:
|
|
|
1873
1996
|
|
|
1874
1997
|
Full example walkthrough: [`examples/openai_server_example.md`](examples/openai_server_example.md).
|
|
1875
1998
|
|
|
1999
|
+
## prompture-hub: Gateway + Dashboard
|
|
2000
|
+
|
|
2001
|
+
Want a UI, or want to let other apps use your provider keys without handing them out? **[prompture-hub](https://github.com/jhd3197/prompture-hub)** is the companion app: a self-hosted gateway and web dashboard built on Prompture.
|
|
2002
|
+
|
|
2003
|
+
```
|
|
2004
|
+
your apps / Cursor / Claude Code / scripts
|
|
2005
|
+
│ hub-issued keys (ph_…)
|
|
2006
|
+
▼
|
|
2007
|
+
┌─────────────────────────────┐
|
|
2008
|
+
│ prompture-hub │ dashboard · scoped keys · spend caps
|
|
2009
|
+
│ (FastAPI + React, SQLite) │ rate limits · usage + cost per call
|
|
2010
|
+
└──────────────┬──────────────┘
|
|
2011
|
+
│ Prompture drivers, resilience, gateway format
|
|
2012
|
+
▼
|
|
2013
|
+
OpenAI · Anthropic · Google · Groq · Ollama · … (real keys stay here)
|
|
2014
|
+
```
|
|
2015
|
+
|
|
2016
|
+
```bash
|
|
2017
|
+
pip install "prompture[hub]"
|
|
2018
|
+
prompture hub # dashboard at http://localhost:1984/
|
|
2019
|
+
```
|
|
2020
|
+
|
|
2021
|
+
| | `prompture serve` | prompture-hub |
|
|
2022
|
+
|---|---|---|
|
|
2023
|
+
| Use it for | One app / local dev, one shared bearer token | Many apps or people sharing your provider keys |
|
|
2024
|
+
| Keys | Single optional `--api-key` | Per-app hub keys, revocable, hashed at rest |
|
|
2025
|
+
| Limits | Model allowlist, per-IP rate limit | Per-key model allowlist, spend caps (day/week/month), rate limits |
|
|
2026
|
+
| Visibility | Logs | Dashboard: usage, cost, latency, conversations |
|
|
2027
|
+
| Protocols | OpenAI chat completions, embeddings, media | OpenAI chat completions + Responses API, Anthropic Messages API (Claude Code), embeddings |
|
|
2028
|
+
| Extras | Server-side tools (`--sandbox`, `--web-search`), media endpoints | Analytics dashboard, `prompture-hub setup <tool>` for Claude Code / Codex / Cursor / Aider, key expiry + IP allowlists, OAuth login |
|
|
2029
|
+
|
|
2030
|
+
Both build on the same wire-format code in `prompture.gateway` (OpenAI chat completions, OpenAI Responses, Anthropic Messages), so responses, streaming events and usage blocks are identical — and both accept `combo/`, `auto/`, `fusion/` and alias model names.
|
|
2031
|
+
|
|
1876
2032
|
## Integrating & Extending
|
|
1877
2033
|
|
|
1878
2034
|
- **FastAPI integration patterns** (AsyncAgent + tools, SSE streaming, structured endpoints, error handling) — see [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md#integrating-prompture-into-your-project)
|
|
@@ -107,6 +107,20 @@ from .refusal import (
|
|
|
107
107
|
RefusalResult,
|
|
108
108
|
is_refusal,
|
|
109
109
|
)
|
|
110
|
+
from .resilience import (
|
|
111
|
+
AllTargetsFailedError,
|
|
112
|
+
AsyncResilientDriver,
|
|
113
|
+
ResilientDriver,
|
|
114
|
+
RetryPolicy,
|
|
115
|
+
async_resilient,
|
|
116
|
+
classify_error,
|
|
117
|
+
explain_route,
|
|
118
|
+
load_combos,
|
|
119
|
+
register_combo,
|
|
120
|
+
register_key_pool,
|
|
121
|
+
register_model_alias,
|
|
122
|
+
resilient,
|
|
123
|
+
)
|
|
110
124
|
from .security import (
|
|
111
125
|
InjectionCategory,
|
|
112
126
|
InjectionResult,
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.12.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 12,
|
|
21
|
+
__version__ = version = '1.12.3.dev1'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 12, 3, 'dev1')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -200,6 +200,41 @@ def test_suite(specfile: str, providers: str | None, models: str | None, fmt: st
|
|
|
200
200
|
click.echo(json.dumps(report, indent=2, ensure_ascii=False))
|
|
201
201
|
|
|
202
202
|
|
|
203
|
+
@cli.command()
|
|
204
|
+
@click.option("--host", default=None, help="Bind host (default 127.0.0.1, or HUB_HOST).")
|
|
205
|
+
@click.option("--port", default=None, type=int, help="Bind port (default 1984, or HUB_PORT).")
|
|
206
|
+
def hub(host: str | None, port: int | None) -> None:
|
|
207
|
+
"""Launch prompture-hub: gateway + dashboard with scoped keys and spend caps.
|
|
208
|
+
|
|
209
|
+
Needs the companion package: pip install "prompture[hub]".
|
|
210
|
+
Unlike `prompture serve`, the hub keeps provider keys server-side, issues
|
|
211
|
+
per-app keys with model allowlists, spend caps and rate limits, and
|
|
212
|
+
records every call in a dashboard.
|
|
213
|
+
"""
|
|
214
|
+
import os
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
from prompture_hub.main import cli as hub_cli
|
|
218
|
+
except ImportError:
|
|
219
|
+
raise click.ClickException(
|
|
220
|
+
"prompture-hub is not installed. Install it with:\n\n"
|
|
221
|
+
' pip install "prompture[hub]"\n\n'
|
|
222
|
+
"or run the lightweight single-key server instead: prompture serve"
|
|
223
|
+
) from None
|
|
224
|
+
|
|
225
|
+
if host:
|
|
226
|
+
os.environ["HUB_HOST"] = host
|
|
227
|
+
if port:
|
|
228
|
+
os.environ["HUB_PORT"] = str(port)
|
|
229
|
+
try:
|
|
230
|
+
from prompture_hub.settings import get_settings
|
|
231
|
+
|
|
232
|
+
get_settings.cache_clear()
|
|
233
|
+
except (ImportError, AttributeError):
|
|
234
|
+
pass
|
|
235
|
+
hub_cli()
|
|
236
|
+
|
|
237
|
+
|
|
203
238
|
@cli.command()
|
|
204
239
|
@click.option("--model", default="openai/gpt-4o-mini", help="Default model string (provider/model).")
|
|
205
240
|
@click.option("--system-prompt", default=None, help="System prompt injected when the client doesn't supply one.")
|