kneo-client 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kneo_client-0.1.0/LICENSE +21 -0
- kneo_client-0.1.0/PKG-INFO +66 -0
- kneo_client-0.1.0/README.md +41 -0
- kneo_client-0.1.0/README.pypi.md +20 -0
- kneo_client-0.1.0/kneo_client/__init__.py +71 -0
- kneo_client-0.1.0/kneo_client/_generated/__init__.py +8 -0
- kneo_client-0.1.0/kneo_client/_generated/api/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/audit_events/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/audit_events/list_audit_events_v1_audit_events_get.py +206 -0
- kneo_client-0.1.0/kneo_client/_generated/api/health/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/health/healthz_v1_healthz_get.py +128 -0
- kneo_client-0.1.0/kneo_client/_generated/api/health/livez_v1_livez_get.py +128 -0
- kneo_client-0.1.0/kneo_client/_generated/api/health/readyz_v1_readyz_get.py +128 -0
- kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/get_human_task_v1_human_tasks_continuation_id_get.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/list_human_tasks_v1_human_tasks_get.py +267 -0
- kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/resume_human_task_v1_human_tasks_continuation_id_resume_post.py +197 -0
- kneo_client-0.1.0/kneo_client/_generated/api/policies/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/policies/get_environment_policy_v1_policies_environment_environment_get.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/policies/list_environment_policies_v1_policies_environment_get.py +128 -0
- kneo_client-0.1.0/kneo_client/_generated/api/policies/put_environment_policy_v1_policies_environment_environment_put.py +182 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/cancel_run_v1_runs_run_id_cancel_post.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/continue_run_v1_runs_run_id_continue_post.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/create_run_v1_runs_post.py +181 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/diff_checkpoints_v1_runs_run_id_checkpoints_diff_get.py +207 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/get_recovery_context_v1_runs_run_id_recovery_get.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/get_replay_view_v1_runs_run_id_replay_get.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/get_run_policy_report_v1_runs_run_id_policy_report_get.py +185 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/get_run_v1_runs_run_id_get.py +161 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/get_trace_v1_runs_run_id_trace_get.py +263 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/list_checkpoints_v1_runs_run_id_checkpoints_get.py +263 -0
- kneo_client-0.1.0/kneo_client/_generated/api/runs/list_runs_v1_runs_get.py +240 -0
- kneo_client-0.1.0/kneo_client/_generated/api/security/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/security/credential_inventory_v1_security_credentials_get.py +212 -0
- kneo_client-0.1.0/kneo_client/_generated/api/specs/__init__.py +1 -0
- kneo_client-0.1.0/kneo_client/_generated/api/specs/compile_spec_v1_specs_compile_post.py +166 -0
- kneo_client-0.1.0/kneo_client/_generated/api/specs/explain_spec_v1_specs_explain_post.py +166 -0
- kneo_client-0.1.0/kneo_client/_generated/api/specs/policy_report_spec_v1_specs_policy_report_post.py +166 -0
- kneo_client-0.1.0/kneo_client/_generated/api/specs/run_spec_v1_specs_run_post.py +181 -0
- kneo_client-0.1.0/kneo_client/_generated/api/specs/validate_spec_v1_specs_validate_post.py +170 -0
- kneo_client-0.1.0/kneo_client/_generated/client.py +282 -0
- kneo_client-0.1.0/kneo_client/_generated/errors.py +16 -0
- kneo_client-0.1.0/kneo_client/_generated/models/__init__.py +195 -0
- kneo_client-0.1.0/kneo_client/_generated/models/audit_event_list_response.py +69 -0
- kneo_client-0.1.0/kneo_client/_generated/models/audit_event_list_response_events_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response.py +183 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_added_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_changed_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_from_checkpoint.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_removed_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_to_checkpoint.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_list_response.py +148 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_list_response_checkpoints_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_list_response_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/credential_inventory_response.py +53 -0
- kneo_client-0.1.0/kneo_client/_generated/models/credential_inventory_response_inventory.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_list_response.py +61 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_list_response_policies.py +76 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_list_response_policies_additional_property.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_request.py +101 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_response.py +138 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_response_policy_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_response_previous_policy_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/get_trace_v1_runs_run_id_trace_get_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/health_response.py +85 -0
- kneo_client-0.1.0/kneo_client/_generated/models/health_response_metadata.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/http_validation_error.py +79 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_resume_request.py +116 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_resume_request_decision.py +12 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_resume_request_metadata.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_resume_response.py +102 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_resume_response_metadata.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_task_list_response.py +137 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_task_list_response_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_task_list_response_tasks_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_task_response.py +82 -0
- kneo_client-0.1.0/kneo_client/_generated/models/human_task_response_request_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/list_checkpoints_v1_runs_run_id_checkpoints_get_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/list_human_tasks_v1_human_tasks_get_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/list_runs_v1_runs_get_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_request.py +196 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_metadata.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_overrides.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_spec_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_target.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_response.py +131 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_create_response_metadata.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_list_response.py +131 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_list_response_runs_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_list_response_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response.py +303 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response_error_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response_pending_human_request_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response_replay_context.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_replay_response.py +175 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_replay_response_replay_context.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_replay_response_timeline_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_status_response.py +355 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_status_response_error_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_status_response_metadata.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/run_status_response_pending_human_request_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_request.py +155 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_request_overrides.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_request_spec_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_response.py +96 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_response_diagnostics_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_response_summary.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_request.py +97 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_request_spec_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_response.py +49 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_response_summary.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_request.py +154 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_request_overrides.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_request_spec_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_response.py +64 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_response_report.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_request.py +148 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_request_overrides.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_request_spec_type_0.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_response.py +78 -0
- kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_response_diagnostics_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/trace_response.py +140 -0
- kneo_client-0.1.0/kneo_client/_generated/models/trace_response_events_item.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/models/trace_response_sort_order.py +9 -0
- kneo_client-0.1.0/kneo_client/_generated/models/validation_error.py +123 -0
- kneo_client-0.1.0/kneo_client/_generated/models/validation_error_context.py +47 -0
- kneo_client-0.1.0/kneo_client/_generated/types.py +54 -0
- kneo_client-0.1.0/kneo_client/agent/__init__.py +14 -0
- kneo_client-0.1.0/kneo_client/agent/_base.py +32 -0
- kneo_client-0.1.0/kneo_client/agent/client.py +20 -0
- kneo_client-0.1.0/kneo_client/agent/specs.py +121 -0
- kneo_client-0.1.0/kneo_client/core/__init__.py +90 -0
- kneo_client-0.1.0/kneo_client/core/auth.py +46 -0
- kneo_client-0.1.0/kneo_client/core/errors.py +173 -0
- kneo_client-0.1.0/kneo_client/core/idempotency.py +40 -0
- kneo_client-0.1.0/kneo_client/core/logging.py +48 -0
- kneo_client-0.1.0/kneo_client/core/pagination.py +74 -0
- kneo_client-0.1.0/kneo_client/core/profiles.py +201 -0
- kneo_client-0.1.0/kneo_client/core/request_id.py +18 -0
- kneo_client-0.1.0/kneo_client/core/retries.py +75 -0
- kneo_client-0.1.0/kneo_client/core/transport.py +295 -0
- kneo_client-0.1.0/kneo_client/platform/__init__.py +26 -0
- kneo_client-0.1.0/kneo_client/platform/_base.py +45 -0
- kneo_client-0.1.0/kneo_client/platform/audit.py +51 -0
- kneo_client-0.1.0/kneo_client/platform/client.py +30 -0
- kneo_client-0.1.0/kneo_client/platform/credentials.py +22 -0
- kneo_client-0.1.0/kneo_client/platform/health.py +29 -0
- kneo_client-0.1.0/kneo_client/platform/human_tasks.py +64 -0
- kneo_client-0.1.0/kneo_client/platform/policies.py +50 -0
- kneo_client-0.1.0/kneo_client/platform/runs.py +247 -0
- kneo_client-0.1.0/kneo_client/py.typed +0 -0
- kneo_client-0.1.0/kneo_client.egg-info/PKG-INFO +66 -0
- kneo_client-0.1.0/kneo_client.egg-info/SOURCES.txt +157 -0
- kneo_client-0.1.0/kneo_client.egg-info/dependency_links.txt +1 -0
- kneo_client-0.1.0/kneo_client.egg-info/requires.txt +24 -0
- kneo_client-0.1.0/kneo_client.egg-info/top_level.txt +1 -0
- kneo_client-0.1.0/pyproject.toml +128 -0
- kneo_client-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kneron, Inc. and kneo-client contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kneo-client
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Typed Python SDK and adapter toolkit for the Kneo Agent Platform
|
|
5
|
+
Author: Kneron, Inc. and kneo-client contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/kneo-agent/kneo-client
|
|
8
|
+
Project-URL: Documentation, https://kneo-agent.github.io/kneo-client/
|
|
9
|
+
Project-URL: Issues, https://github.com/kneo-agent/kneo-client/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/kneo-agent/kneo-client/blob/main/CHANGELOG.md
|
|
11
|
+
Project-URL: Source, https://github.com/kneo-agent/kneo-client
|
|
12
|
+
Keywords: kneo,agent,platform,sdk,client,ai,agents
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.12
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: httpx>=0.27
|
|
25
|
+
Requires-Dist: pydantic>=2.0
|
|
26
|
+
Requires-Dist: anyio>=4.0
|
|
27
|
+
Requires-Dist: platformdirs>=4.0
|
|
28
|
+
Requires-Dist: attrs>=23.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
32
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
33
|
+
Requires-Dist: respx>=0.21; extra == "dev"
|
|
34
|
+
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
35
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
36
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
37
|
+
Requires-Dist: bandit>=1.7; extra == "dev"
|
|
38
|
+
Requires-Dist: pip-audit>=2.7; extra == "dev"
|
|
39
|
+
Provides-Extra: docs
|
|
40
|
+
Requires-Dist: mkdocs>=1.6; extra == "docs"
|
|
41
|
+
Requires-Dist: mkdocs-material>=9.5; extra == "docs"
|
|
42
|
+
Requires-Dist: mkdocstrings[python]>=0.27; extra == "docs"
|
|
43
|
+
Provides-Extra: generator
|
|
44
|
+
Requires-Dist: openapi-python-client>=0.21; extra == "generator"
|
|
45
|
+
Dynamic: license-file
|
|
46
|
+
|
|
47
|
+
# kneo-client
|
|
48
|
+
|
|
49
|
+
Typed Python SDK and adapter toolkit for the [Kneo Agent Platform](https://github.com/kneo-agent/kneo-serv).
|
|
50
|
+
|
|
51
|
+
Shared client layer for **Kneo Agent Studio** (development) and **Kneo Agent Dashboard** (operations). Owns auth, profiles, retries, idempotency, pagination, request IDs, and error normalization for the platform's `/v1` HTTP API.
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from kneo_client import KneoClient
|
|
55
|
+
|
|
56
|
+
async with KneoClient(profile="default") as client:
|
|
57
|
+
run = await client.platform.runs.create(...)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A synchronous facade is provided for callers that do not run in an event loop.
|
|
61
|
+
|
|
62
|
+
See the [project README](https://github.com/kneo-agent/kneo-client) for architecture and scope.
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
MIT
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Kneo Agent Client
|
|
2
|
+
|
|
3
|
+
Typed Python SDK and adapter toolkit for the [Kneo Agent Platform](https://github.com/kneo-agent/kneo-serv).
|
|
4
|
+
|
|
5
|
+
`kneo-client` is the shared client layer that powers **Kneo Agent Studio** (development) and **Kneo Agent Dashboard** (operations). It owns the operational semantics of talking to a Kneo Agent Platform instance — auth, profiles, retries, idempotency, pagination, request IDs, and consistent error normalization — so that downstream UIs do not each reinvent them.
|
|
6
|
+
|
|
7
|
+
## Status
|
|
8
|
+
|
|
9
|
+
`v0.1.0` release candidate (`0.1.0rc1`). All eight roadmap phases complete: core, platform adapter, agent adapter, helpers, examples, user docs, release plumbing, contract tests. The 0.1.0 cut is feature-complete and pending the rc → stable promotion (TestPyPI smoke → PyPI publish). See [docs/releases/release_notes_0.1.0.md](docs/releases/release_notes_0.1.0.md) for what's in this release and [docs/plan/release_checklist.md](docs/plan/release_checklist.md) for the publish sequence.
|
|
10
|
+
|
|
11
|
+
## Architecture
|
|
12
|
+
|
|
13
|
+
Three layers:
|
|
14
|
+
|
|
15
|
+
1. **`kneo_client._generated`** — low-level client generated from `kneo_serv`'s `openapi.json` via `openapi-python-client`. Covers the stable `/v1` API. Treated as a private module.
|
|
16
|
+
2. **`kneo_client.core`** — handwritten cross-cutting client: auth (Bearer / X-Kneo-Api-Key), profile resolution, httpx-based transport, retry/backoff/timeout policy, idempotency-key support, request-ID propagation, pagination helpers, normalized errors, redaction-aware logging.
|
|
17
|
+
3. **Domain adapters**:
|
|
18
|
+
- **`kneo_client.platform`** — operational surface for the dashboard: health, runs, traces, checkpoints, replay, human tasks, audit, credentials, policies.
|
|
19
|
+
- **`kneo_client.agent`** — development surface for the studio: spec validate / compile / explain / run / policy-report.
|
|
20
|
+
|
|
21
|
+
The public entry point is a unified `KneoClient` exposing `.platform` and `.agent` namespaces:
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from kneo_client import KneoClient
|
|
25
|
+
|
|
26
|
+
async with KneoClient(profile="default") as client:
|
|
27
|
+
run = await client.platform.runs.create(...)
|
|
28
|
+
report = await client.agent.specs.policy_report(...)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
A synchronous facade is provided for callers that do not run in an event loop.
|
|
32
|
+
|
|
33
|
+
## Scope
|
|
34
|
+
|
|
35
|
+
**In scope:** anything required to talk to the Kneo Agent Platform `/v1` API safely and consistently.
|
|
36
|
+
|
|
37
|
+
**Out of scope:** business-logic redefinition of the platform; n8n / Dify / other workflow import/conversion (that belongs in Kneo Agent Studio as a development-domain library).
|
|
38
|
+
|
|
39
|
+
## License
|
|
40
|
+
|
|
41
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# kneo-client
|
|
2
|
+
|
|
3
|
+
Typed Python SDK and adapter toolkit for the [Kneo Agent Platform](https://github.com/kneo-agent/kneo-serv).
|
|
4
|
+
|
|
5
|
+
Shared client layer for **Kneo Agent Studio** (development) and **Kneo Agent Dashboard** (operations). Owns auth, profiles, retries, idempotency, pagination, request IDs, and error normalization for the platform's `/v1` HTTP API.
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
from kneo_client import KneoClient
|
|
9
|
+
|
|
10
|
+
async with KneoClient(profile="default") as client:
|
|
11
|
+
run = await client.platform.runs.create(...)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A synchronous facade is provided for callers that do not run in an event loop.
|
|
15
|
+
|
|
16
|
+
See the [project README](https://github.com/kneo-agent/kneo-client) for architecture and scope.
|
|
17
|
+
|
|
18
|
+
## License
|
|
19
|
+
|
|
20
|
+
MIT
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Kneo Agent Client — typed Python SDK and adapter toolkit for the Kneo Agent Platform.
|
|
2
|
+
|
|
3
|
+
The public entry point is :class:`KneoClient`, which exposes ``.platform``
|
|
4
|
+
(operational surface for the Dashboard) and ``.agent`` (development
|
|
5
|
+
surface for the Studio) namespaces backed by a single auth context and
|
|
6
|
+
transport.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from .agent import AgentClient
|
|
14
|
+
from .core.profiles import Profile, load_profile
|
|
15
|
+
from .core.retries import RetryPolicy
|
|
16
|
+
from .core.transport import Transport
|
|
17
|
+
from .platform import PlatformClient
|
|
18
|
+
|
|
19
|
+
__version__ = "0.1.0"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class KneoClient:
|
|
23
|
+
"""Async client for a Kneo Agent Platform instance.
|
|
24
|
+
|
|
25
|
+
Construct directly with a :class:`Profile`, or via :meth:`from_profile`
|
|
26
|
+
to resolve from the standard config-file / env / kwargs chain.
|
|
27
|
+
|
|
28
|
+
Example::
|
|
29
|
+
|
|
30
|
+
async with KneoClient.from_profile() as client:
|
|
31
|
+
health = await client.platform.health.readyz()
|
|
32
|
+
run = await client.platform.runs.create(payload)
|
|
33
|
+
valid = await client.agent.specs.validate(spec_payload)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
profile: Profile,
|
|
39
|
+
*,
|
|
40
|
+
retry_policy: RetryPolicy | None = None,
|
|
41
|
+
) -> None:
|
|
42
|
+
"""Build a KneoClient bound to ``profile``."""
|
|
43
|
+
self._transport = Transport(profile, retry_policy=retry_policy)
|
|
44
|
+
self.platform: PlatformClient = PlatformClient(self._transport)
|
|
45
|
+
self.agent: AgentClient = AgentClient(self._transport)
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def from_profile(cls, name: str | None = None, **overrides: Any) -> KneoClient:
|
|
49
|
+
"""Resolve a profile via :func:`~kneo_client.core.profiles.load_profile` and build a KneoClient."""
|
|
50
|
+
profile = load_profile(name, **overrides)
|
|
51
|
+
return cls(profile)
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def profile(self) -> Profile:
|
|
55
|
+
"""The resolved :class:`Profile` this client is bound to."""
|
|
56
|
+
return self._transport.profile
|
|
57
|
+
|
|
58
|
+
async def aclose(self) -> None:
|
|
59
|
+
"""Close the underlying transport."""
|
|
60
|
+
await self._transport.aclose()
|
|
61
|
+
|
|
62
|
+
async def __aenter__(self) -> KneoClient:
|
|
63
|
+
"""Enter the async context. Returns ``self``."""
|
|
64
|
+
return self
|
|
65
|
+
|
|
66
|
+
async def __aexit__(self, *exc: object) -> None:
|
|
67
|
+
"""Close the transport on context exit."""
|
|
68
|
+
await self.aclose()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
__all__ = ("KneoClient", "__version__")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Contains methods for accessing the API"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Contains endpoint functions for accessing the API"""
|
kneo_client-0.1.0/kneo_client/_generated/api/audit_events/list_audit_events_v1_audit_events_get.py
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from ... import errors
|
|
7
|
+
from ...client import AuthenticatedClient, Client
|
|
8
|
+
from ...models.audit_event_list_response import AuditEventListResponse
|
|
9
|
+
from ...models.http_validation_error import HTTPValidationError
|
|
10
|
+
from ...types import UNSET, Response, Unset
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _get_kwargs(
|
|
14
|
+
*,
|
|
15
|
+
event_type: None | str | Unset = UNSET,
|
|
16
|
+
run_id: None | str | Unset = UNSET,
|
|
17
|
+
limit: int | Unset = 100,
|
|
18
|
+
) -> dict[str, Any]:
|
|
19
|
+
|
|
20
|
+
params: dict[str, Any] = {}
|
|
21
|
+
|
|
22
|
+
json_event_type: None | str | Unset
|
|
23
|
+
if isinstance(event_type, Unset):
|
|
24
|
+
json_event_type = UNSET
|
|
25
|
+
else:
|
|
26
|
+
json_event_type = event_type
|
|
27
|
+
params["event_type"] = json_event_type
|
|
28
|
+
|
|
29
|
+
json_run_id: None | str | Unset
|
|
30
|
+
if isinstance(run_id, Unset):
|
|
31
|
+
json_run_id = UNSET
|
|
32
|
+
else:
|
|
33
|
+
json_run_id = run_id
|
|
34
|
+
params["run_id"] = json_run_id
|
|
35
|
+
|
|
36
|
+
params["limit"] = limit
|
|
37
|
+
|
|
38
|
+
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
|
|
39
|
+
|
|
40
|
+
_kwargs: dict[str, Any] = {
|
|
41
|
+
"method": "get",
|
|
42
|
+
"url": "/v1/audit-events",
|
|
43
|
+
"params": params,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return _kwargs
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _parse_response(
|
|
50
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
51
|
+
) -> AuditEventListResponse | HTTPValidationError | None:
|
|
52
|
+
if response.status_code == 200:
|
|
53
|
+
response_200 = AuditEventListResponse.from_dict(response.json())
|
|
54
|
+
|
|
55
|
+
return response_200
|
|
56
|
+
|
|
57
|
+
if response.status_code == 422:
|
|
58
|
+
response_422 = HTTPValidationError.from_dict(response.json())
|
|
59
|
+
|
|
60
|
+
return response_422
|
|
61
|
+
|
|
62
|
+
if client.raise_on_unexpected_status:
|
|
63
|
+
raise errors.UnexpectedStatus(response.status_code, response.content)
|
|
64
|
+
else:
|
|
65
|
+
return None
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _build_response(
|
|
69
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
70
|
+
) -> Response[AuditEventListResponse | HTTPValidationError]:
|
|
71
|
+
return Response(
|
|
72
|
+
status_code=HTTPStatus(response.status_code),
|
|
73
|
+
content=response.content,
|
|
74
|
+
headers=response.headers,
|
|
75
|
+
parsed=_parse_response(client=client, response=response),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def sync_detailed(
|
|
80
|
+
*,
|
|
81
|
+
client: AuthenticatedClient | Client,
|
|
82
|
+
event_type: None | str | Unset = UNSET,
|
|
83
|
+
run_id: None | str | Unset = UNSET,
|
|
84
|
+
limit: int | Unset = 100,
|
|
85
|
+
) -> Response[AuditEventListResponse | HTTPValidationError]:
|
|
86
|
+
"""List Audit Events
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
event_type (None | str | Unset):
|
|
90
|
+
run_id (None | str | Unset):
|
|
91
|
+
limit (int | Unset): Default: 100.
|
|
92
|
+
|
|
93
|
+
Raises:
|
|
94
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
95
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Response[AuditEventListResponse | HTTPValidationError]
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
kwargs = _get_kwargs(
|
|
102
|
+
event_type=event_type,
|
|
103
|
+
run_id=run_id,
|
|
104
|
+
limit=limit,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
response = client.get_httpx_client().request(
|
|
108
|
+
**kwargs,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
return _build_response(client=client, response=response)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def sync(
|
|
115
|
+
*,
|
|
116
|
+
client: AuthenticatedClient | Client,
|
|
117
|
+
event_type: None | str | Unset = UNSET,
|
|
118
|
+
run_id: None | str | Unset = UNSET,
|
|
119
|
+
limit: int | Unset = 100,
|
|
120
|
+
) -> AuditEventListResponse | HTTPValidationError | None:
|
|
121
|
+
"""List Audit Events
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
event_type (None | str | Unset):
|
|
125
|
+
run_id (None | str | Unset):
|
|
126
|
+
limit (int | Unset): Default: 100.
|
|
127
|
+
|
|
128
|
+
Raises:
|
|
129
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
130
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
AuditEventListResponse | HTTPValidationError
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
return sync_detailed(
|
|
137
|
+
client=client,
|
|
138
|
+
event_type=event_type,
|
|
139
|
+
run_id=run_id,
|
|
140
|
+
limit=limit,
|
|
141
|
+
).parsed
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
async def asyncio_detailed(
|
|
145
|
+
*,
|
|
146
|
+
client: AuthenticatedClient | Client,
|
|
147
|
+
event_type: None | str | Unset = UNSET,
|
|
148
|
+
run_id: None | str | Unset = UNSET,
|
|
149
|
+
limit: int | Unset = 100,
|
|
150
|
+
) -> Response[AuditEventListResponse | HTTPValidationError]:
|
|
151
|
+
"""List Audit Events
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
event_type (None | str | Unset):
|
|
155
|
+
run_id (None | str | Unset):
|
|
156
|
+
limit (int | Unset): Default: 100.
|
|
157
|
+
|
|
158
|
+
Raises:
|
|
159
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
160
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
Response[AuditEventListResponse | HTTPValidationError]
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
kwargs = _get_kwargs(
|
|
167
|
+
event_type=event_type,
|
|
168
|
+
run_id=run_id,
|
|
169
|
+
limit=limit,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
response = await client.get_async_httpx_client().request(**kwargs)
|
|
173
|
+
|
|
174
|
+
return _build_response(client=client, response=response)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
async def asyncio(
|
|
178
|
+
*,
|
|
179
|
+
client: AuthenticatedClient | Client,
|
|
180
|
+
event_type: None | str | Unset = UNSET,
|
|
181
|
+
run_id: None | str | Unset = UNSET,
|
|
182
|
+
limit: int | Unset = 100,
|
|
183
|
+
) -> AuditEventListResponse | HTTPValidationError | None:
|
|
184
|
+
"""List Audit Events
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
event_type (None | str | Unset):
|
|
188
|
+
run_id (None | str | Unset):
|
|
189
|
+
limit (int | Unset): Default: 100.
|
|
190
|
+
|
|
191
|
+
Raises:
|
|
192
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
193
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
AuditEventListResponse | HTTPValidationError
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
await asyncio_detailed(
|
|
201
|
+
client=client,
|
|
202
|
+
event_type=event_type,
|
|
203
|
+
run_id=run_id,
|
|
204
|
+
limit=limit,
|
|
205
|
+
)
|
|
206
|
+
).parsed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Contains endpoint functions for accessing the API"""
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from ... import errors
|
|
7
|
+
from ...client import AuthenticatedClient, Client
|
|
8
|
+
from ...models.health_response import HealthResponse
|
|
9
|
+
from ...types import Response
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _get_kwargs() -> dict[str, Any]:
|
|
13
|
+
|
|
14
|
+
_kwargs: dict[str, Any] = {
|
|
15
|
+
"method": "get",
|
|
16
|
+
"url": "/v1/healthz",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return _kwargs
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _parse_response(
|
|
23
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
24
|
+
) -> HealthResponse | None:
|
|
25
|
+
if response.status_code == 200:
|
|
26
|
+
response_200 = HealthResponse.from_dict(response.json())
|
|
27
|
+
|
|
28
|
+
return response_200
|
|
29
|
+
|
|
30
|
+
if client.raise_on_unexpected_status:
|
|
31
|
+
raise errors.UnexpectedStatus(response.status_code, response.content)
|
|
32
|
+
else:
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _build_response(
|
|
37
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
38
|
+
) -> Response[HealthResponse]:
|
|
39
|
+
return Response(
|
|
40
|
+
status_code=HTTPStatus(response.status_code),
|
|
41
|
+
content=response.content,
|
|
42
|
+
headers=response.headers,
|
|
43
|
+
parsed=_parse_response(client=client, response=response),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def sync_detailed(
|
|
48
|
+
*,
|
|
49
|
+
client: AuthenticatedClient | Client,
|
|
50
|
+
) -> Response[HealthResponse]:
|
|
51
|
+
"""Healthz
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
55
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
Response[HealthResponse]
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
kwargs = _get_kwargs()
|
|
62
|
+
|
|
63
|
+
response = client.get_httpx_client().request(
|
|
64
|
+
**kwargs,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return _build_response(client=client, response=response)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def sync(
|
|
71
|
+
*,
|
|
72
|
+
client: AuthenticatedClient | Client,
|
|
73
|
+
) -> HealthResponse | None:
|
|
74
|
+
"""Healthz
|
|
75
|
+
|
|
76
|
+
Raises:
|
|
77
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
78
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
HealthResponse
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
return sync_detailed(
|
|
85
|
+
client=client,
|
|
86
|
+
).parsed
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
async def asyncio_detailed(
|
|
90
|
+
*,
|
|
91
|
+
client: AuthenticatedClient | Client,
|
|
92
|
+
) -> Response[HealthResponse]:
|
|
93
|
+
"""Healthz
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
97
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Response[HealthResponse]
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
kwargs = _get_kwargs()
|
|
104
|
+
|
|
105
|
+
response = await client.get_async_httpx_client().request(**kwargs)
|
|
106
|
+
|
|
107
|
+
return _build_response(client=client, response=response)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
async def asyncio(
|
|
111
|
+
*,
|
|
112
|
+
client: AuthenticatedClient | Client,
|
|
113
|
+
) -> HealthResponse | None:
|
|
114
|
+
"""Healthz
|
|
115
|
+
|
|
116
|
+
Raises:
|
|
117
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
118
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
HealthResponse
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
await asyncio_detailed(
|
|
126
|
+
client=client,
|
|
127
|
+
)
|
|
128
|
+
).parsed
|