acpkit 0.7.0__tar.gz → 0.8.0__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.
- {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/SKILL.md +72 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.gitignore +3 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.pre-commit-config.yaml +3 -3
- acpkit-0.8.0/CHANGELOG +74 -0
- acpkit-0.8.0/COVERAGE +2 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/PKG-INFO +2 -1
- acpkit-0.8.0/VERSION +1 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/api/pydantic_acp.md +26 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/bridges.md +206 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/cli.md +50 -7
- acpkit-0.8.0/docs/examples/finance.md +38 -0
- acpkit-0.8.0/docs/examples/index.md +28 -0
- acpkit-0.8.0/docs/examples/travel.md +27 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/getting-started/quickstart.md +1 -1
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/index.md +2 -2
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/llms-full.txt +461 -432
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/llms.txt +7 -13
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/plans-thinking-approvals.md +86 -5
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/session-state.md +24 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp.md +6 -2
- acpkit-0.8.0/examples/pydantic/.gitignore +6 -0
- acpkit-0.8.0/examples/pydantic/.travel-agent/ideas.txt +4 -0
- acpkit-0.8.0/examples/pydantic/.travel-agent/itinerary.md +5 -0
- acpkit-0.8.0/examples/pydantic/README.md +44 -0
- acpkit-0.8.0/examples/pydantic/finance_agent.py +263 -0
- acpkit-0.8.0/examples/pydantic/travel_agent.py +262 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/mkdocs.yml +2 -4
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/README.md +1 -1
- acpkit-0.8.0/packages/adapters/pydantic-acp/VERSION +1 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/pyproject.toml +1 -1
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +56 -0
- {acpkit-0.7.0/src/acpkit → acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp}/_version.py +1 -1
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +26 -1
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +64 -23
- acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/capability_support.py +658 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +6 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +96 -5
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +2 -7
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +608 -25
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py → acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_adapter_mixins.py +201 -423
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_adapter_prompt.py +7 -3
- acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_compat.py +103 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_native_plan_runtime.py +20 -3
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_execution.py +20 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_runtime.py +7 -7
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_runtime.py +2 -9
- acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +282 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +40 -46
- acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +46 -0
- acpkit-0.8.0/packages/adapters/pydantic-acp/src/pydantic_acp/types.py +43 -0
- acpkit-0.8.0/packages/helpers/codex-auth-helper/VERSION +1 -0
- {acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp → acpkit-0.8.0/packages/helpers/codex-auth-helper/src/codex_auth_helper}/_version.py +1 -1
- {acpkit-0.7.0 → acpkit-0.8.0}/pyproject.toml +2 -3
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/generate_llms_docs.py +7 -19
- {acpkit-0.7.0/packages/helpers/codex-auth-helper/src/codex_auth_helper → acpkit-0.8.0/src/acpkit}/_version.py +1 -1
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/cli.py +2 -2
- acpkit-0.8.0/tests/codex_auth_helper/test_auth.py +260 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/support.py +26 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_adapter_helpers.py +441 -6
- acpkit-0.8.0/tests/pydantic/test_bridge_capability_support.py +749 -0
- acpkit-0.8.0/tests/pydantic/test_bridge_prepare_tools.py +248 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_thinking.py +10 -5
- acpkit-0.8.0/tests/pydantic/test_bridge_web_capabilities.py +107 -0
- acpkit-0.8.0/tests/pydantic/test_compat.py +129 -0
- acpkit-0.8.0/tests/pydantic/test_examples.py +435 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_hook_introspection.py +123 -15
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_low_level_helpers.py +36 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_models.py +95 -115
- acpkit-0.8.0/tests/pydantic/test_projection.py +1039 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_runtime.py +20 -0
- acpkit-0.8.0/tests/pydantic/test_session_runtime_helpers.py +276 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_slash_commands.py +49 -4
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/test_acpkit_cli.py +157 -5
- acpkit-0.8.0/tests/test_compatibility_manifest.py +200 -0
- acpkit-0.8.0/tests/test_native_pydantic_agent.py +189 -0
- acpkit-0.7.0/COVERAGE +0 -2
- acpkit-0.7.0/VERSION +0 -1
- acpkit-0.7.0/docs/examples/factory.md +0 -47
- acpkit-0.7.0/docs/examples/index.md +0 -43
- acpkit-0.7.0/docs/examples/minimal.md +0 -42
- acpkit-0.7.0/docs/examples/providers.md +0 -33
- acpkit-0.7.0/docs/examples/workspace-agent.md +0 -277
- acpkit-0.7.0/examples/pydantic/.gitignore +0 -2
- acpkit-0.7.0/examples/pydantic/README.md +0 -63
- acpkit-0.7.0/examples/pydantic/approvals.py +0 -57
- acpkit-0.7.0/examples/pydantic/bridges.py +0 -137
- acpkit-0.7.0/examples/pydantic/factory_agent.py +0 -68
- acpkit-0.7.0/examples/pydantic/hook_projection.py +0 -240
- acpkit-0.7.0/examples/pydantic/host_context.py +0 -71
- acpkit-0.7.0/examples/pydantic/providers.py +0 -253
- acpkit-0.7.0/examples/pydantic/static_agent.py +0 -36
- acpkit-0.7.0/examples/pydantic/strong_agent.py +0 -719
- acpkit-0.7.0/examples/pydantic/strong_agent_v2.py +0 -705
- acpkit-0.7.0/packages/adapters/pydantic-acp/VERSION +0 -1
- acpkit-0.7.0/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -28
- acpkit-0.7.0/packages/helpers/codex-auth-helper/VERSION +0 -1
- acpkit-0.7.0/tests/pydantic/test_bridge_prepare_tools.py +0 -101
- acpkit-0.7.0/tests/pydantic/test_projection.py +0 -364
- acpkit-0.7.0/tests/test_compatibility_manifest.py +0 -103
- acpkit-0.7.0/tests/test_native_pydantic_agent.py +0 -129
- {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/agents/openai.yaml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/resources/intro.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/scripts/list_examples.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.agents/skills/acpkit-sdk/scripts/list_public_exports.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.cursorrules +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.editorconfig +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/dependabot.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/ci.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/codecov.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/docs.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/publish.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.github/workflows/test.yml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/.python-version +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/CODE_OF_CONDUCT.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/CONTRIBUTING.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/LICENSE +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/Makefile +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/README.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/SECURITY.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/context7.json +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/.partials/index-header.html +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/about/index.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/api/acpkit.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/api/codex_auth_helper.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/compatibility-matrix-template.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/getting-started/installation.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/helpers.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/host-backends.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/integration-audit.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/integration-readiness.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/integration-testing.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/projection-cookbook.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/providers.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/adapter-config.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/prompt-resources.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/pydantic-acp/runtime-controls.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/stylesheets/tweaks.css +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/docs/testing.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/examples/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/examples/pydantic/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_risk.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_projection_text.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/_slash_commands.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/_hook_capability.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/thinking.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_commands.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/_policy_paths.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/policy.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/projection_helpers.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_agent_state.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_prompt_model_runtime.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_lifecycle.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_model_runtime.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/_session_surface_runtime.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/testing/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/testing/fakes.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/adapters/pydantic-acp/src/pydantic_acp/testing/harness.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/.gitignore +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/LICENSE +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/README.md +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/pyproject.toml +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/pyrightconfig.json +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/check_pypi_versions.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/demo_mcp_server.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/mock_hook_audit.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/mock_hook_snapshot.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/run_if_major_change.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/scripts/save_coverage_summary.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/__main__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/_compatibility_schema.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/adapters.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/compatibility.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/py.typed +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/src/acpkit/runtime.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/codex_auth_helper/support.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/codex_auth_helper/test_factory.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/conftest.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/__init__.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_approvals.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_builder.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_hooks.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_bridge_mcp.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_host.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_host_policy.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_projection_helpers.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_sources.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_testing_fakes.py +0 -0
- {acpkit-0.7.0 → acpkit-0.8.0}/tests/pydantic/test_testing_harness.py +0 -0
|
@@ -36,6 +36,78 @@ The core contract across the repo is:
|
|
|
36
36
|
That rule affects model selection, mode switching, slash commands, native plan state, approval
|
|
37
37
|
flow, MCP metadata, hook rendering, cancellation, and host-backed tooling.
|
|
38
38
|
|
|
39
|
+
## Capability Bridges And UI Projection
|
|
40
|
+
|
|
41
|
+
Recent `pydantic-acp` bridge support covers both upstream capability wiring and ACP-visible transcript rendering, but those are different seams.
|
|
42
|
+
|
|
43
|
+
Important distinction:
|
|
44
|
+
|
|
45
|
+
- a capability bridge wires runtime behavior into the agent
|
|
46
|
+
- a projection map decides whether matching tool calls render as rich ACP cards or generic tool output
|
|
47
|
+
- provider-owned compaction visibility is now built into the runtime path and does not need a projection map
|
|
48
|
+
|
|
49
|
+
Current high-value capability bridges:
|
|
50
|
+
|
|
51
|
+
- `ThreadExecutorBridge`
|
|
52
|
+
- `SetToolMetadataBridge`
|
|
53
|
+
- `IncludeToolReturnSchemasBridge`
|
|
54
|
+
- `WebSearchBridge`
|
|
55
|
+
- `WebFetchBridge`
|
|
56
|
+
- `ImageGenerationBridge`
|
|
57
|
+
- `McpCapabilityBridge`
|
|
58
|
+
- `ToolsetBridge`
|
|
59
|
+
- `PrefixToolsBridge`
|
|
60
|
+
- `OpenAICompactionBridge`
|
|
61
|
+
- `AnthropicCompactionBridge`
|
|
62
|
+
|
|
63
|
+
Current projection helpers for capability-owned builtin tools:
|
|
64
|
+
|
|
65
|
+
- `WebToolProjectionMap()`
|
|
66
|
+
- `BuiltinToolProjectionMap()`
|
|
67
|
+
|
|
68
|
+
Use them like this:
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from pydantic_acp import (
|
|
72
|
+
AdapterConfig,
|
|
73
|
+
BuiltinToolProjectionMap,
|
|
74
|
+
WebFetchBridge,
|
|
75
|
+
WebSearchBridge,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
config = AdapterConfig(
|
|
79
|
+
capability_bridges=[
|
|
80
|
+
WebSearchBridge(),
|
|
81
|
+
WebFetchBridge(),
|
|
82
|
+
],
|
|
83
|
+
projection_maps=[BuiltinToolProjectionMap()],
|
|
84
|
+
)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
What this means in ACP clients:
|
|
88
|
+
|
|
89
|
+
- `WebSearchBridge` + `WebToolProjectionMap` or `BuiltinToolProjectionMap`
|
|
90
|
+
- start card shows query/domain context
|
|
91
|
+
- completion card shows search results instead of opaque raw output
|
|
92
|
+
- `WebFetchBridge` + `WebToolProjectionMap` or `BuiltinToolProjectionMap`
|
|
93
|
+
- start card shows URL
|
|
94
|
+
- completion card shows title, preview text, or binary fetch status
|
|
95
|
+
- `ImageGenerationBridge` + `BuiltinToolProjectionMap`
|
|
96
|
+
- start card shows prompt and settings
|
|
97
|
+
- completion card shows revised prompt / image-generation summary
|
|
98
|
+
- `McpCapabilityBridge` + `BuiltinToolProjectionMap`
|
|
99
|
+
- builtin `mcp_server:*` calls render as intentional MCP cards instead of generic execute noise
|
|
100
|
+
|
|
101
|
+
Compaction is different:
|
|
102
|
+
|
|
103
|
+
- `OpenAICompactionBridge` does not rely on a projection map for visibility
|
|
104
|
+
- `AnthropicCompactionBridge` does not rely on a projection map for visibility
|
|
105
|
+
- when compaction happens, ACP now emits a visible `Context Compaction` card
|
|
106
|
+
- OpenAI compaction opens and closes a visible card around the preflight compaction request
|
|
107
|
+
- Anthropic `CompactionPart` summaries are projected into the transcript as visible completion updates
|
|
108
|
+
|
|
109
|
+
Use this when the product should avoid the "blank wait" failure mode during provider-owned history compaction.
|
|
110
|
+
|
|
39
111
|
## Use The Right Construction Seam
|
|
40
112
|
|
|
41
113
|
Pick the narrowest seam that matches the job:
|
|
@@ -14,7 +14,7 @@ repos:
|
|
|
14
14
|
hooks:
|
|
15
15
|
- id: check-pypi-version-ordering
|
|
16
16
|
name: ensure local package versions are ahead of PyPI
|
|
17
|
-
entry: python3.11 scripts/check_pypi_versions.py
|
|
17
|
+
entry: uv run --extra dev python3.11 scripts/check_pypi_versions.py
|
|
18
18
|
language: system
|
|
19
19
|
pass_filenames: false
|
|
20
20
|
stages: [pre-commit]
|
|
@@ -25,8 +25,8 @@ repos:
|
|
|
25
25
|
pass_filenames: false
|
|
26
26
|
stages: [pre-commit]
|
|
27
27
|
- id: check-coverage
|
|
28
|
-
name: check coverage thresholds for major changes
|
|
29
|
-
entry: python3.11 scripts/run_if_major_change.py --stage pre-commit -- make
|
|
28
|
+
name: save and check coverage thresholds for major changes
|
|
29
|
+
entry: python3.11 scripts/run_if_major_change.py --stage pre-commit -- make save-coverage
|
|
30
30
|
language: system
|
|
31
31
|
pass_filenames: false
|
|
32
32
|
stages: [pre-commit]
|
acpkit-0.8.0/CHANGELOG
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
## Release Summary — 2026-04-17
|
|
2
|
+
|
|
3
|
+
This release upgrades `pydantic-acp` to `pydantic-ai-slim==1.83.0`, expands the upstream
|
|
4
|
+
capability bridge surface, improves ACP-native plan mode behavior, and tightens documentation,
|
|
5
|
+
projection coverage, and runtime compatibility seams.
|
|
6
|
+
|
|
7
|
+
### Highlights
|
|
8
|
+
|
|
9
|
+
- Upgraded `pydantic-acp` to `pydantic-ai-slim==1.83.0`.
|
|
10
|
+
- Hardened hook observation and introspection against upstream private API drift.
|
|
11
|
+
- Added a generic bridge capability seam through `CapabilityBridge.build_agent_capabilities(...)`.
|
|
12
|
+
- Expanded the built-in capability bridge surface to cover:
|
|
13
|
+
- `ThreadExecutorBridge`
|
|
14
|
+
- `SetToolMetadataBridge`
|
|
15
|
+
- `IncludeToolReturnSchemasBridge`
|
|
16
|
+
- `WebSearchBridge`
|
|
17
|
+
- `WebFetchBridge`
|
|
18
|
+
- `ImageGenerationBridge`
|
|
19
|
+
- `McpCapabilityBridge`
|
|
20
|
+
- `ToolsetBridge`
|
|
21
|
+
- `PrefixToolsBridge`
|
|
22
|
+
- `OpenAICompactionBridge`
|
|
23
|
+
- `AnthropicCompactionBridge`
|
|
24
|
+
- Re-exported the new bridges from the public `pydantic_acp` package surface.
|
|
25
|
+
|
|
26
|
+
### ACP Projection And UX
|
|
27
|
+
|
|
28
|
+
- Added `WebToolProjectionMap` and `BuiltinToolProjectionMap`.
|
|
29
|
+
- Added richer ACP tool-card projection for:
|
|
30
|
+
- web search starts and results
|
|
31
|
+
- web fetch starts, previews, and binary fetch fallbacks
|
|
32
|
+
- image generation starts and summaries
|
|
33
|
+
- upstream MCP capability calls and tool-list responses
|
|
34
|
+
- Added visible transcript updates for provider-owned compaction, including OpenAI preflight
|
|
35
|
+
compaction visibility and Anthropic `CompactionPart` projection.
|
|
36
|
+
- Fixed builtin tool result projection from `ModelResponse` history.
|
|
37
|
+
- Expanded the default tool classifier to recognize common web, image, and `mcp_server:*` builtin
|
|
38
|
+
tool names.
|
|
39
|
+
|
|
40
|
+
### Native Plan Mode
|
|
41
|
+
|
|
42
|
+
- Added `TaskPlan` as the structured native-plan output surface for ACP plan mode.
|
|
43
|
+
- Added a session-local `plan_generation_type` config option for `PrepareToolsBridge` with
|
|
44
|
+
`structured` and `tools` modes.
|
|
45
|
+
- Made `structured` the default plan-mode behavior so native plan mode can require structured plan
|
|
46
|
+
generation without exposing `acp_set_plan`.
|
|
47
|
+
- Restored tool-based native plan recording behind `plan_generation_type="tools"`.
|
|
48
|
+
- Kept plan progress tools (`acp_update_plan_entry`, `acp_mark_plan_done`) tied to
|
|
49
|
+
`plan_tools=True` execution flows.
|
|
50
|
+
|
|
51
|
+
### Runtime And Maintainability
|
|
52
|
+
|
|
53
|
+
- Moved remaining private and semi-private hook access behind a dedicated compatibility layer.
|
|
54
|
+
- Preserved hook ordering when wrapping `Hooks(...)` capabilities.
|
|
55
|
+
- Split the large `runtime/adapter.py` delegation surface into dedicated runtime mixins.
|
|
56
|
+
- Added focused inline docstrings on the public ACP-facing adapter methods and runtime mixins.
|
|
57
|
+
|
|
58
|
+
### Docs And Examples
|
|
59
|
+
|
|
60
|
+
- Extended the maintained bridges example to cover the new bridge and projection surfaces.
|
|
61
|
+
- Updated API and bridge docs to reflect the generic capability seam and the current bridge set.
|
|
62
|
+
- Clarified CLI ownership boundaries between `acpkit run ...`, `run_acp(...)`, and
|
|
63
|
+
`create_acp_agent(...)`.
|
|
64
|
+
- Expanded the factory example docs with explicit session-derived input handling and fallback
|
|
65
|
+
guidance.
|
|
66
|
+
- Documented native plan persistence wiring and clarified how ACP-native plan rendering already
|
|
67
|
+
works through `AgentPlanUpdate` plus `acp_get_plan`.
|
|
68
|
+
- Clarified `FileSessionStore` recovery guarantees versus host-owned recovery metrics.
|
|
69
|
+
|
|
70
|
+
### Verification
|
|
71
|
+
|
|
72
|
+
- Added regression coverage for the new capability bridges, hook compatibility paths, projection
|
|
73
|
+
updates, native plan generation modes, and adapter runtime mixin delegation paths.
|
|
74
|
+
- Added helper-path tests to keep coverage above the repository thresholds.
|
acpkit-0.8.0/COVERAGE
ADDED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: acpkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: ACP Kit provides a common adapter for Agent Frameworks.
|
|
5
5
|
Project-URL: Homepage, https://github.com/vcoderun/acpkit
|
|
6
6
|
Project-URL: Issues, https://github.com/vcoderun/acpkit/issues
|
|
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Requires-Python: >=3.11
|
|
18
18
|
Requires-Dist: click>=8.1.8
|
|
19
|
+
Requires-Dist: mcp>=1.27.0
|
|
19
20
|
Requires-Dist: typing-extensions>=4.12.0
|
|
20
21
|
Provides-Extra: all
|
|
21
22
|
Requires-Dist: agent-client-protocol>=0.9.0; extra == 'all'
|
acpkit-0.8.0/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.8.0
|
|
@@ -74,6 +74,28 @@ This page documents the public surface re-exported by `pydantic_acp`.
|
|
|
74
74
|
|
|
75
75
|
::: pydantic_acp.HistoryProcessorBridge
|
|
76
76
|
|
|
77
|
+
::: pydantic_acp.ThreadExecutorBridge
|
|
78
|
+
|
|
79
|
+
::: pydantic_acp.ImageGenerationBridge
|
|
80
|
+
|
|
81
|
+
::: pydantic_acp.SetToolMetadataBridge
|
|
82
|
+
|
|
83
|
+
::: pydantic_acp.IncludeToolReturnSchemasBridge
|
|
84
|
+
|
|
85
|
+
::: pydantic_acp.ToolsetBridge
|
|
86
|
+
|
|
87
|
+
::: pydantic_acp.PrefixToolsBridge
|
|
88
|
+
|
|
89
|
+
::: pydantic_acp.WebSearchBridge
|
|
90
|
+
|
|
91
|
+
::: pydantic_acp.WebFetchBridge
|
|
92
|
+
|
|
93
|
+
::: pydantic_acp.McpCapabilityBridge
|
|
94
|
+
|
|
95
|
+
::: pydantic_acp.OpenAICompactionBridge
|
|
96
|
+
|
|
97
|
+
::: pydantic_acp.AnthropicCompactionBridge
|
|
98
|
+
|
|
77
99
|
::: pydantic_acp.McpBridge
|
|
78
100
|
|
|
79
101
|
::: pydantic_acp.McpServerDefinition
|
|
@@ -90,6 +112,10 @@ This page documents the public surface re-exported by `pydantic_acp`.
|
|
|
90
112
|
|
|
91
113
|
::: pydantic_acp.FileSystemProjectionMap
|
|
92
114
|
|
|
115
|
+
::: pydantic_acp.WebToolProjectionMap
|
|
116
|
+
|
|
117
|
+
::: pydantic_acp.BuiltinToolProjectionMap
|
|
118
|
+
|
|
93
119
|
::: pydantic_acp.CompositeProjectionMap
|
|
94
120
|
|
|
95
121
|
## Projection Helpers
|
|
@@ -37,6 +37,7 @@ Use `BufferedCapabilityBridge` when the bridge also needs to emit ACP transcript
|
|
|
37
37
|
|
|
38
38
|
| Method | Override it when | Return value |
|
|
39
39
|
|---|---|---|
|
|
40
|
+
| `build_agent_capabilities(...)` | your bridge contributes Pydantic AI capabilities that should be attached to the active agent | `tuple[AbstractCapability, ...]` |
|
|
40
41
|
| `get_session_metadata(...)` | you want a metadata section under your bridge `metadata_key` | `dict[str, JsonValue]` |
|
|
41
42
|
| `get_tool_kind(...)` | you want custom ACP tool classification | `ToolKind` |
|
|
42
43
|
| `get_mcp_capabilities(...)` | your bridge requires MCP transport capability flags | `McpCapabilities` |
|
|
@@ -47,11 +48,52 @@ Use `BufferedCapabilityBridge` when the bridge also needs to emit ACP transcript
|
|
|
47
48
|
|
|
48
49
|
Practical rules:
|
|
49
50
|
|
|
51
|
+
- use `build_agent_capabilities(...)` when the bridge needs to materialize upstream Pydantic AI capabilities
|
|
52
|
+
- `AgentBridgeBuilder` is the adapter-local helper that turns those bridge contributions into agent constructor inputs
|
|
50
53
|
- set `metadata_key` if you want your metadata to appear in session metadata
|
|
51
54
|
- keep classification deterministic; the first bridge that returns a `ToolKind` wins
|
|
52
55
|
- return `None` when your bridge is not authoritative for that surface
|
|
53
56
|
- use bridge-local buffering only when you truly need ACP transcript updates, not just metadata
|
|
54
57
|
|
|
58
|
+
## `AgentBridgeBuilder` Is The Capability Wiring Seam
|
|
59
|
+
|
|
60
|
+
`AdapterConfig(capability_bridges=[...])` makes the adapter aware of bridge-owned ACP surfaces such as:
|
|
61
|
+
|
|
62
|
+
- session metadata
|
|
63
|
+
- tool classification
|
|
64
|
+
- config options
|
|
65
|
+
- mode state
|
|
66
|
+
- model settings
|
|
67
|
+
|
|
68
|
+
If a bridge also contributes upstream Pydantic AI capabilities, those still need to be attached to
|
|
69
|
+
the active agent instance.
|
|
70
|
+
|
|
71
|
+
Use `AgentBridgeBuilder(...)` inside your factory or source:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
builder = AgentBridgeBuilder(
|
|
75
|
+
session=session,
|
|
76
|
+
capability_bridges=bridges,
|
|
77
|
+
)
|
|
78
|
+
contributions = builder.build()
|
|
79
|
+
|
|
80
|
+
agent = Agent(
|
|
81
|
+
model,
|
|
82
|
+
capabilities=contributions.capabilities,
|
|
83
|
+
history_processors=contributions.history_processors,
|
|
84
|
+
)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
That is the intended seam for:
|
|
88
|
+
|
|
89
|
+
- `HookBridge`
|
|
90
|
+
- `PrepareToolsBridge`
|
|
91
|
+
- `ThreadExecutorBridge`
|
|
92
|
+
- `SetToolMetadataBridge`
|
|
93
|
+
- `IncludeToolReturnSchemasBridge`
|
|
94
|
+
- `WebSearchBridge`
|
|
95
|
+
- `WebFetchBridge`
|
|
96
|
+
|
|
55
97
|
## Compatibility Note: History Processor Types
|
|
56
98
|
|
|
57
99
|
`HistoryProcessorBridge` depends on Pydantic AI history-processor callable types.
|
|
@@ -218,8 +260,172 @@ HookBridge(hide_all=True)
|
|
|
218
260
|
|
|
219
261
|
Wraps history processors so their activity can be reflected into ACP updates.
|
|
220
262
|
|
|
263
|
+
### `WebSearchBridge`
|
|
264
|
+
|
|
265
|
+
Adds Pydantic AI's `WebSearch` capability into the active agent and classifies matching tools as ACP `search`.
|
|
266
|
+
|
|
267
|
+
Use it when:
|
|
268
|
+
|
|
269
|
+
- the runtime should expose builtin or local web search through one bridge-owned capability
|
|
270
|
+
- ACP transcript cards should classify `web_search` or local fallback search tools as search operations
|
|
271
|
+
- session metadata should show search configuration such as allowed domains or context size
|
|
272
|
+
|
|
273
|
+
Default classified tool names:
|
|
274
|
+
|
|
275
|
+
- `web_search`
|
|
276
|
+
- `duckduckgo_search`
|
|
277
|
+
- `exa_search`
|
|
278
|
+
- `tavily_search`
|
|
279
|
+
|
|
280
|
+
UI note:
|
|
281
|
+
|
|
282
|
+
- add `WebToolProjectionMap()` or `BuiltinToolProjectionMap()` when you want ACP transcript cards to show query/domain context at start and search results at completion instead of generic tool output
|
|
283
|
+
|
|
284
|
+
### `WebFetchBridge`
|
|
285
|
+
|
|
286
|
+
Adds Pydantic AI's `WebFetch` capability into the active agent and classifies matching tools as ACP `fetch`.
|
|
287
|
+
|
|
288
|
+
Use it when:
|
|
289
|
+
|
|
290
|
+
- the runtime should expose builtin or local URL fetching through one bridge-owned capability
|
|
291
|
+
- ACP transcript cards should classify `web_fetch` as a fetch operation instead of generic execute
|
|
292
|
+
- session metadata should show fetch guardrails such as allowed domains, citations, or token limits
|
|
293
|
+
|
|
221
294
|
This is useful when you want message-history trimming or contextual rewriting to remain observable.
|
|
222
295
|
|
|
296
|
+
UI note:
|
|
297
|
+
|
|
298
|
+
- add `WebToolProjectionMap()` or `BuiltinToolProjectionMap()` when you want ACP transcript cards to show fetched URLs, page titles, text previews, and binary-fetch status
|
|
299
|
+
|
|
300
|
+
### `ImageGenerationBridge`
|
|
301
|
+
|
|
302
|
+
Adds upstream `ImageGeneration` through the bridge-builder seam.
|
|
303
|
+
|
|
304
|
+
Use it when:
|
|
305
|
+
|
|
306
|
+
- the runtime should expose builtin image generation or a local fallback subagent through one ACP-owned seam
|
|
307
|
+
- session metadata should reflect image-generation policy such as quality, size, or output format
|
|
308
|
+
- projection maps should recognize `image_generation` or `generate_image` as intentional builtin work instead of generic tool noise
|
|
309
|
+
|
|
310
|
+
UI note:
|
|
311
|
+
|
|
312
|
+
- add `BuiltinToolProjectionMap()` when you want ACP transcript cards to show prompt, quality, size, and revised prompt summary for builtin image generation
|
|
313
|
+
|
|
314
|
+
### `ThreadExecutorBridge`
|
|
315
|
+
|
|
316
|
+
Adds Pydantic AI's `ThreadExecutor` capability through the bridge-builder seam.
|
|
317
|
+
|
|
318
|
+
Use it when:
|
|
319
|
+
|
|
320
|
+
- your ACP service is long-lived
|
|
321
|
+
- sync tools or callbacks should run on a bounded executor
|
|
322
|
+
- you want bridge-owned agent construction to keep executor policy explicit
|
|
323
|
+
|
|
324
|
+
### `SetToolMetadataBridge`
|
|
325
|
+
|
|
326
|
+
Adds upstream `SetToolMetadata` capability through the bridge-builder seam.
|
|
327
|
+
|
|
328
|
+
Use it when:
|
|
329
|
+
|
|
330
|
+
- tool metadata should be attached centrally instead of per-tool definition
|
|
331
|
+
- downstream selectors, MCP logic, or provider behavior depend on consistent metadata
|
|
332
|
+
|
|
333
|
+
### `IncludeToolReturnSchemasBridge`
|
|
334
|
+
|
|
335
|
+
Adds upstream `IncludeToolReturnSchemas` capability through the bridge-builder seam.
|
|
336
|
+
|
|
337
|
+
Use it when:
|
|
338
|
+
|
|
339
|
+
- you want richer tool return contracts sent to models
|
|
340
|
+
- downstream integrations should enable return-schema support consistently across selected tools
|
|
341
|
+
|
|
342
|
+
### `ToolsetBridge`
|
|
343
|
+
|
|
344
|
+
Adds upstream `Toolset` capability through the bridge-builder seam.
|
|
345
|
+
|
|
346
|
+
Use it when:
|
|
347
|
+
|
|
348
|
+
- a maintained `FunctionToolset` or other agent toolset should be injected through the same ACP-owned bridge path as other capabilities
|
|
349
|
+
- integration code wants one explicit place to wire toolset-owned instructions or wrappers
|
|
350
|
+
|
|
351
|
+
Compatibility notes:
|
|
352
|
+
|
|
353
|
+
- toolset `get_instructions()` output passes through to the upstream model request as `instruction_parts`
|
|
354
|
+
- ordering is explicit: `AgentBridgeBuilder.build(capabilities=...)` keeps user-supplied capabilities first, then appends bridge capabilities in configured bridge order
|
|
355
|
+
|
|
356
|
+
### `PrefixToolsBridge`
|
|
357
|
+
|
|
358
|
+
Adds upstream `PrefixTools` capability through the bridge-builder seam.
|
|
359
|
+
|
|
360
|
+
Use it when:
|
|
361
|
+
|
|
362
|
+
- a wrapped capability's tool names need a stable namespace prefix
|
|
363
|
+
- downstream clients should see prefixed tool names without custom tool re-registration logic
|
|
364
|
+
|
|
365
|
+
### `McpCapabilityBridge`
|
|
366
|
+
|
|
367
|
+
Adds upstream `MCP` capability through the bridge-builder seam.
|
|
368
|
+
|
|
369
|
+
Use it when:
|
|
370
|
+
|
|
371
|
+
- the model should use builtin MCP server support when available and local HTTP fallback otherwise
|
|
372
|
+
- ACP session metadata should expose the connected MCP URL, resolved server id, or allowlist shape
|
|
373
|
+
- projection maps should summarize `mcp_server:*` builtin tool calls
|
|
374
|
+
|
|
375
|
+
Compatibility note:
|
|
376
|
+
|
|
377
|
+
- this bridge is separate from MCP toolsets such as `MCPServerStdio` or `MCPServerStreamableHTTP`
|
|
378
|
+
- if those toolsets are attached directly to the agent with `include_instructions=True`, their server instructions still flow through the normal upstream toolset path into `instruction_parts`
|
|
379
|
+
|
|
380
|
+
UI note:
|
|
381
|
+
|
|
382
|
+
- add `BuiltinToolProjectionMap()` when you want ACP transcript cards to summarize builtin MCP calls such as `call_tool`, `list_tools`, and output previews instead of generic execute cards
|
|
383
|
+
|
|
384
|
+
### `OpenAICompactionBridge`
|
|
385
|
+
|
|
386
|
+
Adds provider-owned OpenAI Responses compaction through the bridge-builder seam.
|
|
387
|
+
|
|
388
|
+
Use it when:
|
|
389
|
+
|
|
390
|
+
- long-running ACP sessions should compact history without looking stalled in the client
|
|
391
|
+
- the ACP transcript should show a visible `Context Compaction` card before and after OpenAI compaction runs
|
|
392
|
+
- session metadata should still expose the configured trigger and instructions
|
|
393
|
+
|
|
394
|
+
UI behavior:
|
|
395
|
+
|
|
396
|
+
- no extra projection map is required
|
|
397
|
+
- when compaction triggers, ACP emits a visible `Context Compaction` start/update pair
|
|
398
|
+
- OpenAI shows provider status and round-trip payload preservation instead of a blank wait
|
|
399
|
+
- OpenAI completion is emitted by the bridge-owned wrapper so the same card opens and closes around the compaction request
|
|
400
|
+
|
|
401
|
+
### `AnthropicCompactionBridge`
|
|
402
|
+
|
|
403
|
+
Adds provider-owned Anthropic context-management compaction through the bridge-builder seam.
|
|
404
|
+
|
|
405
|
+
Use it when:
|
|
406
|
+
|
|
407
|
+
- Anthropic context management should be configured through the bridge seam
|
|
408
|
+
- Anthropic compaction summaries should be visible in ACP transcripts instead of disappearing into raw provider behavior
|
|
409
|
+
|
|
410
|
+
UI behavior:
|
|
411
|
+
|
|
412
|
+
- no extra projection map is required
|
|
413
|
+
- when Anthropic returns a `CompactionPart`, ACP emits a visible `Context Compaction` card
|
|
414
|
+
- readable Anthropic compaction summaries are shown in the completion update
|
|
415
|
+
|
|
416
|
+
## Builtin Capability Projection
|
|
417
|
+
|
|
418
|
+
Use `BuiltinToolProjectionMap()` when the agent exposes upstream builtin capability tools and you want ACP-visible cards instead of generic execute noise.
|
|
419
|
+
|
|
420
|
+
Current builtin projection coverage:
|
|
421
|
+
|
|
422
|
+
- web search
|
|
423
|
+
- web fetch
|
|
424
|
+
- image generation
|
|
425
|
+
- builtin MCP server tools
|
|
426
|
+
|
|
427
|
+
Compaction visibility is built into the runtime path and does not require a projection map.
|
|
428
|
+
|
|
223
429
|
### `McpBridge`
|
|
224
430
|
|
|
225
431
|
Adds MCP-aware metadata and tool classification:
|
|
@@ -13,7 +13,7 @@ The root `acpkit` package exposes two command families:
|
|
|
13
13
|
```bash
|
|
14
14
|
acpkit run TARGET [-p PATH]...
|
|
15
15
|
acpkit launch TARGET [-p PATH]...
|
|
16
|
-
acpkit launch --command "python3.11
|
|
16
|
+
acpkit launch --command "python3.11 finance_agent.py"
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
`TARGET` can be:
|
|
@@ -42,21 +42,63 @@ If the resolved value is not a supported agent type, `acpkit` raises `Unsupporte
|
|
|
42
42
|
Use `run` when the target itself should be resolved and exposed through ACP:
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
acpkit run
|
|
46
|
-
acpkit run
|
|
45
|
+
acpkit run finance_agent
|
|
46
|
+
acpkit run finance_agent:agent
|
|
47
47
|
acpkit run app.agents.demo:agent -p ./examples
|
|
48
48
|
acpkit run external_agent -p /absolute/path/to/agents
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
This is the most direct path from Python code to a running ACP server.
|
|
52
52
|
|
|
53
|
+
The expected Python module shape is:
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from pydantic_ai import Agent
|
|
57
|
+
from pydantic_acp import run_acp
|
|
58
|
+
|
|
59
|
+
agent = Agent("openai:gpt-5", name="demo-agent")
|
|
60
|
+
|
|
61
|
+
run_acp(agent=agent)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
That means:
|
|
65
|
+
|
|
66
|
+
- `acpkit run my_agent_module`
|
|
67
|
+
- imports `my_agent_module`
|
|
68
|
+
- finds the last defined `pydantic_ai.Agent`
|
|
69
|
+
- exposes it through the matching ACP adapter
|
|
70
|
+
- `acpkit run my_agent_module:agent`
|
|
71
|
+
- imports the explicit `agent` symbol and exposes that one
|
|
72
|
+
|
|
73
|
+
If you need adapter configuration such as session persistence, plan bridges, approvals, or host
|
|
74
|
+
projection maps, keep that wiring inside the target module and still run the module through
|
|
75
|
+
`acpkit run`.
|
|
76
|
+
|
|
77
|
+
## CLI Versus Runtime API
|
|
78
|
+
|
|
79
|
+
Use the root CLI when:
|
|
80
|
+
|
|
81
|
+
- you want target resolution from a module path
|
|
82
|
+
- your editor or launcher shells out to a command
|
|
83
|
+
- ACP transport lifecycle should be owned by the `acpkit` process
|
|
84
|
+
|
|
85
|
+
Use `run_acp(...)` when:
|
|
86
|
+
|
|
87
|
+
- you already have the Python agent object in-process
|
|
88
|
+
- the module itself should start the ACP server directly
|
|
89
|
+
|
|
90
|
+
Use `create_acp_agent(...)` when:
|
|
91
|
+
|
|
92
|
+
- another runtime should own transport lifecycle
|
|
93
|
+
- you want the ACP-compatible agent object without starting the server immediately
|
|
94
|
+
|
|
53
95
|
## `acpkit launch`
|
|
54
96
|
|
|
55
97
|
Use `launch` when you want Toad ACP to launch the command for you:
|
|
56
98
|
|
|
57
99
|
```bash
|
|
58
|
-
acpkit launch
|
|
59
|
-
acpkit launch
|
|
100
|
+
acpkit launch finance_agent
|
|
101
|
+
acpkit launch finance_agent:agent -p ./examples
|
|
60
102
|
```
|
|
61
103
|
|
|
62
104
|
This mirrors the resolved target through:
|
|
@@ -68,13 +110,13 @@ toad acp "acpkit run TARGET [-p PATH]..."
|
|
|
68
110
|
Raw command mode skips target resolution entirely:
|
|
69
111
|
|
|
70
112
|
```bash
|
|
71
|
-
acpkit launch --command "python3.11
|
|
113
|
+
acpkit launch --command "python3.11 finance_agent.py"
|
|
72
114
|
```
|
|
73
115
|
|
|
74
116
|
That becomes:
|
|
75
117
|
|
|
76
118
|
```bash
|
|
77
|
-
toad acp "python3.11
|
|
119
|
+
toad acp "python3.11 finance_agent.py"
|
|
78
120
|
```
|
|
79
121
|
|
|
80
122
|
## Installation Hints And Failure Modes
|
|
@@ -90,6 +132,7 @@ Common failure cases:
|
|
|
90
132
|
- the module imports but contains no detectable supported agent
|
|
91
133
|
- `module:attribute` points at a non-agent object
|
|
92
134
|
- the requested adapter package is not installed
|
|
135
|
+
- the target module starts ACP with `run_acp(...)` but imports fail before the agent is created
|
|
93
136
|
|
|
94
137
|
## Runtime API
|
|
95
138
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Finance Agent
|
|
2
|
+
|
|
3
|
+
The maintained finance showcase is [`examples/pydantic/finance_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/finance_agent.py).
|
|
4
|
+
|
|
5
|
+
It is the main example for:
|
|
6
|
+
|
|
7
|
+
- a direct module-level `Agent(...)` plus `AdapterConfig(...)` surface
|
|
8
|
+
- `PrepareToolsBridge` mode shaping
|
|
9
|
+
- structured native plan generation
|
|
10
|
+
- approval-gated writes with `FileSystemProjectionMap`
|
|
11
|
+
- file-backed ACP session persistence
|
|
12
|
+
|
|
13
|
+
## Why This Example Exists
|
|
14
|
+
|
|
15
|
+
Older examples in this repo split these ideas across separate files. That made the codebase noisy
|
|
16
|
+
and kept coverage low in files that were too small to justify keeping around.
|
|
17
|
+
|
|
18
|
+
`finance_agent.py` intentionally keeps those ACP surfaces together in one realistic workflow:
|
|
19
|
+
|
|
20
|
+
- `ask` mode for read-only inspection
|
|
21
|
+
- `plan` mode for ACP-native structured plans
|
|
22
|
+
- `trade` mode for approval-gated note updates
|
|
23
|
+
|
|
24
|
+
## Run It
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
uv run python -m examples.pydantic.finance_agent
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
By default the example uses `TestModel`. Set `ACP_FINANCE_MODEL` when you want a live model.
|
|
31
|
+
|
|
32
|
+
## Key Patterns
|
|
33
|
+
|
|
34
|
+
- the module exports plain `agent`, `config`, and `main` symbols without factory wrappers
|
|
35
|
+
- `FinancePlanPersistenceProvider` writes ACP plans into `.acpkit/plans/`
|
|
36
|
+
- `PrepareToolsBridge` keeps `ask`, `plan`, and `trade` behaviors explicit instead of scattering them across separate examples
|
|
37
|
+
- `FileSystemProjectionMap` turns note reads and writes into rich ACP diffs
|
|
38
|
+
- `NativeApprovalBridge` keeps mutating writes truthfully approval-gated
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
All maintained examples live under [`examples/pydantic/`](https://github.com/vcoderun/acpkit/tree/main/examples/pydantic).
|
|
4
|
+
|
|
5
|
+
The repo intentionally keeps the maintained set small. Each example is broad enough to be useful on
|
|
6
|
+
its own instead of only demonstrating one narrow helper.
|
|
7
|
+
|
|
8
|
+
## Maintained Examples
|
|
9
|
+
|
|
10
|
+
| Example | What it demonstrates |
|
|
11
|
+
|---|---|
|
|
12
|
+
| [`finance_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/finance_agent.py) | session-aware finance workspace with ACP plans, approvals, mode-aware tool shaping, and projected note diffs |
|
|
13
|
+
| [`travel_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/travel_agent.py) | travel planning runtime with hook projection, approval-gated trip files, and prompt-model override behavior for media prompts |
|
|
14
|
+
|
|
15
|
+
## Recommended Reading Order
|
|
16
|
+
|
|
17
|
+
1. [Finance Agent](finance.md)
|
|
18
|
+
2. [Travel Agent](travel.md)
|
|
19
|
+
|
|
20
|
+
## Running The Examples
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv run python -m examples.pydantic.finance_agent
|
|
24
|
+
uv run python -m examples.pydantic.travel_agent
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Both examples run without credentials by default. Set the example-specific environment variables
|
|
28
|
+
only when you want live models.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Travel Agent
|
|
2
|
+
|
|
3
|
+
The maintained travel showcase is [`examples/pydantic/travel_agent.py`](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/travel_agent.py).
|
|
4
|
+
|
|
5
|
+
It is the main example for:
|
|
6
|
+
|
|
7
|
+
- `Hooks` capability introspection rendered through `HookProjectionMap`
|
|
8
|
+
- approval-gated read/write diff projection in a local workspace
|
|
9
|
+
- prompt-model override behavior for image and audio prompts
|
|
10
|
+
- a direct module-level `Agent(...)` plus `AdapterConfig(...)` surface without example-only factories
|
|
11
|
+
|
|
12
|
+
## Run It
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
uv run python -m examples.pydantic.travel_agent
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Without `MODEL_NAME`, the example uses `TestModel` so the demo remains credential-free. Set
|
|
19
|
+
`MODEL_NAME` and optionally `ACP_TRAVEL_MEDIA_MODEL` when you want live-model behavior.
|
|
20
|
+
|
|
21
|
+
## Key Patterns
|
|
22
|
+
|
|
23
|
+
- the module exports plain `agent`, `config`, and `main` symbols without factory wrappers
|
|
24
|
+
- `HookProjectionMap` relabels and hides selected hook lifecycle events
|
|
25
|
+
- `TravelPromptModelProvider` shows how a host can supply an explicit media-model override
|
|
26
|
+
- generated trip files keep the example self-contained instead of relying on tracked demo fixtures
|
|
27
|
+
- `FileSystemProjectionMap` turns travel file reads and writes into ACP-visible diffs
|
|
@@ -200,4 +200,4 @@ acpkit run my_agent_module:agent -p ./examples
|
|
|
200
200
|
- Want every `AdapterConfig` knob? Read [AdapterConfig](../pydantic-acp/adapter-config.md).
|
|
201
201
|
- Want host-owned session state? Read [Providers](../providers.md).
|
|
202
202
|
- Want ACP-visible capabilities? Read [Bridges](../bridges.md).
|
|
203
|
-
- Want
|
|
203
|
+
- Want maintained end-to-end examples? Read [Finance Agent](../examples/finance.md) and [Travel Agent](../examples/travel.md).
|