acpkit 0.4.0__tar.gz → 0.4.2__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.
Files changed (140) hide show
  1. {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/monorepo-ci.yml +3 -3
  2. {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/publish.yml +3 -3
  3. {acpkit-0.4.0 → acpkit-0.4.2}/.gitignore +3 -1
  4. acpkit-0.4.2/.pre-commit-config.yaml +14 -0
  5. {acpkit-0.4.0 → acpkit-0.4.2}/Makefile +6 -1
  6. acpkit-0.4.2/PKG-INFO +601 -0
  7. acpkit-0.4.2/README.md +536 -0
  8. {acpkit-0.4.0 → acpkit-0.4.2}/SKILL.md +4 -4
  9. acpkit-0.4.2/VERSION +1 -0
  10. {acpkit-0.4.0 → acpkit-0.4.2}/docs/bridges.md +47 -4
  11. {acpkit-0.4.0 → acpkit-0.4.2}/docs/cli.md +51 -3
  12. {acpkit-0.4.0 → acpkit-0.4.2}/docs/helpers.md +12 -1
  13. acpkit-0.4.2/docs/index.md +77 -0
  14. acpkit-0.4.2/docs/providers.md +281 -0
  15. acpkit-0.4.2/examples/pydantic/.gitignore +2 -0
  16. acpkit-0.4.2/examples/pydantic/README.md +63 -0
  17. acpkit-0.4.2/examples/pydantic/strong_agent.py +560 -0
  18. acpkit-0.4.2/examples/pydantic/strong_agent_v2.py +498 -0
  19. acpkit-0.4.2/packages/adapters/pydantic-acp/README.md +123 -0
  20. acpkit-0.4.2/packages/adapters/pydantic-acp/VERSION +1 -0
  21. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/pyproject.toml +1 -1
  22. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +1 -6
  23. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +1 -6
  24. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +2 -6
  25. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +41 -22
  26. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +10 -0
  27. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +7 -0
  28. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +11 -13
  29. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +1 -6
  30. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +186 -18
  31. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +5 -1
  32. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +1 -6
  33. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +7 -1
  34. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +7 -1
  35. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +30 -6
  36. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/README.md +3 -3
  37. acpkit-0.4.2/packages/helpers/codex-auth-helper/VERSION +1 -0
  38. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/pyproject.toml +1 -1
  39. {acpkit-0.4.0 → acpkit-0.4.2}/pyproject.toml +4 -2
  40. {acpkit-0.4.0 → acpkit-0.4.2}/pyrightconfig.json +1 -1
  41. {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/__init__.py +5 -1
  42. acpkit-0.4.2/src/acpkit/cli.py +87 -0
  43. {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/runtime.py +48 -0
  44. {acpkit-0.4.0 → acpkit-0.4.2}/tests/codex_auth_helper/test_factory.py +3 -1
  45. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_bridges.py +32 -0
  46. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_models.py +175 -0
  47. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_projection.py +3 -1
  48. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_slash_commands.py +16 -5
  49. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_sources.py +54 -0
  50. {acpkit-0.4.0 → acpkit-0.4.2}/tests/test_acpkit_cli.py +165 -1
  51. acpkit-0.4.0/.pre-commit-config.yaml +0 -16
  52. acpkit-0.4.0/PKG-INFO +0 -257
  53. acpkit-0.4.0/README.md +0 -197
  54. acpkit-0.4.0/VERSION +0 -1
  55. acpkit-0.4.0/docs/index.md +0 -43
  56. acpkit-0.4.0/docs/providers.md +0 -77
  57. acpkit-0.4.0/examples/pydantic/README.md +0 -52
  58. acpkit-0.4.0/examples/pydantic/my_agent.py +0 -1012
  59. acpkit-0.4.0/packages/adapters/pydantic-acp/README.md +0 -116
  60. acpkit-0.4.0/packages/adapters/pydantic-acp/VERSION +0 -1
  61. acpkit-0.4.0/packages/helpers/codex-auth-helper/VERSION +0 -1
  62. acpkit-0.4.0/src/acpkit/cli.py +0 -50
  63. {acpkit-0.4.0 → acpkit-0.4.2}/.cursorrules +0 -0
  64. {acpkit-0.4.0 → acpkit-0.4.2}/.editorconfig +0 -0
  65. {acpkit-0.4.0 → acpkit-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  66. {acpkit-0.4.0 → acpkit-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  67. {acpkit-0.4.0 → acpkit-0.4.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  68. {acpkit-0.4.0 → acpkit-0.4.2}/.github/dependabot.yml +0 -0
  69. {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/docs.yml +0 -0
  70. {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/test.yml +0 -0
  71. {acpkit-0.4.0 → acpkit-0.4.2}/.python-version +0 -0
  72. {acpkit-0.4.0 → acpkit-0.4.2}/CODE_OF_CONDUCT.md +0 -0
  73. {acpkit-0.4.0 → acpkit-0.4.2}/CONTRIBUTING.md +0 -0
  74. {acpkit-0.4.0 → acpkit-0.4.2}/LICENSE +0 -0
  75. {acpkit-0.4.0 → acpkit-0.4.2}/SECURITY.md +0 -0
  76. {acpkit-0.4.0 → acpkit-0.4.2}/context7.json +0 -0
  77. {acpkit-0.4.0 → acpkit-0.4.2}/docs/about/index.md +0 -0
  78. {acpkit-0.4.0 → acpkit-0.4.2}/docs/host-backends.md +0 -0
  79. {acpkit-0.4.0 → acpkit-0.4.2}/docs/llms.txt +0 -0
  80. {acpkit-0.4.0 → acpkit-0.4.2}/docs/testing.md +0 -0
  81. {acpkit-0.4.0 → acpkit-0.4.2}/examples/__init__.py +0 -0
  82. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/__init__.py +0 -0
  83. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/approvals.py +0 -0
  84. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/bridges.py +0 -0
  85. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/factory_agent.py +0 -0
  86. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/hook_projection.py +0 -0
  87. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/host_context.py +0 -0
  88. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/providers.py +0 -0
  89. {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/static_agent.py +0 -0
  90. {acpkit-0.4.0 → acpkit-0.4.2}/mkdocs.yml +0 -0
  91. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
  92. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
  93. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
  94. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +0 -0
  95. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +0 -0
  96. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +0 -0
  97. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
  98. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +0 -0
  99. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +0 -0
  100. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +0 -0
  101. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +0 -0
  102. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +0 -0
  103. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +0 -0
  104. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
  105. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
  106. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
  107. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
  108. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +0 -0
  109. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
  110. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -0
  111. {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
  112. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/.gitignore +0 -0
  113. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/LICENSE +0 -0
  114. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
  115. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
  116. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
  117. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
  118. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
  119. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
  120. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
  121. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
  122. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
  123. {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
  124. {acpkit-0.4.0 → acpkit-0.4.2}/scripts/demo_mcp_server.py +0 -0
  125. {acpkit-0.4.0 → acpkit-0.4.2}/scripts/mock_hook_audit.py +0 -0
  126. {acpkit-0.4.0 → acpkit-0.4.2}/scripts/mock_hook_snapshot.py +0 -0
  127. {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/__main__.py +0 -0
  128. {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/adapters.py +0 -0
  129. {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/py.typed +0 -0
  130. {acpkit-0.4.0 → acpkit-0.4.2}/tests/__init__.py +0 -0
  131. {acpkit-0.4.0 → acpkit-0.4.2}/tests/codex_auth_helper/__init__.py +0 -0
  132. {acpkit-0.4.0 → acpkit-0.4.2}/tests/codex_auth_helper/support.py +0 -0
  133. {acpkit-0.4.0 → acpkit-0.4.2}/tests/conftest.py +0 -0
  134. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/__init__.py +0 -0
  135. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/support.py +0 -0
  136. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_approvals.py +0 -0
  137. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_hook_introspection.py +0 -0
  138. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_host.py +0 -0
  139. {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_runtime.py +0 -0
  140. {acpkit-0.4.0 → acpkit-0.4.2}/tests/test_native_pydantic_agent.py +0 -0
@@ -20,15 +20,15 @@ jobs:
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
22
  - name: Check Out Repository
23
- uses: actions/checkout@v4
23
+ uses: actions/checkout@v6
24
24
 
25
25
  - name: Set Up Python
26
- uses: actions/setup-python@v5
26
+ uses: actions/setup-python@v6
27
27
  with:
28
28
  python-version: "3.11"
29
29
 
30
30
  - name: Set Up uv
31
- uses: astral-sh/setup-uv@v5
31
+ uses: astral-sh/setup-uv@v7
32
32
  with:
33
33
  enable-cache: true
34
34
 
@@ -21,15 +21,15 @@ jobs:
21
21
  UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }}
22
22
  steps:
23
23
  - name: Check Out Repository
24
- uses: actions/checkout@v4
24
+ uses: actions/checkout@v6
25
25
 
26
26
  - name: Set Up Python
27
- uses: actions/setup-python@v5
27
+ uses: actions/setup-python@v6
28
28
  with:
29
29
  python-version: "3.11"
30
30
 
31
31
  - name: Set Up uv
32
- uses: astral-sh/setup-uv@v5
32
+ uses: astral-sh/setup-uv@v7
33
33
  with:
34
34
  enable-cache: true
35
35
 
@@ -74,4 +74,6 @@ AGENTS.md
74
74
 
75
75
  # Temporary
76
76
  tmp
77
- deep.py
77
+ *.snapshot
78
+ bump.sh
79
+ local.sh
@@ -0,0 +1,14 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.5.0
4
+ hooks:
5
+ - id: check-yaml
6
+ - id: check-toml
7
+
8
+ - repo: local
9
+ hooks:
10
+ - id: make-prod
11
+ name: verify build
12
+ entry: make prod
13
+ language: system
14
+ pass_filenames: false
@@ -3,7 +3,7 @@ GREEN := \033[1;32m
3
3
  RESET := \033[0m
4
4
  PYTHON_VERSIONS := 3.11.13 3.12.10 3.13.9
5
5
 
6
- .PHONY: tests format check check-matrix all prod rename serve
6
+ .PHONY: tests format check-formatted check check-matrix all prod rename serve
7
7
 
8
8
  # Hack to allow passing arguments to make commands (e.g. make rename my_project)
9
9
  ifeq (rename,$(firstword $(MAKECMDGOALS)))
@@ -27,6 +27,11 @@ format:
27
27
  @uv run ruff format
28
28
  @printf "$(GREEN)✔ Formatting complete.$(RESET)\n"
29
29
 
30
+ check-formatted:
31
+ @printf "$(BLUE)==>$(RESET) Checking formatting with ruff format --check...\n"
32
+ @uv run ruff format --check
33
+ @printf "$(GREEN)✔ Formatting check complete.$(RESET)\n"
34
+
30
35
  check:
31
36
  @printf "$(BLUE)==>$(RESET) Running ruff checks...\n"
32
37
  @uv run --extra dev ruff check
acpkit-0.4.2/PKG-INFO ADDED
@@ -0,0 +1,601 @@
1
+ Metadata-Version: 2.4
2
+ Name: acpkit
3
+ Version: 0.4.2
4
+ Summary: ACP Kit provides a common adapter for Agent Frameworks.
5
+ Project-URL: Homepage, https://github.com/vcoderun/acpkit
6
+ Project-URL: Issues, https://github.com/vcoderun/acpkit/issues
7
+ Project-URL: Repository, https://github.com/vcoderun/acpkit
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: acp,agents,protocol,pydantic-ai
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: click>=8.1.8
19
+ Requires-Dist: typing-extensions>=4.12.0
20
+ Provides-Extra: all
21
+ Requires-Dist: agent-client-protocol>=0.9.0; extra == 'all'
22
+ Requires-Dist: basedpyright; extra == 'all'
23
+ Requires-Dist: codex-auth-helper; extra == 'all'
24
+ Requires-Dist: mkdocs-material; extra == 'all'
25
+ Requires-Dist: mkdocstrings[python]; extra == 'all'
26
+ Requires-Dist: pre-commit; extra == 'all'
27
+ Requires-Dist: pydantic-acp; extra == 'all'
28
+ Requires-Dist: pydantic-ai-slim; extra == 'all'
29
+ Requires-Dist: pydantic-graph; extra == 'all'
30
+ Requires-Dist: pydantic>=2.7; extra == 'all'
31
+ Requires-Dist: pytest; extra == 'all'
32
+ Requires-Dist: pytest-asyncio; extra == 'all'
33
+ Requires-Dist: pytest-cov; extra == 'all'
34
+ Requires-Dist: python-dotenv; extra == 'all'
35
+ Requires-Dist: ruff; extra == 'all'
36
+ Requires-Dist: ty; extra == 'all'
37
+ Requires-Dist: typing-extensions>=4.12.0; extra == 'all'
38
+ Requires-Dist: uv>=0.8.3; extra == 'all'
39
+ Provides-Extra: codex
40
+ Requires-Dist: codex-auth-helper; extra == 'codex'
41
+ Provides-Extra: dev
42
+ Requires-Dist: agent-client-protocol>=0.9.0; extra == 'dev'
43
+ Requires-Dist: basedpyright; extra == 'dev'
44
+ Requires-Dist: codex-auth-helper; extra == 'dev'
45
+ Requires-Dist: pre-commit; extra == 'dev'
46
+ Requires-Dist: pydantic-acp; extra == 'dev'
47
+ Requires-Dist: pydantic-ai-slim; extra == 'dev'
48
+ Requires-Dist: pydantic-graph; extra == 'dev'
49
+ Requires-Dist: pydantic>=2.7; extra == 'dev'
50
+ Requires-Dist: pytest; extra == 'dev'
51
+ Requires-Dist: pytest-asyncio; extra == 'dev'
52
+ Requires-Dist: pytest-cov; extra == 'dev'
53
+ Requires-Dist: python-dotenv; extra == 'dev'
54
+ Requires-Dist: ruff; extra == 'dev'
55
+ Requires-Dist: ty; extra == 'dev'
56
+ Requires-Dist: typing-extensions>=4.12.0; extra == 'dev'
57
+ Provides-Extra: docs
58
+ Requires-Dist: mkdocs-material; extra == 'docs'
59
+ Requires-Dist: mkdocstrings[python]; extra == 'docs'
60
+ Provides-Extra: launch
61
+ Requires-Dist: uv>=0.8.3; extra == 'launch'
62
+ Provides-Extra: pydantic
63
+ Requires-Dist: pydantic-acp; extra == 'pydantic'
64
+ Description-Content-Type: text/markdown
65
+
66
+ # ACP Kit
67
+
68
+ ACP Kit is a monorepo for ACP-facing agent runtime packages.
69
+
70
+ - `acpkit` is the root CLI and target resolver
71
+ - `pydantic-acp` adapts `pydantic_ai.Agent` instances to ACP
72
+ - `codex-auth-helper` turns a local Codex login into a `pydantic-ai` Responses model
73
+
74
+ The core workflow is simple:
75
+
76
+ 1. build a normal `pydantic_ai.Agent`
77
+ 2. expose it through ACP with `run_acp(...)` or `create_acp_agent(...)`
78
+ 3. optionally add session stores, approvals, providers, projection maps, and bridges
79
+
80
+ ## Installation
81
+
82
+ Production:
83
+
84
+ ```bash
85
+ uv pip install "acpkit[pydantic]"
86
+ ```
87
+
88
+ ```bash
89
+ pip install "acpkit[pydantic]"
90
+ ```
91
+
92
+ To use `acpkit launch ...`, install the optional launch extra:
93
+
94
+ ```bash
95
+ uv pip install "acpkit[launch]"
96
+ ```
97
+
98
+ ```bash
99
+ pip install "acpkit[launch]"
100
+ ```
101
+
102
+ Development:
103
+
104
+ ```bash
105
+ uv sync --extra dev --extra docs --extra pydantic
106
+ ```
107
+
108
+ ```bash
109
+ pip install -e ".[dev,docs,pydantic]"
110
+ ```
111
+
112
+ ## CLI
113
+
114
+ Run a supported agent target through ACP:
115
+
116
+ ```bash
117
+ acpkit run strong_agent
118
+ acpkit run strong_agent:agent
119
+ acpkit run strong_agent:agent -p ./examples
120
+ ```
121
+
122
+ `acpkit` resolves `module` or `module:attribute` targets, auto-detects `pydantic_ai.Agent`
123
+ instances, and dispatches them to the installed adapter package. If only the module is given, it
124
+ selects the last defined `pydantic_ai.Agent` instance in that module.
125
+
126
+ If the matching adapter extra is not installed, `acpkit` fails with an install hint such as
127
+ `uv pip install "acpkit[pydantic]"`.
128
+
129
+ Launch a target through Toad ACP:
130
+
131
+ ```bash
132
+ acpkit launch strong_agent
133
+ acpkit launch strong_agent:agent -p ./examples
134
+ ```
135
+
136
+ `acpkit launch TARGET` mirrors the resolved target to:
137
+
138
+ ```bash
139
+ toad acp "acpkit run TARGET [-p PATH]..."
140
+ ```
141
+
142
+ The command is dispatched through `uvx --python 3.14 --from batrachian-toad`, so Toad runs in a
143
+ separate Python 3.14 tool environment and does not replace your project Python.
144
+
145
+ If the script already starts its own ACP server and should be launched directly, use `--command`:
146
+
147
+ ```bash
148
+ acpkit launch -c "python3.11 strong_agent.py"
149
+ ```
150
+
151
+ `launch TARGET` and `launch --command ...` are mutually exclusive. `-p/--path` only applies to
152
+ `TARGET` mode.
153
+
154
+ ## run_acp
155
+
156
+ Use `run_acp(...)` when you want to start an ACP server directly from a Pydantic AI agent:
157
+
158
+ ```python
159
+ from pydantic_ai import Agent
160
+ from pydantic_acp import run_acp
161
+
162
+ agent = Agent("openai:gpt-5", name="weather-agent")
163
+
164
+ @agent.tool_plain
165
+ def get_weather(city: str) -> str:
166
+ return f"Weather in {city}: sunny"
167
+
168
+ run_acp(agent=agent)
169
+ ```
170
+
171
+ ## create_acp_agent
172
+
173
+ Use `create_acp_agent(...)` when you want the ACP agent object without starting the server
174
+ immediately:
175
+
176
+ ```python
177
+ import asyncio
178
+
179
+ from acp import run_agent
180
+ from pydantic_ai import Agent
181
+ from pydantic_acp import AdapterConfig, MemorySessionStore, create_acp_agent
182
+
183
+ agent = Agent("openai:gpt-5", name="composable-agent")
184
+
185
+ acp_agent = create_acp_agent(
186
+ agent=agent,
187
+ config=AdapterConfig(
188
+ agent_name="my-service",
189
+ agent_title="My Service Agent",
190
+ session_store=MemorySessionStore(),
191
+ ),
192
+ )
193
+
194
+ asyncio.run(run_agent(acp_agent))
195
+ ```
196
+
197
+ ## AdapterConfig
198
+
199
+ `AdapterConfig` is the main runtime configuration surface. Common fields include:
200
+
201
+ - agent metadata: `agent_name`, `agent_title`, `agent_version`
202
+ - persistence: `session_store`
203
+ - model selection: `allow_model_selection`, `available_models`, `models_provider`
204
+ - mode and config state: `modes_provider`, `config_options_provider`
205
+ - plans: `plan_provider`, or native plan state via `PrepareToolsMode(plan_mode=True)`
206
+ - approvals: `approval_bridge`, `approval_state_provider`
207
+ - bridges: `capability_bridges`
208
+ - projection and classification: `projection_maps`, `tool_classifier`, `enable_generic_tool_projection`
209
+
210
+ Configured adapter example:
211
+
212
+ ```python
213
+ from pathlib import Path
214
+
215
+ from pydantic_ai import Agent
216
+ from pydantic_acp import (
217
+ AdapterConfig,
218
+ AdapterModel,
219
+ FileSessionStore,
220
+ NativeApprovalBridge,
221
+ run_acp,
222
+ )
223
+
224
+ agent = Agent("openai:gpt-5", name="configured-agent")
225
+
226
+ config = AdapterConfig(
227
+ agent_name="configured-agent",
228
+ agent_title="Configured Agent",
229
+ allow_model_selection=True,
230
+ available_models=[
231
+ AdapterModel(
232
+ model_id="fast",
233
+ name="Fast",
234
+ description="Lower-latency responses",
235
+ override="openai:gpt-5-mini",
236
+ ),
237
+ AdapterModel(
238
+ model_id="smart",
239
+ name="Smart",
240
+ description="Higher-quality responses",
241
+ override="openai:gpt-5",
242
+ ),
243
+ ],
244
+ session_store=FileSessionStore(base_dir=Path(".acp-sessions")),
245
+ approval_bridge=NativeApprovalBridge(enable_persistent_choices=True),
246
+ )
247
+
248
+ run_acp(agent=agent, config=config)
249
+ ```
250
+
251
+ ## Native Plan State
252
+
253
+ When `plan_provider` is not configured, the adapter can manage ACP plan state natively. Enable it
254
+ by marking one `PrepareToolsMode` with `plan_mode=True` inside a `PrepareToolsBridge`:
255
+
256
+ ```python
257
+ from pydantic_ai import Agent
258
+ from pydantic_ai.tools import RunContext, ToolDefinition
259
+ from pydantic_acp import AdapterConfig, PrepareToolsBridge, PrepareToolsMode, run_acp
260
+
261
+
262
+ def plan_tools(
263
+ ctx: RunContext[None], tool_defs: list[ToolDefinition]
264
+ ) -> list[ToolDefinition]:
265
+ del ctx
266
+ return list(tool_defs)
267
+
268
+
269
+ def agent_tools(
270
+ ctx: RunContext[None], tool_defs: list[ToolDefinition]
271
+ ) -> list[ToolDefinition]:
272
+ del ctx
273
+ return list(tool_defs)
274
+
275
+
276
+ agent = Agent("openai:gpt-5", name="plan-agent")
277
+
278
+ run_acp(
279
+ agent=agent,
280
+ config=AdapterConfig(
281
+ capability_bridges=[
282
+ PrepareToolsBridge(
283
+ default_mode_id="agent",
284
+ modes=[
285
+ PrepareToolsMode(
286
+ id="plan",
287
+ name="Plan",
288
+ description="Inspect and write plans.",
289
+ prepare_func=plan_tools,
290
+ plan_mode=True,
291
+ ),
292
+ PrepareToolsMode(
293
+ id="agent",
294
+ name="Agent",
295
+ description="Full tool surface.",
296
+ prepare_func=agent_tools,
297
+ ),
298
+ ],
299
+ ),
300
+ ],
301
+ ),
302
+ )
303
+ ```
304
+
305
+ When the session is in `plan` mode, the adapter:
306
+
307
+ - injects `acp_get_plan` and `acp_set_plan` as hidden tools on the agent
308
+ - extends `output_type` with `NativePlanGeneration` so the agent can emit a structured plan in a
309
+ single response
310
+
311
+ `NativePlanGeneration` fields:
312
+ - `plan_entries: list[PlanEntry]` — structured plan entries
313
+ - `plan_md: str` — optional markdown representation
314
+
315
+ Native plan state and `plan_provider` are mutually exclusive. See
316
+ [docs/providers.md](https://github.com/vcoderun/acpkit/blob/main/docs/providers.md) for full
317
+ details.
318
+
319
+ ## Agent Factories
320
+
321
+ Use a factory or custom `AgentSource` when agent construction depends on the current session:
322
+
323
+ ```python
324
+ from pydantic_ai import Agent
325
+ from pydantic_acp import AcpSessionContext, create_acp_agent
326
+
327
+ def build_agent(session: AcpSessionContext) -> Agent[None, str]:
328
+ return Agent(
329
+ "openai:gpt-5",
330
+ name=f"agent-{session.cwd.name}",
331
+ system_prompt=f"Work inside {session.cwd.name}.",
332
+ )
333
+
334
+ acp_agent = create_acp_agent(agent_factory=build_agent)
335
+ ```
336
+
337
+ `StaticAgentSource` accepts an optional `deps` field to pass typed runtime dependencies alongside
338
+ a shared agent instance without a factory:
339
+
340
+ ```python
341
+ from pydantic_acp import AdapterConfig, create_acp_agent
342
+ from pydantic_acp.agent_source import StaticAgentSource
343
+ from pydantic_ai import Agent
344
+
345
+ from myapp.deps import AppDependencies
346
+
347
+ deps = AppDependencies(db=my_db, cache=my_cache)
348
+ agent = Agent("openai:gpt-5", name="deps-agent", deps_type=AppDependencies)
349
+
350
+ acp_agent = create_acp_agent(
351
+ agent_source=StaticAgentSource(agent=agent, deps=deps),
352
+ )
353
+ ```
354
+
355
+ ## Session Stores
356
+
357
+ `MemorySessionStore` is the default. Use `FileSessionStore` when sessions should survive process
358
+ restarts:
359
+
360
+ ```python
361
+ from pathlib import Path
362
+
363
+ from pydantic_ai import Agent
364
+ from pydantic_acp import AdapterConfig, FileSessionStore, run_acp
365
+
366
+ agent = Agent("openai:gpt-5", name="persistent-agent")
367
+
368
+ run_acp(
369
+ agent=agent,
370
+ config=AdapterConfig(
371
+ session_store=FileSessionStore(base_dir=Path(".acp-sessions")),
372
+ ),
373
+ )
374
+ ```
375
+
376
+ Session lifecycle support includes create, load, list, fork, resume, close, transcript replay, and
377
+ message-history replay.
378
+
379
+ ## Runtime Controls
380
+
381
+ The adapter exposes a small ACP control plane alongside normal prompts:
382
+
383
+ - `/model`
384
+ print the current session model id
385
+ - `/model provider:model`
386
+ switch the current session model
387
+ - `/tools`
388
+ list registered tools
389
+ - `/hooks`
390
+ list registered `Hooks` callbacks visible on the current agent
391
+ - `/mcp-servers`
392
+ list MCP servers extracted from the current agent toolsets and session metadata
393
+
394
+ Codex-backed model changes must be explicit:
395
+
396
+ ```text
397
+ /model codex:gpt-5.4
398
+ ```
399
+
400
+ ## Approval Flow
401
+
402
+ Pydantic AI approval-gated tools are bridged to ACP permission requests:
403
+
404
+ ```python
405
+ from pydantic_ai import Agent
406
+ from pydantic_ai.exceptions import ApprovalRequired
407
+ from pydantic_ai.tools import RunContext
408
+ from pydantic_acp import AdapterConfig, NativeApprovalBridge, run_acp
409
+
410
+ agent = Agent("openai:gpt-5", name="approval-agent")
411
+
412
+ @agent.tool
413
+ def delete_file(ctx: RunContext[None], path: str) -> str:
414
+ if not ctx.tool_call_approved:
415
+ raise ApprovalRequired()
416
+ return f"Deleted {path}"
417
+
418
+ run_acp(
419
+ agent=agent,
420
+ config=AdapterConfig(
421
+ approval_bridge=NativeApprovalBridge(enable_persistent_choices=True),
422
+ ),
423
+ )
424
+ ```
425
+
426
+ ## Projection Maps
427
+
428
+ `projection_maps` lets known tool families render as richer ACP content instead of raw text.
429
+
430
+ ### FileSystemProjectionMap
431
+
432
+ `FileSystemProjectionMap` can project:
433
+
434
+ - read tools into ACP diff previews
435
+ - write tools into ACP file diffs
436
+ - bash tools into command previews and terminal references
437
+
438
+ ```python
439
+ from pydantic_acp import FileSystemProjectionMap, run_acp
440
+
441
+ run_acp(
442
+ agent=agent,
443
+ projection_maps=(
444
+ FileSystemProjectionMap(
445
+ default_read_tool="read_file",
446
+ default_write_tool="write_file",
447
+ default_bash_tool="execute",
448
+ ),
449
+ ),
450
+ )
451
+ ```
452
+
453
+ ### HookProjectionMap
454
+
455
+ `HookProjectionMap` controls how existing `pydantic_ai.capabilities.Hooks` callbacks render into
456
+ ACP updates:
457
+
458
+ ```python
459
+ from pydantic_ai import Agent
460
+ from pydantic_ai.capabilities import Hooks
461
+ from pydantic_acp import HookProjectionMap, run_acp
462
+
463
+ hooks = Hooks[None]()
464
+
465
+ @hooks.on.before_model_request
466
+ async def log_request(ctx, request_context):
467
+ del ctx
468
+ return request_context
469
+
470
+ agent = Agent("openai:gpt-5", capabilities=[hooks])
471
+
472
+ run_acp(
473
+ agent=agent,
474
+ projection_maps=(
475
+ HookProjectionMap(
476
+ hidden_event_ids=frozenset({"after_model_request"}),
477
+ event_labels={"before_model_request": "Preparing Request"},
478
+ ),
479
+ ),
480
+ )
481
+ ```
482
+
483
+ ## Capability Bridges
484
+
485
+ Capability bridges extend ACP exposure without coupling the adapter core to one product runtime.
486
+ Built-in bridges cover:
487
+
488
+ - `HookBridge`
489
+ - `PrepareToolsBridge`
490
+ - `HistoryProcessorBridge`
491
+ - `McpBridge`
492
+ - `AgentBridgeBuilder`
493
+
494
+ See [docs/bridges.md](https://github.com/vcoderun/acpkit/blob/main/docs/bridges.md) for the full bridge model.
495
+
496
+ ## Providers
497
+
498
+ Providers let the host own session state while the adapter exposes it through ACP:
499
+
500
+ - `SessionModelsProvider`
501
+ - `SessionModesProvider`
502
+ - `ConfigOptionsProvider`
503
+ - `PlanProvider`
504
+ - `ApprovalStateProvider`
505
+
506
+ See [docs/providers.md](https://github.com/vcoderun/acpkit/blob/main/docs/providers.md) for full details.
507
+
508
+ ## Host Backends
509
+
510
+ `ClientHostContext` provides session-scoped access to ACP client-backed filesystem and terminal
511
+ operations:
512
+
513
+ ```python
514
+ from acp.interfaces import Client as AcpClient
515
+ from pydantic_ai import Agent
516
+ from pydantic_acp import AcpSessionContext, ClientHostContext
517
+
518
+ def build_agent(client: AcpClient, session: AcpSessionContext) -> Agent[None, str]:
519
+ host = ClientHostContext.from_session(client=client, session=session)
520
+ agent = Agent("openai:gpt-5")
521
+
522
+ @agent.tool
523
+ async def read_user_file(ctx, path: str) -> str:
524
+ del ctx
525
+ result = await host.filesystem.read_text_file(path)
526
+ return result.content
527
+
528
+ return agent
529
+ ```
530
+
531
+ See [docs/host-backends.md](https://github.com/vcoderun/acpkit/blob/main/docs/host-backends.md) for the filesystem
532
+ and terminal API surface.
533
+
534
+ ## Codex Auth Helper
535
+
536
+ `codex-auth-helper` reads `~/.codex/auth.json`, refreshes tokens when needed, builds a Codex-aware
537
+ `AsyncOpenAI` client, and returns a ready-to-use `OpenAIResponsesModel`.
538
+
539
+ ```python
540
+ from pydantic_ai import Agent
541
+ from codex_auth_helper import create_codex_responses_model
542
+
543
+ agent = Agent(create_codex_responses_model("gpt-5.4"))
544
+ ```
545
+
546
+ See [docs/helpers.md](https://github.com/vcoderun/acpkit/blob/main/docs/helpers.md) for helper package details.
547
+
548
+ ## Examples
549
+
550
+ Runnable and focused examples live under [examples/pydantic](https://github.com/vcoderun/acpkit/tree/main/examples/pydantic):
551
+
552
+ - [static_agent.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/static_agent.py)
553
+ smallest direct `run_acp(agent=...)` setup
554
+ - [factory_agent.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/factory_agent.py)
555
+ session-aware factory plus session-local model selection
556
+ - [providers.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/providers.py)
557
+ models, modes, config options, plan updates, and approval metadata
558
+ - [bridges.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/bridges.py)
559
+ bridge builder, prepare-tools, history processors, and MCP metadata
560
+ - [approvals.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/approvals.py)
561
+ native deferred approval flow
562
+ - [host_context.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/host_context.py)
563
+ `ClientHostContext` usage inside a factory-built agent
564
+ - [hook_projection.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/hook_projection.py)
565
+ existing `Hooks` capability introspection rendered through `HookProjectionMap`
566
+ - [strong_agent.py](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/strong_agent.py)
567
+ full-featured workspace agent example combining factories, providers, approvals, bridges, projection maps, `ask/plan/agent` modes, and host helpers
568
+
569
+ ## Development
570
+
571
+ Canonical local checks:
572
+
573
+ ```bash
574
+ uv run ruff check
575
+ uv run ty check
576
+ uv run basedpyright
577
+ make tests
578
+ make check
579
+ ```
580
+
581
+ Preview the docs locally:
582
+
583
+ ```bash
584
+ make serve
585
+ ```
586
+
587
+ ## Documentation Map
588
+
589
+ - [docs/index.md](https://github.com/vcoderun/acpkit/blob/main/docs/index.md): workspace overview and package map
590
+ - [docs/cli.md](https://github.com/vcoderun/acpkit/blob/main/docs/cli.md): root `acpkit` CLI behavior
591
+ - [docs/pydantic-acp.md](https://github.com/vcoderun/acpkit/blob/main/docs/pydantic-acp.md): adapter API, runtime controls, approvals, projection maps, providers, and host backends
592
+ - [docs/bridges.md](https://github.com/vcoderun/acpkit/blob/main/docs/bridges.md): capability bridges and hook rendering
593
+ - [docs/providers.md](https://github.com/vcoderun/acpkit/blob/main/docs/providers.md): provider seams and host-owned state
594
+ - [docs/host-backends.md](https://github.com/vcoderun/acpkit/blob/main/docs/host-backends.md): client filesystem and terminal helpers
595
+ - [docs/helpers.md](https://github.com/vcoderun/acpkit/blob/main/docs/helpers.md): helper packages including `codex-auth-helper`
596
+ - [docs/testing.md](https://github.com/vcoderun/acpkit/blob/main/docs/testing.md): behavioral test surface and validation commands
597
+ - [examples/pydantic/README.md](https://github.com/vcoderun/acpkit/blob/main/examples/pydantic/README.md): runnable demos and focused SDK examples
598
+
599
+ ## License
600
+
601
+ Apache 2.0