prompture 1.13.5.dev3__tar.gz → 1.13.6.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/PKG-INFO +5 -5
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/README.md +4 -4
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/_version.py +2 -2
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/__init__.py +4 -2
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/challenge.py +29 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/__init__.py +4 -1
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/cache.py +1 -1
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/fetch.py +5 -1
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/__init__.py +5 -1
- prompture-1.13.6.dev1/prompture/tools/web/readers/anilist.py +376 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/PKG-INFO +5 -5
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/SOURCES.txt +1 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/scm_file_list.json +1 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.env.copy +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.gitattributes +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/FUNDING.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/workflows/dev.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/workflows/documentation.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/workflows/publish.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.github/workflows/security.yml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/.safety-project.ini +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/AGENTS.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/BREAKING_CHANGES.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/CLAUDE.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/CONTRIBUTING.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/LICENSE +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/MANIFEST.in +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/ROADMAP.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/SECURITY.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/VERSION +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/dev.ps1 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/dev.sh +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/llms.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/mypy_errors.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/README.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_json/README.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_json/test.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/__main__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/_internal/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/_internal/json_encoder.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/agent.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/assistant.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/async_agent.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/async_conversation.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/conversation.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/deep_state.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/live_events.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/persona.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/review_loop.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/skill_miner.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/skills.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/tool_grammars.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/tools_schema.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/agents/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/aio/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/bridges/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/backends.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/builtin_checks.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/errors.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/health.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/http.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/probe.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/capabilities/url_safety.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/checkpoints/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/checkpoints/core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/checkpoints/stores.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/checkpoints/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/citations/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/citations/core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/citations/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/cli.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/doctor_cmd.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/formatters.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/mcp_cmd.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/research_cmd.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/runner.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/server.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/setup_cmd.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/skill_cmd.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/cli/transcribe_cmd.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/automations.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/calls.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/capacity.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/coding_tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/hook.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/live.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/local.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/memory.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/reuse.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/router.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/routing_policy.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/server.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/summary.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/companion/tool_routing.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/dedup.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/evol.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/filters.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/formats.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/schemas.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/seed.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/dataset/synth.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/doctor/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/doctor/core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/doctor/providers.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_media_usage.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_ollama_options.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_openai_compat.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_openai_compat_stream.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_openai_responses.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_prompt_cache.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_prompted_tool_stream.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/_usage_reporting.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/aggregator_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_aggregator_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_claude_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_kev_decision_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_laya_decision_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_compatible_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/azure_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/claude_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/decision_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/decision_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/google_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/groq_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/job_runner.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/kev_decision_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/laya_decision_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/lipsync_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/lipsync_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/media_capabilities.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/muapi_aggregator_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/music_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/music_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_compatible_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/provider_branding.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/provider_descriptors.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/systemone_compatible_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/typesafe_decision_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/vertex_img_gen_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/eval/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/eval/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/eval/faithfulness.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/eval/judge.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/eval/pairwise.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/eval/self_consistency.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/exceptions.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/context.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/context_eval.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/data/document_qa_policies.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/data/extraction_contacts.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/data/tool_task_inventory.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/fixtures.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/gates.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/harness.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/improve/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/improve/candidates.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/improve/optimizer.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/improve/promotion.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/improve/scorecard.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/integration.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/outcomes.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/policy.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/sandbox.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/scoring.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/strategies/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/strategies/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/strategies/critique.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/strategies/direct.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/strategies/registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/strategies/retrieve.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/execution/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/_usage.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/async_core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/code_extraction.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/few_shot.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/fields.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/strategy.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/streaming.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/tukuy_bridge.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/extraction/validator.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/gateway/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/gateway/anthropic_format.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/gateway/gemini_format.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/gateway/openai_format.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/gateway/reasoning_cache.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/gateway/responses_format.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/async_groups.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/consensus.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/debate.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/fusion.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/groups.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/groups/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/imaging/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/imaging/enhance.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/imaging/negative.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/imaging/set_planner.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/imaging/style_presets.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/accounts.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/billing.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/budget.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/cache.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/callbacks.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/capabilities.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/coding_agent_activity.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/coding_agent_events.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/coding_agent_readers.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/coding_agent_specs.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/coding_agent_usage.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/coding_agents.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/compression.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/credentials.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/discovery.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/environment.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/ledger.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/logging.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/media_pricing.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/media_rates.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/model_rates.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/otel.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/pricing.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/provider_env.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rate_limits.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/google.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/kev.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/laya.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/together.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/typesafe.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/session.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/settings.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/token_counting.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/tracker.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/infra/updates.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/detect.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/document.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/integrations/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/integrations/mcp_bridge.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/integrations/tukuy_bridge.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/jobs.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/kg/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/kg/core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/kg/stores.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/kg/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/client.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/health.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/hub.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/importers.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/server.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/mcp/tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/agent_tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/audio.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/hosting.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/image.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/errors.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/ffmpeg.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/groq_stt.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/health.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/sources.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/summarize.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/understand/transcribe.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/media/video.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/02-installation.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/06-stability.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pages/07-migration.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/persistence/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/persistence/history.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/persistence/serialization.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/persistence/store.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/pipeline/routing.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/decision_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/plugins/discovery.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/py.typed +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/contextual.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/documents.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/pipeline.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/_fusion.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/hyde.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/multi_query.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/retrievers/step_back.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/refusal/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/refusal/detector.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/refusal/markers.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/agent.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/budget.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/events.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/planner.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/ranking.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/report.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/synthesis.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/research/tools.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/async_driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/backoff.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/breaker.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/driver.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/errors.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/explain.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/headroom.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/keys.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/router.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/strategies.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/resilience/virtual.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/generator.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/security/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/security/injection.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/security/redaction.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/session_memory/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/session_memory/core.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/session_memory/project.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/session_memory/stores.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/session_memory/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/SKILL.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/dev.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/finance.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/mcp.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/media.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/models.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/search.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/skill/data/references/web.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/environment.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/memory.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/scheduler.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/swarm.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/swarm_agent.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/swarm/types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/testing/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/cli/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/cli/adapter.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/cli/builtin.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/cli/config.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/cli/health.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/code_exec.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/named.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/packs.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/_common.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/_mcp_http.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/_types.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/health.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/html2md.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/platform.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/_media.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/arxiv.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/base.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/feeds.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/github.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/hackernews.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/podcasts.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/wikipedia.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/readers/youtube.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/search.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web/toolkit.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/tools/web_search.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/__init__.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/architect.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/engine.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/errors.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/model.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/nodes.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/recovery.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/references.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/registry.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/scheduler.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture/workflow/state.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/requires.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/prompture_cost_tracking.md +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/pyproject.toml +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/requirements.txt +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/setup.cfg +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/specs/basic_extraction.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/specs/schema_validation.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/specs/strategy_comparison.json +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/test.py +0 -0
- {prompture-1.13.5.dev3 → prompture-1.13.6.dev1}/test_version_diagnosis.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prompture
|
|
3
|
-
Version: 1.13.
|
|
3
|
+
Version: 1.13.6.dev1
|
|
4
4
|
Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
|
|
5
5
|
Author-email: Juan Denis <juan@vene.co>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -188,7 +188,7 @@ prompture mcp add --preset exa # mount MCP servers by name
|
|
|
188
188
|
prompture skill install # teach your coding agent all of this
|
|
189
189
|
```
|
|
190
190
|
|
|
191
|
-
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
|
|
191
|
+
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, feeds and podcasts
|
|
192
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
193
|
- **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
|
|
194
194
|
- **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
|
|
@@ -237,7 +237,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
237
237
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
238
238
|
|
|
239
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
|
|
240
|
+
- Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, AniList, feeds, podcasts), with failover across keyed providers
|
|
241
241
|
- Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
|
|
242
242
|
- `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
|
|
243
243
|
- `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
|
|
@@ -2132,7 +2132,7 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
|
|
|
2132
2132
|
|---|---|
|
|
2133
2133
|
| `web_search` | `tavily` ▸ `exa` ▸ `serper` ▸ `brave` ▸ `jina` ▸ `searxng` ▸ `exa_mcp` (keyless) |
|
|
2134
2134
|
| `web_fetch` | `jina_reader` (keyless) ▸ `direct` (safe GET + HTML to Markdown) |
|
|
2135
|
-
| `read_url` | YouTube, GitHub, Hacker News, arXiv, Wikipedia, podcasts, RSS/Atom readers ▸ `web_fetch` |
|
|
2135
|
+
| `read_url` | YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, podcasts, RSS/Atom readers ▸ `web_fetch` |
|
|
2136
2136
|
| `search_platform` | YouTube (`yt-dlp`), GitHub, Hacker News (Algolia), arXiv |
|
|
2137
2137
|
|
|
2138
2138
|
- Auth, quota and rate-limit errors fail over immediately; timeouts and 5xx
|
|
@@ -2155,7 +2155,7 @@ entry lives as long as that kind of content stays true:
|
|
|
2155
2155
|
| Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
|
|
2156
2156
|
| Ordinary pages / searches within `recency_days <= 7` | 1 h |
|
|
2157
2157
|
| Other searches | 6 h |
|
|
2158
|
-
| Wikipedia, podcast episodes | 1 day |
|
|
2158
|
+
| Wikipedia, AniList, podcast episodes | 1 day |
|
|
2159
2159
|
| Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
|
|
2160
2160
|
|
|
2161
2161
|
Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
|
|
@@ -71,7 +71,7 @@ prompture mcp add --preset exa # mount MCP servers by name
|
|
|
71
71
|
prompture skill install # teach your coding agent all of this
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
|
|
74
|
+
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, feeds and podcasts
|
|
75
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
76
|
- **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
|
|
77
77
|
- **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
|
|
@@ -120,7 +120,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
120
120
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
121
121
|
|
|
122
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
|
|
123
|
+
- Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, AniList, feeds, podcasts), with failover across keyed providers
|
|
124
124
|
- Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
|
|
125
125
|
- `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
|
|
126
126
|
- `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
|
|
@@ -2015,7 +2015,7 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
|
|
|
2015
2015
|
|---|---|
|
|
2016
2016
|
| `web_search` | `tavily` ▸ `exa` ▸ `serper` ▸ `brave` ▸ `jina` ▸ `searxng` ▸ `exa_mcp` (keyless) |
|
|
2017
2017
|
| `web_fetch` | `jina_reader` (keyless) ▸ `direct` (safe GET + HTML to Markdown) |
|
|
2018
|
-
| `read_url` | YouTube, GitHub, Hacker News, arXiv, Wikipedia, podcasts, RSS/Atom readers ▸ `web_fetch` |
|
|
2018
|
+
| `read_url` | YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, podcasts, RSS/Atom readers ▸ `web_fetch` |
|
|
2019
2019
|
| `search_platform` | YouTube (`yt-dlp`), GitHub, Hacker News (Algolia), arXiv |
|
|
2020
2020
|
|
|
2021
2021
|
- Auth, quota and rate-limit errors fail over immediately; timeouts and 5xx
|
|
@@ -2038,7 +2038,7 @@ entry lives as long as that kind of content stays true:
|
|
|
2038
2038
|
| Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
|
|
2039
2039
|
| Ordinary pages / searches within `recency_days <= 7` | 1 h |
|
|
2040
2040
|
| Other searches | 6 h |
|
|
2041
|
-
| Wikipedia, podcast episodes | 1 day |
|
|
2041
|
+
| Wikipedia, AniList, podcast episodes | 1 day |
|
|
2042
2042
|
| Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
|
|
2043
2043
|
|
|
2044
2044
|
Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
|
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 13,
|
|
21
|
+
__version__ = version = '1.13.6.dev1'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 13, 6, 'dev1')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
* :mod:`.health` — :class:`HealthStatus` and the capability registry doctor walks.
|
|
6
6
|
* :mod:`.url_safety` — :func:`normalize_public_http_url` public-URL guard.
|
|
7
7
|
* :mod:`.http` — :func:`safe_get` redirect-checked, size-capped GET.
|
|
8
|
-
* :mod:`.challenge` — :func:`is_challenge_page` interstitial detection
|
|
8
|
+
* :mod:`.challenge` — :func:`is_challenge_page` interstitial detection and
|
|
9
|
+
:func:`is_js_shell_page` for pages that are only a "needs JavaScript" shell.
|
|
9
10
|
"""
|
|
10
11
|
|
|
11
12
|
from .backends import Backend, BackendChain, BaseBackend, ChainResult, order_backends, parse_override
|
|
12
|
-
from .challenge import is_challenge_page
|
|
13
|
+
from .challenge import is_challenge_page, is_js_shell_page
|
|
13
14
|
from .errors import (
|
|
14
15
|
AllBackendsFailedError,
|
|
15
16
|
BackendUnavailableError,
|
|
@@ -52,6 +53,7 @@ __all__ = [
|
|
|
52
53
|
"check_capabilities",
|
|
53
54
|
"clear_probe_cache",
|
|
54
55
|
"is_challenge_page",
|
|
56
|
+
"is_js_shell_page",
|
|
55
57
|
"is_public_http_url",
|
|
56
58
|
"is_public_ip",
|
|
57
59
|
"list_capabilities",
|
|
@@ -73,3 +73,32 @@ def is_challenge_page(
|
|
|
73
73
|
score = challenge_score(text)
|
|
74
74
|
threshold = 2 if status in _CHALLENGE_STATUSES else 3
|
|
75
75
|
return score >= threshold
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# The first characters of a page rendered without its scripts: an app shell
|
|
79
|
+
# that only says the content needs JavaScript or a newer browser.
|
|
80
|
+
SHELL_SCAN_CHARS = 1000
|
|
81
|
+
|
|
82
|
+
_SHELL_MARKERS = (
|
|
83
|
+
"requires a modern browser",
|
|
84
|
+
"upgrade to a newer web browser",
|
|
85
|
+
"you need to enable javascript to run this app",
|
|
86
|
+
"please enable javascript to continue",
|
|
87
|
+
"this site requires javascript",
|
|
88
|
+
"this page requires javascript",
|
|
89
|
+
"javascript is required to view",
|
|
90
|
+
"javascript is disabled in your browser",
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def is_js_shell_page(text: str | bytes) -> bool:
|
|
95
|
+
"""Return ``True`` when the start of *text* is a "needs JavaScript" app shell.
|
|
96
|
+
|
|
97
|
+
Only the opening :data:`SHELL_SCAN_CHARS` are checked, so a real article
|
|
98
|
+
that mentions JavaScript further down (a comments widget, say) still counts
|
|
99
|
+
as content.
|
|
100
|
+
"""
|
|
101
|
+
if isinstance(text, bytes):
|
|
102
|
+
text = text[: SHELL_SCAN_CHARS * 4].decode("utf-8", errors="ignore")
|
|
103
|
+
head = text[:SHELL_SCAN_CHARS].lower()
|
|
104
|
+
return any(m in head for m in _SHELL_MARKERS)
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* :func:`web_search` — ordered search backends with failover; keyless Exa MCP floor.
|
|
4
4
|
* :func:`web_fetch` — URL → Markdown (Jina reader ▸ direct), paging, 10-minute cache.
|
|
5
5
|
* :func:`read_url` — URL-routed readers (YouTube, GitHub, Hacker News, arXiv,
|
|
6
|
-
Wikipedia, podcasts, feeds) with ``web_fetch`` fallback.
|
|
6
|
+
Wikipedia, AniList, podcasts, feeds) with ``web_fetch`` fallback.
|
|
7
|
+
* :func:`search_anilist` — find an anime / manga by title (its URL reads the cast).
|
|
7
8
|
* :func:`search_platform` — YouTube / GitHub / Hacker News / arXiv search.
|
|
8
9
|
* :class:`WebToolkit` — the above as agent tools; ``tools=["web:all"]``.
|
|
9
10
|
|
|
@@ -47,6 +48,7 @@ from .readers import (
|
|
|
47
48
|
list_readers,
|
|
48
49
|
read_url,
|
|
49
50
|
register_reader,
|
|
51
|
+
search_anilist,
|
|
50
52
|
unregister_reader,
|
|
51
53
|
)
|
|
52
54
|
from .search import (
|
|
@@ -112,6 +114,7 @@ __all__ = [
|
|
|
112
114
|
"read_url",
|
|
113
115
|
"register_reader",
|
|
114
116
|
"resolve_web_tools",
|
|
117
|
+
"search_anilist",
|
|
115
118
|
"search_chain",
|
|
116
119
|
"search_platform",
|
|
117
120
|
"unregister_reader",
|
|
@@ -126,7 +126,7 @@ def read_ttl(url: str, reader: str, kind: str = "page") -> int:
|
|
|
126
126
|
return 7 * DAY # a published video's transcript doesn't change
|
|
127
127
|
if reader == "arxiv":
|
|
128
128
|
return 7 * DAY
|
|
129
|
-
if reader
|
|
129
|
+
if reader in ("wikipedia", "anilist"):
|
|
130
130
|
return DAY
|
|
131
131
|
if reader == "podcasts":
|
|
132
132
|
return DAY
|
|
@@ -28,7 +28,7 @@ from typing import Any
|
|
|
28
28
|
import requests
|
|
29
29
|
|
|
30
30
|
from ...capabilities.backends import BackendChain, BaseBackend
|
|
31
|
-
from ...capabilities.challenge import is_challenge_page
|
|
31
|
+
from ...capabilities.challenge import is_challenge_page, is_js_shell_page
|
|
32
32
|
from ...capabilities.errors import ChallengePageError, HTTPStatusError
|
|
33
33
|
from ...capabilities.http import safe_get
|
|
34
34
|
from ...capabilities.url_safety import normalize_public_http_url
|
|
@@ -174,6 +174,8 @@ class JinaReaderBackend(FetchBackend):
|
|
|
174
174
|
raise RequestRejectedError(self.name, "empty content")
|
|
175
175
|
if is_challenge_page(content) or title.strip().lower() in _CHALLENGE_TITLES:
|
|
176
176
|
raise ChallengePageError(f"{url} returned a bot challenge via {self.name}")
|
|
177
|
+
if is_js_shell_page(content):
|
|
178
|
+
raise RequestRejectedError(self.name, "page is a JavaScript app shell with no content")
|
|
177
179
|
ctype = "application/pdf" if url.lower().split("?", 1)[0].endswith(".pdf") else "text/html"
|
|
178
180
|
return FetchedPage(url=url, final_url=final_url, title=title, content=content.strip(), content_type=ctype)
|
|
179
181
|
|
|
@@ -209,6 +211,8 @@ class DirectBackend(FetchBackend):
|
|
|
209
211
|
html = resp.text
|
|
210
212
|
info = scan_head(html, resp.url)
|
|
211
213
|
content = html_to_markdown(html, base_url=resp.url)
|
|
214
|
+
if is_js_shell_page(content):
|
|
215
|
+
raise RequestRejectedError(self.name, "page is a JavaScript app shell with no content")
|
|
212
216
|
return FetchedPage(url, resp.url, info.title, content, "text/html")
|
|
213
217
|
if ctype == "application/json" or ctype.endswith("+json"):
|
|
214
218
|
try:
|
|
@@ -5,7 +5,7 @@ matches and that has a usable backend reads the URL. When none matches (or
|
|
|
5
5
|
every matching reader fails), :func:`read_url` falls back to
|
|
6
6
|
:func:`~prompture.tools.web.fetch.web_fetch`.
|
|
7
7
|
|
|
8
|
-
Built-in order: YouTube, GitHub, Hacker News, arXiv, Wikipedia, Podcasts,
|
|
8
|
+
Built-in order: YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, Podcasts,
|
|
9
9
|
Feeds. Add your own with :func:`register_reader` (``first=True`` to take
|
|
10
10
|
precedence over the built-ins).
|
|
11
11
|
"""
|
|
@@ -25,6 +25,7 @@ from ....resilience.errors import classify_error
|
|
|
25
25
|
from .. import cache as web_cache
|
|
26
26
|
from .._common import error_text, page
|
|
27
27
|
from ..fetch import web_fetch
|
|
28
|
+
from .anilist import AniListReader, search_anilist
|
|
28
29
|
from .arxiv import ArxivReader
|
|
29
30
|
from .base import BaseReader, Reader, ReadResult, StepBackend
|
|
30
31
|
from .feeds import FeedReader
|
|
@@ -270,6 +271,7 @@ def _register_builtins() -> None:
|
|
|
270
271
|
HackerNewsReader(),
|
|
271
272
|
ArxivReader(),
|
|
272
273
|
WikipediaReader(),
|
|
274
|
+
AniListReader(),
|
|
273
275
|
PodcastReader(),
|
|
274
276
|
FeedReader(),
|
|
275
277
|
):
|
|
@@ -279,6 +281,7 @@ def _register_builtins() -> None:
|
|
|
279
281
|
_register_builtins()
|
|
280
282
|
|
|
281
283
|
__all__ = [
|
|
284
|
+
"AniListReader",
|
|
282
285
|
"ArxivReader",
|
|
283
286
|
"BaseReader",
|
|
284
287
|
"FeedReader",
|
|
@@ -296,5 +299,6 @@ __all__ = [
|
|
|
296
299
|
"matching_readers",
|
|
297
300
|
"read_url",
|
|
298
301
|
"register_reader",
|
|
302
|
+
"search_anilist",
|
|
299
303
|
"unregister_reader",
|
|
300
304
|
]
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"""AniList reader: anime / manga / character pages → structured cast Markdown.
|
|
2
|
+
|
|
3
|
+
anilist.co renders in the browser, so fetching the page returns an app shell.
|
|
4
|
+
This reader asks AniList's public GraphQL API instead (keyless, rate-limited
|
|
5
|
+
per IP). A title page (``/anime/<id>``, ``/manga/<id>``, with or without
|
|
6
|
+
``/characters``) becomes the title's details plus its characters in role
|
|
7
|
+
order, each with gender, age, description and voice actors; a
|
|
8
|
+
``/character/<id>`` page becomes that character with the titles it appears in.
|
|
9
|
+
``meta`` carries the same data as plain dicts for programmatic use.
|
|
10
|
+
|
|
11
|
+
Reader options: ``max_characters`` (default 50), ``spoilers`` (default
|
|
12
|
+
``False`` — AniList ``~!spoiler!~`` passages are dropped) and
|
|
13
|
+
``voice_language`` (``"JAPANESE"`` by default; ``None`` for every language).
|
|
14
|
+
|
|
15
|
+
:func:`search_anilist` finds titles by name, for callers that start from a
|
|
16
|
+
title rather than a URL.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import html
|
|
22
|
+
import re
|
|
23
|
+
import unicodedata
|
|
24
|
+
from typing import Any
|
|
25
|
+
from urllib.parse import urlsplit
|
|
26
|
+
|
|
27
|
+
import requests
|
|
28
|
+
|
|
29
|
+
from ....capabilities.http import proxies_for
|
|
30
|
+
from .._common import API_USER_AGENT, BackendUnavailableError, RequestRejectedError, default_session, host_of
|
|
31
|
+
from .._common import raise_for_status as _raise_for_status
|
|
32
|
+
from .base import BaseReader, ReadResult, StepBackend, clip
|
|
33
|
+
|
|
34
|
+
API = "https://graphql.anilist.co"
|
|
35
|
+
SITE = "https://anilist.co"
|
|
36
|
+
_PATH_RE = re.compile(r"^/(anime|manga|character)/(\d+)(?:/|$)")
|
|
37
|
+
_SPOILER_RE = re.compile(r"~!.*?!~", re.DOTALL)
|
|
38
|
+
_TAG_RE = re.compile(r"<br\s*/?>", re.IGNORECASE)
|
|
39
|
+
PAGE_SIZE = 25
|
|
40
|
+
|
|
41
|
+
_CHARACTER_FIELDS = """
|
|
42
|
+
id siteUrl gender age
|
|
43
|
+
name { full native alternative }
|
|
44
|
+
image { medium }
|
|
45
|
+
description(asHtml: false)
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
_MEDIA_QUERY = (
|
|
49
|
+
"""
|
|
50
|
+
query ($id: Int, $page: Int, $perPage: Int, $lang: StaffLanguage) {
|
|
51
|
+
Media(id: $id) {
|
|
52
|
+
id type format status episodes chapters seasonYear siteUrl
|
|
53
|
+
title { romaji english native }
|
|
54
|
+
description(asHtml: false)
|
|
55
|
+
characters(page: $page, perPage: $perPage, sort: [ROLE, RELEVANCE, ID]) {
|
|
56
|
+
pageInfo { hasNextPage }
|
|
57
|
+
edges {
|
|
58
|
+
role
|
|
59
|
+
node {"""
|
|
60
|
+
+ _CHARACTER_FIELDS
|
|
61
|
+
+ """}
|
|
62
|
+
voiceActors(language: $lang) { name { full native } languageV2 }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
"""
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
_CHARACTER_QUERY = (
|
|
71
|
+
"""
|
|
72
|
+
query ($id: Int) {
|
|
73
|
+
Character(id: $id) {"""
|
|
74
|
+
+ _CHARACTER_FIELDS
|
|
75
|
+
+ """
|
|
76
|
+
media(perPage: 25, sort: [POPULARITY_DESC]) {
|
|
77
|
+
edges {
|
|
78
|
+
characterRole
|
|
79
|
+
node { id type format seasonYear siteUrl title { romaji english native } }
|
|
80
|
+
voiceActors { name { full native } languageV2 }
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
"""
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
_SEARCH_QUERY = """
|
|
89
|
+
query ($search: String, $type: MediaType, $perPage: Int) {
|
|
90
|
+
Page(perPage: $perPage) {
|
|
91
|
+
media(search: $search, type: $type, sort: [SEARCH_MATCH]) {
|
|
92
|
+
id type format episodes seasonYear siteUrl
|
|
93
|
+
title { romaji english native }
|
|
94
|
+
synonyms
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def anilist_id(url: str) -> tuple[str, int] | None:
|
|
102
|
+
"""``(kind, id)`` for an AniList title or character URL, else ``None``.
|
|
103
|
+
|
|
104
|
+
*kind* is ``"anime"``, ``"manga"`` or ``"character"``.
|
|
105
|
+
"""
|
|
106
|
+
if host_of(url) not in ("anilist.co", "www.anilist.co"):
|
|
107
|
+
return None
|
|
108
|
+
try:
|
|
109
|
+
m = _PATH_RE.match(urlsplit(url).path)
|
|
110
|
+
except ValueError:
|
|
111
|
+
return None
|
|
112
|
+
return (m.group(1), int(m.group(2))) if m else None
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def graphql(query: str, variables: dict[str, Any], *, session: Any = None, timeout: float = 20.0) -> dict[str, Any]:
|
|
116
|
+
"""POST one query to the AniList API and return its ``data``."""
|
|
117
|
+
sess = session or default_session()
|
|
118
|
+
resp = sess.post(
|
|
119
|
+
API,
|
|
120
|
+
json={"query": query, "variables": variables},
|
|
121
|
+
headers={"Accept": "application/json", "Content-Type": "application/json", "User-Agent": API_USER_AGENT},
|
|
122
|
+
timeout=timeout,
|
|
123
|
+
proxies=proxies_for("anilist"),
|
|
124
|
+
)
|
|
125
|
+
_raise_for_status(resp, "anilist")
|
|
126
|
+
body = resp.json() or {}
|
|
127
|
+
if body.get("errors"):
|
|
128
|
+
message = str(body["errors"][0].get("message") or "unknown error")
|
|
129
|
+
if "not found" in message.lower():
|
|
130
|
+
raise RequestRejectedError("anilist", message)
|
|
131
|
+
raise BackendUnavailableError(f"AniList API error: {message}")
|
|
132
|
+
return body.get("data") or {}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def clean_description(text: str | None, *, spoilers: bool = False) -> str:
|
|
136
|
+
"""AniList description text without HTML entities and (by default) spoilers."""
|
|
137
|
+
if not text:
|
|
138
|
+
return ""
|
|
139
|
+
if not spoilers:
|
|
140
|
+
text = _SPOILER_RE.sub("", text)
|
|
141
|
+
text = html.unescape(_TAG_RE.sub("\n", text.replace("~!", "").replace("!~", "")))
|
|
142
|
+
return re.sub(r"\n{3,}", "\n\n", text).strip()
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _title(media: dict[str, Any]) -> str:
|
|
146
|
+
t = media.get("title") or {}
|
|
147
|
+
return str(t.get("english") or t.get("romaji") or t.get("native") or "")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _voices(entries: list[dict[str, Any]] | None) -> list[dict[str, str]]:
|
|
151
|
+
return [
|
|
152
|
+
{
|
|
153
|
+
"name": str((v.get("name") or {}).get("full") or ""),
|
|
154
|
+
"native": str((v.get("name") or {}).get("native") or ""),
|
|
155
|
+
"language": str(v.get("languageV2") or ""),
|
|
156
|
+
}
|
|
157
|
+
for v in entries or []
|
|
158
|
+
]
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _character(node: dict[str, Any], *, spoilers: bool) -> dict[str, Any]:
|
|
162
|
+
name = node.get("name") or {}
|
|
163
|
+
return {
|
|
164
|
+
"id": node.get("id"),
|
|
165
|
+
"name": str(name.get("full") or ""),
|
|
166
|
+
"native": str(name.get("native") or ""),
|
|
167
|
+
"alternative": [a for a in name.get("alternative") or [] if a],
|
|
168
|
+
"gender": node.get("gender"),
|
|
169
|
+
"age": node.get("age"),
|
|
170
|
+
"description": clean_description(node.get("description"), spoilers=spoilers),
|
|
171
|
+
"image": (node.get("image") or {}).get("medium"),
|
|
172
|
+
"url": node.get("siteUrl"),
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _character_lines(c: dict[str, Any], head: str) -> list[str]:
|
|
177
|
+
facts = [f for f in (c.get("role"), c.get("gender"), f"age {c['age']}" if c.get("age") else None) if f]
|
|
178
|
+
lines = [f"{head} {c['name']}" + (f" ({c['native']})" if c.get("native") else "")]
|
|
179
|
+
if facts:
|
|
180
|
+
lines.append("- " + " · ".join(str(f) for f in facts))
|
|
181
|
+
if c.get("voice_actors"):
|
|
182
|
+
lines.append(
|
|
183
|
+
"- Voice: "
|
|
184
|
+
+ ", ".join(v["name"] + (f" ({v['language']})" if v["language"] else "") for v in c["voice_actors"])
|
|
185
|
+
)
|
|
186
|
+
if c.get("description"):
|
|
187
|
+
lines.append("")
|
|
188
|
+
lines.append(clip(c["description"], 600))
|
|
189
|
+
lines.append("")
|
|
190
|
+
return lines
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def fold_title(text: str) -> str:
|
|
194
|
+
"""*text* with accents on Latin letters removed ("Shippūden" → "Shippuden").
|
|
195
|
+
|
|
196
|
+
AniList's search matches romanized titles without macrons and misses them
|
|
197
|
+
with. Marks on other scripts (a kana's dakuten) are kept.
|
|
198
|
+
"""
|
|
199
|
+
out: list[str] = []
|
|
200
|
+
for ch in unicodedata.normalize("NFKD", text):
|
|
201
|
+
if unicodedata.combining(ch) and out and out[-1].isascii():
|
|
202
|
+
continue
|
|
203
|
+
out.append(ch)
|
|
204
|
+
return unicodedata.normalize("NFC", "".join(out))
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def search_anilist(
|
|
208
|
+
query: str,
|
|
209
|
+
*,
|
|
210
|
+
media_type: str | None = "ANIME",
|
|
211
|
+
max_results: int = 5,
|
|
212
|
+
session: Any = None,
|
|
213
|
+
timeout: float = 20.0,
|
|
214
|
+
) -> list[dict[str, Any]]:
|
|
215
|
+
"""Titles matching *query*, best match first.
|
|
216
|
+
|
|
217
|
+
Each item has ``id``, ``type``, ``format``, ``episodes``, ``year``,
|
|
218
|
+
``title`` (display), ``titles`` (romaji / english / native), ``synonyms``
|
|
219
|
+
and ``url`` — pass the ``url`` to ``read_url`` for the cast.
|
|
220
|
+
|
|
221
|
+
Accented Latin letters are folded first (AniList misses "Shippūden" but
|
|
222
|
+
finds "Shippuden"); the query as given is tried when that finds nothing.
|
|
223
|
+
"""
|
|
224
|
+
variables: dict[str, Any] = {"perPage": max(1, min(max_results, 25))}
|
|
225
|
+
if media_type:
|
|
226
|
+
variables["type"] = media_type.upper()
|
|
227
|
+
media: list[dict[str, Any]] = []
|
|
228
|
+
for attempt in dict.fromkeys([fold_title(query), query]):
|
|
229
|
+
data = graphql(_SEARCH_QUERY, {**variables, "search": attempt}, session=session, timeout=timeout)
|
|
230
|
+
media = (data.get("Page") or {}).get("media") or []
|
|
231
|
+
if media:
|
|
232
|
+
break
|
|
233
|
+
return [
|
|
234
|
+
{
|
|
235
|
+
"id": m.get("id"),
|
|
236
|
+
"type": m.get("type"),
|
|
237
|
+
"format": m.get("format"),
|
|
238
|
+
"episodes": m.get("episodes"),
|
|
239
|
+
"year": m.get("seasonYear"),
|
|
240
|
+
"title": _title(m),
|
|
241
|
+
"titles": m.get("title") or {},
|
|
242
|
+
"synonyms": m.get("synonyms") or [],
|
|
243
|
+
"url": m.get("siteUrl"),
|
|
244
|
+
}
|
|
245
|
+
for m in media
|
|
246
|
+
]
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class AniListReader(BaseReader):
|
|
250
|
+
"""AniList anime, manga and character pages via the public GraphQL API."""
|
|
251
|
+
|
|
252
|
+
name = "anilist"
|
|
253
|
+
description = "AniList titles and characters → cast with roles, gender, age and voice actors"
|
|
254
|
+
|
|
255
|
+
def can_handle(self, url: str) -> bool:
|
|
256
|
+
return anilist_id(url) is not None
|
|
257
|
+
|
|
258
|
+
def steps(self) -> list[StepBackend]:
|
|
259
|
+
return [
|
|
260
|
+
StepBackend(
|
|
261
|
+
"graphql",
|
|
262
|
+
self._via_graphql,
|
|
263
|
+
live=lambda: graphql("query { Media(id: 1) { id } }", {}),
|
|
264
|
+
)
|
|
265
|
+
]
|
|
266
|
+
|
|
267
|
+
def _via_graphql(
|
|
268
|
+
self,
|
|
269
|
+
url: str,
|
|
270
|
+
*,
|
|
271
|
+
session: requests.Session | None = None,
|
|
272
|
+
max_characters: int = 50,
|
|
273
|
+
spoilers: bool = False,
|
|
274
|
+
voice_language: str | None = "JAPANESE",
|
|
275
|
+
**_: Any,
|
|
276
|
+
) -> ReadResult:
|
|
277
|
+
parsed = anilist_id(url)
|
|
278
|
+
if parsed is None:
|
|
279
|
+
raise RequestRejectedError("graphql", "not an AniList title or character URL")
|
|
280
|
+
kind, item_id = parsed
|
|
281
|
+
if kind == "character":
|
|
282
|
+
return self._read_character(url, item_id, session=session, spoilers=spoilers)
|
|
283
|
+
return self._read_media(
|
|
284
|
+
url,
|
|
285
|
+
item_id,
|
|
286
|
+
session=session,
|
|
287
|
+
max_characters=max_characters,
|
|
288
|
+
spoilers=spoilers,
|
|
289
|
+
voice_language=voice_language,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
def _read_media(
|
|
293
|
+
self,
|
|
294
|
+
url: str,
|
|
295
|
+
media_id: int,
|
|
296
|
+
*,
|
|
297
|
+
session: Any,
|
|
298
|
+
max_characters: int,
|
|
299
|
+
spoilers: bool,
|
|
300
|
+
voice_language: str | None,
|
|
301
|
+
) -> ReadResult:
|
|
302
|
+
media: dict[str, Any] = {}
|
|
303
|
+
characters: list[dict[str, Any]] = []
|
|
304
|
+
page_no = 1
|
|
305
|
+
more = True
|
|
306
|
+
while more and len(characters) < max_characters:
|
|
307
|
+
variables: dict[str, Any] = {"id": media_id, "page": page_no, "perPage": PAGE_SIZE}
|
|
308
|
+
if voice_language:
|
|
309
|
+
variables["lang"] = voice_language.upper()
|
|
310
|
+
media = graphql(_MEDIA_QUERY, variables, session=session).get("Media") or {}
|
|
311
|
+
if not media:
|
|
312
|
+
raise RequestRejectedError("graphql", f"AniList has no title {media_id}")
|
|
313
|
+
block = media.get("characters") or {}
|
|
314
|
+
for edge in block.get("edges") or []:
|
|
315
|
+
c = _character(edge.get("node") or {}, spoilers=spoilers)
|
|
316
|
+
c["role"] = edge.get("role")
|
|
317
|
+
c["voice_actors"] = _voices(edge.get("voiceActors"))
|
|
318
|
+
characters.append(c)
|
|
319
|
+
more = bool((block.get("pageInfo") or {}).get("hasNextPage"))
|
|
320
|
+
page_no += 1
|
|
321
|
+
characters = characters[:max_characters]
|
|
322
|
+
|
|
323
|
+
title = _title(media)
|
|
324
|
+
facts = [media.get("format"), media.get("seasonYear")]
|
|
325
|
+
if media.get("episodes"):
|
|
326
|
+
facts.append(f"{media['episodes']} episodes")
|
|
327
|
+
lines = ["_" + " · ".join(str(f) for f in facts if f) + "_", ""]
|
|
328
|
+
about = clean_description(media.get("description"), spoilers=spoilers)
|
|
329
|
+
if about:
|
|
330
|
+
lines += [clip(about, 1200), ""]
|
|
331
|
+
lines += [f"## Characters ({len(characters)}{'+' if more else ''})", ""]
|
|
332
|
+
for c in characters:
|
|
333
|
+
lines += _character_lines(c, "###")
|
|
334
|
+
meta = {
|
|
335
|
+
"id": media.get("id"),
|
|
336
|
+
"type": media.get("type"),
|
|
337
|
+
"format": media.get("format"),
|
|
338
|
+
"status": media.get("status"),
|
|
339
|
+
"episodes": media.get("episodes"),
|
|
340
|
+
"chapters": media.get("chapters"),
|
|
341
|
+
"year": media.get("seasonYear"),
|
|
342
|
+
"titles": media.get("title") or {},
|
|
343
|
+
"page_url": media.get("siteUrl") or url,
|
|
344
|
+
"characters": characters,
|
|
345
|
+
"more_characters": more,
|
|
346
|
+
}
|
|
347
|
+
return ReadResult(url, title, "\n".join(lines).strip(), self.name, "cast", meta)
|
|
348
|
+
|
|
349
|
+
def _read_character(self, url: str, character_id: int, *, session: Any, spoilers: bool) -> ReadResult:
|
|
350
|
+
node = graphql(_CHARACTER_QUERY, {"id": character_id}, session=session).get("Character") or {}
|
|
351
|
+
if not node:
|
|
352
|
+
raise RequestRejectedError("graphql", f"AniList has no character {character_id}")
|
|
353
|
+
c = _character(node, spoilers=spoilers)
|
|
354
|
+
appearances = []
|
|
355
|
+
for edge in (node.get("media") or {}).get("edges") or []:
|
|
356
|
+
m = edge.get("node") or {}
|
|
357
|
+
appearances.append(
|
|
358
|
+
{
|
|
359
|
+
"id": m.get("id"),
|
|
360
|
+
"title": _title(m),
|
|
361
|
+
"type": m.get("type"),
|
|
362
|
+
"format": m.get("format"),
|
|
363
|
+
"year": m.get("seasonYear"),
|
|
364
|
+
"role": edge.get("characterRole"),
|
|
365
|
+
"url": m.get("siteUrl"),
|
|
366
|
+
"voice_actors": _voices(edge.get("voiceActors")),
|
|
367
|
+
}
|
|
368
|
+
)
|
|
369
|
+
lines = _character_lines(c, "##")[1:] # the title already names the character
|
|
370
|
+
if appearances:
|
|
371
|
+
lines += ["## Appears in", ""]
|
|
372
|
+
for a in appearances:
|
|
373
|
+
facts = ", ".join(str(f) for f in (a["format"], a["year"], a["role"]) if f)
|
|
374
|
+
lines.append(f"- {a['title']}" + (f" ({facts})" if facts else ""))
|
|
375
|
+
meta = {**c, "page_url": c.get("url") or url, "appearances": appearances}
|
|
376
|
+
return ReadResult(url, c["name"], "\n".join(lines).strip(), self.name, "character", meta)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prompture
|
|
3
|
-
Version: 1.13.
|
|
3
|
+
Version: 1.13.6.dev1
|
|
4
4
|
Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
|
|
5
5
|
Author-email: Juan Denis <juan@vene.co>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -188,7 +188,7 @@ prompture mcp add --preset exa # mount MCP servers by name
|
|
|
188
188
|
prompture skill install # teach your coding agent all of this
|
|
189
189
|
```
|
|
190
190
|
|
|
191
|
-
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
|
|
191
|
+
- **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, feeds and podcasts
|
|
192
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
193
|
- **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
|
|
194
194
|
- **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
|
|
@@ -237,7 +237,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
|
|
|
237
237
|
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
238
238
|
|
|
239
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
|
|
240
|
+
- Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, AniList, feeds, podcasts), with failover across keyed providers
|
|
241
241
|
- Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
|
|
242
242
|
- `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
|
|
243
243
|
- `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
|
|
@@ -2132,7 +2132,7 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
|
|
|
2132
2132
|
|---|---|
|
|
2133
2133
|
| `web_search` | `tavily` ▸ `exa` ▸ `serper` ▸ `brave` ▸ `jina` ▸ `searxng` ▸ `exa_mcp` (keyless) |
|
|
2134
2134
|
| `web_fetch` | `jina_reader` (keyless) ▸ `direct` (safe GET + HTML to Markdown) |
|
|
2135
|
-
| `read_url` | YouTube, GitHub, Hacker News, arXiv, Wikipedia, podcasts, RSS/Atom readers ▸ `web_fetch` |
|
|
2135
|
+
| `read_url` | YouTube, GitHub, Hacker News, arXiv, Wikipedia, AniList, podcasts, RSS/Atom readers ▸ `web_fetch` |
|
|
2136
2136
|
| `search_platform` | YouTube (`yt-dlp`), GitHub, Hacker News (Algolia), arXiv |
|
|
2137
2137
|
|
|
2138
2138
|
- Auth, quota and rate-limit errors fail over immediately; timeouts and 5xx
|
|
@@ -2155,7 +2155,7 @@ entry lives as long as that kind of content stays true:
|
|
|
2155
2155
|
| Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
|
|
2156
2156
|
| Ordinary pages / searches within `recency_days <= 7` | 1 h |
|
|
2157
2157
|
| Other searches | 6 h |
|
|
2158
|
-
| Wikipedia, podcast episodes | 1 day |
|
|
2158
|
+
| Wikipedia, AniList, podcast episodes | 1 day |
|
|
2159
2159
|
| Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
|
|
2160
2160
|
|
|
2161
2161
|
Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
|