prompture 1.1.1.dev5__tar.gz → 1.1.2.dev2__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.1.dev5 → prompture-1.1.2.dev2}/.env.copy +11 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/PKG-INFO +195 -3
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/README.md +194 -2
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/_version.py +2 -2
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/cli.py +90 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/server.py +101 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/__init__.py +56 -0
- prompture-1.1.2.dev2/prompture/infra/coding_agent_events.py +316 -0
- prompture-1.1.2.dev2/prompture/infra/coding_agent_specs.py +259 -0
- prompture-1.1.2.dev2/prompture/infra/coding_agents.py +569 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/discovery.py +574 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/settings.py +10 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/PKG-INFO +195 -3
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/SOURCES.txt +3 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/pyproject.toml +9 -2
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-driver/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-driver/references/driver-template.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-example/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-field/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-persona/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-test/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/add-tool/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/create-pr/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/run-tests/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.claude/skills/update-pricing/SKILL.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/FUNDING.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/scripts/update_docs_version.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/scripts/update_wrapper_version.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/dev.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/documentation.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/pricing-freshness.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/publish.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.github/workflows/security.yml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/.safety-project.ini +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/AGENTS.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/BREAKING_CHANGES.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/CLAUDE.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/CONTRIBUTING.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/LICENSE +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/MANIFEST.in +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/ROADMAP.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/SECURITY.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/dev.ps1 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/dev.sh +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/mypy_errors.txt +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/README.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/README.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/pyproject.toml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_json/test.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/README.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/pyproject.toml +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/packages/llm_to_toon/test.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/agent.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/async_agent.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/async_conversation.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/async_deep_agent.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/conversation.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/planner.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/subagents.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/summarizer.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep/vfs.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep_agent.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep_prompts.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/deep_state.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/persona.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/simulated_tools.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/skills.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/tools_schema.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/agents/types.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/aio/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/bridges/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/bridges/tukuy_backend.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/formatters.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/cli/runner.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/formats.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/schemas.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/dataset/synth.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/airllm_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/assemblyai_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_airllm_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_azure_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_bedrock_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cachibot_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_claude_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cohere_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_deepseek_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_embedding_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_google_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_google_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_google_vertexai_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_grok_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_groq_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_hugging_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_img_gen_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_jina_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_jina_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_lmstudio_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_local_http_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_minimax_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mistral_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_modelscope_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_moonshot_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_ollama_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_compatible_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_moderation_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openai_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_openrouter_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_runway_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_stt_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_tts_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_video_gen_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/async_zai_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/audio_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/azure_config.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/azure_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/bedrock_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/bfl_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cachibot_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cartesia_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/claude_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cohere_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cohere_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/cohere_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/deepgram_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/deepgram_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/deepseek_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/driver_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/embedding_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/embedding_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/fal_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/fal_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/google_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/google_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/google_vertexai_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/grok_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/grok_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/grok_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/groq_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/hugging_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/img_gen_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/img_gen_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/jina_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/jina_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/kling_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/kling_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/lmstudio_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/local_http_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/luma_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/minimax_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/minimax_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mistral_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mistral_moderation_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/modelscope_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/moderation_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/moderation_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/moonshot_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mxbai_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/mxbai_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/nomic_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/ollama_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/ollama_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_compatible_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_moderation_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_stt_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openai_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/openrouter_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/pika_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/provider_descriptors.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/rerank_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/rerank_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_audio_transform_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_capabilities.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_tts_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/runway_video_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/stability_img_gen_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/stt_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/tts_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/video_gen_base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/video_gen_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/vision_helpers.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/voyage_embedding_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/voyage_rerank_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/drivers/zai_driver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/exceptions.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/async_core.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/core.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/fields.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/reasoning.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/strategy.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/tools.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/tukuy_bridge.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/extraction/validator.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/async_groups.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/consensus.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/debate.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/groups.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/groups/types.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/budget.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/cache.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/callbacks.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/capabilities.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/cost_mixin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/ledger.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/logging.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/model_rates.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/pricing.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/provider_env.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/anthropic.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/azure.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/bedrock.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/cerebras.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/cohere.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/deepinfra.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/deepseek.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/fireworks.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/google.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/google_vertexai.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/groq.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/jina.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/mistral.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/mixedbread.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/moonshot.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/nomic.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/nvidia.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/openai.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/openrouter.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/perplexity.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/sambanova.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/siliconflow.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/together.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/voyage.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/rates/xai.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/session.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/tracker.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/infra/tukuy_backend.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/chunking.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/detect.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/document.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/csv_parser.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/docx.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/html.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/markdown.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/pdf.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/ingestion/parsers/xlsx.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/integrations/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/integrations/tukuy_bridge.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/audio.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/image.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/media/video.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/01-why-prompture.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/02-installation.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/03-quickstart.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/04-toon-input.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/05-test-harness.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/06-stability.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pages/07-migration.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/history.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/serialization.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/persistence/store.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/pipeline.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/resolver.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/pipeline/routing.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/_aliases.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/audio_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/cloud_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/extras_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/google_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/image_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/local_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/openai_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/builtins/video_plugin.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/plugins/discovery.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/py.typed +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/character.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/chunker_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/markdown.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/recursive.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/semantic.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/chunkers/token.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/documents.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loader_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/csv_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/docx_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/epub_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/html_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/json_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/markdown_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/pdf_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/text_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/loaders/xlsx_loader.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/pipeline.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/hybrid.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/mmr.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/retriever_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/retrievers/similarity.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/base.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/chroma.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/faiss.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/pgvector.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/pinecone.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/qdrant.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/rag/vectorstores/weaviate.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/detector.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/evaluator.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/refusal/markers.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/generator.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/README.md.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/config.py.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/env.example.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/main.py.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/models.py.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/security/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/security/injection.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/security/redaction.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/testing/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/testing/driver_contract.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/tools/__init__.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/tools/code_exec.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture/tools/web_search.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/dependency_links.txt +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/entry_points.txt +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/requires.txt +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture.egg-info/top_level.txt +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/prompture_cost_tracking.md +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/requirements.txt +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/scripts/check_pricing_freshness.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/setup.cfg +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/specs/basic_extraction.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/specs/schema_validation.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/specs/strategy_comparison.json +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/test.py +0 -0
- {prompture-1.1.1.dev5 → prompture-1.1.2.dev2}/test_version_diagnosis.py +0 -0
|
@@ -211,3 +211,14 @@ SERPER_API_KEY=
|
|
|
211
211
|
BRAVE_SEARCH_API_KEY=
|
|
212
212
|
# SearXNG — self-hosted metasearch engine (no key, set the base URL).
|
|
213
213
|
SEARXNG_ENDPOINT=
|
|
214
|
+
|
|
215
|
+
# ─── Coding-agent CLI binaries (optional path overrides) ─────────────────────
|
|
216
|
+
# Set if a CLI isn't on PATH or you want to pin a specific install.
|
|
217
|
+
CODING_AGENT_BIN_CLAUDE=
|
|
218
|
+
CODING_AGENT_BIN_CODEX=
|
|
219
|
+
CODING_AGENT_BIN_GEMINI=
|
|
220
|
+
CODING_AGENT_BIN_QWEN=
|
|
221
|
+
CODING_AGENT_BIN_AIDER=
|
|
222
|
+
CODING_AGENT_BIN_OPENCODE=
|
|
223
|
+
CODING_AGENT_BIN_CURSOR_AGENT=
|
|
224
|
+
CODING_AGENT_BIN_CRUSH=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prompture
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.2.dev2
|
|
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
|
|
@@ -146,7 +146,7 @@ print(person.name) # Maria
|
|
|
146
146
|
- **Tool use** — Function calling and streaming across supported providers, with automatic prompt-based simulation for models without native tool support
|
|
147
147
|
- **Sandboxed Python execution** — Drop-in `python_execute` tool backed by Tukuy's `PythonSandbox` (import whitelist, path restrictions, timeout, memory limit, AST risk gate)
|
|
148
148
|
- **Web search** — Drop-in `web_search` tool with Tavily, Serper, Brave, and SearXNG backends; returns Markdown so the LLM can cite by URL
|
|
149
|
-
- **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
|
|
149
|
+
- **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`, and `/v1/coding-agents`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
|
|
150
150
|
- **Synthetic datasets** — `generate_qa_dataset()` turns documents into fine-tuning JSONL (Q&A, ShareGPT, or Alpaca) ready for Unsloth, Axolotl, or TRL
|
|
151
151
|
- **Refusal detection** — `RefusalDetector` + `RefusalEvaluator` flag and score LLM refusals (5 categories, en/es markers, position-weighted confidence); useful for cross-provider alignment comparison and validating abliterated models
|
|
152
152
|
- **Input safety** — `PromptInjectionDetector` (jailbreak, role-hijack, delimiter attacks, encoded payloads) + `PIIRedactor` (emails, phones, Luhn-checked cards, SSN, IBAN, IPs, API keys, embedded URL credentials)
|
|
@@ -1306,6 +1306,198 @@ get_available_video_gen_models() # ['runway/gen4.5', 'runway/gen4_aleph',
|
|
|
1306
1306
|
get_available_audio_models(modality="tts") # ['runway/eleven_multilingual_v2', ...]
|
|
1307
1307
|
```
|
|
1308
1308
|
|
|
1309
|
+
### Local coding-agent CLIs
|
|
1310
|
+
|
|
1311
|
+
Prompture detects and runs the major terminal coding agents — Claude Code,
|
|
1312
|
+
Codex, Gemini, Qwen Code, Aider, OpenCode, Cursor Agent, and Crush — through
|
|
1313
|
+
one unified interface. Useful when an app wants to delegate code-editing
|
|
1314
|
+
tasks to whatever agent the user already has installed, without reimplementing
|
|
1315
|
+
the per-CLI flag dance for each one.
|
|
1316
|
+
|
|
1317
|
+
| Agent | Binary | Install | Provider |
|
|
1318
|
+
|---|---|---|---|
|
|
1319
|
+
| Claude Code | `claude` | `npm i -g @anthropic-ai/claude-code` | Anthropic |
|
|
1320
|
+
| Codex CLI | `codex` | `npm i -g @openai/codex` | OpenAI |
|
|
1321
|
+
| Gemini CLI | `gemini` | `npm i -g @google/gemini-cli` | Google |
|
|
1322
|
+
| Qwen Code | `qwen` | `npm i -g @qwen-code/qwen-code` | Alibaba (gemini-cli fork) |
|
|
1323
|
+
| Aider | `aider` | `pip install aider-chat` | model-agnostic |
|
|
1324
|
+
| OpenCode | `opencode` | `npm i -g opencode-ai` | model-agnostic (sst) |
|
|
1325
|
+
| Cursor Agent | `cursor-agent` | Cursor installer | Cursor / Anysphere |
|
|
1326
|
+
| Crush | `crush` | `brew install charmbracelet/tap/crush` | model-agnostic (Charm) |
|
|
1327
|
+
|
|
1328
|
+
#### Discover
|
|
1329
|
+
|
|
1330
|
+
```python
|
|
1331
|
+
from prompture import get_available_coding_agents
|
|
1332
|
+
|
|
1333
|
+
for agent in get_available_coding_agents(verify=True):
|
|
1334
|
+
print(agent.id, agent.available, agent.binary, agent.source)
|
|
1335
|
+
```
|
|
1336
|
+
|
|
1337
|
+
`verify=True` runs a `--version` health check on each resolved binary and
|
|
1338
|
+
reports the failure reason for broken PATH shims — common after Node version
|
|
1339
|
+
switches on Windows or WSL. Discovery resolves both PATH installs and the
|
|
1340
|
+
underlying `node_modules` package entrypoint, so a working agent can still be
|
|
1341
|
+
found when the npm shim is broken.
|
|
1342
|
+
|
|
1343
|
+
#### Run
|
|
1344
|
+
|
|
1345
|
+
```python
|
|
1346
|
+
from prompture import run_coding_agent
|
|
1347
|
+
|
|
1348
|
+
result = run_coding_agent(
|
|
1349
|
+
"claude", # claude, codex, gemini, qwen, aider, opencode, cursor-agent, crush
|
|
1350
|
+
"Add focused tests for the discovery helper.",
|
|
1351
|
+
cwd=".",
|
|
1352
|
+
approval_mode="auto", # default | auto | yolo
|
|
1353
|
+
model="sonnet", # optional, passed to CLIs that support --model
|
|
1354
|
+
timeout=600,
|
|
1355
|
+
)
|
|
1356
|
+
print(result.output)
|
|
1357
|
+
print("ok:", result.ok, "exit:", result.returncode, "duration:", result.duration_seconds)
|
|
1358
|
+
```
|
|
1359
|
+
|
|
1360
|
+
Approval modes:
|
|
1361
|
+
|
|
1362
|
+
- **`default`** — run interactively; the CLI asks for approvals as it edits or runs commands.
|
|
1363
|
+
- **`auto`** — skip approval prompts but stay within the CLI's normal sandboxing where it has one (codex `--sandbox workspace-write`, gemini/qwen `-y`, aider `--yes-always`, crush `--yolo`). Claude Code has no intermediate mode, so `auto` maps to `--dangerously-skip-permissions` there.
|
|
1364
|
+
- **`yolo`** — every CLI's full bypass: claude `--dangerously-skip-permissions`, codex `--dangerously-bypass-approvals-and-sandbox`, gemini/qwen `-y`, crush `--yolo`. Use only inside an environment whose blast radius you already trust.
|
|
1365
|
+
|
|
1366
|
+
Before launching the task, the binary is health-checked by default so a
|
|
1367
|
+
broken shim fails fast with a clear error rather than hanging or producing
|
|
1368
|
+
opaque output. Pass `verify_binary=False` to skip the preflight.
|
|
1369
|
+
|
|
1370
|
+
#### Structured output
|
|
1371
|
+
|
|
1372
|
+
Claude Code (`--output-format stream-json`) and Codex (`exec --json`) emit a
|
|
1373
|
+
JSON event stream that Prompture normalises into a typed `CodingAgentEvent`
|
|
1374
|
+
union — `system`, `message`, `tool_call`, `tool_result`, `done`, `error`. Pass
|
|
1375
|
+
`output_format="json"` to get parsed events, cost, and token counts on the
|
|
1376
|
+
result:
|
|
1377
|
+
|
|
1378
|
+
```python
|
|
1379
|
+
result = run_coding_agent(
|
|
1380
|
+
"claude",
|
|
1381
|
+
"Find every TODO that references issue #42 and summarise them.",
|
|
1382
|
+
cwd=".",
|
|
1383
|
+
approval_mode="auto",
|
|
1384
|
+
output_format="json",
|
|
1385
|
+
)
|
|
1386
|
+
print(f"${result.cost_usd:.4f} — {result.input_tokens} in / {result.output_tokens} out")
|
|
1387
|
+
for event in result.events:
|
|
1388
|
+
if event.type == "tool_call":
|
|
1389
|
+
print("→", event.tool_name, event.tool_input)
|
|
1390
|
+
elif event.type == "message":
|
|
1391
|
+
print(event.text)
|
|
1392
|
+
```
|
|
1393
|
+
|
|
1394
|
+
For live progress, use `astream_coding_agent` — an async generator that yields
|
|
1395
|
+
events as the CLI emits them:
|
|
1396
|
+
|
|
1397
|
+
```python
|
|
1398
|
+
from prompture import astream_coding_agent
|
|
1399
|
+
|
|
1400
|
+
async for event in astream_coding_agent("claude", "refactor X", cwd="."):
|
|
1401
|
+
if event.type == "tool_call":
|
|
1402
|
+
ui.show_pending(event.tool_name, event.tool_input)
|
|
1403
|
+
elif event.type == "done":
|
|
1404
|
+
ui.show_cost(event.cost_usd)
|
|
1405
|
+
```
|
|
1406
|
+
|
|
1407
|
+
Streaming requires an agent whose spec provides a parser (Claude Code and
|
|
1408
|
+
Codex today). Cancelling the iterator terminates the underlying subprocess.
|
|
1409
|
+
|
|
1410
|
+
#### Detecting clarifying questions
|
|
1411
|
+
|
|
1412
|
+
Coding agents often pause to ask the user a clarifying question ("which
|
|
1413
|
+
approach do you want?", "should I delete this file?") instead of acting. In
|
|
1414
|
+
non-interactive mode this manifests as a final assistant message that ends in
|
|
1415
|
+
a question. Prompture's event parser detects question patterns and emits a
|
|
1416
|
+
typed `question` event alongside the `message`, with extracted numbered /
|
|
1417
|
+
bulleted / lettered choices when present:
|
|
1418
|
+
|
|
1419
|
+
```python
|
|
1420
|
+
result = run_coding_agent("claude", "refactor X", cwd=".", output_format="json")
|
|
1421
|
+
if (q := result.asked_question):
|
|
1422
|
+
print("Agent asked:", q.text)
|
|
1423
|
+
if q.choices:
|
|
1424
|
+
for i, choice in enumerate(q.choices, 1):
|
|
1425
|
+
print(f" {i}. {choice}")
|
|
1426
|
+
# …then re-run with extra_args=["The answer is option 2"] to continue.
|
|
1427
|
+
```
|
|
1428
|
+
|
|
1429
|
+
The same `detect_question(text)` helper is exported for callers that want to
|
|
1430
|
+
run their own heuristic over arbitrary agent text.
|
|
1431
|
+
|
|
1432
|
+
#### Budget tracking
|
|
1433
|
+
|
|
1434
|
+
Pass a `UsageSession` and coding-agent runs participate in the same per-model
|
|
1435
|
+
cost / token / latency summary as direct LLM calls:
|
|
1436
|
+
|
|
1437
|
+
```python
|
|
1438
|
+
from prompture import UsageSession, run_coding_agent
|
|
1439
|
+
|
|
1440
|
+
session = UsageSession()
|
|
1441
|
+
run_coding_agent("claude", "task 1", cwd=".", output_format="json", session=session)
|
|
1442
|
+
run_coding_agent("claude", "task 2", cwd=".", output_format="json", session=session)
|
|
1443
|
+
print(session.summary()["formatted"])
|
|
1444
|
+
# Session: 3,200 tokens across 2 call(s) costing $0.0421 | …
|
|
1445
|
+
```
|
|
1446
|
+
|
|
1447
|
+
#### Binary path overrides
|
|
1448
|
+
|
|
1449
|
+
When a CLI isn't on PATH, or you want to pin a specific install, set the
|
|
1450
|
+
matching `CODING_AGENT_BIN_*` env var (or field in `Settings`) and discovery
|
|
1451
|
+
will pick it up without threading the path through every call. Hyphenated ids
|
|
1452
|
+
use underscores in the variable name:
|
|
1453
|
+
|
|
1454
|
+
```bash
|
|
1455
|
+
export CODING_AGENT_BIN_CLAUDE=/opt/claude/claude
|
|
1456
|
+
export CODING_AGENT_BIN_CURSOR_AGENT="/c/Program Files/Cursor/resources/app/bin/cursor-agent.exe"
|
|
1457
|
+
```
|
|
1458
|
+
|
|
1459
|
+
Explicit `agent_paths={"claude": "..."}` kwargs still override settings when
|
|
1460
|
+
needed.
|
|
1461
|
+
|
|
1462
|
+
#### From the CLI
|
|
1463
|
+
|
|
1464
|
+
```bash
|
|
1465
|
+
prompture coding-agents --verify
|
|
1466
|
+
prompture code-agent claude --auto-approve "Review this package for release blockers"
|
|
1467
|
+
prompture code-agent codex --auto-approve "Add tests for the pricing cache"
|
|
1468
|
+
prompture code-agent aider --auto-approve --model gpt-4o "Rename foo to bar across the package"
|
|
1469
|
+
```
|
|
1470
|
+
|
|
1471
|
+
#### From the server
|
|
1472
|
+
|
|
1473
|
+
`prompture serve` exposes coding-agent discovery and execution as HTTP
|
|
1474
|
+
endpoints so any app talking to the OpenAI-compatible server can also drive a
|
|
1475
|
+
local agent:
|
|
1476
|
+
|
|
1477
|
+
```bash
|
|
1478
|
+
# Discover
|
|
1479
|
+
curl "http://localhost:9471/v1/coding-agents"
|
|
1480
|
+
curl "http://localhost:9471/v1/coding-agents?verify=false"
|
|
1481
|
+
|
|
1482
|
+
# Run, blocking
|
|
1483
|
+
curl -X POST "http://localhost:9471/v1/coding-agents/run" \
|
|
1484
|
+
-H "content-type: application/json" \
|
|
1485
|
+
-d '{"agent": "claude", "task": "summarise CHANGELOG.md", "approval_mode": "auto", "output_format": "json"}'
|
|
1486
|
+
|
|
1487
|
+
# Run, SSE-streaming live events
|
|
1488
|
+
curl -N -X POST "http://localhost:9471/v1/coding-agents/run" \
|
|
1489
|
+
-H "content-type: application/json" \
|
|
1490
|
+
-d '{"agent": "claude", "task": "refactor X", "approval_mode": "auto", "stream": true}'
|
|
1491
|
+
```
|
|
1492
|
+
|
|
1493
|
+
#### Adding a new agent
|
|
1494
|
+
|
|
1495
|
+
Drop a `CodingAgentSpec` into
|
|
1496
|
+
`prompture.infra.coding_agent_specs.CODING_AGENT_SPECS` with a `build_args`
|
|
1497
|
+
callable that produces the CLI's argv from a task, approval mode, model, and
|
|
1498
|
+
extra args. Discovery, health checks, command construction, the CLI, and the
|
|
1499
|
+
server endpoint all read from this registry — no other changes are needed.
|
|
1500
|
+
|
|
1309
1501
|
### Logging and Debugging
|
|
1310
1502
|
|
|
1311
1503
|
```python
|
|
@@ -1345,7 +1537,7 @@ Run spec-driven extraction suites for cross-model comparison.
|
|
|
1345
1537
|
|
|
1346
1538
|
`prompture serve` exposes an OpenAI-shaped API
|
|
1347
1539
|
(`/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`,
|
|
1348
|
-
`/v1/models`) backed by Prompture's driver registry. Point any
|
|
1540
|
+
`/v1/models`, `/v1/coding-agents`) backed by Prompture's driver registry. Point any
|
|
1349
1541
|
OpenAI SDK — or any tool that speaks the OpenAI API (Claude Code,
|
|
1350
1542
|
Codex, Cursor, Aider, LangChain) — at it and route to any of the 36+
|
|
1351
1543
|
supported providers under one endpoint.
|
|
@@ -43,7 +43,7 @@ print(person.name) # Maria
|
|
|
43
43
|
- **Tool use** — Function calling and streaming across supported providers, with automatic prompt-based simulation for models without native tool support
|
|
44
44
|
- **Sandboxed Python execution** — Drop-in `python_execute` tool backed by Tukuy's `PythonSandbox` (import whitelist, path restrictions, timeout, memory limit, AST risk gate)
|
|
45
45
|
- **Web search** — Drop-in `web_search` tool with Tavily, Serper, Brave, and SearXNG backends; returns Markdown so the LLM can cite by URL
|
|
46
|
-
- **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
|
|
46
|
+
- **OpenAI-compatible server** — `prompture serve` exposes `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, `/v1/models`, and `/v1/coding-agents`; point Claude Code, Codex, Cursor, Aider, or any OpenAI SDK at it and route to any of the 36+ providers
|
|
47
47
|
- **Synthetic datasets** — `generate_qa_dataset()` turns documents into fine-tuning JSONL (Q&A, ShareGPT, or Alpaca) ready for Unsloth, Axolotl, or TRL
|
|
48
48
|
- **Refusal detection** — `RefusalDetector` + `RefusalEvaluator` flag and score LLM refusals (5 categories, en/es markers, position-weighted confidence); useful for cross-provider alignment comparison and validating abliterated models
|
|
49
49
|
- **Input safety** — `PromptInjectionDetector` (jailbreak, role-hijack, delimiter attacks, encoded payloads) + `PIIRedactor` (emails, phones, Luhn-checked cards, SSN, IBAN, IPs, API keys, embedded URL credentials)
|
|
@@ -1203,6 +1203,198 @@ get_available_video_gen_models() # ['runway/gen4.5', 'runway/gen4_aleph',
|
|
|
1203
1203
|
get_available_audio_models(modality="tts") # ['runway/eleven_multilingual_v2', ...]
|
|
1204
1204
|
```
|
|
1205
1205
|
|
|
1206
|
+
### Local coding-agent CLIs
|
|
1207
|
+
|
|
1208
|
+
Prompture detects and runs the major terminal coding agents — Claude Code,
|
|
1209
|
+
Codex, Gemini, Qwen Code, Aider, OpenCode, Cursor Agent, and Crush — through
|
|
1210
|
+
one unified interface. Useful when an app wants to delegate code-editing
|
|
1211
|
+
tasks to whatever agent the user already has installed, without reimplementing
|
|
1212
|
+
the per-CLI flag dance for each one.
|
|
1213
|
+
|
|
1214
|
+
| Agent | Binary | Install | Provider |
|
|
1215
|
+
|---|---|---|---|
|
|
1216
|
+
| Claude Code | `claude` | `npm i -g @anthropic-ai/claude-code` | Anthropic |
|
|
1217
|
+
| Codex CLI | `codex` | `npm i -g @openai/codex` | OpenAI |
|
|
1218
|
+
| Gemini CLI | `gemini` | `npm i -g @google/gemini-cli` | Google |
|
|
1219
|
+
| Qwen Code | `qwen` | `npm i -g @qwen-code/qwen-code` | Alibaba (gemini-cli fork) |
|
|
1220
|
+
| Aider | `aider` | `pip install aider-chat` | model-agnostic |
|
|
1221
|
+
| OpenCode | `opencode` | `npm i -g opencode-ai` | model-agnostic (sst) |
|
|
1222
|
+
| Cursor Agent | `cursor-agent` | Cursor installer | Cursor / Anysphere |
|
|
1223
|
+
| Crush | `crush` | `brew install charmbracelet/tap/crush` | model-agnostic (Charm) |
|
|
1224
|
+
|
|
1225
|
+
#### Discover
|
|
1226
|
+
|
|
1227
|
+
```python
|
|
1228
|
+
from prompture import get_available_coding_agents
|
|
1229
|
+
|
|
1230
|
+
for agent in get_available_coding_agents(verify=True):
|
|
1231
|
+
print(agent.id, agent.available, agent.binary, agent.source)
|
|
1232
|
+
```
|
|
1233
|
+
|
|
1234
|
+
`verify=True` runs a `--version` health check on each resolved binary and
|
|
1235
|
+
reports the failure reason for broken PATH shims — common after Node version
|
|
1236
|
+
switches on Windows or WSL. Discovery resolves both PATH installs and the
|
|
1237
|
+
underlying `node_modules` package entrypoint, so a working agent can still be
|
|
1238
|
+
found when the npm shim is broken.
|
|
1239
|
+
|
|
1240
|
+
#### Run
|
|
1241
|
+
|
|
1242
|
+
```python
|
|
1243
|
+
from prompture import run_coding_agent
|
|
1244
|
+
|
|
1245
|
+
result = run_coding_agent(
|
|
1246
|
+
"claude", # claude, codex, gemini, qwen, aider, opencode, cursor-agent, crush
|
|
1247
|
+
"Add focused tests for the discovery helper.",
|
|
1248
|
+
cwd=".",
|
|
1249
|
+
approval_mode="auto", # default | auto | yolo
|
|
1250
|
+
model="sonnet", # optional, passed to CLIs that support --model
|
|
1251
|
+
timeout=600,
|
|
1252
|
+
)
|
|
1253
|
+
print(result.output)
|
|
1254
|
+
print("ok:", result.ok, "exit:", result.returncode, "duration:", result.duration_seconds)
|
|
1255
|
+
```
|
|
1256
|
+
|
|
1257
|
+
Approval modes:
|
|
1258
|
+
|
|
1259
|
+
- **`default`** — run interactively; the CLI asks for approvals as it edits or runs commands.
|
|
1260
|
+
- **`auto`** — skip approval prompts but stay within the CLI's normal sandboxing where it has one (codex `--sandbox workspace-write`, gemini/qwen `-y`, aider `--yes-always`, crush `--yolo`). Claude Code has no intermediate mode, so `auto` maps to `--dangerously-skip-permissions` there.
|
|
1261
|
+
- **`yolo`** — every CLI's full bypass: claude `--dangerously-skip-permissions`, codex `--dangerously-bypass-approvals-and-sandbox`, gemini/qwen `-y`, crush `--yolo`. Use only inside an environment whose blast radius you already trust.
|
|
1262
|
+
|
|
1263
|
+
Before launching the task, the binary is health-checked by default so a
|
|
1264
|
+
broken shim fails fast with a clear error rather than hanging or producing
|
|
1265
|
+
opaque output. Pass `verify_binary=False` to skip the preflight.
|
|
1266
|
+
|
|
1267
|
+
#### Structured output
|
|
1268
|
+
|
|
1269
|
+
Claude Code (`--output-format stream-json`) and Codex (`exec --json`) emit a
|
|
1270
|
+
JSON event stream that Prompture normalises into a typed `CodingAgentEvent`
|
|
1271
|
+
union — `system`, `message`, `tool_call`, `tool_result`, `done`, `error`. Pass
|
|
1272
|
+
`output_format="json"` to get parsed events, cost, and token counts on the
|
|
1273
|
+
result:
|
|
1274
|
+
|
|
1275
|
+
```python
|
|
1276
|
+
result = run_coding_agent(
|
|
1277
|
+
"claude",
|
|
1278
|
+
"Find every TODO that references issue #42 and summarise them.",
|
|
1279
|
+
cwd=".",
|
|
1280
|
+
approval_mode="auto",
|
|
1281
|
+
output_format="json",
|
|
1282
|
+
)
|
|
1283
|
+
print(f"${result.cost_usd:.4f} — {result.input_tokens} in / {result.output_tokens} out")
|
|
1284
|
+
for event in result.events:
|
|
1285
|
+
if event.type == "tool_call":
|
|
1286
|
+
print("→", event.tool_name, event.tool_input)
|
|
1287
|
+
elif event.type == "message":
|
|
1288
|
+
print(event.text)
|
|
1289
|
+
```
|
|
1290
|
+
|
|
1291
|
+
For live progress, use `astream_coding_agent` — an async generator that yields
|
|
1292
|
+
events as the CLI emits them:
|
|
1293
|
+
|
|
1294
|
+
```python
|
|
1295
|
+
from prompture import astream_coding_agent
|
|
1296
|
+
|
|
1297
|
+
async for event in astream_coding_agent("claude", "refactor X", cwd="."):
|
|
1298
|
+
if event.type == "tool_call":
|
|
1299
|
+
ui.show_pending(event.tool_name, event.tool_input)
|
|
1300
|
+
elif event.type == "done":
|
|
1301
|
+
ui.show_cost(event.cost_usd)
|
|
1302
|
+
```
|
|
1303
|
+
|
|
1304
|
+
Streaming requires an agent whose spec provides a parser (Claude Code and
|
|
1305
|
+
Codex today). Cancelling the iterator terminates the underlying subprocess.
|
|
1306
|
+
|
|
1307
|
+
#### Detecting clarifying questions
|
|
1308
|
+
|
|
1309
|
+
Coding agents often pause to ask the user a clarifying question ("which
|
|
1310
|
+
approach do you want?", "should I delete this file?") instead of acting. In
|
|
1311
|
+
non-interactive mode this manifests as a final assistant message that ends in
|
|
1312
|
+
a question. Prompture's event parser detects question patterns and emits a
|
|
1313
|
+
typed `question` event alongside the `message`, with extracted numbered /
|
|
1314
|
+
bulleted / lettered choices when present:
|
|
1315
|
+
|
|
1316
|
+
```python
|
|
1317
|
+
result = run_coding_agent("claude", "refactor X", cwd=".", output_format="json")
|
|
1318
|
+
if (q := result.asked_question):
|
|
1319
|
+
print("Agent asked:", q.text)
|
|
1320
|
+
if q.choices:
|
|
1321
|
+
for i, choice in enumerate(q.choices, 1):
|
|
1322
|
+
print(f" {i}. {choice}")
|
|
1323
|
+
# …then re-run with extra_args=["The answer is option 2"] to continue.
|
|
1324
|
+
```
|
|
1325
|
+
|
|
1326
|
+
The same `detect_question(text)` helper is exported for callers that want to
|
|
1327
|
+
run their own heuristic over arbitrary agent text.
|
|
1328
|
+
|
|
1329
|
+
#### Budget tracking
|
|
1330
|
+
|
|
1331
|
+
Pass a `UsageSession` and coding-agent runs participate in the same per-model
|
|
1332
|
+
cost / token / latency summary as direct LLM calls:
|
|
1333
|
+
|
|
1334
|
+
```python
|
|
1335
|
+
from prompture import UsageSession, run_coding_agent
|
|
1336
|
+
|
|
1337
|
+
session = UsageSession()
|
|
1338
|
+
run_coding_agent("claude", "task 1", cwd=".", output_format="json", session=session)
|
|
1339
|
+
run_coding_agent("claude", "task 2", cwd=".", output_format="json", session=session)
|
|
1340
|
+
print(session.summary()["formatted"])
|
|
1341
|
+
# Session: 3,200 tokens across 2 call(s) costing $0.0421 | …
|
|
1342
|
+
```
|
|
1343
|
+
|
|
1344
|
+
#### Binary path overrides
|
|
1345
|
+
|
|
1346
|
+
When a CLI isn't on PATH, or you want to pin a specific install, set the
|
|
1347
|
+
matching `CODING_AGENT_BIN_*` env var (or field in `Settings`) and discovery
|
|
1348
|
+
will pick it up without threading the path through every call. Hyphenated ids
|
|
1349
|
+
use underscores in the variable name:
|
|
1350
|
+
|
|
1351
|
+
```bash
|
|
1352
|
+
export CODING_AGENT_BIN_CLAUDE=/opt/claude/claude
|
|
1353
|
+
export CODING_AGENT_BIN_CURSOR_AGENT="/c/Program Files/Cursor/resources/app/bin/cursor-agent.exe"
|
|
1354
|
+
```
|
|
1355
|
+
|
|
1356
|
+
Explicit `agent_paths={"claude": "..."}` kwargs still override settings when
|
|
1357
|
+
needed.
|
|
1358
|
+
|
|
1359
|
+
#### From the CLI
|
|
1360
|
+
|
|
1361
|
+
```bash
|
|
1362
|
+
prompture coding-agents --verify
|
|
1363
|
+
prompture code-agent claude --auto-approve "Review this package for release blockers"
|
|
1364
|
+
prompture code-agent codex --auto-approve "Add tests for the pricing cache"
|
|
1365
|
+
prompture code-agent aider --auto-approve --model gpt-4o "Rename foo to bar across the package"
|
|
1366
|
+
```
|
|
1367
|
+
|
|
1368
|
+
#### From the server
|
|
1369
|
+
|
|
1370
|
+
`prompture serve` exposes coding-agent discovery and execution as HTTP
|
|
1371
|
+
endpoints so any app talking to the OpenAI-compatible server can also drive a
|
|
1372
|
+
local agent:
|
|
1373
|
+
|
|
1374
|
+
```bash
|
|
1375
|
+
# Discover
|
|
1376
|
+
curl "http://localhost:9471/v1/coding-agents"
|
|
1377
|
+
curl "http://localhost:9471/v1/coding-agents?verify=false"
|
|
1378
|
+
|
|
1379
|
+
# Run, blocking
|
|
1380
|
+
curl -X POST "http://localhost:9471/v1/coding-agents/run" \
|
|
1381
|
+
-H "content-type: application/json" \
|
|
1382
|
+
-d '{"agent": "claude", "task": "summarise CHANGELOG.md", "approval_mode": "auto", "output_format": "json"}'
|
|
1383
|
+
|
|
1384
|
+
# Run, SSE-streaming live events
|
|
1385
|
+
curl -N -X POST "http://localhost:9471/v1/coding-agents/run" \
|
|
1386
|
+
-H "content-type: application/json" \
|
|
1387
|
+
-d '{"agent": "claude", "task": "refactor X", "approval_mode": "auto", "stream": true}'
|
|
1388
|
+
```
|
|
1389
|
+
|
|
1390
|
+
#### Adding a new agent
|
|
1391
|
+
|
|
1392
|
+
Drop a `CodingAgentSpec` into
|
|
1393
|
+
`prompture.infra.coding_agent_specs.CODING_AGENT_SPECS` with a `build_args`
|
|
1394
|
+
callable that produces the CLI's argv from a task, approval mode, model, and
|
|
1395
|
+
extra args. Discovery, health checks, command construction, the CLI, and the
|
|
1396
|
+
server endpoint all read from this registry — no other changes are needed.
|
|
1397
|
+
|
|
1206
1398
|
### Logging and Debugging
|
|
1207
1399
|
|
|
1208
1400
|
```python
|
|
@@ -1242,7 +1434,7 @@ Run spec-driven extraction suites for cross-model comparison.
|
|
|
1242
1434
|
|
|
1243
1435
|
`prompture serve` exposes an OpenAI-shaped API
|
|
1244
1436
|
(`/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`,
|
|
1245
|
-
`/v1/models`) backed by Prompture's driver registry. Point any
|
|
1437
|
+
`/v1/models`, `/v1/coding-agents`) backed by Prompture's driver registry. Point any
|
|
1246
1438
|
OpenAI SDK — or any tool that speaks the OpenAI API (Claude Code,
|
|
1247
1439
|
Codex, Cursor, Aider, LangChain) — at it and route to any of the 36+
|
|
1248
1440
|
supported providers under one endpoint.
|
|
@@ -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.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 1,
|
|
21
|
+
__version__ = version = '1.1.2.dev2'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 1, 2, 'dev2')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import shlex
|
|
2
3
|
|
|
3
4
|
import click
|
|
4
5
|
|
|
@@ -39,6 +40,95 @@ def _build_drivers(providers: list[str]) -> dict[str, object]:
|
|
|
39
40
|
return drivers
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
@cli.command("coding-agents")
|
|
44
|
+
@click.option("--json", "json_output", is_flag=True, help="Output machine-readable JSON.")
|
|
45
|
+
@click.option("--verify", is_flag=True, help="Run a lightweight health check for each detected CLI.")
|
|
46
|
+
def coding_agents(json_output: bool, verify: bool) -> None:
|
|
47
|
+
"""List detected local coding-agent CLIs."""
|
|
48
|
+
from dataclasses import asdict
|
|
49
|
+
|
|
50
|
+
from ..infra import get_available_coding_agents
|
|
51
|
+
|
|
52
|
+
agents = get_available_coding_agents(verify=verify)
|
|
53
|
+
if json_output:
|
|
54
|
+
click.echo(json.dumps([asdict(agent) for agent in agents], indent=2))
|
|
55
|
+
return
|
|
56
|
+
|
|
57
|
+
for agent in agents:
|
|
58
|
+
if verify:
|
|
59
|
+
status = "healthy" if agent.available else "failed"
|
|
60
|
+
else:
|
|
61
|
+
status = "available" if agent.available else "missing"
|
|
62
|
+
source = "custom" if agent.custom_path else (agent.source or "missing")
|
|
63
|
+
detail = f" {agent.error}" if agent.error else ""
|
|
64
|
+
click.echo(f"{agent.id:<7} {status:<9} {source:<12} {agent.binary}{detail}")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@cli.command("code-agent")
|
|
68
|
+
@click.argument("agent", type=click.Choice(["claude", "codex", "gemini"]))
|
|
69
|
+
@click.argument("task", nargs=-1, required=True)
|
|
70
|
+
@click.option("--cwd", default=".", type=click.Path(exists=True, file_okay=False), help="Working directory.")
|
|
71
|
+
@click.option("--model", default=None, help="Model passed through to the agent CLI.")
|
|
72
|
+
@click.option("--binary", default=None, help="Explicit binary path for this run.")
|
|
73
|
+
@click.option("--auto-approve", is_flag=True, help="Avoid repeated approval prompts where the CLI supports it.")
|
|
74
|
+
@click.option("--yolo", is_flag=True, help="Use the CLI's dangerous no-approval/no-sandbox mode.")
|
|
75
|
+
@click.option("--timeout", default=600, type=int, help="Timeout in seconds.")
|
|
76
|
+
@click.option("--max-output", default=50000, type=int, help="Maximum output characters to print.")
|
|
77
|
+
@click.option("--verify/--no-verify", default=True, help="Health-check the CLI before running.")
|
|
78
|
+
@click.option("--dry-run", is_flag=True, help="Print the resolved command without running it.")
|
|
79
|
+
def code_agent(
|
|
80
|
+
agent: str,
|
|
81
|
+
task: tuple[str, ...],
|
|
82
|
+
cwd: str,
|
|
83
|
+
model: str | None,
|
|
84
|
+
binary: str | None,
|
|
85
|
+
auto_approve: bool,
|
|
86
|
+
yolo: bool,
|
|
87
|
+
timeout: int,
|
|
88
|
+
max_output: int,
|
|
89
|
+
verify: bool,
|
|
90
|
+
dry_run: bool,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Run Claude Code, Codex CLI, or Gemini CLI from Prompture."""
|
|
93
|
+
from ..infra import build_coding_agent_command, run_coding_agent
|
|
94
|
+
|
|
95
|
+
if auto_approve and yolo:
|
|
96
|
+
click.echo("Error: choose either --auto-approve or --yolo, not both.", err=True)
|
|
97
|
+
raise SystemExit(2)
|
|
98
|
+
|
|
99
|
+
approval_mode = "yolo" if yolo else ("auto" if auto_approve else "default")
|
|
100
|
+
task_text = " ".join(task).strip()
|
|
101
|
+
|
|
102
|
+
if dry_run:
|
|
103
|
+
command = build_coding_agent_command(
|
|
104
|
+
agent,
|
|
105
|
+
task_text,
|
|
106
|
+
cwd=cwd,
|
|
107
|
+
approval_mode=approval_mode,
|
|
108
|
+
binary=binary,
|
|
109
|
+
model=model,
|
|
110
|
+
)
|
|
111
|
+
click.echo(shlex.join(command.argv))
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
result = run_coding_agent(
|
|
115
|
+
agent,
|
|
116
|
+
task_text,
|
|
117
|
+
cwd=cwd,
|
|
118
|
+
approval_mode=approval_mode,
|
|
119
|
+
binary=binary,
|
|
120
|
+
model=model,
|
|
121
|
+
timeout=timeout,
|
|
122
|
+
max_output_chars=max_output,
|
|
123
|
+
verify_binary=verify,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if result.output:
|
|
127
|
+
click.echo(result.output)
|
|
128
|
+
if not result.ok:
|
|
129
|
+
raise SystemExit(result.returncode if result.returncode > 0 else 1)
|
|
130
|
+
|
|
131
|
+
|
|
42
132
|
@cli.command("test-suite")
|
|
43
133
|
@click.argument("specfile", type=click.Path(exists=True))
|
|
44
134
|
@click.option("--providers", default=None, help="Comma-separated provider names (e.g., openai,ollama,groq).")
|