prompture 1.13.5.dev1__tar.gz → 1.13.5.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.env.copy +6 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/PKG-INFO +65 -4
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/README.md +64 -3
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/llms.txt +1 -1
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/_version.py +2 -2
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/http.py +146 -2
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/setup_cmd.py +1 -1
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/logging.py +11 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/agent.py +23 -13
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/SKILL.md +6 -3
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/search.md +8 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/web.md +12 -2
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/adapter.py +43 -1
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/config.py +14 -1
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/__init__.py +3 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/_types.py +16 -0
- prompture-1.13.5.dev3/prompture/tools/web/cache.py +296 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/fetch.py +23 -15
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/health.py +27 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/platform.py +33 -1
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/__init__.py +35 -1
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/search.py +41 -2
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/PKG-INFO +65 -4
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/SOURCES.txt +1 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/scm_file_list.json +2 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.gitattributes +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/FUNDING.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/dev.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/documentation.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/publish.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/security.yml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.safety-project.ini +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/AGENTS.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/BREAKING_CHANGES.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/CLAUDE.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/CONTRIBUTING.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/LICENSE +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/MANIFEST.in +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/ROADMAP.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/SECURITY.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/VERSION +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/dev.ps1 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/dev.sh +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/mypy_errors.txt +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/README.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/README.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/test.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/__main__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/_internal/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/_internal/json_encoder.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/agent.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/assistant.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/async_agent.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/async_conversation.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/conversation.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep_state.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/live_events.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/persona.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/review_loop.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/skill_miner.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/skills.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/tool_grammars.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/tools_schema.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/aio/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/bridges/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/backends.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/builtin_checks.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/challenge.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/errors.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/health.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/probe.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/url_safety.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/stores.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/citations/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/citations/core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/citations/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/cli.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/doctor_cmd.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/formatters.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/mcp_cmd.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/research_cmd.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/runner.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/server.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/skill_cmd.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/transcribe_cmd.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/automations.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/calls.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/capacity.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/coding_tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/hook.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/live.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/local.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/memory.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/reuse.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/router.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/routing_policy.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/server.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/summary.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/tool_routing.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/dedup.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/evol.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/filters.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/formats.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/schemas.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/seed.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/synth.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/doctor/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/doctor/core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/doctor/providers.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_media_usage.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_ollama_options.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_openai_compat.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_openai_compat_stream.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_openai_responses.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_prompt_cache.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_prompted_tool_stream.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_usage_reporting.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/aggregator_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_aggregator_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_claude_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_kev_decision_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_laya_decision_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_compatible_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/azure_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/claude_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/decision_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/decision_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/google_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/groq_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/job_runner.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/kev_decision_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/laya_decision_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/lipsync_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/lipsync_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/media_capabilities.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/muapi_aggregator_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/music_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/music_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_compatible_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/provider_branding.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/provider_descriptors.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/systemone_compatible_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/typesafe_decision_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/vertex_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/faithfulness.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/judge.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/pairwise.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/self_consistency.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/exceptions.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/context.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/context_eval.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/data/document_qa_policies.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/data/extraction_contacts.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/data/tool_task_inventory.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/fixtures.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/gates.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/harness.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/candidates.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/optimizer.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/promotion.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/scorecard.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/integration.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/outcomes.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/policy.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/sandbox.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/scoring.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/critique.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/direct.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/retrieve.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/_usage.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/async_core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/code_extraction.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/few_shot.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/fields.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/strategy.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/streaming.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/tukuy_bridge.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/validator.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/anthropic_format.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/gemini_format.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/openai_format.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/reasoning_cache.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/responses_format.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/async_groups.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/consensus.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/debate.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/fusion.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/groups.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/enhance.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/negative.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/set_planner.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/style_presets.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/accounts.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/billing.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/budget.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/cache.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/callbacks.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/capabilities.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_activity.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_events.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_readers.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_specs.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_usage.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agents.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/compression.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/credentials.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/discovery.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/environment.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/ledger.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/media_pricing.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/media_rates.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/model_rates.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/otel.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/pricing.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/provider_env.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rate_limits.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/google.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/kev.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/laya.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/together.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/typesafe.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/session.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/settings.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/token_counting.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/tracker.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/updates.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/detect.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/document.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/integrations/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/integrations/mcp_bridge.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/integrations/tukuy_bridge.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/jobs.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/stores.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/client.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/health.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/hub.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/importers.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/server.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/agent_tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/audio.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/hosting.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/image.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/errors.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/ffmpeg.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/groq_stt.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/health.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/sources.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/summarize.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/transcribe.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/video.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/02-installation.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/06-stability.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/07-migration.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/history.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/serialization.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/store.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/routing.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/decision_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/discovery.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/py.typed +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/contextual.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/documents.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/pipeline.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/_fusion.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/hyde.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/multi_query.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/step_back.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/detector.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/markers.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/budget.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/events.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/planner.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/ranking.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/report.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/synthesis.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/tools.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/async_driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/backoff.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/breaker.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/driver.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/errors.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/explain.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/headroom.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/keys.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/router.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/strategies.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/virtual.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/generator.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/security/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/security/injection.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/security/redaction.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/core.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/project.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/stores.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/dev.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/finance.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/mcp.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/media.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/models.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/environment.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/memory.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/scheduler.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/swarm.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/swarm_agent.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/types.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/testing/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/builtin.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/health.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/code_exec.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/named.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/packs.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/_common.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/_mcp_http.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/html2md.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/_media.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/arxiv.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/base.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/feeds.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/github.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/hackernews.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/podcasts.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/wikipedia.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/youtube.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/toolkit.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web_search.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/__init__.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/architect.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/engine.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/errors.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/model.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/nodes.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/recovery.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/references.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/registry.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/scheduler.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/state.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/requires.txt +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture_cost_tracking.md +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/pyproject.toml +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/requirements.txt +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/setup.cfg +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/specs/basic_extraction.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/specs/schema_validation.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/specs/strategy_comparison.json +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/test.py +0 -0
- {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/test_version_diagnosis.py +0 -0
|
@@ -252,6 +252,12 @@ PROMPTURE_SEARCH_PROVIDERS=
|
|
|
252
252
|
PROMPTURE_FETCH_BACKENDS=
|
|
253
253
|
# Allow tools to reach private/loopback addresses (off by default).
|
|
254
254
|
PROMPTURE_WEB_ALLOW_PRIVATE=
|
|
255
|
+
# Local cache for search / fetch / reader results: disk (default, shared
|
|
256
|
+
# across processes), memory (this process only) or off. Lifetimes depend on
|
|
257
|
+
# the content: minutes for weather/prices/news, days for papers/transcripts.
|
|
258
|
+
PROMPTURE_WEB_CACHE=
|
|
259
|
+
# Where the disk cache lives (default ~/.prompture/cache/web_cache.db).
|
|
260
|
+
PROMPTURE_WEB_CACHE_PATH=
|
|
255
261
|
|
|
256
262
|
# ─── Media understanding (transcripts / summaries) ───────────────────────────
|
|
257
263
|
# Uses the first configured STT key: GROQ_API_KEY ▸ OPENAI_API_KEY ▸
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prompture
|
|
3
|
-
Version: 1.13.5.
|
|
3
|
+
Version: 1.13.5.dev3
|
|
4
4
|
Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
|
|
5
5
|
Author-email: Juan Denis <juan@vene.co>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -162,6 +162,39 @@ print(person.name) # Maria
|
|
|
162
162
|
> | `ollama/llama3.1:8b`, … (local) | no extra needed | — (set `OLLAMA_HOST` if non-default) |
|
|
163
163
|
> | everything in one go | `pip install "prompture[all]"` | provider-specific |
|
|
164
164
|
|
|
165
|
+
## Agents That Can Search, Read, Watch and Listen
|
|
166
|
+
|
|
167
|
+
Prompture also gives agents working capabilities. **Web search and reading
|
|
168
|
+
need no API key at all**; keys only raise their limits and quality. Model
|
|
169
|
+
calls, transcription and some packs use the keys you already have, and
|
|
170
|
+
`prompture doctor` tells you exactly what's missing.
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
from prompture import Agent
|
|
174
|
+
|
|
175
|
+
agent = Agent(
|
|
176
|
+
"openai/gpt-4o-mini",
|
|
177
|
+
tools=["web:all", "pack:dev", "mcp:exa"], # search, read any URL, transcribe, GitHub/HN/arXiv, MCP
|
|
178
|
+
system_prompt="Cite every fact with a URL you opened.",
|
|
179
|
+
)
|
|
180
|
+
print(agent.run("Summarize https://youtu.be/<id> and find related papers").output)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
prompture doctor # what works on this machine and how to fix the rest
|
|
185
|
+
prompture research "What changed in Python 3.13?" --depth quick # cited multi-source report
|
|
186
|
+
prompture transcribe talk.mp3 --summary # timestamped transcript + key points
|
|
187
|
+
prompture mcp add --preset exa # mount MCP servers by name
|
|
188
|
+
prompture skill install # teach your coding agent all of this
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
|
|
192
|
+
- **Fails over instead of failing:** search, fetch and the readers try the next backend on auth, quota or rate-limit errors and tell you which one served the result
|
|
193
|
+
- **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
|
|
194
|
+
- **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
|
|
195
|
+
|
|
196
|
+
Full guide: [Capabilities](#capabilities).
|
|
197
|
+
|
|
165
198
|
## Prompture Desk: Usage in Your Tray
|
|
166
199
|
|
|
167
200
|
**See what your LLM calls cost, live, from your tray.** [Prompture Desk](https://github.com/jhd3197/Prompture-Desk) tracks tokens and spend per provider and project, rate-limit headroom, balances, and your coding tools (Claude Code, Codex, …). Windows, macOS and Linux.
|
|
@@ -194,8 +227,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
194
227
|
**Agents, tools, RAG**
|
|
195
228
|
- Stateful conversations with sync + async support
|
|
196
229
|
- Function calling and streaming across providers, with prompt-based simulation for models without native tool use
|
|
197
|
-
- Drop-in tools: sandboxed `python_execute` (Tukuy)
|
|
198
|
-
- Mount tools by name: `tools=["web:all", "mcp:exa", "pack:finance", "cli:gh"]`; `ResearchAgent` for cited multi-source research
|
|
230
|
+
- Drop-in tools: sandboxed `python_execute` (Tukuy) plus the [capability layer](#capabilities) below
|
|
199
231
|
- `DeepAgent` with planning, virtual filesystem, sub-agents, and auto-summarization — no LangChain
|
|
200
232
|
- Full RAG stack — loaders, chunkers, vector stores, hybrid dense+BM25 retrieval, end-to-end `RAGPipeline` — see [RAG](#rag)
|
|
201
233
|
|
|
@@ -204,8 +236,16 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
204
236
|
- `RefusalDetector` / `RefusalEvaluator` for cross-provider alignment scoring
|
|
205
237
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
206
238
|
|
|
207
|
-
**
|
|
239
|
+
**Capabilities** — see [Capabilities](#capabilities)
|
|
240
|
+
- Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, feeds, podcasts), with failover across keyed providers
|
|
241
|
+
- Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
|
|
242
|
+
- `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
|
|
243
|
+
- `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
|
|
244
|
+
- MCP hub, wrapped CLI tools (`gh`, `yt-dlp`) and domain packs (finance, news, dev, places), mounted by name: `tools=["mcp:exa", "pack:finance", "cli:gh"]`
|
|
208
245
|
- `prompture doctor` — what works on this machine (providers, tools, media, MCP servers, binaries), which backend is active, and the exact fix for anything that isn't
|
|
246
|
+
- `prompture setup` with an owner-only credential store and profiles; `prompture skill install` teaches coding agents to use all of it
|
|
247
|
+
|
|
248
|
+
**Ops**
|
|
209
249
|
- 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)
|
|
210
250
|
- [Prompture Desk](#prompture-desk-usage-in-your-tray) — desktop tray app: usage per provider and project, rate limits and balances, live calls
|
|
211
251
|
- [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]`)
|
|
@@ -2103,6 +2143,27 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
|
|
|
2103
2143
|
refused, redirects are re-checked per hop, bodies are size-capped and
|
|
2104
2144
|
challenge pages move to the next backend.
|
|
2105
2145
|
|
|
2146
|
+
**Local cache.** Results are cached in `~/.prompture/cache/web_cache.db`, so a
|
|
2147
|
+
repeated search or page comes back instantly, even from another process. Each
|
|
2148
|
+
entry lives as long as that kind of content stays true:
|
|
2149
|
+
|
|
2150
|
+
| Content | Lifetime |
|
|
2151
|
+
|---|---|
|
|
2152
|
+
| Searches about weather, prices, scores, news, "today", or `recency_days <= 1` | 10 min |
|
|
2153
|
+
| Fast-moving pages (Hacker News, Reddit, X, status pages), GitHub issues/PRs | 10 min |
|
|
2154
|
+
| Feeds | 15 min |
|
|
2155
|
+
| Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
|
|
2156
|
+
| Ordinary pages / searches within `recency_days <= 7` | 1 h |
|
|
2157
|
+
| Other searches | 6 h |
|
|
2158
|
+
| Wikipedia, podcast episodes | 1 day |
|
|
2159
|
+
| Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
|
|
2160
|
+
|
|
2161
|
+
Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
|
|
2162
|
+
ago" in the Markdown footer). Errors and empty results are never stored. Pass
|
|
2163
|
+
`use_cache=False` or `cache_ttl=<seconds>` per call, set
|
|
2164
|
+
`PROMPTURE_WEB_CACHE=memory|off` to change the store, and
|
|
2165
|
+
`clear_web_cache()` or `prompture reset` to empty it.
|
|
2166
|
+
|
|
2106
2167
|
### Media understanding: transcripts and summaries
|
|
2107
2168
|
|
|
2108
2169
|
```python
|
|
@@ -45,6 +45,39 @@ print(person.name) # Maria
|
|
|
45
45
|
> | `ollama/llama3.1:8b`, … (local) | no extra needed | — (set `OLLAMA_HOST` if non-default) |
|
|
46
46
|
> | everything in one go | `pip install "prompture[all]"` | provider-specific |
|
|
47
47
|
|
|
48
|
+
## Agents That Can Search, Read, Watch and Listen
|
|
49
|
+
|
|
50
|
+
Prompture also gives agents working capabilities. **Web search and reading
|
|
51
|
+
need no API key at all**; keys only raise their limits and quality. Model
|
|
52
|
+
calls, transcription and some packs use the keys you already have, and
|
|
53
|
+
`prompture doctor` tells you exactly what's missing.
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from prompture import Agent
|
|
57
|
+
|
|
58
|
+
agent = Agent(
|
|
59
|
+
"openai/gpt-4o-mini",
|
|
60
|
+
tools=["web:all", "pack:dev", "mcp:exa"], # search, read any URL, transcribe, GitHub/HN/arXiv, MCP
|
|
61
|
+
system_prompt="Cite every fact with a URL you opened.",
|
|
62
|
+
)
|
|
63
|
+
print(agent.run("Summarize https://youtu.be/<id> and find related papers").output)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
prompture doctor # what works on this machine and how to fix the rest
|
|
68
|
+
prompture research "What changed in Python 3.13?" --depth quick # cited multi-source report
|
|
69
|
+
prompture transcribe talk.mp3 --summary # timestamped transcript + key points
|
|
70
|
+
prompture mcp add --preset exa # mount MCP servers by name
|
|
71
|
+
prompture skill install # teach your coding agent all of this
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
|
|
75
|
+
- **Fails over instead of failing:** search, fetch and the readers try the next backend on auth, quota or rate-limit errors and tell you which one served the result
|
|
76
|
+
- **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
|
|
77
|
+
- **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
|
|
78
|
+
|
|
79
|
+
Full guide: [Capabilities](#capabilities).
|
|
80
|
+
|
|
48
81
|
## Prompture Desk: Usage in Your Tray
|
|
49
82
|
|
|
50
83
|
**See what your LLM calls cost, live, from your tray.** [Prompture Desk](https://github.com/jhd3197/Prompture-Desk) tracks tokens and spend per provider and project, rate-limit headroom, balances, and your coding tools (Claude Code, Codex, …). Windows, macOS and Linux.
|
|
@@ -77,8 +110,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
77
110
|
**Agents, tools, RAG**
|
|
78
111
|
- Stateful conversations with sync + async support
|
|
79
112
|
- Function calling and streaming across providers, with prompt-based simulation for models without native tool use
|
|
80
|
-
- Drop-in tools: sandboxed `python_execute` (Tukuy)
|
|
81
|
-
- Mount tools by name: `tools=["web:all", "mcp:exa", "pack:finance", "cli:gh"]`; `ResearchAgent` for cited multi-source research
|
|
113
|
+
- Drop-in tools: sandboxed `python_execute` (Tukuy) plus the [capability layer](#capabilities) below
|
|
82
114
|
- `DeepAgent` with planning, virtual filesystem, sub-agents, and auto-summarization — no LangChain
|
|
83
115
|
- Full RAG stack — loaders, chunkers, vector stores, hybrid dense+BM25 retrieval, end-to-end `RAGPipeline` — see [RAG](#rag)
|
|
84
116
|
|
|
@@ -87,8 +119,16 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
87
119
|
- `RefusalDetector` / `RefusalEvaluator` for cross-provider alignment scoring
|
|
88
120
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
89
121
|
|
|
90
|
-
**
|
|
122
|
+
**Capabilities** — see [Capabilities](#capabilities)
|
|
123
|
+
- Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, feeds, podcasts), with failover across keyed providers
|
|
124
|
+
- Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
|
|
125
|
+
- `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
|
|
126
|
+
- `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
|
|
127
|
+
- MCP hub, wrapped CLI tools (`gh`, `yt-dlp`) and domain packs (finance, news, dev, places), mounted by name: `tools=["mcp:exa", "pack:finance", "cli:gh"]`
|
|
91
128
|
- `prompture doctor` — what works on this machine (providers, tools, media, MCP servers, binaries), which backend is active, and the exact fix for anything that isn't
|
|
129
|
+
- `prompture setup` with an owner-only credential store and profiles; `prompture skill install` teaches coding agents to use all of it
|
|
130
|
+
|
|
131
|
+
**Ops**
|
|
92
132
|
- 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)
|
|
93
133
|
- [Prompture Desk](#prompture-desk-usage-in-your-tray) — desktop tray app: usage per provider and project, rate limits and balances, live calls
|
|
94
134
|
- [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]`)
|
|
@@ -1986,6 +2026,27 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
|
|
|
1986
2026
|
refused, redirects are re-checked per hop, bodies are size-capped and
|
|
1987
2027
|
challenge pages move to the next backend.
|
|
1988
2028
|
|
|
2029
|
+
**Local cache.** Results are cached in `~/.prompture/cache/web_cache.db`, so a
|
|
2030
|
+
repeated search or page comes back instantly, even from another process. Each
|
|
2031
|
+
entry lives as long as that kind of content stays true:
|
|
2032
|
+
|
|
2033
|
+
| Content | Lifetime |
|
|
2034
|
+
|---|---|
|
|
2035
|
+
| Searches about weather, prices, scores, news, "today", or `recency_days <= 1` | 10 min |
|
|
2036
|
+
| Fast-moving pages (Hacker News, Reddit, X, status pages), GitHub issues/PRs | 10 min |
|
|
2037
|
+
| Feeds | 15 min |
|
|
2038
|
+
| Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
|
|
2039
|
+
| Ordinary pages / searches within `recency_days <= 7` | 1 h |
|
|
2040
|
+
| Other searches | 6 h |
|
|
2041
|
+
| Wikipedia, podcast episodes | 1 day |
|
|
2042
|
+
| Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
|
|
2043
|
+
|
|
2044
|
+
Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
|
|
2045
|
+
ago" in the Markdown footer). Errors and empty results are never stored. Pass
|
|
2046
|
+
`use_cache=False` or `cache_ttl=<seconds>` per call, set
|
|
2047
|
+
`PROMPTURE_WEB_CACHE=memory|off` to change the store, and
|
|
2048
|
+
`clear_web_cache()` or `prompture reset` to empty it.
|
|
2049
|
+
|
|
1989
2050
|
### Media understanding: transcripts and summaries
|
|
1990
2051
|
|
|
1991
2052
|
```python
|
|
@@ -39,7 +39,7 @@ Model strings are `provider/model` (e.g. `openai/gpt-4o-mini`, `claude/claude-ha
|
|
|
39
39
|
- `prompture.drivers`: one driver per provider; `get_driver_for_model("provider/model")`
|
|
40
40
|
- `prompture.resilience`: `resilient()`, `classify_error`, combos and virtual models
|
|
41
41
|
- `prompture.capabilities`: `BackendChain`, `probe_command`, `HealthStatus`, `safe_get`, `normalize_public_http_url`
|
|
42
|
-
- `prompture.tools.web`: `web_search`, `web_fetch`, `read_url`, `search_platform`, `WebToolkit`
|
|
42
|
+
- `prompture.tools.web`: `web_search`, `web_fetch`, `read_url`, `search_platform`, `WebToolkit`, local cache (`clear_web_cache`, `cache_info`, `PROMPTURE_WEB_CACHE`)
|
|
43
43
|
- `prompture.media.understand`: `transcribe`, `summarize_media`
|
|
44
44
|
- `prompture.mcp`: MCP client/server and `hub` (`MCPHub`, `resolve_mcp_tools`)
|
|
45
45
|
- `prompture.tools.cli`, `prompture.tools.packs`: `CLITool`, domain packs
|
|
@@ -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.13.5.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 13, 5, '
|
|
21
|
+
__version__ = version = '1.13.5.dev3'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 13, 5, 'dev3')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -5,19 +5,31 @@
|
|
|
5
5
|
``max_bytes``, detects challenge interstitials, and raises typed errors that
|
|
6
6
|
``classify_error`` understands. Proxies come from ``PROMPTURE_<BACKEND>_PROXY``
|
|
7
7
|
or ``PROMPTURE_PROXY``.
|
|
8
|
+
|
|
9
|
+
Validating a hostname and then connecting to it resolves DNS twice, and a
|
|
10
|
+
hostile DNS server can answer with a public address the first time and a
|
|
11
|
+
private one the second (DNS rebinding). :class:`GuardedHTTPAdapter` closes that
|
|
12
|
+
gap: it checks the address the socket *actually connected to*, before any
|
|
13
|
+
request bytes are sent. Connections to a configured proxy are exempt, since
|
|
14
|
+
the peer is then the proxy itself.
|
|
8
15
|
"""
|
|
9
16
|
|
|
10
17
|
from __future__ import annotations
|
|
11
18
|
|
|
19
|
+
import threading
|
|
20
|
+
from contextvars import ContextVar
|
|
12
21
|
from dataclasses import dataclass, field
|
|
13
22
|
from typing import Any
|
|
14
23
|
from urllib.parse import urljoin
|
|
15
24
|
|
|
16
25
|
import requests
|
|
26
|
+
from requests.adapters import HTTPAdapter
|
|
27
|
+
from urllib3.connection import HTTPConnection, HTTPSConnection
|
|
28
|
+
from urllib3.connectionpool import HTTPConnectionPool, HTTPSConnectionPool
|
|
17
29
|
|
|
18
30
|
from .challenge import is_challenge_page
|
|
19
31
|
from .errors import ChallengePageError, HTTPStatusError, ResponseTooLargeError, UnsafeURLError
|
|
20
|
-
from .url_safety import normalize_public_http_url
|
|
32
|
+
from .url_safety import allow_private_default, is_public_ip, normalize_public_http_url
|
|
21
33
|
|
|
22
34
|
BROWSER_USER_AGENT = (
|
|
23
35
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
|
|
@@ -54,6 +66,92 @@ def proxies_for(backend: str | None = None) -> dict[str, str] | None:
|
|
|
54
66
|
return {"http": proxy, "https": proxy} if proxy else None
|
|
55
67
|
|
|
56
68
|
|
|
69
|
+
# ---------------------------------------------------------------------------
|
|
70
|
+
# Connect-time address check (DNS rebinding)
|
|
71
|
+
# ---------------------------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
# Per-request override of PROMPTURE_WEB_ALLOW_PRIVATE, set by safe_get.
|
|
74
|
+
_allow_private: ContextVar[bool | None] = ContextVar("prompture_allow_private", default=None)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _check_peer(conn: Any, sock: Any) -> None:
|
|
78
|
+
"""Refuse a socket that ended up connected to a non-public address."""
|
|
79
|
+
if getattr(conn, "proxy", None) is not None or getattr(conn, "_tunnel_host", None):
|
|
80
|
+
return # the peer is the configured proxy, not the target
|
|
81
|
+
allow = _allow_private.get()
|
|
82
|
+
if allow is None:
|
|
83
|
+
allow = allow_private_default()
|
|
84
|
+
if allow:
|
|
85
|
+
return
|
|
86
|
+
try:
|
|
87
|
+
peer = sock.getpeername()[0]
|
|
88
|
+
except (OSError, IndexError):
|
|
89
|
+
return # not an inet socket; nothing to check
|
|
90
|
+
if not is_public_ip(peer):
|
|
91
|
+
sock.close()
|
|
92
|
+
raise UnsafeURLError(f"{getattr(conn, 'host', 'host')} connected to non-public address {peer}")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class _GuardedHTTPConnection(HTTPConnection):
|
|
96
|
+
def _new_conn(self) -> Any:
|
|
97
|
+
sock = super()._new_conn()
|
|
98
|
+
_check_peer(self, sock)
|
|
99
|
+
return sock
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class _GuardedHTTPSConnection(HTTPSConnection):
|
|
103
|
+
def _new_conn(self) -> Any:
|
|
104
|
+
sock = super()._new_conn()
|
|
105
|
+
_check_peer(self, sock)
|
|
106
|
+
return sock
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class _GuardedHTTPConnectionPool(HTTPConnectionPool):
|
|
110
|
+
ConnectionCls = _GuardedHTTPConnection
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class _GuardedHTTPSConnectionPool(HTTPSConnectionPool):
|
|
114
|
+
ConnectionCls = _GuardedHTTPSConnection # type: ignore[assignment]
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class GuardedHTTPAdapter(HTTPAdapter):
|
|
118
|
+
"""``requests`` adapter that refuses connections to non-public addresses.
|
|
119
|
+
|
|
120
|
+
The check runs on the connected socket, so it holds even when DNS answers
|
|
121
|
+
differently between validation and connection.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
def init_poolmanager(self, *args: Any, **kwargs: Any) -> None:
|
|
125
|
+
super().init_poolmanager(*args, **kwargs)
|
|
126
|
+
self.poolmanager.pool_classes_by_scheme = { # type: ignore[attr-defined]
|
|
127
|
+
"http": _GuardedHTTPConnectionPool,
|
|
128
|
+
"https": _GuardedHTTPSConnectionPool,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def guard_session(session: requests.Session) -> requests.Session:
|
|
133
|
+
"""Mount :class:`GuardedHTTPAdapter` on *session* (keeping its retry policy); returns it."""
|
|
134
|
+
for prefix in ("http://", "https://"):
|
|
135
|
+
current = session.get_adapter(prefix)
|
|
136
|
+
if not isinstance(current, GuardedHTTPAdapter):
|
|
137
|
+
retries = getattr(current, "max_retries", 0)
|
|
138
|
+
session.mount(prefix, GuardedHTTPAdapter(max_retries=retries))
|
|
139
|
+
return session
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
_shared: requests.Session | None = None
|
|
143
|
+
_shared_lock = threading.Lock()
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def guarded_session() -> requests.Session:
|
|
147
|
+
"""Process-wide guarded session used when :func:`safe_get` gets none."""
|
|
148
|
+
global _shared
|
|
149
|
+
with _shared_lock:
|
|
150
|
+
if _shared is None:
|
|
151
|
+
_shared = guard_session(requests.Session())
|
|
152
|
+
return _shared
|
|
153
|
+
|
|
154
|
+
|
|
57
155
|
@dataclass
|
|
58
156
|
class SafeResponse:
|
|
59
157
|
"""Body and metadata of a completed :func:`safe_get`."""
|
|
@@ -122,10 +220,56 @@ def safe_get(
|
|
|
122
220
|
backend: Backend name used to pick a per-backend proxy.
|
|
123
221
|
raise_for_status: Raise :class:`HTTPStatusError` on non-2xx.
|
|
124
222
|
"""
|
|
125
|
-
|
|
223
|
+
if allow_private is None:
|
|
224
|
+
allow_private = allow_private_default()
|
|
225
|
+
if isinstance(session, requests.Session):
|
|
226
|
+
http: Any = guard_session(session)
|
|
227
|
+
elif session is not None:
|
|
228
|
+
http = session # a duck-typed client (tests); URL checks still apply
|
|
229
|
+
elif allow_private:
|
|
230
|
+
# Keep private-network connections out of the shared pool.
|
|
231
|
+
http = guard_session(requests.Session())
|
|
232
|
+
else:
|
|
233
|
+
http = guarded_session()
|
|
126
234
|
merged = {**DEFAULT_HEADERS, **(headers or {})}
|
|
127
235
|
proxies = proxies_for(backend)
|
|
128
236
|
current = normalize_public_http_url(url, allow_private=allow_private)
|
|
237
|
+
token = _allow_private.set(allow_private)
|
|
238
|
+
try:
|
|
239
|
+
return _get_with_redirects(
|
|
240
|
+
http,
|
|
241
|
+
current,
|
|
242
|
+
headers=merged,
|
|
243
|
+
params=params,
|
|
244
|
+
timeout=timeout,
|
|
245
|
+
proxies=proxies,
|
|
246
|
+
max_bytes=max_bytes,
|
|
247
|
+
max_redirects=max_redirects,
|
|
248
|
+
allow_private=allow_private,
|
|
249
|
+
check_challenge=check_challenge,
|
|
250
|
+
truncate=truncate,
|
|
251
|
+
raise_for_status=raise_for_status,
|
|
252
|
+
)
|
|
253
|
+
finally:
|
|
254
|
+
_allow_private.reset(token)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def _get_with_redirects(
|
|
258
|
+
http: Any,
|
|
259
|
+
current: str,
|
|
260
|
+
*,
|
|
261
|
+
headers: dict[str, str],
|
|
262
|
+
params: dict[str, Any] | None,
|
|
263
|
+
timeout: float,
|
|
264
|
+
proxies: dict[str, str] | None,
|
|
265
|
+
max_bytes: int,
|
|
266
|
+
max_redirects: int,
|
|
267
|
+
allow_private: bool,
|
|
268
|
+
check_challenge: bool,
|
|
269
|
+
truncate: bool,
|
|
270
|
+
raise_for_status: bool,
|
|
271
|
+
) -> SafeResponse:
|
|
272
|
+
merged = headers
|
|
129
273
|
history: list[str] = []
|
|
130
274
|
query = params
|
|
131
275
|
|
|
@@ -550,7 +550,7 @@ _STATE_DESCRIPTIONS = {
|
|
|
550
550
|
"credentials.yaml": "stored credentials and settings",
|
|
551
551
|
"mcp.json": "named MCP servers",
|
|
552
552
|
"usage": "usage ledger databases",
|
|
553
|
-
"cache": "model-rate, response and plan-usage caches",
|
|
553
|
+
"cache": "model-rate, response, web and plan-usage caches",
|
|
554
554
|
"update_check.json": "update-check state",
|
|
555
555
|
"companion.json": "local companion address and token",
|
|
556
556
|
"companion-prefs.json": "companion preferences",
|
|
@@ -21,6 +21,7 @@ Usage::
|
|
|
21
21
|
|
|
22
22
|
from __future__ import annotations
|
|
23
23
|
|
|
24
|
+
import contextlib
|
|
24
25
|
import json
|
|
25
26
|
import logging
|
|
26
27
|
from datetime import datetime, timezone
|
|
@@ -43,6 +44,16 @@ class SecretScrubbingFilter(logging.Filter):
|
|
|
43
44
|
if scrubbed != message:
|
|
44
45
|
record.msg = scrubbed
|
|
45
46
|
record.args = None
|
|
47
|
+
# Formatters append the traceback after the message, and exception
|
|
48
|
+
# text often carries the very URL or key we just scrubbed. Render it
|
|
49
|
+
# now and store the scrubbed copy; formatters reuse ``exc_text``.
|
|
50
|
+
if record.exc_info and not record.exc_text:
|
|
51
|
+
with contextlib.suppress(Exception):
|
|
52
|
+
record.exc_text = logging.Formatter().formatException(record.exc_info)
|
|
53
|
+
if record.exc_text:
|
|
54
|
+
record.exc_text = scrub_secrets(record.exc_text)
|
|
55
|
+
if record.stack_info:
|
|
56
|
+
record.stack_info = scrub_secrets(record.stack_info)
|
|
46
57
|
return True
|
|
47
58
|
|
|
48
59
|
|
|
@@ -86,8 +86,11 @@ def default_research_model() -> str | None:
|
|
|
86
86
|
cheap model of the first configured provider in
|
|
87
87
|
:data:`DEFAULT_MODEL_CANDIDATES`. ``None`` when nothing is configured.
|
|
88
88
|
"""
|
|
89
|
+
from ..infra.credentials import get_config_value
|
|
90
|
+
|
|
89
91
|
for var in ("PROMPTURE_RESEARCH_MODEL", "PROMPTURE_DEFAULT_MODEL"):
|
|
90
|
-
|
|
92
|
+
# Env first, then the credential store, where `prompture setup` saves the default model.
|
|
93
|
+
value = (get_config_value(var) or "").strip()
|
|
91
94
|
if value:
|
|
92
95
|
return value
|
|
93
96
|
try:
|
|
@@ -364,6 +367,10 @@ class _ResearchRun:
|
|
|
364
367
|
self.fetched: dict[str, _Fetched] = {}
|
|
365
368
|
self._lock = threading.Lock()
|
|
366
369
|
self._emit_lock = threading.Lock()
|
|
370
|
+
# Packs run in parallel, but under a token/cost budget their LLM calls
|
|
371
|
+
# take turns: checking the budget and recording usage happen under this
|
|
372
|
+
# lock, so concurrent calls can't all pass the check and overshoot.
|
|
373
|
+
self._llm_budget_lock = threading.Lock()
|
|
367
374
|
self.search_ok = 0
|
|
368
375
|
self.search_failed = 0
|
|
369
376
|
|
|
@@ -494,18 +501,21 @@ class _ResearchRun:
|
|
|
494
501
|
)
|
|
495
502
|
|
|
496
503
|
def _pack_one(self, pack: str) -> None:
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
504
|
+
budgeted = self.tracker.budget.max_tokens is not None or self.tracker.budget.max_cost is not None
|
|
505
|
+
guard = self._llm_budget_lock if budgeted else contextlib.nullcontext()
|
|
506
|
+
with guard:
|
|
507
|
+
if not self.tracker.llm_budget_left():
|
|
508
|
+
return
|
|
509
|
+
try:
|
|
510
|
+
text, usage = _call_with_deadline(
|
|
511
|
+
lambda: self.agent._run_pack(pack, self.question), self.tracker.gather_remaining()
|
|
512
|
+
)
|
|
513
|
+
except Exception as exc:
|
|
514
|
+
with self._lock:
|
|
515
|
+
self.routes.append({"op": "pack", "target": pack, "ok": False, "error": _short_error(exc)})
|
|
516
|
+
self.emit("search", f"Pack {pack} unavailable", pack=pack, ok=False)
|
|
517
|
+
return
|
|
518
|
+
self.tracker.record_usage(usage)
|
|
509
519
|
text = (text or "").strip()
|
|
510
520
|
with self._lock:
|
|
511
521
|
self.routes.append({"op": "pack", "target": pack, "ok": bool(text), "served_by": f"pack:{pack}"})
|
|
@@ -7,9 +7,12 @@ description: Use when you need to search the web, read a URL (pages, PDFs, YouTu
|
|
|
7
7
|
|
|
8
8
|
Prompture gives agents working capabilities — search, read, watch, listen,
|
|
9
9
|
call models and external tools — and tells you exactly what works on this
|
|
10
|
-
machine and how to fix what doesn't.
|
|
11
|
-
only raise limits or quality.
|
|
12
|
-
|
|
10
|
+
machine and how to fix what doesn't. Web search and URL reading have keyless
|
|
11
|
+
defaults; keys only raise their limits or quality. Model calls, transcription,
|
|
12
|
+
packs and MCP servers need the provider, key, package or binary that doctor
|
|
13
|
+
names. Where a capability has more than one permitted backend, it fails over
|
|
14
|
+
and reports which one served the request and whether a fallback happened.
|
|
15
|
+
Transcription never moves audio to a second provider without explicit consent.
|
|
13
16
|
|
|
14
17
|
Install: `pip install prompture` (extras: `prompture[web]`, `prompture[media]`,
|
|
15
18
|
`prompture[mcp]`, `prompture[all]`).
|
|
@@ -65,6 +65,14 @@ The report only cites pages it actually opened. Model defaults to
|
|
|
65
65
|
`PROMPTURE_RESEARCH_MODEL`, then the first configured provider's cheap model.
|
|
66
66
|
Other agents can call it as a tool: `tools=[research_tool(depth="quick")]`.
|
|
67
67
|
|
|
68
|
+
## Cache
|
|
69
|
+
|
|
70
|
+
Results are cached locally (`~/.prompture/cache/web_cache.db`). Volatile
|
|
71
|
+
searches (weather, prices, scores, news, "today", `recency_days <= 1`) live 10
|
|
72
|
+
minutes; others live hours. A cached result has `route["cached"] is True` and
|
|
73
|
+
`route["cache_age_s"]` — say so when it matters ("from a search 5 min ago").
|
|
74
|
+
For something that must be live right now, pass `use_cache=False`.
|
|
75
|
+
|
|
68
76
|
## When search fails
|
|
69
77
|
|
|
70
78
|
1. `prompture doctor --only tools --json` → look at the `web_search` row.
|
|
@@ -41,8 +41,18 @@ if page.truncated:
|
|
|
41
41
|
more = web_fetch(page.url, start=page.next_start) # paging
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Long pages end with `[truncated — call again with start=N]
|
|
45
|
-
|
|
44
|
+
Long pages end with `[truncated — call again with start=N]`; paging reads
|
|
45
|
+
from the cache, not the network. `compress=True` trims boilerplate for agent
|
|
46
|
+
loops.
|
|
47
|
+
|
|
48
|
+
## Cache
|
|
49
|
+
|
|
50
|
+
`web_fetch`, `read_url` and `search_platform` share a local cache whose
|
|
51
|
+
lifetime follows the content: 10 minutes for Hacker News, Reddit, X, status
|
|
52
|
+
pages and GitHub issues/PRs, 1 hour for ordinary pages, 1 day for Wikipedia,
|
|
53
|
+
7 days for papers, PDFs, DOIs and YouTube transcripts. Cached results carry
|
|
54
|
+
`route["cached"]` and `route["cache_age_s"]`. Use `use_cache=False` when the
|
|
55
|
+
user needs the page as it is right now; `PROMPTURE_WEB_CACHE=off` disables it.
|
|
46
56
|
|
|
47
57
|
## Safety (don't work around these)
|
|
48
58
|
|
|
@@ -580,6 +580,10 @@ class CLITool:
|
|
|
580
580
|
secrets never have to live in a config file. Values are never logged.
|
|
581
581
|
install_hint: Fix hint when the binary is missing.
|
|
582
582
|
prefix: Tool-name prefix (defaults to *name* with ``-`` → ``_``).
|
|
583
|
+
trusted: Whether health checks may execute the binary. Tools from a
|
|
584
|
+
project's ``.prompture/tools.*`` are untrusted: a repository could
|
|
585
|
+
point ``command`` / ``version_args`` at arbitrary code, so doctor
|
|
586
|
+
and ``cli:all`` only locate their executable and never run it.
|
|
583
587
|
"""
|
|
584
588
|
|
|
585
589
|
name: str
|
|
@@ -593,6 +597,7 @@ class CLITool:
|
|
|
593
597
|
env: dict[str, str] = field(default_factory=dict)
|
|
594
598
|
install_hint: str | None = None
|
|
595
599
|
prefix: str | None = None
|
|
600
|
+
trusted: bool = True
|
|
596
601
|
|
|
597
602
|
def __post_init__(self) -> None:
|
|
598
603
|
if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9_.-]{0,40}", self.name or ""):
|
|
@@ -730,10 +735,16 @@ class CLITool:
|
|
|
730
735
|
return _ON_WINDOWS and path.lower().endswith((".bat", ".cmd"))
|
|
731
736
|
|
|
732
737
|
def is_active(self) -> bool:
|
|
733
|
-
"""True when the binary exists and its version probe succeeds.
|
|
738
|
+
"""True when the binary exists and (for trusted tools) its version probe succeeds.
|
|
739
|
+
|
|
740
|
+
Untrusted, project-defined tools are never executed here; finding the
|
|
741
|
+
executable is enough.
|
|
742
|
+
"""
|
|
734
743
|
path = self._resolve()
|
|
735
744
|
if path is None or self._is_batch_launcher(path):
|
|
736
745
|
return False
|
|
746
|
+
if not self.trusted:
|
|
747
|
+
return True
|
|
737
748
|
return cached_probe(self.command, self.version_args, hint=self.install_hint).ok
|
|
738
749
|
|
|
739
750
|
def check(self, live: bool = False) -> HealthStatus:
|
|
@@ -750,6 +761,8 @@ class CLITool:
|
|
|
750
761
|
fix_hint=f"Point `command` at the real executable for {self.name}.",
|
|
751
762
|
details={**details, "path": path},
|
|
752
763
|
)
|
|
764
|
+
if not self.trusted:
|
|
765
|
+
return self._untrusted_check(row_name, path, details)
|
|
753
766
|
probe = cached_probe(self.command, self.version_args, hint=self.install_hint or install_hint(self.command))
|
|
754
767
|
details.update(path=probe.path, version=probe.version if probe.ok else None, exit_code=probe.exit_code)
|
|
755
768
|
if not probe.ok:
|
|
@@ -789,6 +802,35 @@ class CLITool:
|
|
|
789
802
|
details=details,
|
|
790
803
|
) # type: ignore[arg-type]
|
|
791
804
|
|
|
805
|
+
def _untrusted_check(self, row_name: str, path: str | None, details: dict[str, Any]) -> HealthStatus:
|
|
806
|
+
"""Health row for a project-defined tool: locate the executable, never run it."""
|
|
807
|
+
details.update(path=path, trusted=False)
|
|
808
|
+
if path is None:
|
|
809
|
+
return HealthStatus(
|
|
810
|
+
row_name,
|
|
811
|
+
"missing",
|
|
812
|
+
category="tools",
|
|
813
|
+
message=f"`{self.command}` not found on PATH",
|
|
814
|
+
fix_hint=self.install_hint or install_hint(self.command),
|
|
815
|
+
details=details,
|
|
816
|
+
)
|
|
817
|
+
_, missing = self._injected_env()
|
|
818
|
+
fix = None
|
|
819
|
+
status = "ok"
|
|
820
|
+
if missing:
|
|
821
|
+
status = "degraded"
|
|
822
|
+
fix = "Set " + ", ".join(sorted(set(missing))) + f" (referenced by {self.name} env)."
|
|
823
|
+
details["missing_env"] = sorted(set(missing))
|
|
824
|
+
return HealthStatus(
|
|
825
|
+
row_name,
|
|
826
|
+
status, # type: ignore[arg-type]
|
|
827
|
+
category="tools",
|
|
828
|
+
active_backend=path,
|
|
829
|
+
message=f"found at {path}; project-defined, so not executed by health checks",
|
|
830
|
+
fix_hint=fix,
|
|
831
|
+
details=details,
|
|
832
|
+
)
|
|
833
|
+
|
|
792
834
|
# -- execution ------------------------------------------------------
|
|
793
835
|
|
|
794
836
|
def run(self, command: str, **params: Any) -> CLIResult:
|