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.
- acpkit-0.4.1/PKG-INFO +475 -0
- acpkit-0.4.1/README.md +415 -0
- acpkit-0.4.1/VERSION +1 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/bridges.md +28 -4
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/helpers.md +11 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/index.md +23 -2
- acpkit-0.4.1/docs/providers.md +178 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/README.md +19 -17
- acpkit-0.4.1/packages/adapters/pydantic-acp/README.md +123 -0
- acpkit-0.4.1/packages/adapters/pydantic-acp/VERSION +1 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/pyproject.toml +1 -1
- acpkit-0.4.1/packages/helpers/codex-auth-helper/VERSION +1 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/pyproject.toml +1 -1
- {acpkit-0.4.0 → acpkit-0.4.1}/pyproject.toml +1 -1
- {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/__init__.py +1 -1
- acpkit-0.4.0/PKG-INFO +0 -257
- acpkit-0.4.0/README.md +0 -197
- acpkit-0.4.0/VERSION +0 -1
- acpkit-0.4.0/docs/providers.md +0 -77
- acpkit-0.4.0/packages/adapters/pydantic-acp/README.md +0 -116
- acpkit-0.4.0/packages/adapters/pydantic-acp/VERSION +0 -1
- acpkit-0.4.0/packages/helpers/codex-auth-helper/VERSION +0 -1
- {acpkit-0.4.0 → acpkit-0.4.1}/.cursorrules +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.editorconfig +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/dependabot.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/docs.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/monorepo-ci.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/publish.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.github/workflows/test.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.gitignore +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.pre-commit-config.yaml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/.python-version +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/CODE_OF_CONDUCT.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/CONTRIBUTING.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/LICENSE +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/Makefile +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/SECURITY.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/SKILL.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/context7.json +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/about/index.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/cli.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/host-backends.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/llms.txt +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/docs/testing.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/approvals.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/bridges.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/factory_agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/hook_projection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/host_context.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/my_agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/providers.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/examples/pydantic/static_agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/mkdocs.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/.gitignore +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/LICENSE +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/README.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/pyrightconfig.json +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/scripts/demo_mcp_server.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/scripts/mock_hook_audit.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/scripts/mock_hook_snapshot.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/__main__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/adapters.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/cli.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/py.typed +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/src/acpkit/runtime.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/codex_auth_helper/support.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/codex_auth_helper/test_factory.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/conftest.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/support.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_approvals.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_bridges.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_hook_introspection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_host.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_models.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_projection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_runtime.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_slash_commands.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/pydantic/test_sources.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.1}/tests/test_acpkit_cli.py +0 -0
- {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
|