omnimancer-cli 0.3.2__tar.gz → 0.3.4__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.
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/PKG-INFO +1 -1
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/bedrock.py +27 -15
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer_cli.egg-info/PKG-INFO +1 -1
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/pyproject.toml +1 -1
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_bedrock_provider.py +64 -4
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/LICENSE +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/README.md +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omn_fleet_hook.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/__main__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/agent_loop.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/approval_formatter.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/approval_integration.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/approval_prompt.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/command_dispatch.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/commands.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/completion.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/display.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/dynamic_commands.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/file_mentions.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/h2l_command.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/h2l_headless.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/handlers/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/headless.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/headless_checkpoint.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/interface.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/prompt_input.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/pt_completion.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/session.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/subagent.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/system_prompts.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/tool_handler.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/turn_notify.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/cli/usage.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/approval_context.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/approval_interface.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/approval_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/config.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/file_system_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/program_executor.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/read_before_write_errors.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/status_core.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/status_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/tool_definitions.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/types.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/web_client.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/workflow_orchestrator.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent_engine.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent_managers.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent_mode_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/chat_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/config_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/config_migration.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/config_validator.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/conversation_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/engine.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/env_loader.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/fallback_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/health_monitor.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/history_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/hooks.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/mcp_integration_layer.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/models.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/prompt_enhancer.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/provider_capabilities.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/provider_initializer.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/provider_registry.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/rate_limit_fallback.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/approval_workflow.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/audit_logger.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/permission_controller.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/permission_rules.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/sandbox_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/security_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/signal_handler.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/events/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/events/emitter.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/events/jsonl_writer.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/events/schema.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/judge.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/loop.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/models.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/orchestrator.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/planner.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/prompts.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/refs.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/render.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/h2l/worker.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/mcp/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/mcp/client.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/mcp/manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/azure.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/base.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/cache_tokens.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/claude.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/claude_code.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/claude_credentials.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/cohere.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/digitalocean.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/factory.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/gemini.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/mistral.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/ollama.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/openai.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/openai_compatible.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/openrouter.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/perplexity.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/vertex.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/providers/xai.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/fleet/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/fleet/app.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/fleet/cli.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/fleet/models.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/fleet/sources.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/tui/fleet/widgets.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/ui/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/ui/cancellation_handler.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/ui/progress_indicator.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/ui/streaming_display.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/ui/turn_activity.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/utils/__init__.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/utils/error_handler.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/utils/errors.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/utils/retry.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer_cli.egg-info/SOURCES.txt +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer_cli.egg-info/dependency_links.txt +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer_cli.egg-info/entry_points.txt +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer_cli.egg-info/requires.txt +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer_cli.egg-info/top_level.txt +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/setup.cfg +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_approval_integration_compatibility.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_approval_preview_format.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_approval_remember.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_approval_system.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_azure_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_claude_code_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_claude_credentials.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_claude_prompt_cache.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_claude_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_cohere_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_command_approval_security.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_config_comprehensive.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_config_migration_passthrough.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_conversation_history.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_conversation_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_core_engine.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_digitalocean_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_enhanced_model_info.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_env_loader.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_error_handling_robustness.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_execution_timeout_errors.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_fallback_manager.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_fixtures.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_gemini_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_hooks.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_httpx_compatibility.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_import_validation.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_interface_smoke_tests.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_mcp_integration.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_mcp_integration_layer.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_mcp_management_commands.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_mistral_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_models.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_ollama_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_openai_compatible_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_openai_context_fit.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_openai_provider_tools.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_openai_request_timeout.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_openai_streaming.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_openrouter_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_permission_rules.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_perplexity_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_program_executor.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_aliases.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_base.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_cache_tokens.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_capability_consistency.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_discovery.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_integration.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_provider_registry.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_rate_limit_fallback.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_retry.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_security_validation.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_system_integration.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_system_prompts.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_tool_calling_integration.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_tool_handler.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_vertex_provider.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_web_request_markers.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_workflows_comprehensive.py +0 -0
- {omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_xai_provider.py +0 -0
|
@@ -8,7 +8,7 @@ API key authentication, and region configuration.
|
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
10
|
from datetime import datetime
|
|
11
|
-
from typing import Any, Dict, List, Union
|
|
11
|
+
from typing import Any, Dict, List, Optional, Union
|
|
12
12
|
|
|
13
13
|
import httpx
|
|
14
14
|
|
|
@@ -70,10 +70,13 @@ class BedrockProvider(BaseProvider):
|
|
|
70
70
|
# AWS-specific configuration
|
|
71
71
|
self.aws_region = kwargs.get("aws_region", "us-east-1")
|
|
72
72
|
|
|
73
|
-
# Standard parameters
|
|
73
|
+
# Standard parameters. Bedrock fronts third-party models that reject
|
|
74
|
+
# temperature/topP in inferenceConfig outright, and nothing in
|
|
75
|
+
# Omnimancer lets a user pick these values, so an unset param stays
|
|
76
|
+
# None and is omitted rather than defaulted into every request.
|
|
74
77
|
self.max_tokens = kwargs.get("max_tokens", 4096)
|
|
75
|
-
self.temperature = kwargs.get("temperature"
|
|
76
|
-
self.top_p = kwargs.get("top_p"
|
|
78
|
+
self.temperature = kwargs.get("temperature")
|
|
79
|
+
self.top_p = kwargs.get("top_p")
|
|
77
80
|
self.top_k = kwargs.get("top_k", 250)
|
|
78
81
|
|
|
79
82
|
# Build base URL for Bedrock API key authentication
|
|
@@ -258,7 +261,7 @@ class BedrockProvider(BaseProvider):
|
|
|
258
261
|
# Test the specific model with a minimal request
|
|
259
262
|
test_request = {
|
|
260
263
|
"messages": [{"role": "user", "content": [{"text": "Hi"}]}],
|
|
261
|
-
"inferenceConfig":
|
|
264
|
+
"inferenceConfig": self._build_inference_config(max_tokens=10),
|
|
262
265
|
}
|
|
263
266
|
|
|
264
267
|
# If using ARN format, include the model ARN in the request
|
|
@@ -373,6 +376,23 @@ class BedrockProvider(BaseProvider):
|
|
|
373
376
|
"message": f"Failed to test model: {str(e)}",
|
|
374
377
|
}
|
|
375
378
|
|
|
379
|
+
def _build_inference_config(
|
|
380
|
+
self, max_tokens: Optional[int] = None
|
|
381
|
+
) -> Dict[str, Any]:
|
|
382
|
+
"""Build inferenceConfig, omitting sampling params that are unset.
|
|
383
|
+
|
|
384
|
+
Converse raises a ValidationException for any inference field the
|
|
385
|
+
target model does not accept, so only configured values are sent.
|
|
386
|
+
"""
|
|
387
|
+
inference: Dict[str, Any] = {
|
|
388
|
+
"maxTokens": max_tokens if max_tokens is not None else self.max_tokens
|
|
389
|
+
}
|
|
390
|
+
if self.temperature is not None:
|
|
391
|
+
inference["temperature"] = self.temperature
|
|
392
|
+
if self.top_p is not None:
|
|
393
|
+
inference["topP"] = self.top_p
|
|
394
|
+
return inference
|
|
395
|
+
|
|
376
396
|
# Converse prompt caching is model-gated: sending a cachePoint to an
|
|
377
397
|
# unsupported model is a hard ValidationException, so only inject for
|
|
378
398
|
# families AWS documents as supported.
|
|
@@ -429,11 +449,7 @@ class BedrockProvider(BaseProvider):
|
|
|
429
449
|
|
|
430
450
|
request_data = {
|
|
431
451
|
"messages": messages,
|
|
432
|
-
"inferenceConfig":
|
|
433
|
-
"maxTokens": self.max_tokens,
|
|
434
|
-
"temperature": self.temperature,
|
|
435
|
-
"topP": self.top_p,
|
|
436
|
-
},
|
|
452
|
+
"inferenceConfig": self._build_inference_config(),
|
|
437
453
|
}
|
|
438
454
|
|
|
439
455
|
# If using ARN format, include the model ARN in the request
|
|
@@ -470,11 +486,7 @@ class BedrockProvider(BaseProvider):
|
|
|
470
486
|
|
|
471
487
|
request_data = {
|
|
472
488
|
"messages": messages,
|
|
473
|
-
"inferenceConfig":
|
|
474
|
-
"maxTokens": self.max_tokens,
|
|
475
|
-
"temperature": self.temperature,
|
|
476
|
-
"topP": self.top_p,
|
|
477
|
-
},
|
|
489
|
+
"inferenceConfig": self._build_inference_config(),
|
|
478
490
|
}
|
|
479
491
|
|
|
480
492
|
# Add tools in Bedrock Converse format
|
|
@@ -218,12 +218,20 @@ class TestBedrockProviderInitialization:
|
|
|
218
218
|
assert "eu-west-1" in provider.base_url
|
|
219
219
|
|
|
220
220
|
def test_initialization_default_generation_params(self, bedrock_provider):
|
|
221
|
-
"""
|
|
221
|
+
"""Unset sampling params stay None so the model's defaults apply."""
|
|
222
222
|
assert bedrock_provider.max_tokens == 4096
|
|
223
|
-
assert bedrock_provider.temperature
|
|
224
|
-
assert bedrock_provider.top_p
|
|
223
|
+
assert bedrock_provider.temperature is None
|
|
224
|
+
assert bedrock_provider.top_p is None
|
|
225
225
|
assert bedrock_provider.top_k == 250
|
|
226
226
|
|
|
227
|
+
def test_initialization_explicit_generation_params(self):
|
|
228
|
+
"""Explicitly configured sampling params are kept."""
|
|
229
|
+
provider = BedrockProvider(
|
|
230
|
+
api_key="key", model=_SONNET_MODEL, temperature=0.2, top_p=0.9
|
|
231
|
+
)
|
|
232
|
+
assert provider.temperature == 0.2
|
|
233
|
+
assert provider.top_p == 0.9
|
|
234
|
+
|
|
227
235
|
def test_initialization_missing_api_key_raises_error(self):
|
|
228
236
|
"""Test that missing api_key raises ValueError."""
|
|
229
237
|
with pytest.raises(ValueError, match="API key is required"):
|
|
@@ -288,7 +296,59 @@ class TestBedrockProviderRequestPreparation:
|
|
|
288
296
|
|
|
289
297
|
assert "inferenceConfig" in body
|
|
290
298
|
assert body["inferenceConfig"]["maxTokens"] == bedrock_provider.max_tokens
|
|
291
|
-
|
|
299
|
+
|
|
300
|
+
def test_unset_sampling_params_are_omitted_from_inference_config(
|
|
301
|
+
self, bedrock_provider, sample_chat_context, sample_tools
|
|
302
|
+
):
|
|
303
|
+
"""Bedrock hosts models that reject temperature/topP outright.
|
|
304
|
+
|
|
305
|
+
Nothing in Omnimancer lets a user choose these values, so an
|
|
306
|
+
unconfigured provider must not send them and trigger a
|
|
307
|
+
ValidationException on models that do not accept them.
|
|
308
|
+
"""
|
|
309
|
+
for body_str in (
|
|
310
|
+
bedrock_provider._prepare_bedrock_request("Hello", sample_chat_context),
|
|
311
|
+
bedrock_provider._prepare_bedrock_request_with_tools(
|
|
312
|
+
"Hello", sample_chat_context, sample_tools
|
|
313
|
+
),
|
|
314
|
+
):
|
|
315
|
+
inference = json.loads(body_str)["inferenceConfig"]
|
|
316
|
+
assert "temperature" not in inference
|
|
317
|
+
assert "topP" not in inference
|
|
318
|
+
assert inference["maxTokens"] == bedrock_provider.max_tokens
|
|
319
|
+
|
|
320
|
+
def test_configured_sampling_params_are_sent(
|
|
321
|
+
self, sample_chat_context, sample_tools
|
|
322
|
+
):
|
|
323
|
+
"""A user who configures temperature/top_p still gets them sent."""
|
|
324
|
+
provider = BedrockProvider(
|
|
325
|
+
api_key="key", model=_SONNET_MODEL, temperature=0.2, top_p=0.9
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
for body_str in (
|
|
329
|
+
provider._prepare_bedrock_request("Hello", sample_chat_context),
|
|
330
|
+
provider._prepare_bedrock_request_with_tools(
|
|
331
|
+
"Hello", sample_chat_context, sample_tools
|
|
332
|
+
),
|
|
333
|
+
):
|
|
334
|
+
inference = json.loads(body_str)["inferenceConfig"]
|
|
335
|
+
assert inference["temperature"] == 0.2
|
|
336
|
+
assert inference["topP"] == 0.9
|
|
337
|
+
|
|
338
|
+
@pytest.mark.asyncio
|
|
339
|
+
async def test_validate_model_access_omits_temperature(self, bedrock_provider):
|
|
340
|
+
"""The model-access probe must not send temperature either."""
|
|
341
|
+
mock_response = MagicMock()
|
|
342
|
+
mock_response.status_code = 200
|
|
343
|
+
|
|
344
|
+
with patch("httpx.AsyncClient") as mock_client:
|
|
345
|
+
mock_post = AsyncMock(return_value=mock_response)
|
|
346
|
+
mock_client.return_value.__aenter__.return_value.post = mock_post
|
|
347
|
+
|
|
348
|
+
await bedrock_provider.validate_model_access()
|
|
349
|
+
|
|
350
|
+
sent = json.loads(mock_post.call_args.kwargs["content"])
|
|
351
|
+
assert "temperature" not in sent["inferenceConfig"]
|
|
292
352
|
|
|
293
353
|
def test_prepare_request_standard_model_has_no_model_id_field(
|
|
294
354
|
self, bedrock_provider, sample_chat_context
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/read_before_write_errors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/agent/workflow_orchestrator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/omnimancer/core/security/permission_controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{omnimancer_cli-0.3.2 → omnimancer_cli-0.3.4}/tests/test_approval_integration_compatibility.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|