acpkit 0.4.0__tar.gz → 0.4.1__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 (133) hide show
  1. acpkit-0.4.1/PKG-INFO +475 -0
  2. acpkit-0.4.1/README.md +415 -0
  3. acpkit-0.4.1/VERSION +1 -0
  4. {acpkit-0.4.0 → acpkit-0.4.1}/docs/bridges.md +28 -4
  5. {acpkit-0.4.0 → acpkit-0.4.1}/docs/helpers.md +11 -0
  6. {acpkit-0.4.0 → acpkit-0.4.1}/docs/index.md +23 -2
  7. acpkit-0.4.1/docs/providers.md +178 -0
  8. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/README.md +19 -17
  9. acpkit-0.4.1/packages/adapters/pydantic-acp/README.md +123 -0
  10. acpkit-0.4.1/packages/adapters/pydantic-acp/VERSION +1 -0
  11. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/pyproject.toml +1 -1
  12. acpkit-0.4.1/packages/helpers/codex-auth-helper/VERSION +1 -0
  13. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/pyproject.toml +1 -1
  14. {acpkit-0.4.0 → acpkit-0.4.1}/pyproject.toml +1 -1
  15. {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/__init__.py +1 -1
  16. acpkit-0.4.0/PKG-INFO +0 -257
  17. acpkit-0.4.0/README.md +0 -197
  18. acpkit-0.4.0/VERSION +0 -1
  19. acpkit-0.4.0/docs/providers.md +0 -77
  20. acpkit-0.4.0/packages/adapters/pydantic-acp/README.md +0 -116
  21. acpkit-0.4.0/packages/adapters/pydantic-acp/VERSION +0 -1
  22. acpkit-0.4.0/packages/helpers/codex-auth-helper/VERSION +0 -1
  23. {acpkit-0.4.0 → acpkit-0.4.1}/.cursorrules +0 -0
  24. {acpkit-0.4.0 → acpkit-0.4.1}/.editorconfig +0 -0
  25. {acpkit-0.4.0 → acpkit-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {acpkit-0.4.0 → acpkit-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  27. {acpkit-0.4.0 → acpkit-0.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  28. {acpkit-0.4.0 → acpkit-0.4.1}/.github/dependabot.yml +0 -0
  29. {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/docs.yml +0 -0
  30. {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/monorepo-ci.yml +0 -0
  31. {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/publish.yml +0 -0
  32. {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/test.yml +0 -0
  33. {acpkit-0.4.0 → acpkit-0.4.1}/.gitignore +0 -0
  34. {acpkit-0.4.0 → acpkit-0.4.1}/.pre-commit-config.yaml +0 -0
  35. {acpkit-0.4.0 → acpkit-0.4.1}/.python-version +0 -0
  36. {acpkit-0.4.0 → acpkit-0.4.1}/CODE_OF_CONDUCT.md +0 -0
  37. {acpkit-0.4.0 → acpkit-0.4.1}/CONTRIBUTING.md +0 -0
  38. {acpkit-0.4.0 → acpkit-0.4.1}/LICENSE +0 -0
  39. {acpkit-0.4.0 → acpkit-0.4.1}/Makefile +0 -0
  40. {acpkit-0.4.0 → acpkit-0.4.1}/SECURITY.md +0 -0
  41. {acpkit-0.4.0 → acpkit-0.4.1}/SKILL.md +0 -0
  42. {acpkit-0.4.0 → acpkit-0.4.1}/context7.json +0 -0
  43. {acpkit-0.4.0 → acpkit-0.4.1}/docs/about/index.md +0 -0
  44. {acpkit-0.4.0 → acpkit-0.4.1}/docs/cli.md +0 -0
  45. {acpkit-0.4.0 → acpkit-0.4.1}/docs/host-backends.md +0 -0
  46. {acpkit-0.4.0 → acpkit-0.4.1}/docs/llms.txt +0 -0
  47. {acpkit-0.4.0 → acpkit-0.4.1}/docs/testing.md +0 -0
  48. {acpkit-0.4.0 → acpkit-0.4.1}/examples/__init__.py +0 -0
  49. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/__init__.py +0 -0
  50. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/approvals.py +0 -0
  51. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/bridges.py +0 -0
  52. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/factory_agent.py +0 -0
  53. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/hook_projection.py +0 -0
  54. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/host_context.py +0 -0
  55. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/my_agent.py +0 -0
  56. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/providers.py +0 -0
  57. {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/static_agent.py +0 -0
  58. {acpkit-0.4.0 → acpkit-0.4.1}/mkdocs.yml +0 -0
  59. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +0 -0
  60. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
  61. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
  62. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +0 -0
  63. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
  64. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +0 -0
  65. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +0 -0
  66. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +0 -0
  67. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +0 -0
  68. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +0 -0
  69. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +0 -0
  70. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
  71. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +0 -0
  72. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +0 -0
  73. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +0 -0
  74. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +0 -0
  75. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +0 -0
  76. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +0 -0
  77. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +0 -0
  78. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
  79. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +0 -0
  80. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +0 -0
  81. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
  82. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
  83. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +0 -0
  84. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
  85. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +0 -0
  86. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +0 -0
  87. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +0 -0
  88. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
  89. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +0 -0
  90. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -0
  91. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
  92. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +0 -0
  93. {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +0 -0
  94. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/.gitignore +0 -0
  95. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/LICENSE +0 -0
  96. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/README.md +0 -0
  97. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
  98. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
  99. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
  100. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
  101. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
  102. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
  103. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
  104. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
  105. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
  106. {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
  107. {acpkit-0.4.0 → acpkit-0.4.1}/pyrightconfig.json +0 -0
  108. {acpkit-0.4.0 → acpkit-0.4.1}/scripts/demo_mcp_server.py +0 -0
  109. {acpkit-0.4.0 → acpkit-0.4.1}/scripts/mock_hook_audit.py +0 -0
  110. {acpkit-0.4.0 → acpkit-0.4.1}/scripts/mock_hook_snapshot.py +0 -0
  111. {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/__main__.py +0 -0
  112. {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/adapters.py +0 -0
  113. {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/cli.py +0 -0
  114. {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/py.typed +0 -0
  115. {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/runtime.py +0 -0
  116. {acpkit-0.4.0 → acpkit-0.4.1}/tests/__init__.py +0 -0
  117. {acpkit-0.4.0 → acpkit-0.4.1}/tests/codex_auth_helper/__init__.py +0 -0
  118. {acpkit-0.4.0 → acpkit-0.4.1}/tests/codex_auth_helper/support.py +0 -0
  119. {acpkit-0.4.0 → acpkit-0.4.1}/tests/codex_auth_helper/test_factory.py +0 -0
  120. {acpkit-0.4.0 → acpkit-0.4.1}/tests/conftest.py +0 -0
  121. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/__init__.py +0 -0
  122. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/support.py +0 -0
  123. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_approvals.py +0 -0
  124. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_bridges.py +0 -0
  125. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_hook_introspection.py +0 -0
  126. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_host.py +0 -0
  127. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_models.py +0 -0
  128. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_projection.py +0 -0
  129. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_runtime.py +0 -0
  130. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_slash_commands.py +0 -0
  131. {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_sources.py +0 -0
  132. {acpkit-0.4.0 → acpkit-0.4.1}/tests/test_acpkit_cli.py +0 -0
  133. {acpkit-0.4.0 → acpkit-0.4.1}/tests/test_native_pydantic_agent.py +0 -0
acpkit-0.4.1/PKG-INFO ADDED
@@ -0,0 +1,475 @@
1
+ Metadata-Version: 2.4
2
+ Name: acpkit
3
+ Version: 0.4.1
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: ruff; extra == 'all'
35
+ Requires-Dist: ty; extra == 'all'
36
+ Requires-Dist: typing-extensions>=4.12.0; extra == 'all'
37
+ Provides-Extra: codex
38
+ Requires-Dist: codex-auth-helper; extra == 'codex'
39
+ Provides-Extra: dev
40
+ Requires-Dist: agent-client-protocol>=0.9.0; extra == 'dev'
41
+ Requires-Dist: basedpyright; extra == 'dev'
42
+ Requires-Dist: codex-auth-helper; extra == 'dev'
43
+ Requires-Dist: pre-commit; extra == 'dev'
44
+ Requires-Dist: pydantic-acp; extra == 'dev'
45
+ Requires-Dist: pydantic-ai-slim; extra == 'dev'
46
+ Requires-Dist: pydantic-graph; extra == 'dev'
47
+ Requires-Dist: pydantic>=2.7; extra == 'dev'
48
+ Requires-Dist: pytest; extra == 'dev'
49
+ Requires-Dist: pytest-asyncio; extra == 'dev'
50
+ Requires-Dist: pytest-cov; extra == 'dev'
51
+ Requires-Dist: ruff; extra == 'dev'
52
+ Requires-Dist: ty; extra == 'dev'
53
+ Requires-Dist: typing-extensions>=4.12.0; extra == 'dev'
54
+ Provides-Extra: docs
55
+ Requires-Dist: mkdocs-material; extra == 'docs'
56
+ Requires-Dist: mkdocstrings[python]; extra == 'docs'
57
+ Provides-Extra: pydantic
58
+ Requires-Dist: pydantic-acp; extra == 'pydantic'
59
+ Description-Content-Type: text/markdown
60
+
61
+ # ACP Kit
62
+
63
+ ACP Kit is a monorepo for ACP-facing agent runtime packages.
64
+
65
+ - `acpkit` is the root CLI and target resolver
66
+ - `pydantic-acp` adapts `pydantic_ai.Agent` instances to ACP
67
+ - `codex-auth-helper` turns a local Codex login into a `pydantic-ai` Responses model
68
+
69
+ The core workflow is simple:
70
+
71
+ 1. build a normal `pydantic_ai.Agent`
72
+ 2. expose it through ACP with `run_acp(...)` or `create_acp_agent(...)`
73
+ 3. optionally add session stores, approvals, providers, projection maps, and bridges
74
+
75
+ ## Installation
76
+
77
+ Production:
78
+
79
+ ```bash
80
+ uv pip install "acpkit[pydantic]"
81
+ ```
82
+
83
+ ```bash
84
+ pip install "acpkit[pydantic]"
85
+ ```
86
+
87
+ Development:
88
+
89
+ ```bash
90
+ uv sync --extra dev --extra docs --extra pydantic
91
+ ```
92
+
93
+ ```bash
94
+ pip install -e ".[dev,docs,pydantic]"
95
+ ```
96
+
97
+ ## CLI
98
+
99
+ Run a supported agent target through ACP:
100
+
101
+ ```bash
102
+ acpkit run my_agent
103
+ acpkit run my_agent:agent
104
+ acpkit run my_agent:agent -p ./examples
105
+ ```
106
+
107
+ `acpkit` resolves `module` or `module:attribute` targets, auto-detects `pydantic_ai.Agent`
108
+ instances, and dispatches them to the installed adapter package. If only the module is given, it
109
+ selects the last defined `pydantic_ai.Agent` instance in that module.
110
+
111
+ If the matching adapter extra is not installed, `acpkit` fails with an install hint such as
112
+ `uv pip install "acpkit[pydantic]"`.
113
+
114
+ ## run_acp
115
+
116
+ Use `run_acp(...)` when you want to start an ACP server directly from a Pydantic AI agent:
117
+
118
+ ```python
119
+ from pydantic_ai import Agent
120
+ from pydantic_acp import run_acp
121
+
122
+ agent = Agent("openai:gpt-5", name="weather-agent")
123
+
124
+ @agent.tool_plain
125
+ def get_weather(city: str) -> str:
126
+ return f"Weather in {city}: sunny"
127
+
128
+ run_acp(agent=agent)
129
+ ```
130
+
131
+ ## create_acp_agent
132
+
133
+ Use `create_acp_agent(...)` when you want the ACP agent object without starting the server
134
+ immediately:
135
+
136
+ ```python
137
+ import asyncio
138
+
139
+ from acp import run_agent
140
+ from pydantic_ai import Agent
141
+ from pydantic_acp import AdapterConfig, MemorySessionStore, create_acp_agent
142
+
143
+ agent = Agent("openai:gpt-5", name="composable-agent")
144
+
145
+ acp_agent = create_acp_agent(
146
+ agent=agent,
147
+ config=AdapterConfig(
148
+ agent_name="my-service",
149
+ agent_title="My Service Agent",
150
+ session_store=MemorySessionStore(),
151
+ ),
152
+ )
153
+
154
+ asyncio.run(run_agent(acp_agent))
155
+ ```
156
+
157
+ ## AdapterConfig
158
+
159
+ `AdapterConfig` is the main runtime configuration surface. Common fields include:
160
+
161
+ - agent metadata: `agent_name`, `agent_title`, `agent_version`
162
+ - persistence: `session_store`
163
+ - model selection: `allow_model_selection`, `available_models`, `models_provider`
164
+ - mode and config state: `modes_provider`, `config_options_provider`
165
+ - plans: `plan_provider`
166
+ - approvals: `approval_bridge`, `approval_state_provider`
167
+ - bridges: `capability_bridges`
168
+ - projection and classification: `projection_maps`, `tool_classifier`, `enable_generic_tool_projection`
169
+
170
+ Configured adapter example:
171
+
172
+ ```python
173
+ from pathlib import Path
174
+
175
+ from pydantic_ai import Agent
176
+ from pydantic_acp import (
177
+ AdapterConfig,
178
+ AdapterModel,
179
+ FileSessionStore,
180
+ NativeApprovalBridge,
181
+ run_acp,
182
+ )
183
+
184
+ agent = Agent("openai:gpt-5", name="configured-agent")
185
+
186
+ config = AdapterConfig(
187
+ agent_name="configured-agent",
188
+ agent_title="Configured Agent",
189
+ allow_model_selection=True,
190
+ available_models=[
191
+ AdapterModel(
192
+ model_id="fast",
193
+ name="Fast",
194
+ description="Lower-latency responses",
195
+ override="openai:gpt-5-mini",
196
+ ),
197
+ AdapterModel(
198
+ model_id="smart",
199
+ name="Smart",
200
+ description="Higher-quality responses",
201
+ override="openai:gpt-5",
202
+ ),
203
+ ],
204
+ session_store=FileSessionStore(base_dir=Path(".acp-sessions")),
205
+ approval_bridge=NativeApprovalBridge(enable_persistent_choices=True),
206
+ )
207
+
208
+ run_acp(agent=agent, config=config)
209
+ ```
210
+
211
+ ## Agent Factories
212
+
213
+ Use a factory or custom `AgentSource` when agent construction depends on the current session:
214
+
215
+ ```python
216
+ from pydantic_ai import Agent
217
+ from pydantic_acp import AcpSessionContext, create_acp_agent
218
+
219
+ def build_agent(session: AcpSessionContext) -> Agent[None, str]:
220
+ return Agent(
221
+ "openai:gpt-5",
222
+ name=f"agent-{session.cwd.name}",
223
+ system_prompt=f"Work inside {session.cwd.name}.",
224
+ )
225
+
226
+ acp_agent = create_acp_agent(agent_factory=build_agent)
227
+ ```
228
+
229
+ ## Session Stores
230
+
231
+ `MemorySessionStore` is the default. Use `FileSessionStore` when sessions should survive process
232
+ restarts:
233
+
234
+ ```python
235
+ from pathlib import Path
236
+
237
+ from pydantic_ai import Agent
238
+ from pydantic_acp import AdapterConfig, FileSessionStore, run_acp
239
+
240
+ agent = Agent("openai:gpt-5", name="persistent-agent")
241
+
242
+ run_acp(
243
+ agent=agent,
244
+ config=AdapterConfig(
245
+ session_store=FileSessionStore(base_dir=Path(".acp-sessions")),
246
+ ),
247
+ )
248
+ ```
249
+
250
+ Session lifecycle support includes create, load, list, fork, resume, close, transcript replay, and
251
+ message-history replay.
252
+
253
+ ## Runtime Controls
254
+
255
+ The adapter exposes a small ACP control plane alongside normal prompts:
256
+
257
+ - `/model`
258
+ print the current session model id
259
+ - `/model provider:model`
260
+ switch the current session model
261
+ - `/tools`
262
+ list registered tools
263
+ - `/hooks`
264
+ list registered `Hooks` callbacks visible on the current agent
265
+ - `/mcp-servers`
266
+ list MCP servers extracted from the current agent toolsets and session metadata
267
+
268
+ Codex-backed model changes must be explicit:
269
+
270
+ ```text
271
+ /model codex:gpt-5
272
+ ```
273
+
274
+ ## Approval Flow
275
+
276
+ Pydantic AI approval-gated tools are bridged to ACP permission requests:
277
+
278
+ ```python
279
+ from pydantic_ai import Agent
280
+ from pydantic_ai.exceptions import ApprovalRequired
281
+ from pydantic_ai.tools import RunContext
282
+ from pydantic_acp import AdapterConfig, NativeApprovalBridge, run_acp
283
+
284
+ agent = Agent("openai:gpt-5", name="approval-agent")
285
+
286
+ @agent.tool
287
+ def delete_file(ctx: RunContext[None], path: str) -> str:
288
+ if not ctx.tool_call_approved:
289
+ raise ApprovalRequired()
290
+ return f"Deleted {path}"
291
+
292
+ run_acp(
293
+ agent=agent,
294
+ config=AdapterConfig(
295
+ approval_bridge=NativeApprovalBridge(enable_persistent_choices=True),
296
+ ),
297
+ )
298
+ ```
299
+
300
+ ## Projection Maps
301
+
302
+ `projection_maps` lets known tool families render as richer ACP content instead of raw text.
303
+
304
+ ### FileSystemProjectionMap
305
+
306
+ `FileSystemProjectionMap` can project:
307
+
308
+ - read tools into ACP diff previews
309
+ - write tools into ACP file diffs
310
+ - bash tools into command previews and terminal references
311
+
312
+ ```python
313
+ from pydantic_acp import FileSystemProjectionMap, run_acp
314
+
315
+ run_acp(
316
+ agent=agent,
317
+ projection_maps=(
318
+ FileSystemProjectionMap(
319
+ default_read_tool="read_file",
320
+ default_write_tool="write_file",
321
+ default_bash_tool="execute",
322
+ ),
323
+ ),
324
+ )
325
+ ```
326
+
327
+ ### HookProjectionMap
328
+
329
+ `HookProjectionMap` controls how existing `pydantic_ai.capabilities.Hooks` callbacks render into
330
+ ACP updates:
331
+
332
+ ```python
333
+ from pydantic_ai import Agent
334
+ from pydantic_ai.capabilities import Hooks
335
+ from pydantic_acp import HookProjectionMap, run_acp
336
+
337
+ hooks = Hooks[None]()
338
+
339
+ @hooks.on.before_model_request
340
+ async def log_request(ctx, request_context):
341
+ del ctx
342
+ return request_context
343
+
344
+ agent = Agent("openai:gpt-5", capabilities=[hooks])
345
+
346
+ run_acp(
347
+ agent=agent,
348
+ projection_maps=(
349
+ HookProjectionMap(
350
+ hidden_event_ids=frozenset({"after_model_request"}),
351
+ event_labels={"before_model_request": "Preparing Request"},
352
+ ),
353
+ ),
354
+ )
355
+ ```
356
+
357
+ ## Capability Bridges
358
+
359
+ Capability bridges extend ACP exposure without coupling the adapter core to one product runtime.
360
+ Built-in bridges cover:
361
+
362
+ - `HookBridge`
363
+ - `PrepareToolsBridge`
364
+ - `HistoryProcessorBridge`
365
+ - `McpBridge`
366
+ - `AgentBridgeBuilder`
367
+
368
+ See [docs/bridges.md](/Users/mert/Desktop/acpkit/docs/bridges.md) for the full bridge model.
369
+
370
+ ## Providers
371
+
372
+ Providers let the host own session state while the adapter exposes it through ACP:
373
+
374
+ - `SessionModelsProvider`
375
+ - `SessionModesProvider`
376
+ - `ConfigOptionsProvider`
377
+ - `PlanProvider`
378
+ - `ApprovalStateProvider`
379
+
380
+ See [docs/providers.md](/Users/mert/Desktop/acpkit/docs/providers.md) for full details.
381
+
382
+ ## Host Backends
383
+
384
+ `ClientHostContext` provides session-scoped access to ACP client-backed filesystem and terminal
385
+ operations:
386
+
387
+ ```python
388
+ from acp.interfaces import Client as AcpClient
389
+ from pydantic_ai import Agent
390
+ from pydantic_acp import AcpSessionContext, ClientHostContext
391
+
392
+ def build_agent(client: AcpClient, session: AcpSessionContext) -> Agent[None, str]:
393
+ host = ClientHostContext.from_session(client=client, session=session)
394
+ agent = Agent("openai:gpt-5")
395
+
396
+ @agent.tool
397
+ async def read_user_file(ctx, path: str) -> str:
398
+ del ctx
399
+ result = await host.filesystem.read_text_file(path)
400
+ return result.content
401
+
402
+ return agent
403
+ ```
404
+
405
+ See [docs/host-backends.md](/Users/mert/Desktop/acpkit/docs/host-backends.md) for the filesystem
406
+ and terminal API surface.
407
+
408
+ ## Codex Auth Helper
409
+
410
+ `codex-auth-helper` reads `~/.codex/auth.json`, refreshes tokens when needed, builds a Codex-aware
411
+ `AsyncOpenAI` client, and returns a ready-to-use `OpenAIResponsesModel`.
412
+
413
+ ```python
414
+ from pydantic_ai import Agent
415
+ from codex_auth_helper import create_codex_responses_model
416
+
417
+ agent = Agent(create_codex_responses_model("gpt-5"))
418
+ ```
419
+
420
+ See [docs/helpers.md](/Users/mert/Desktop/acpkit/docs/helpers.md) for helper package details.
421
+
422
+ ## Examples
423
+
424
+ Runnable and focused examples live under [examples/pydantic](/Users/mert/Desktop/acpkit/examples/pydantic):
425
+
426
+ - [static_agent.py](/Users/mert/Desktop/acpkit/examples/pydantic/static_agent.py)
427
+ smallest direct `run_acp(agent=...)` setup
428
+ - [factory_agent.py](/Users/mert/Desktop/acpkit/examples/pydantic/factory_agent.py)
429
+ session-aware factory plus session-local model selection
430
+ - [providers.py](/Users/mert/Desktop/acpkit/examples/pydantic/providers.py)
431
+ models, modes, config options, plan updates, and approval metadata
432
+ - [bridges.py](/Users/mert/Desktop/acpkit/examples/pydantic/bridges.py)
433
+ bridge builder, prepare-tools, history processors, and MCP metadata
434
+ - [approvals.py](/Users/mert/Desktop/acpkit/examples/pydantic/approvals.py)
435
+ native deferred approval flow
436
+ - [host_context.py](/Users/mert/Desktop/acpkit/examples/pydantic/host_context.py)
437
+ `ClientHostContext` usage inside a factory-built agent
438
+ - [hook_projection.py](/Users/mert/Desktop/acpkit/examples/pydantic/hook_projection.py)
439
+ existing `Hooks` capability introspection rendered through `HookProjectionMap`
440
+ - [my_agent.py](/Users/mert/Desktop/acpkit/examples/pydantic/my_agent.py)
441
+ broad end-to-end demo combining factories, providers, approvals, bridges, projection maps, and host helpers
442
+
443
+ ## Development
444
+
445
+ Canonical local checks:
446
+
447
+ ```bash
448
+ uv run ruff check
449
+ uv run ty check
450
+ uv run basedpyright
451
+ make tests
452
+ make check
453
+ ```
454
+
455
+ Preview the docs locally:
456
+
457
+ ```bash
458
+ make serve
459
+ ```
460
+
461
+ ## Documentation Map
462
+
463
+ - [docs/index.md](/Users/mert/Desktop/acpkit/docs/index.md): workspace overview and package map
464
+ - [docs/cli.md](/Users/mert/Desktop/acpkit/docs/cli.md): root `acpkit` CLI behavior
465
+ - [docs/pydantic-acp.md](/Users/mert/Desktop/acpkit/docs/pydantic-acp.md): adapter API, runtime controls, approvals, projection maps, providers, and host backends
466
+ - [docs/bridges.md](/Users/mert/Desktop/acpkit/docs/bridges.md): capability bridges and hook rendering
467
+ - [docs/providers.md](/Users/mert/Desktop/acpkit/docs/providers.md): provider seams and host-owned state
468
+ - [docs/host-backends.md](/Users/mert/Desktop/acpkit/docs/host-backends.md): client filesystem and terminal helpers
469
+ - [docs/helpers.md](/Users/mert/Desktop/acpkit/docs/helpers.md): helper packages including `codex-auth-helper`
470
+ - [docs/testing.md](/Users/mert/Desktop/acpkit/docs/testing.md): behavioral test surface and validation commands
471
+ - [examples/pydantic/README.md](/Users/mert/Desktop/acpkit/examples/pydantic/README.md): runnable demos and focused SDK examples
472
+
473
+ ## License
474
+
475
+ Apache 2.0