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.
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/monorepo-ci.yml +3 -3
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/publish.yml +3 -3
- {acpkit-0.4.0 → acpkit-0.4.2}/.gitignore +3 -1
- acpkit-0.4.2/.pre-commit-config.yaml +14 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/Makefile +6 -1
- acpkit-0.4.2/PKG-INFO +601 -0
- acpkit-0.4.2/README.md +536 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/SKILL.md +4 -4
- acpkit-0.4.2/VERSION +1 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/bridges.md +47 -4
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/cli.md +51 -3
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/helpers.md +12 -1
- acpkit-0.4.2/docs/index.md +77 -0
- acpkit-0.4.2/docs/providers.md +281 -0
- acpkit-0.4.2/examples/pydantic/.gitignore +2 -0
- acpkit-0.4.2/examples/pydantic/README.md +63 -0
- acpkit-0.4.2/examples/pydantic/strong_agent.py +560 -0
- acpkit-0.4.2/examples/pydantic/strong_agent_v2.py +498 -0
- acpkit-0.4.2/packages/adapters/pydantic-acp/README.md +123 -0
- acpkit-0.4.2/packages/adapters/pydantic-acp/VERSION +1 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/pyproject.toml +1 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/__init__.py +1 -6
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/approvals.py +1 -6
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/history_processor.py +2 -6
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/hooks.py +41 -22
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/prepare_tools.py +10 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/context.py +7 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/projection.py +11 -13
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/providers.py +1 -6
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/adapter.py +186 -18
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/hook_introspection.py +5 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/server.py +1 -6
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/slash_commands.py +7 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/session/state.py +7 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/session/store.py +30 -6
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/README.md +3 -3
- acpkit-0.4.2/packages/helpers/codex-auth-helper/VERSION +1 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/pyproject.toml +1 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/pyproject.toml +4 -2
- {acpkit-0.4.0 → acpkit-0.4.2}/pyrightconfig.json +1 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/__init__.py +5 -1
- acpkit-0.4.2/src/acpkit/cli.py +87 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/runtime.py +48 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/codex_auth_helper/test_factory.py +3 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_bridges.py +32 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_models.py +175 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_projection.py +3 -1
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_slash_commands.py +16 -5
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_sources.py +54 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/test_acpkit_cli.py +165 -1
- acpkit-0.4.0/.pre-commit-config.yaml +0 -16
- 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/index.md +0 -43
- acpkit-0.4.0/docs/providers.md +0 -77
- acpkit-0.4.0/examples/pydantic/README.md +0 -52
- acpkit-0.4.0/examples/pydantic/my_agent.py +0 -1012
- 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/src/acpkit/cli.py +0 -50
- {acpkit-0.4.0 → acpkit-0.4.2}/.cursorrules +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.editorconfig +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/dependabot.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/docs.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.github/workflows/test.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/.python-version +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/CODE_OF_CONDUCT.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/CONTRIBUTING.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/LICENSE +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/SECURITY.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/context7.json +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/about/index.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/host-backends.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/llms.txt +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/docs/testing.md +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/approvals.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/bridges.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/factory_agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/hook_projection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/host_context.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/providers.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/examples/pydantic/static_agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/mkdocs.yml +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_source.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/agent_types.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/awaitables.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/base.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/bridges/mcp.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/builders/agent.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/config.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/hook_projection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/filesystem.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/host/terminal.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/models.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/py.typed +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/bridge_manager.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/prompts.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/runtime/session_surface.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/serialization.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/adapters/pydantic-acp/src/pydantic_acp/session/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/.gitignore +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/LICENSE +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/config.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/manager.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/state.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/auth/store.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/client.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/factory.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/model.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/packages/helpers/codex-auth-helper/src/codex_auth_helper/py.typed +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/scripts/demo_mcp_server.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/scripts/mock_hook_audit.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/scripts/mock_hook_snapshot.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/__main__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/adapters.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/src/acpkit/py.typed +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/codex_auth_helper/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/codex_auth_helper/support.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/conftest.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/__init__.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/support.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_approvals.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_hook_introspection.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_host.py +0 -0
- {acpkit-0.4.0 → acpkit-0.4.2}/tests/pydantic/test_runtime.py +0 -0
- {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@
|
|
23
|
+
uses: actions/checkout@v6
|
|
24
24
|
|
|
25
25
|
- name: Set Up Python
|
|
26
|
-
uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
24
|
+
uses: actions/checkout@v6
|
|
25
25
|
|
|
26
26
|
- name: Set Up Python
|
|
27
|
-
uses: actions/setup-python@
|
|
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@
|
|
32
|
+
uses: astral-sh/setup-uv@v7
|
|
33
33
|
with:
|
|
34
34
|
enable-cache: true
|
|
35
35
|
|
|
@@ -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
|