prompture 1.12.3.dev1__tar.gz → 1.12.4.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.3.dev1 → prompture-1.12.4.dev1}/CLAUDE.md +3 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/PKG-INFO +1 -1
- prompture-1.12.4.dev1/prompture/__main__.py +6 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/_version.py +2 -2
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/cli.py +38 -0
- prompture-1.12.4.dev1/prompture/companion/__init__.py +47 -0
- prompture-1.12.4.dev1/prompture/companion/live.py +154 -0
- prompture-1.12.4.dev1/prompture/companion/local.py +153 -0
- prompture-1.12.4.dev1/prompture/companion/server.py +317 -0
- prompture-1.12.4.dev1/prompture/companion/summary.py +137 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_openai_compat_stream.py +12 -2
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_openai_responses.py +25 -7
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_azure_driver.py +17 -8
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_base.py +10 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_claude_driver.py +26 -16
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_groq_driver.py +8 -2
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_compatible_driver.py +11 -1
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_driver.py +9 -2
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/azure_driver.py +18 -9
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/base.py +10 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/claude_driver.py +29 -16
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/groq_driver.py +8 -2
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_compatible_driver.py +11 -1
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_driver.py +9 -2
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/__init__.py +30 -0
- prompture-1.12.4.dev1/prompture/infra/accounts.py +430 -0
- prompture-1.12.4.dev1/prompture/infra/rate_limits.py +316 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/tracker.py +82 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/__init__.py +4 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/async_driver.py +18 -8
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/backoff.py +4 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/driver.py +16 -8
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/explain.py +3 -0
- prompture-1.12.4.dev1/prompture/resilience/headroom.py +137 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/router.py +32 -3
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/PKG-INFO +1 -1
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/SOURCES.txt +9 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/scm_file_list.json +13 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.env.copy +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/FUNDING.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/dev.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/documentation.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/publish.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.github/workflows/security.yml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/.safety-project.ini +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/AGENTS.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/BREAKING_CHANGES.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/CONTRIBUTING.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/LICENSE +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/MANIFEST.in +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/README.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/ROADMAP.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/SECURITY.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/VERSION +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/dev.ps1 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/dev.sh +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/mypy_errors.txt +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/README.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/README.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_json/test.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/_internal/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/_internal/json_encoder.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/agent.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/assistant.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/async_agent.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/async_conversation.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/conversation.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/deep_state.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/live_events.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/persona.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/review_loop.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/skill_miner.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/skills.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/tool_grammars.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/tools_schema.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/agents/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/aio/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/bridges/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/core.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/stores.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/checkpoints/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/citations/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/citations/core.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/citations/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/formatters.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/runner.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/cli/server.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/dedup.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/evol.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/filters.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/formats.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/schemas.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/seed.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/dataset/synth.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_media_usage.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_openai_compat.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_prompt_cache.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_prompted_tool_stream.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/_usage_reporting.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/aggregator_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_aggregator_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_kev_decision_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_laya_decision_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/decision_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/decision_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/google_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/job_runner.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/kev_decision_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/laya_decision_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/lipsync_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/lipsync_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/media_capabilities.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/muapi_aggregator_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/music_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/music_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/provider_branding.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/provider_descriptors.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/systemone_compatible_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/typesafe_decision_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/faithfulness.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/judge.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/pairwise.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/eval/self_consistency.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/exceptions.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/context.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/context_eval.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/data/document_qa_policies.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/data/extraction_contacts.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/data/tool_task_inventory.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/fixtures.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/gates.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/harness.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/candidates.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/optimizer.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/promotion.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/improve/scorecard.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/integration.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/outcomes.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/policy.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/sandbox.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/scoring.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/critique.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/direct.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/strategies/retrieve.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/execution/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/_usage.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/async_core.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/code_extraction.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/core.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/few_shot.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/fields.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/strategy.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/streaming.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/tools.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/tukuy_bridge.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/extraction/validator.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/anthropic_format.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/openai_format.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/reasoning_cache.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/gateway/responses_format.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/async_groups.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/consensus.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/debate.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/fusion.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/groups.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/groups/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/enhance.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/negative.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/set_planner.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/imaging/style_presets.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/billing.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/budget.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/cache.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/callbacks.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/capabilities.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/coding_agent_events.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/coding_agent_specs.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/coding_agents.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/compression.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/discovery.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/ledger.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/logging.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/media_pricing.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/media_rates.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/model_rates.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/otel.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/pricing.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/provider_env.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/google.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/kev.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/laya.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/together.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/typesafe.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/session.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/settings.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/token_counting.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/detect.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/document.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/integrations/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/integrations/mcp_bridge.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/integrations/tukuy_bridge.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/jobs.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/core.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/stores.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/kg/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/client.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/server.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/mcp/tools.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/agent_tools.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/audio.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/hosting.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/image.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/media/video.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/02-installation.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/06-stability.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pages/07-migration.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/history.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/serialization.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/persistence/store.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/pipeline/routing.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/decision_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/plugins/discovery.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/py.typed +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/contextual.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/documents.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/pipeline.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/hyde.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/retrievers/step_back.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/detector.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/refusal/markers.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/breaker.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/errors.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/keys.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/strategies.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/resilience/virtual.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/generator.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/security/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/security/injection.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/security/redaction.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/core.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/stores.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/session_memory/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/environment.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/memory.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/scheduler.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/swarm.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/swarm_agent.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/swarm/types.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/testing/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/tools/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/tools/code_exec.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/tools/web_search.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/__init__.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/architect.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/engine.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/errors.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/model.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/nodes.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/recovery.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/references.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/registry.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/scheduler.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture/workflow/state.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/requires.txt +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/prompture_cost_tracking.md +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/pyproject.toml +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/requirements.txt +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/setup.cfg +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/specs/basic_extraction.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/specs/schema_validation.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/specs/strategy_comparison.json +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/test.py +0 -0
- {prompture-1.12.3.dev1 → prompture-1.12.4.dev1}/test_version_diagnosis.py +0 -0
|
@@ -73,6 +73,9 @@ Configuration is in `pyproject.toml` under `[tool.ruff]`.
|
|
|
73
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
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
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/rate_limits.py`** — `LimitSnapshot` from documented rate-limit response headers (OpenAI/Groq `x-ratelimit-*`, Anthropic `anthropic-ratelimit-*`). SDK drivers hook their httpx client (`attach_rate_limit_hook`) and wrap calls in `capture_rate_limits()`; streams read `stream.response`. Surfaces as `meta["rate_limits"]` only when headers were present. `resilience/headroom.py` feeds these into routing: `HeadroomTracker` keeps the latest snapshot per target and `RoutePlan` moves targets below `RetryPolicy.min_headroom` (default 5%) to the back (`meta["route"]["deprioritized"]`).
|
|
77
|
+
- **`prompture/infra/accounts.py`** — `AccountSource` registry for balances/spend from documented endpoints (OpenRouter key, DeepSeek, Moonshot, OpenAI/Anthropic admin cost reports). `get_account_snapshots()` only calls configured sources, caches ~60s, and turns failures into `error` snapshots.
|
|
78
|
+
- **`prompture/companion/`** — the companion API that desktop companions (Prompture Desk) read, shared with prompture-hub: `LiveBus` (SSE event bus, asyncio + thread subscribers), `summarize_spend` / `provider_limits` / period windows, `COMPANION_API_VERSION`. `prompture companion` runs a stdlib-only local server over the usage ledger (`LedgerSource`) on 127.0.0.1 with its URL + token in `~/.prompture/companion.json`, so no hub is needed. Usage is tagged per project via `tracker.project()` / `PROMPTURE_PROJECT`.
|
|
76
79
|
- **`prompture/infra/otel.py`** / **`infra/compression.py`** — GenAI-convention OpenTelemetry spans via `DriverCallbacks`; conservative message compression for agent loops.
|
|
77
80
|
- **`prompture/runner.py`** — Spec-driven test suite runner for cross-model comparison.
|
|
78
81
|
- **`prompture/validator.py`** — JSON schema validation via jsonschema with fallback.
|
|
@@ -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.4.dev1'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 12, 4, 'dev1')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import contextlib
|
|
1
2
|
import json
|
|
2
3
|
import shlex
|
|
3
4
|
|
|
@@ -200,6 +201,43 @@ def test_suite(specfile: str, providers: str | None, models: str | None, fmt: st
|
|
|
200
201
|
click.echo(json.dumps(report, indent=2, ensure_ascii=False))
|
|
201
202
|
|
|
202
203
|
|
|
204
|
+
@cli.command()
|
|
205
|
+
@click.option("--port", default=0, type=int, help="Port on 127.0.0.1 (default: a free one the OS picks).")
|
|
206
|
+
@click.option(
|
|
207
|
+
"--db", "db_path", default=None, type=click.Path(), help="Usage ledger (default ~/.prompture/usage/usage.db)."
|
|
208
|
+
)
|
|
209
|
+
@click.option(
|
|
210
|
+
"--exit-with-pid",
|
|
211
|
+
default=None,
|
|
212
|
+
type=int,
|
|
213
|
+
help="Stop when this process exits (used by apps that start the companion for themselves).",
|
|
214
|
+
)
|
|
215
|
+
def companion(port: int, db_path: str | None, exit_with_pid: int | None) -> None:
|
|
216
|
+
"""Serve this machine's Prompture usage to desktop companions (no hub needed).
|
|
217
|
+
|
|
218
|
+
Reads the usage ledger every Prompture call writes to, plus rate-limit
|
|
219
|
+
headroom and provider account balances, and serves them on localhost with
|
|
220
|
+
the same companion API as prompture-hub. The address and a bearer token are
|
|
221
|
+
written to ~/.prompture/companion.json. If a companion is already running,
|
|
222
|
+
this prints its address and exits.
|
|
223
|
+
"""
|
|
224
|
+
from ..companion import CompanionServer, LedgerSource, running_instance
|
|
225
|
+
|
|
226
|
+
existing = running_instance()
|
|
227
|
+
if existing:
|
|
228
|
+
click.echo(f"Prompture companion already running at {existing['url']} (pid {existing.get('pid')}).")
|
|
229
|
+
return
|
|
230
|
+
server = CompanionServer(LedgerSource(db_path), port=port)
|
|
231
|
+
click.echo(f"Prompture companion on {server.url} - ledger {server.ledger.db_path}")
|
|
232
|
+
click.echo("Address and token in ~/.prompture/companion.json. Ctrl+C to stop.")
|
|
233
|
+
if exit_with_pid:
|
|
234
|
+
from ..companion.server import stop_when_process_exits
|
|
235
|
+
|
|
236
|
+
stop_when_process_exits(server, exit_with_pid)
|
|
237
|
+
with contextlib.suppress(KeyboardInterrupt):
|
|
238
|
+
server.run()
|
|
239
|
+
|
|
240
|
+
|
|
203
241
|
@cli.command()
|
|
204
242
|
@click.option("--host", default=None, help="Bind host (default 127.0.0.1, or HUB_HOST).")
|
|
205
243
|
@click.option("--port", default=None, type=int, help="Bind port (default 1984, or HUB_PORT).")
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""The companion API: what desktop companions (e.g. Prompture Desk) read.
|
|
2
|
+
|
|
3
|
+
Two servers speak it:
|
|
4
|
+
|
|
5
|
+
- **prompture-hub** — the gateway, which sees every call routed through it and
|
|
6
|
+
adds keys, projects, alert rules and controls.
|
|
7
|
+
- **the local companion** (``prompture companion``) — no hub needed; reports
|
|
8
|
+
this machine's Prompture usage from the usage ledger, rate-limit headroom and
|
|
9
|
+
provider account balances.
|
|
10
|
+
|
|
11
|
+
This package holds what both share — the live event bus, the spend / limits
|
|
12
|
+
aggregations and the API version — plus the local server itself.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from .live import LiveBus, get_bus, new_request_id, sse_event, visible
|
|
16
|
+
from .local import LedgerSource
|
|
17
|
+
from .server import CompanionServer, read_state, running_instance
|
|
18
|
+
from .summary import (
|
|
19
|
+
COMPANION_API_VERSION,
|
|
20
|
+
PERIODS,
|
|
21
|
+
UsageRow,
|
|
22
|
+
account_limits,
|
|
23
|
+
provider_limits,
|
|
24
|
+
summarize_spend,
|
|
25
|
+
window_end,
|
|
26
|
+
window_start,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"COMPANION_API_VERSION",
|
|
31
|
+
"PERIODS",
|
|
32
|
+
"CompanionServer",
|
|
33
|
+
"LedgerSource",
|
|
34
|
+
"LiveBus",
|
|
35
|
+
"UsageRow",
|
|
36
|
+
"account_limits",
|
|
37
|
+
"get_bus",
|
|
38
|
+
"new_request_id",
|
|
39
|
+
"provider_limits",
|
|
40
|
+
"read_state",
|
|
41
|
+
"running_instance",
|
|
42
|
+
"sse_event",
|
|
43
|
+
"summarize_spend",
|
|
44
|
+
"visible",
|
|
45
|
+
"window_end",
|
|
46
|
+
"window_start",
|
|
47
|
+
]
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""In-process live event bus behind a companion's ``GET /v1/live``.
|
|
2
|
+
|
|
3
|
+
Producers publish an event when a call starts, produces its first token,
|
|
4
|
+
changes activity and finishes. Events carry metadata only: ids, model,
|
|
5
|
+
project, status, tokens, cost, timings — never prompt or completion text.
|
|
6
|
+
|
|
7
|
+
The bus keeps the last :data:`RING_SIZE` events, so a client that reconnects
|
|
8
|
+
with ``Last-Event-ID`` gets what it missed, and the set of in-flight calls, so
|
|
9
|
+
a client that connects mid-request still sees it running. Publishing is
|
|
10
|
+
thread-safe. Subscribers are either asyncio queues (FastAPI servers such as
|
|
11
|
+
prompture-hub) or plain thread queues (the standard-library local server).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import asyncio
|
|
17
|
+
import itertools
|
|
18
|
+
import queue
|
|
19
|
+
import threading
|
|
20
|
+
import time
|
|
21
|
+
import uuid
|
|
22
|
+
from collections import deque
|
|
23
|
+
from collections.abc import Iterable
|
|
24
|
+
from dataclasses import dataclass, field
|
|
25
|
+
from datetime import datetime, timezone
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
RING_SIZE = 1000
|
|
29
|
+
SUBSCRIBER_QUEUE = 500
|
|
30
|
+
#: In-flight entries older than this are assumed abandoned (a client that
|
|
31
|
+
#: dropped a stream before the upstream call finished).
|
|
32
|
+
IN_FLIGHT_TTL = 30 * 60
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(eq=False) # compared and hashed by identity
|
|
36
|
+
class Subscriber:
|
|
37
|
+
"""One stream reader. ``loop`` is set for asyncio readers, ``None`` for threads."""
|
|
38
|
+
|
|
39
|
+
queue: Any
|
|
40
|
+
loop: asyncio.AbstractEventLoop | None = None
|
|
41
|
+
overflowed: bool = False
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class LiveBus:
|
|
46
|
+
ring: deque = field(default_factory=lambda: deque(maxlen=RING_SIZE))
|
|
47
|
+
in_flight: dict[str, dict[str, Any]] = field(default_factory=dict)
|
|
48
|
+
_subscribers: set = field(default_factory=set)
|
|
49
|
+
_lock: threading.Lock = field(default_factory=threading.Lock)
|
|
50
|
+
_seq: itertools.count = field(default_factory=lambda: itertools.count(1))
|
|
51
|
+
|
|
52
|
+
def publish(self, type_: str, data: dict[str, Any]) -> dict[str, Any]:
|
|
53
|
+
event = {"type": type_, "ts": data.get("ts") or datetime.now(timezone.utc).isoformat(), **data}
|
|
54
|
+
with self._lock:
|
|
55
|
+
event["id"] = next(self._seq)
|
|
56
|
+
self.ring.append(event)
|
|
57
|
+
request_id = data.get("request_id")
|
|
58
|
+
if type_ == "request.started" and request_id:
|
|
59
|
+
self.in_flight[request_id] = {**event, "_mono": time.monotonic()}
|
|
60
|
+
elif request_id in self.in_flight and type_ in ("request.first_token", "request.activity"):
|
|
61
|
+
self.in_flight[request_id].update({k: v for k, v in data.items() if k != "request_id"})
|
|
62
|
+
elif type_ == "request.finished" and request_id:
|
|
63
|
+
self.in_flight.pop(request_id, None)
|
|
64
|
+
subscribers = list(self._subscribers)
|
|
65
|
+
for sub in subscribers:
|
|
66
|
+
if sub.loop is None:
|
|
67
|
+
self._deliver(sub, event)
|
|
68
|
+
continue
|
|
69
|
+
try:
|
|
70
|
+
sub.loop.call_soon_threadsafe(self._deliver, sub, event)
|
|
71
|
+
except RuntimeError: # loop closed; the subscriber is gone
|
|
72
|
+
self.unsubscribe(sub)
|
|
73
|
+
return event
|
|
74
|
+
|
|
75
|
+
@staticmethod
|
|
76
|
+
def _deliver(sub: Subscriber, event: dict[str, Any]) -> None:
|
|
77
|
+
try:
|
|
78
|
+
sub.queue.put_nowait(event)
|
|
79
|
+
except (asyncio.QueueFull, queue.Full):
|
|
80
|
+
sub.overflowed = True
|
|
81
|
+
|
|
82
|
+
def subscribe(self) -> Subscriber:
|
|
83
|
+
"""Subscribe from a running asyncio loop."""
|
|
84
|
+
sub = Subscriber(asyncio.Queue(maxsize=SUBSCRIBER_QUEUE), asyncio.get_running_loop())
|
|
85
|
+
with self._lock:
|
|
86
|
+
self._subscribers.add(sub)
|
|
87
|
+
return sub
|
|
88
|
+
|
|
89
|
+
def subscribe_thread(self) -> Subscriber:
|
|
90
|
+
"""Subscribe from a plain thread; read with ``sub.queue.get(timeout=...)``."""
|
|
91
|
+
sub = Subscriber(queue.Queue(maxsize=SUBSCRIBER_QUEUE))
|
|
92
|
+
with self._lock:
|
|
93
|
+
self._subscribers.add(sub)
|
|
94
|
+
return sub
|
|
95
|
+
|
|
96
|
+
def unsubscribe(self, sub: Subscriber) -> None:
|
|
97
|
+
with self._lock:
|
|
98
|
+
self._subscribers.discard(sub)
|
|
99
|
+
|
|
100
|
+
def replay(self, after_id: int) -> list[dict[str, Any]]:
|
|
101
|
+
"""Buffered events newer than *after_id* (oldest first)."""
|
|
102
|
+
with self._lock:
|
|
103
|
+
return [e for e in self.ring if e["id"] > after_id]
|
|
104
|
+
|
|
105
|
+
def running(self) -> list[dict[str, Any]]:
|
|
106
|
+
"""Calls that started and have not finished, dropping abandoned ones."""
|
|
107
|
+
cutoff = time.monotonic() - IN_FLIGHT_TTL
|
|
108
|
+
with self._lock:
|
|
109
|
+
for rid in [rid for rid, e in self.in_flight.items() if e["_mono"] < cutoff]:
|
|
110
|
+
del self.in_flight[rid]
|
|
111
|
+
return [{k: v for k, v in e.items() if k != "_mono"} for e in self.in_flight.values()]
|
|
112
|
+
|
|
113
|
+
def last_id(self) -> int:
|
|
114
|
+
with self._lock:
|
|
115
|
+
return self.ring[-1]["id"] if self.ring else 0
|
|
116
|
+
|
|
117
|
+
def reset(self) -> None:
|
|
118
|
+
with self._lock:
|
|
119
|
+
self.ring.clear()
|
|
120
|
+
self.in_flight.clear()
|
|
121
|
+
self._subscribers.clear()
|
|
122
|
+
self._seq = itertools.count(1)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
_bus = LiveBus()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def get_bus() -> LiveBus:
|
|
129
|
+
"""The process-wide bus."""
|
|
130
|
+
return _bus
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def new_request_id() -> str:
|
|
134
|
+
return f"req_{uuid.uuid4().hex[:20]}"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def visible(event: dict[str, Any], key_ids: Iterable[int] | None) -> bool:
|
|
138
|
+
"""Whether a caller limited to *key_ids* (``None`` = all) may see *event*."""
|
|
139
|
+
if key_ids is None:
|
|
140
|
+
return True
|
|
141
|
+
key_id = event.get("key_id")
|
|
142
|
+
return key_id is None or key_id in key_ids
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def sse_event(event: dict[str, Any]) -> str:
|
|
146
|
+
"""Format one event as a Server-Sent Events frame."""
|
|
147
|
+
import json
|
|
148
|
+
|
|
149
|
+
lines = []
|
|
150
|
+
if "id" in event:
|
|
151
|
+
lines.append(f"id: {event['id']}")
|
|
152
|
+
lines.append(f"event: {event['type']}")
|
|
153
|
+
lines.append("data: " + json.dumps(event, separators=(",", ":"), default=str))
|
|
154
|
+
return "\n".join(lines) + "\n\n"
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""The local companion's data: Prompture's own usage ledger.
|
|
2
|
+
|
|
3
|
+
Every Prompture driver call on this machine is recorded in
|
|
4
|
+
``~/.prompture/usage/usage.db`` (see :mod:`prompture.infra.tracker`). The
|
|
5
|
+
:class:`LedgerSource` reads that file — it never writes to it — to answer the
|
|
6
|
+
companion views, and :meth:`LedgerSource.tail` turns newly written rows into
|
|
7
|
+
``request.finished`` live events.
|
|
8
|
+
|
|
9
|
+
The ledger only knows about calls once they finish, so the local companion has
|
|
10
|
+
no "running now" view; prompture-hub, which sits in the request path, does.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sqlite3
|
|
17
|
+
import threading
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
from ..infra.tracker import PROJECT_TAG
|
|
23
|
+
from .live import LiveBus
|
|
24
|
+
from .summary import UsageRow, window_start
|
|
25
|
+
|
|
26
|
+
DEFAULT_LEDGER = Path.home() / ".prompture" / "usage" / "usage.db"
|
|
27
|
+
#: How many recent rows are scanned for each model's latest rate-limit snapshot.
|
|
28
|
+
RATE_LIMIT_SCAN = 500
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _project(tags: str | None) -> str | None:
|
|
32
|
+
for tag in json.loads(tags) if tags else []:
|
|
33
|
+
if isinstance(tag, str) and tag.startswith(PROJECT_TAG):
|
|
34
|
+
return tag[len(PROJECT_TAG) :] or None
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _meta(raw: str | None) -> dict[str, Any]:
|
|
39
|
+
try:
|
|
40
|
+
value = json.loads(raw) if raw else {}
|
|
41
|
+
except ValueError:
|
|
42
|
+
return {}
|
|
43
|
+
return value if isinstance(value, dict) else {}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class LedgerSource:
|
|
47
|
+
"""Read-only view of a Prompture usage ledger."""
|
|
48
|
+
|
|
49
|
+
def __init__(self, db_path: str | Path | None = None) -> None:
|
|
50
|
+
self.db_path = Path(db_path) if db_path else DEFAULT_LEDGER
|
|
51
|
+
|
|
52
|
+
def _connect(self) -> sqlite3.Connection | None:
|
|
53
|
+
if not self.db_path.exists():
|
|
54
|
+
return None
|
|
55
|
+
conn = sqlite3.connect(f"file:{self.db_path.as_posix()}?mode=ro", uri=True, timeout=5)
|
|
56
|
+
conn.row_factory = sqlite3.Row
|
|
57
|
+
return conn
|
|
58
|
+
|
|
59
|
+
def _query(self, sql: str, params: tuple = ()) -> list[sqlite3.Row]:
|
|
60
|
+
conn = self._connect()
|
|
61
|
+
if conn is None:
|
|
62
|
+
return []
|
|
63
|
+
try:
|
|
64
|
+
return conn.execute(sql, params).fetchall()
|
|
65
|
+
except sqlite3.OperationalError: # table not created yet
|
|
66
|
+
return []
|
|
67
|
+
finally:
|
|
68
|
+
conn.close()
|
|
69
|
+
|
|
70
|
+
@staticmethod
|
|
71
|
+
def _row(r: sqlite3.Row) -> UsageRow:
|
|
72
|
+
meta = _meta(r["metadata"])
|
|
73
|
+
route = meta.get("route") if isinstance(meta.get("route"), dict) else {}
|
|
74
|
+
return UsageRow(
|
|
75
|
+
model=r["model_name"] or "",
|
|
76
|
+
cost_usd=float(r["cost"] or 0.0),
|
|
77
|
+
tokens=int(r["total_tokens"] or 0),
|
|
78
|
+
status="ok" if r["status"] == "success" else (r["status"] or "ok"),
|
|
79
|
+
served_by=route.get("served_by"),
|
|
80
|
+
project=_project(r["tags"]),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def rows(self, period: str = "day", now: datetime | None = None) -> list[UsageRow]:
|
|
84
|
+
"""Calls in the current UTC ``period`` window."""
|
|
85
|
+
start = window_start(period, now).isoformat()
|
|
86
|
+
return [
|
|
87
|
+
self._row(r)
|
|
88
|
+
for r in self._query(
|
|
89
|
+
"SELECT model_name, cost, total_tokens, status, tags, metadata FROM usage_events WHERE timestamp >= ?",
|
|
90
|
+
(start,),
|
|
91
|
+
)
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
def rate_limits(self) -> dict[str, dict[str, Any]]:
|
|
95
|
+
"""Latest rate-limit snapshot per model, from recent calls' metadata."""
|
|
96
|
+
out: dict[str, dict[str, Any]] = {}
|
|
97
|
+
for r in self._query(
|
|
98
|
+
"SELECT model_name, metadata FROM usage_events WHERE metadata LIKE '%rate_limits%' "
|
|
99
|
+
"ORDER BY rowid DESC LIMIT ?",
|
|
100
|
+
(RATE_LIMIT_SCAN,),
|
|
101
|
+
):
|
|
102
|
+
model = r["model_name"]
|
|
103
|
+
data = _meta(r["metadata"]).get("rate_limits")
|
|
104
|
+
if model and model not in out and isinstance(data, dict):
|
|
105
|
+
out[model] = data
|
|
106
|
+
return out
|
|
107
|
+
|
|
108
|
+
def last_rowid(self) -> int:
|
|
109
|
+
rows = self._query("SELECT MAX(rowid) AS last FROM usage_events")
|
|
110
|
+
return int(rows[0]["last"] or 0) if rows else 0
|
|
111
|
+
|
|
112
|
+
def events_after(self, rowid: int) -> list[tuple[int, dict[str, Any]]]:
|
|
113
|
+
"""``request.finished`` payloads for rows newer than *rowid*."""
|
|
114
|
+
out = []
|
|
115
|
+
for r in self._query(
|
|
116
|
+
"SELECT rowid, id, timestamp, model_name, cost, prompt_tokens, completion_tokens, total_tokens, "
|
|
117
|
+
"elapsed_ms, status, error_message, tags, metadata FROM usage_events WHERE rowid > ? ORDER BY rowid",
|
|
118
|
+
(rowid,),
|
|
119
|
+
):
|
|
120
|
+
meta = _meta(r["metadata"])
|
|
121
|
+
route = meta.get("route") if isinstance(meta.get("route"), dict) else {}
|
|
122
|
+
attempts = sum(1 for a in route.get("attempts", []) if a.get("outcome") in ("ok", "error")) or 1
|
|
123
|
+
out.append(
|
|
124
|
+
(
|
|
125
|
+
int(r["rowid"]),
|
|
126
|
+
{
|
|
127
|
+
"request_id": r["id"],
|
|
128
|
+
"ts": r["timestamp"],
|
|
129
|
+
"key_id": None,
|
|
130
|
+
"model": r["model_name"],
|
|
131
|
+
"served_by": route.get("served_by"),
|
|
132
|
+
"project": _project(r["tags"]),
|
|
133
|
+
"status": "ok" if r["status"] == "success" else r["status"],
|
|
134
|
+
"error": (r["error_message"] or "")[:200] or None,
|
|
135
|
+
"prompt_tokens": r["prompt_tokens"],
|
|
136
|
+
"completion_tokens": r["completion_tokens"],
|
|
137
|
+
"cost_usd": r["cost"],
|
|
138
|
+
"latency_ms": int(r["elapsed_ms"] or 0),
|
|
139
|
+
"attempts": attempts,
|
|
140
|
+
"fallback": attempts > 1,
|
|
141
|
+
"deprioritized": route.get("deprioritized") or [],
|
|
142
|
+
},
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
return out
|
|
146
|
+
|
|
147
|
+
def tail(self, bus: LiveBus, stop: threading.Event, interval: float = 1.0) -> None:
|
|
148
|
+
"""Publish a ``request.finished`` event for every row written from now on."""
|
|
149
|
+
last = self.last_rowid()
|
|
150
|
+
while not stop.wait(interval):
|
|
151
|
+
for rowid, payload in self.events_after(last):
|
|
152
|
+
bus.publish("request.finished", payload)
|
|
153
|
+
last = rowid
|