prompture 1.1.3.dev1__tar.gz → 1.1.3.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/PKG-INFO +203 -226
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/README.md +202 -225
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/_version.py +2 -2
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/__init__.py +20 -0
- prompture-1.1.3.dev3/prompture/agents/assistant.py +455 -0
- prompture-1.1.3.dev3/prompture/agents/review_loop.py +242 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/__init__.py +10 -0
- prompture-1.1.3.dev3/prompture/extraction/code_extraction.py +159 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/__init__.py +2 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/coding_agent_specs.py +23 -1
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/discovery.py +75 -1
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture.egg-info/PKG-INFO +203 -226
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture.egg-info/SOURCES.txt +3 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.env.copy +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/FUNDING.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/workflows/dev.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/workflows/documentation.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/workflows/publish.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.github/workflows/security.yml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/.safety-project.ini +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/AGENTS.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/BREAKING_CHANGES.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/CLAUDE.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/CONTRIBUTING.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/LICENSE +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/MANIFEST.in +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/ROADMAP.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/SECURITY.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/dev.ps1 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/dev.sh +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/mypy_errors.txt +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/README.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_json/README.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_json/test.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/agent.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/async_agent.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/async_conversation.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/conversation.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/deep_state.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/persona.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/skills.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/tools_schema.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/agents/types.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/aio/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/bridges/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/cli/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/cli/cli.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/cli/formatters.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/cli/runner.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/cli/server.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/dataset/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/dataset/formats.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/dataset/schemas.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/dataset/synth.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_claude_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_compatible_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/azure_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/claude_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/google_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/groq_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_compatible_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/provider_descriptors.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/exceptions.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/async_core.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/core.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/fields.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/strategy.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/tools.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/tukuy_bridge.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/extraction/validator.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/groups/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/groups/async_groups.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/groups/consensus.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/groups/debate.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/groups/groups.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/groups/types.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/budget.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/cache.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/callbacks.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/capabilities.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/coding_agent_events.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/coding_agents.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/ledger.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/logging.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/model_rates.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/pricing.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/provider_env.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/google.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/together.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/session.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/settings.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/tracker.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/detect.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/document.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/integrations/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/integrations/tukuy_bridge.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/media/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/media/audio.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/media/image.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/media/video.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/02-installation.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/06-stability.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pages/07-migration.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/persistence/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/persistence/history.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/persistence/serialization.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/persistence/store.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/pipeline/routing.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/plugins/discovery.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/py.typed +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/documents.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/pipeline.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/refusal/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/refusal/detector.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/refusal/markers.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/generator.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/security/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/security/injection.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/security/redaction.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/testing/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/tools/__init__.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/tools/code_exec.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture/tools/web_search.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture.egg-info/requires.txt +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/prompture_cost_tracking.md +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/pyproject.toml +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/requirements.txt +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/setup.cfg +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/specs/basic_extraction.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/specs/schema_validation.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/specs/strategy_comparison.json +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/test.py +0 -0
- {prompture-1.1.3.dev1 → prompture-1.1.3.dev3}/test_version_diagnosis.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prompture
|
|
3
|
-
Version: 1.1.3.
|
|
3
|
+
Version: 1.1.3.dev3
|
|
4
4
|
Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
|
|
5
5
|
Author-email: Juan Denis <juan@vene.co>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -134,29 +134,37 @@ print(person.name) # Maria
|
|
|
134
134
|
|
|
135
135
|
## Key Features
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
-
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
-
|
|
155
|
-
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
137
|
+
**Structured extraction**
|
|
138
|
+
- JSON schema enforcement and direct Pydantic model population
|
|
139
|
+
- Stepwise per-field extraction with smart type coercion (shorthand numbers, multilingual booleans, dates)
|
|
140
|
+
- Field registry — 50+ predefined fields with template variables and Pydantic integration
|
|
141
|
+
- Strategy cascade — auto-selects provider-native JSON mode, tool-call extraction, or prompted repair
|
|
142
|
+
- Multi-model fallback with per-attempt cost, token, and capability accounting
|
|
143
|
+
- Optional auto-repair pass for malformed JSON
|
|
144
|
+
|
|
145
|
+
**Providers & modalities**
|
|
146
|
+
- 36+ providers under a unified `provider/model` string — see [Providers](#providers)
|
|
147
|
+
- Multi-modal drivers for embeddings, rerank, moderation, image, video, TTS, STT, and audio transforms — see [Multi-Modal](#multi-modal)
|
|
148
|
+
- TOON input conversion for 45–60% token savings on structured input ([python-toon](https://github.com/jhd3197/python-toon))
|
|
149
|
+
|
|
150
|
+
**Agents, tools, RAG**
|
|
151
|
+
- Stateful conversations with sync + async support
|
|
152
|
+
- Function calling and streaming across providers, with prompt-based simulation for models without native tool use
|
|
153
|
+
- Drop-in tools: sandboxed `python_execute` (Tukuy), `web_search` (Tavily / Serper / Brave / SearXNG)
|
|
154
|
+
- `DeepAgent` with planning, virtual filesystem, sub-agents, and auto-summarization — no LangChain
|
|
155
|
+
- Full RAG stack — loaders, chunkers, vector stores, hybrid dense+BM25 retrieval, end-to-end `RAGPipeline` — see [RAG](#rag)
|
|
156
|
+
|
|
157
|
+
**Safety & evaluation**
|
|
158
|
+
- `PromptInjectionDetector` + `PIIRedactor` for input-side defense
|
|
159
|
+
- `RefusalDetector` / `RefusalEvaluator` for cross-provider alignment scoring
|
|
160
|
+
- `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
|
|
161
|
+
|
|
162
|
+
**Ops**
|
|
163
|
+
- `prompture serve` — OpenAI-compatible server (`/v1/chat/completions`, `/v1/embeddings`, `/v1/coding-agents`, …) routes any client to any provider
|
|
164
|
+
- Usage tracking — tokens + cost on every call
|
|
165
|
+
- Response cache — memory, SQLite, Redis backends
|
|
166
|
+
- Plugin system — register custom drivers via entry points
|
|
167
|
+
- Spec-driven batch testing for cross-model comparison
|
|
160
168
|
|
|
161
169
|
## Built With Prompture
|
|
162
170
|
|
|
@@ -171,34 +179,70 @@ Projects powered by Prompture at their core:
|
|
|
171
179
|
pip install prompture
|
|
172
180
|
```
|
|
173
181
|
|
|
174
|
-
|
|
182
|
+
That's all you need for the core driver system, structured extraction, and
|
|
183
|
+
agent loop. Everything below is **opt-in** — install only what you'll actually
|
|
184
|
+
use.
|
|
185
|
+
|
|
186
|
+
> **TL;DR** — Building a RAG app? `pip install prompture[rag]` and skip the
|
|
187
|
+
> rest of this section. Just doing structured extraction or agents? You don't
|
|
188
|
+
> need any extras.
|
|
189
|
+
|
|
190
|
+
### Core extras
|
|
191
|
+
|
|
192
|
+
| Extra | Adds | Install |
|
|
193
|
+
|---|---|---|
|
|
194
|
+
| `redis` | Redis cache backend | `pip install prompture[redis]` |
|
|
195
|
+
| `serve` | FastAPI server mode (`prompture serve`) | `pip install prompture[serve]` |
|
|
196
|
+
| `airllm` | AirLLM local inference | `pip install prompture[airllm]` |
|
|
197
|
+
| `bedrock` | AWS Bedrock driver (`boto3`) | `pip install prompture[bedrock]` |
|
|
198
|
+
| `sandbox` | Sandboxed Python execution tool (`tukuy`) | `pip install prompture[sandbox]` |
|
|
199
|
+
|
|
200
|
+
### RAG — the easy path
|
|
175
201
|
|
|
176
202
|
```bash
|
|
177
|
-
pip install prompture[
|
|
178
|
-
pip install prompture[serve] # FastAPI server mode
|
|
179
|
-
pip install prompture[airllm] # AirLLM local inference
|
|
180
|
-
pip install prompture[bedrock] # AWS Bedrock driver (boto3)
|
|
181
|
-
pip install prompture[sandbox] # Sandboxed Python execution tool (tukuy)
|
|
182
|
-
pip install prompture[rag] # Full RAG stack (all loaders, chunkers, vector stores, hybrid retrieval)
|
|
203
|
+
pip install prompture[rag]
|
|
183
204
|
```
|
|
184
205
|
|
|
185
|
-
|
|
206
|
+
Pulls in every loader, chunker, hybrid retrieval, and all vector-store
|
|
207
|
+
backends. Use this unless you need to keep the dependency footprint small.
|
|
208
|
+
|
|
209
|
+
### RAG — à la carte
|
|
210
|
+
|
|
211
|
+
Pick only the pieces you need.
|
|
212
|
+
|
|
213
|
+
**Loaders** — one per document format:
|
|
214
|
+
|
|
215
|
+
| Extra | Format | Backed by |
|
|
216
|
+
|---|---|---|
|
|
217
|
+
| `rag-pdf` | PDF | `pypdf` |
|
|
218
|
+
| `rag-docx` | DOCX | `python-docx` |
|
|
219
|
+
| `rag-html` | HTML | `beautifulsoup4` + `markdownify` + `lxml` |
|
|
220
|
+
| `rag-epub` | EPUB | `ebooklib` |
|
|
221
|
+
| `rag-xlsx` | XLSX | `openpyxl` |
|
|
222
|
+
|
|
223
|
+
**Chunking & retrieval:**
|
|
224
|
+
|
|
225
|
+
| Extra | What it adds | Backed by |
|
|
226
|
+
|---|---|---|
|
|
227
|
+
| `rag-token` | Token-aware chunker | `tiktoken` |
|
|
228
|
+
| `rag-semantic` | Semantic chunker | `numpy` |
|
|
229
|
+
| `rag-hybrid` | Hybrid retriever (BM25 + vectors) | `rank-bm25` |
|
|
230
|
+
|
|
231
|
+
**Vector stores** — pick whichever you deploy against:
|
|
232
|
+
|
|
233
|
+
| Extra | Vector store |
|
|
234
|
+
|---|---|
|
|
235
|
+
| `rag-vs-chroma` | Chroma |
|
|
236
|
+
| `rag-vs-pinecone` | Pinecone |
|
|
237
|
+
| `rag-vs-qdrant` | Qdrant |
|
|
238
|
+
| `rag-vs-pgvector` | pgvector / PostgreSQL |
|
|
239
|
+
| `rag-vs-faiss` | FAISS (CPU build) |
|
|
240
|
+
| `rag-vs-weaviate` | Weaviate |
|
|
241
|
+
|
|
242
|
+
Combine them as needed, e.g.:
|
|
186
243
|
|
|
187
244
|
```bash
|
|
188
|
-
pip install prompture[rag-pdf]
|
|
189
|
-
pip install prompture[rag-docx] # DOCX loader (python-docx)
|
|
190
|
-
pip install prompture[rag-html] # HTML loader (beautifulsoup4 + markdownify + lxml)
|
|
191
|
-
pip install prompture[rag-epub] # EPUB loader (ebooklib)
|
|
192
|
-
pip install prompture[rag-xlsx] # XLSX loader (openpyxl)
|
|
193
|
-
pip install prompture[rag-token] # Token-aware chunker (tiktoken)
|
|
194
|
-
pip install prompture[rag-semantic] # Semantic chunker (numpy)
|
|
195
|
-
pip install prompture[rag-hybrid] # Hybrid retriever with BM25 (rank-bm25)
|
|
196
|
-
pip install prompture[rag-vs-chroma] # Chroma vector store
|
|
197
|
-
pip install prompture[rag-vs-pinecone] # Pinecone vector store
|
|
198
|
-
pip install prompture[rag-vs-qdrant] # Qdrant vector store
|
|
199
|
-
pip install prompture[rag-vs-pgvector] # pgvector / PostgreSQL
|
|
200
|
-
pip install prompture[rag-vs-faiss] # FAISS vector store (CPU build)
|
|
201
|
-
pip install prompture[rag-vs-weaviate] # Weaviate vector store
|
|
245
|
+
pip install "prompture[rag-pdf,rag-token,rag-vs-qdrant]"
|
|
202
246
|
```
|
|
203
247
|
|
|
204
248
|
## Configuration
|
|
@@ -247,17 +291,23 @@ Model strings use `"provider/model"` format. The provider prefix routes to the c
|
|
|
247
291
|
| `openai` | `openai/gpt-4` | Automatic |
|
|
248
292
|
| `claude` | `claude/claude-3` | Automatic |
|
|
249
293
|
| `google` | `google/gemini-1.5-pro` | Automatic |
|
|
250
|
-
| `google_vertexai` | `google_vertexai/gemini-1.5-pro` | Automatic |
|
|
251
294
|
| `groq` | `groq/llama2-70b-4096` | Automatic |
|
|
295
|
+
| `openrouter` | `openrouter/anthropic/claude-2` | Automatic |
|
|
296
|
+
| `ollama` | `ollama/llama3.1:8b` | Free (local) |
|
|
297
|
+
|
|
298
|
+
<details>
|
|
299
|
+
<summary><b>Show all 30+ providers</b></summary>
|
|
300
|
+
|
|
301
|
+
| Provider | Example Model | Cost |
|
|
302
|
+
|---|---|---|
|
|
303
|
+
| `google_vertexai` | `google_vertexai/gemini-1.5-pro` | Automatic |
|
|
252
304
|
| `grok` | `grok/grok-4-fast-reasoning` | Automatic |
|
|
253
305
|
| `azure` | `azure/deployed-name` | Automatic |
|
|
254
306
|
| `bedrock` | `bedrock/anthropic.claude-3-5-haiku-20241022-v1:0` (requires `pip install prompture[bedrock]`) | Automatic |
|
|
255
|
-
| `openrouter` | `openrouter/anthropic/claude-2` | Automatic |
|
|
256
307
|
| `moonshot` | `moonshot/kimi-k2` | Automatic |
|
|
257
308
|
| `modelscope` | `modelscope/Qwen2.5-72B-Instruct` | Automatic |
|
|
258
309
|
| `zai` | `zai/glm-4` | Automatic |
|
|
259
310
|
| `cachibot` | `cachibot/openai/gpt-4o-mini` | Automatic |
|
|
260
|
-
| `ollama` | `ollama/llama3.1:8b` | Free (local) |
|
|
261
311
|
| `lmstudio` | `lmstudio/local-model` | Free (local) |
|
|
262
312
|
| `huggingface` | `hf/model-name` | Free (local) |
|
|
263
313
|
| `airllm` | `airllm/Qwen2-7B` | Free (local) |
|
|
@@ -277,6 +327,8 @@ Model strings use `"provider/model"` format. The provider prefix routes to the c
|
|
|
277
327
|
| `mixedbread` | `mixedbread/mxbai-embed-large-v1` (embedding), `mixedbread/mxbai-rerank-large-v1` (rerank) | Automatic |
|
|
278
328
|
| `openai_compatible` | `openai_compatible/<profile>/<model>` — 9 curated profiles: `fireworks`, `together`, `cerebras`, `sambanova`, `perplexity`, `nvidia`, `deepinfra`, `siliconflow`, `github_models` (or pass an explicit `endpoint=` for anything else) | Automatic where pricing is known |
|
|
279
329
|
|
|
330
|
+
</details>
|
|
331
|
+
|
|
280
332
|
Aliases (`anthropic`, `gemini`, `chatgpt`, `xai`, `lm_studio`, `zhipu`, `hf`, `dalle`, `runwayml`, `hailuo`, `mistralai`, `flux`, `mxbai`) route to their canonical providers.
|
|
281
333
|
|
|
282
334
|
## Multi-Modal
|
|
@@ -1226,6 +1278,105 @@ agent = create_deep_agent(
|
|
|
1226
1278
|
|
|
1227
1279
|
`AsyncDeepAgent` / `create_async_deep_agent` mirror the sync API for async use. State lives on `agent.deep_state` (the `state` attribute is reserved for lifecycle on the underlying `Agent`). Reserved tool names (`write_todos`, `task`, `read_file`, `write_file`, `edit_file`, `ls`, `glob`, `grep`) take precedence over user tools; collisions emit a warning. See `examples/deep_agent_example.py` for a complete walkthrough.
|
|
1228
1280
|
|
|
1281
|
+
### Assistants
|
|
1282
|
+
|
|
1283
|
+
An `Assistant` bundles a `Persona`, optional `Skill`s, optional `tools`, and exactly one execution backend (an LLM `model` id or a `coding_agent` CLI id) into a reusable unit. Consumers register an assistant once and reuse it everywhere, swapping the backend without changing call-sites.
|
|
1284
|
+
|
|
1285
|
+
```python
|
|
1286
|
+
from prompture import Assistant, Persona, SkillInfo
|
|
1287
|
+
|
|
1288
|
+
web_dev = Assistant(
|
|
1289
|
+
name="web-developer",
|
|
1290
|
+
persona=Persona(
|
|
1291
|
+
name="web_dev",
|
|
1292
|
+
system_prompt="You are a senior {{role}} building {{page_type}} pages.",
|
|
1293
|
+
),
|
|
1294
|
+
skills=[SkillInfo(
|
|
1295
|
+
name="semantic-html5",
|
|
1296
|
+
description="Always prefer semantic HTML5 tags.",
|
|
1297
|
+
instructions="Use <header>/<main>/<section>; avoid <div> when a semantic tag fits.",
|
|
1298
|
+
)],
|
|
1299
|
+
model="openai/gpt-4o",
|
|
1300
|
+
variables={"role": "developer"},
|
|
1301
|
+
).register() # store in the assistant registry
|
|
1302
|
+
|
|
1303
|
+
# Later, anywhere:
|
|
1304
|
+
a = Assistant.from_registry("web-developer")
|
|
1305
|
+
result = await a.arun("Build /about.html.", role="senior", page_type="about")
|
|
1306
|
+
print(result.output, result.cost_usd)
|
|
1307
|
+
```
|
|
1308
|
+
|
|
1309
|
+
Both backends return a uniform `AssistantResult` with `output`, `cost_usd`, `input_tokens`, `output_tokens`, `session_id` (coding-agent only), and `raw` (the underlying `AgentResult` / `CodingAgentRunResult`). Swap an LLM for a CLI by replacing `model="…"` with `coding_agent="claude"` (or `"auto"` for capability-aware auto-selection — see *Picking a coding-agent CLI* below).
|
|
1310
|
+
|
|
1311
|
+
Set `enable_planning=True` to route the LLM backend through `AsyncDeepAgent` and gain `write_todos` + streaming plan updates.
|
|
1312
|
+
|
|
1313
|
+
### Review Loops
|
|
1314
|
+
|
|
1315
|
+
`AsyncReviewLoop` wraps the "do work → critique it → optionally revise" pattern as a single async call. Works with anything exposing an awaitable `arun(prompt, **kwargs)` that returns an object with `.output` — typically two `Assistant`s.
|
|
1316
|
+
|
|
1317
|
+
```python
|
|
1318
|
+
from prompture import Assistant, AsyncReviewLoop, Persona
|
|
1319
|
+
|
|
1320
|
+
coder = Assistant(name="c", persona=Persona(name="c", system_prompt="Write Python."), model="openai/gpt-4o-mini")
|
|
1321
|
+
reviewer = Assistant(
|
|
1322
|
+
name="r",
|
|
1323
|
+
persona=Persona(
|
|
1324
|
+
name="r",
|
|
1325
|
+
system_prompt="Critique the code. End with one line: SCORE: <0-10>",
|
|
1326
|
+
),
|
|
1327
|
+
model="openai/gpt-4o-mini",
|
|
1328
|
+
)
|
|
1329
|
+
|
|
1330
|
+
loop = AsyncReviewLoop(
|
|
1331
|
+
coder=coder,
|
|
1332
|
+
reviewer=reviewer,
|
|
1333
|
+
max_iters=3,
|
|
1334
|
+
approve_when=lambda r: "SCORE: 9" in r.output or "SCORE: 10" in r.output,
|
|
1335
|
+
)
|
|
1336
|
+
result = await loop.arun("Write a function that reverses a string.")
|
|
1337
|
+
print(result.output, "approved=", result.approved, "iters=", result.iterations)
|
|
1338
|
+
```
|
|
1339
|
+
|
|
1340
|
+
Customise the review framing with `review_prompt=` and the retry framing with `feedback_prompt=` if the defaults don't fit. Every iteration is preserved in `result.history` as a `ReviewLoopIteration` with the raw coder / reviewer results attached.
|
|
1341
|
+
|
|
1342
|
+
### Picking a coding-agent CLI
|
|
1343
|
+
|
|
1344
|
+
`pick_best_coding_agent` combines discovery with the capability flags on each `CodingAgentSpec`, so callers can ask for *"any installed CLI that supports X"* without hardcoding agent ids.
|
|
1345
|
+
|
|
1346
|
+
```python
|
|
1347
|
+
from prompture import pick_best_coding_agent
|
|
1348
|
+
|
|
1349
|
+
chosen = pick_best_coding_agent(
|
|
1350
|
+
prefer=["claude", "codex"],
|
|
1351
|
+
require_session_resume=True,
|
|
1352
|
+
verify=True,
|
|
1353
|
+
)
|
|
1354
|
+
if chosen:
|
|
1355
|
+
print(f"Will use {chosen.id} from {chosen.binary}")
|
|
1356
|
+
```
|
|
1357
|
+
|
|
1358
|
+
Capability flags exposed today: `supports_tool_use`, `supports_structured_output`, `supports_questions` (clarifying-question events), `supports_session_resume`.
|
|
1359
|
+
|
|
1360
|
+
### Salvaging code from text responses
|
|
1361
|
+
|
|
1362
|
+
When an LLM should have called your `write_file` tool but instead dumped code into its final response (common with weaker models or providers without tool-calling), use `extract_fenced_blocks` and `extract_html_document` to recover it:
|
|
1363
|
+
|
|
1364
|
+
```python
|
|
1365
|
+
from prompture import extract_fenced_blocks, extract_html_document
|
|
1366
|
+
|
|
1367
|
+
for block in extract_fenced_blocks(text, languages=["html", "css", "js"]):
|
|
1368
|
+
write_file(f"{block.language}.txt", block.content)
|
|
1369
|
+
|
|
1370
|
+
doc = extract_html_document(text)
|
|
1371
|
+
if doc.found:
|
|
1372
|
+
write_file("index.html", doc.html)
|
|
1373
|
+
# inline <style> / <script> blocks are also split out:
|
|
1374
|
+
write_file("styles.css", "\n\n".join(doc.styles))
|
|
1375
|
+
write_file("script.js", "\n\n".join(doc.scripts))
|
|
1376
|
+
```
|
|
1377
|
+
|
|
1378
|
+
Both helpers return plain dataclasses with no I/O of their own. See `examples/assistant_example.py` for the assistant + review-loop + extractor flow end-to-end.
|
|
1379
|
+
|
|
1229
1380
|
### Cost Pre-flight
|
|
1230
1381
|
|
|
1231
1382
|
Forecast the cost of a call **before** making it. Accepts either text
|
|
@@ -1592,184 +1743,10 @@ Selected flags:
|
|
|
1592
1743
|
|
|
1593
1744
|
Full example walkthrough: [`examples/openai_server_example.md`](examples/openai_server_example.md).
|
|
1594
1745
|
|
|
1595
|
-
## Integrating
|
|
1596
|
-
|
|
1597
|
-
### FastAPI + AsyncAgent with Tools
|
|
1598
|
-
|
|
1599
|
-
The most common integration pattern — an AI chat endpoint with database-backed tools:
|
|
1600
|
-
|
|
1601
|
-
```python
|
|
1602
|
-
from fastapi import APIRouter, Depends
|
|
1603
|
-
from prompture import AsyncAgent, ToolRegistry, ProviderEnvironment, BudgetExceededError
|
|
1604
|
-
|
|
1605
|
-
router = APIRouter()
|
|
1606
|
-
|
|
1607
|
-
def build_tools(db) -> ToolRegistry:
|
|
1608
|
-
registry = ToolRegistry()
|
|
1609
|
-
|
|
1610
|
-
@registry.tool
|
|
1611
|
-
async def search_records(query: str) -> str:
|
|
1612
|
-
"""Search the database for matching records."""
|
|
1613
|
-
results = await db.execute(...)
|
|
1614
|
-
return format_results(results)
|
|
1615
|
-
|
|
1616
|
-
return registry
|
|
1617
|
-
|
|
1618
|
-
@router.post("/chat")
|
|
1619
|
-
async def chat(message: str, db=Depends(get_db)):
|
|
1620
|
-
env = ProviderEnvironment(openai_api_key=get_api_key_from_db(db))
|
|
1621
|
-
|
|
1622
|
-
agent = AsyncAgent(
|
|
1623
|
-
"openai/gpt-4o",
|
|
1624
|
-
env=env,
|
|
1625
|
-
tools=build_tools(db),
|
|
1626
|
-
system_prompt="You are a helpful assistant with database access.",
|
|
1627
|
-
max_cost=0.25,
|
|
1628
|
-
budget_policy="hard_stop",
|
|
1629
|
-
)
|
|
1630
|
-
|
|
1631
|
-
try:
|
|
1632
|
-
result = await agent.run(message)
|
|
1633
|
-
return {"reply": result.output_text, "usage": result.usage}
|
|
1634
|
-
except BudgetExceededError:
|
|
1635
|
-
return {"error": "Cost limit exceeded"}, 429
|
|
1636
|
-
```
|
|
1637
|
-
|
|
1638
|
-
### SSE Streaming Endpoint
|
|
1639
|
-
|
|
1640
|
-
Stream responses via Server-Sent Events:
|
|
1641
|
-
|
|
1642
|
-
```python
|
|
1643
|
-
from fastapi.responses import StreamingResponse
|
|
1644
|
-
from prompture import AsyncAgent, StreamEventType
|
|
1645
|
-
|
|
1646
|
-
@router.post("/chat/stream")
|
|
1647
|
-
async def chat_stream(message: str):
|
|
1648
|
-
agent = AsyncAgent("claude/claude-sonnet-4-6", env=env, system_prompt="...")
|
|
1649
|
-
|
|
1650
|
-
async def event_stream():
|
|
1651
|
-
async for event in agent.run_stream(message):
|
|
1652
|
-
match event.event_type:
|
|
1653
|
-
case StreamEventType.text_delta:
|
|
1654
|
-
yield f"data: {json.dumps({'type': 'text', 'content': event.data})}\n\n"
|
|
1655
|
-
case StreamEventType.tool_call:
|
|
1656
|
-
yield f"data: {json.dumps({'type': 'tool_call', 'name': event.data['name']})}\n\n"
|
|
1657
|
-
case StreamEventType.output:
|
|
1658
|
-
yield f"data: {json.dumps({'type': 'done'})}\n\n"
|
|
1746
|
+
## Integrating & Extending
|
|
1659
1747
|
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
### Structured Extraction in Endpoints
|
|
1664
|
-
|
|
1665
|
-
Use `AsyncConversation.ask_for_json()` for one-shot structured data extraction:
|
|
1666
|
-
|
|
1667
|
-
```python
|
|
1668
|
-
from prompture import AsyncConversation
|
|
1669
|
-
|
|
1670
|
-
@router.get("/insights")
|
|
1671
|
-
async def get_insights():
|
|
1672
|
-
conv = AsyncConversation("openai/gpt-4o", system_prompt="You analyze data.")
|
|
1673
|
-
result = await conv.ask_for_json(
|
|
1674
|
-
f"Analyze this data and produce insights:\n\n{context}",
|
|
1675
|
-
{"type": "object", "properties": {
|
|
1676
|
-
"insights": {"type": "array", "items": {"type": "object", ...}},
|
|
1677
|
-
"summary": {"type": "string"},
|
|
1678
|
-
}},
|
|
1679
|
-
)
|
|
1680
|
-
return result["json_object"]
|
|
1681
|
-
```
|
|
1682
|
-
|
|
1683
|
-
### Error Handling
|
|
1684
|
-
|
|
1685
|
-
Key exceptions to catch in production:
|
|
1686
|
-
|
|
1687
|
-
```python
|
|
1688
|
-
from prompture import BudgetExceededError, DriverError, ExtractionError, ValidationError
|
|
1689
|
-
|
|
1690
|
-
try:
|
|
1691
|
-
result = await agent.run(message)
|
|
1692
|
-
except BudgetExceededError:
|
|
1693
|
-
# Cost or token limit exceeded — return 429
|
|
1694
|
-
pass
|
|
1695
|
-
except DriverError:
|
|
1696
|
-
# Provider API error (auth, rate limit, network) — return 502
|
|
1697
|
-
pass
|
|
1698
|
-
except ExtractionError:
|
|
1699
|
-
# JSON parsing/validation failed — return 422
|
|
1700
|
-
pass
|
|
1701
|
-
except ValidationError:
|
|
1702
|
-
# Schema validation failed — return 422
|
|
1703
|
-
pass
|
|
1704
|
-
```
|
|
1705
|
-
|
|
1706
|
-
## Extending Prompture
|
|
1707
|
-
|
|
1708
|
-
Prompture's provider registry is plugin-based. Every built-in provider
|
|
1709
|
-
(OpenAI, Claude, Google, etc.) is contributed by a `ProviderPlugin`
|
|
1710
|
-
instance registered in `prompture.plugins.builtins`. Third-party packages
|
|
1711
|
-
can register their own providers via the `prompture.providers` Python
|
|
1712
|
-
entry-point group — no fork required.
|
|
1713
|
-
|
|
1714
|
-
### Plugin Architecture
|
|
1715
|
-
|
|
1716
|
-
At import time, `prompture` discovers plugins from two sources:
|
|
1717
|
-
|
|
1718
|
-
1. **Built-in plugins** — loaded from `prompture.plugins.builtins` directly.
|
|
1719
|
-
2. **External plugins** — discovered through the `prompture.providers`
|
|
1720
|
-
entry-point group via `importlib.metadata.entry_points()`.
|
|
1721
|
-
|
|
1722
|
-
Each plugin returns one or more `ProviderDescriptor` instances. Prompture
|
|
1723
|
-
then wires them up to the LLM, audio, image, video, embedding, rerank,
|
|
1724
|
-
and moderation driver registries.
|
|
1725
|
-
|
|
1726
|
-
### Writing a Plugin
|
|
1727
|
-
|
|
1728
|
-
Create a Python file that subclasses `ProviderPlugin`:
|
|
1729
|
-
|
|
1730
|
-
```python
|
|
1731
|
-
# my_package/plugin.py
|
|
1732
|
-
from prompture.plugins import ProviderPlugin
|
|
1733
|
-
from prompture.drivers.provider_descriptors import (
|
|
1734
|
-
ProviderDescriptor,
|
|
1735
|
-
DriverSpec,
|
|
1736
|
-
)
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
class MyProviderPlugin(ProviderPlugin):
|
|
1740
|
-
name = "my_provider"
|
|
1741
|
-
version = "0.1.0"
|
|
1742
|
-
|
|
1743
|
-
def descriptors(self):
|
|
1744
|
-
return [
|
|
1745
|
-
ProviderDescriptor(
|
|
1746
|
-
name="my_provider",
|
|
1747
|
-
llm_sync=DriverSpec(
|
|
1748
|
-
cls_path="my_package.driver.MyDriver",
|
|
1749
|
-
kwarg_map={"api_key": "my_provider_api_key"},
|
|
1750
|
-
default_model="my-model-1",
|
|
1751
|
-
),
|
|
1752
|
-
display_name="My Provider",
|
|
1753
|
-
is_configured_check="my_provider_api_key",
|
|
1754
|
-
),
|
|
1755
|
-
]
|
|
1756
|
-
```
|
|
1757
|
-
|
|
1758
|
-
Then declare the entry point in your package's `pyproject.toml`:
|
|
1759
|
-
|
|
1760
|
-
```toml
|
|
1761
|
-
[project.entry-points."prompture.providers"]
|
|
1762
|
-
my_provider = "my_package.plugin:MyProviderPlugin"
|
|
1763
|
-
```
|
|
1764
|
-
|
|
1765
|
-
Once `pip install`-ed alongside Prompture, your provider becomes
|
|
1766
|
-
available automatically:
|
|
1767
|
-
|
|
1768
|
-
```python
|
|
1769
|
-
from prompture import get_driver_for_model
|
|
1770
|
-
|
|
1771
|
-
driver = get_driver_for_model("my_provider/my-model-1")
|
|
1772
|
-
```
|
|
1748
|
+
- **FastAPI integration patterns** (AsyncAgent + tools, SSE streaming, structured endpoints, error handling) — see [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md#integrating-prompture-into-your-project)
|
|
1749
|
+
- **Custom provider plugins** (architecture + a complete `ProviderPlugin` walkthrough) — see [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md#extending-prompture)
|
|
1773
1750
|
|
|
1774
1751
|
## Development
|
|
1775
1752
|
|