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.
Files changed (159) hide show
  1. kneo_client-0.1.0/LICENSE +21 -0
  2. kneo_client-0.1.0/PKG-INFO +66 -0
  3. kneo_client-0.1.0/README.md +41 -0
  4. kneo_client-0.1.0/README.pypi.md +20 -0
  5. kneo_client-0.1.0/kneo_client/__init__.py +71 -0
  6. kneo_client-0.1.0/kneo_client/_generated/__init__.py +8 -0
  7. kneo_client-0.1.0/kneo_client/_generated/api/__init__.py +1 -0
  8. kneo_client-0.1.0/kneo_client/_generated/api/audit_events/__init__.py +1 -0
  9. kneo_client-0.1.0/kneo_client/_generated/api/audit_events/list_audit_events_v1_audit_events_get.py +206 -0
  10. kneo_client-0.1.0/kneo_client/_generated/api/health/__init__.py +1 -0
  11. kneo_client-0.1.0/kneo_client/_generated/api/health/healthz_v1_healthz_get.py +128 -0
  12. kneo_client-0.1.0/kneo_client/_generated/api/health/livez_v1_livez_get.py +128 -0
  13. kneo_client-0.1.0/kneo_client/_generated/api/health/readyz_v1_readyz_get.py +128 -0
  14. kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/__init__.py +1 -0
  15. kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/get_human_task_v1_human_tasks_continuation_id_get.py +161 -0
  16. kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/list_human_tasks_v1_human_tasks_get.py +267 -0
  17. kneo_client-0.1.0/kneo_client/_generated/api/human_tasks/resume_human_task_v1_human_tasks_continuation_id_resume_post.py +197 -0
  18. kneo_client-0.1.0/kneo_client/_generated/api/policies/__init__.py +1 -0
  19. kneo_client-0.1.0/kneo_client/_generated/api/policies/get_environment_policy_v1_policies_environment_environment_get.py +161 -0
  20. kneo_client-0.1.0/kneo_client/_generated/api/policies/list_environment_policies_v1_policies_environment_get.py +128 -0
  21. kneo_client-0.1.0/kneo_client/_generated/api/policies/put_environment_policy_v1_policies_environment_environment_put.py +182 -0
  22. kneo_client-0.1.0/kneo_client/_generated/api/runs/__init__.py +1 -0
  23. kneo_client-0.1.0/kneo_client/_generated/api/runs/cancel_run_v1_runs_run_id_cancel_post.py +161 -0
  24. kneo_client-0.1.0/kneo_client/_generated/api/runs/continue_run_v1_runs_run_id_continue_post.py +161 -0
  25. kneo_client-0.1.0/kneo_client/_generated/api/runs/create_run_v1_runs_post.py +181 -0
  26. kneo_client-0.1.0/kneo_client/_generated/api/runs/diff_checkpoints_v1_runs_run_id_checkpoints_diff_get.py +207 -0
  27. kneo_client-0.1.0/kneo_client/_generated/api/runs/get_recovery_context_v1_runs_run_id_recovery_get.py +161 -0
  28. kneo_client-0.1.0/kneo_client/_generated/api/runs/get_replay_view_v1_runs_run_id_replay_get.py +161 -0
  29. kneo_client-0.1.0/kneo_client/_generated/api/runs/get_run_policy_report_v1_runs_run_id_policy_report_get.py +185 -0
  30. kneo_client-0.1.0/kneo_client/_generated/api/runs/get_run_v1_runs_run_id_get.py +161 -0
  31. kneo_client-0.1.0/kneo_client/_generated/api/runs/get_trace_v1_runs_run_id_trace_get.py +263 -0
  32. kneo_client-0.1.0/kneo_client/_generated/api/runs/list_checkpoints_v1_runs_run_id_checkpoints_get.py +263 -0
  33. kneo_client-0.1.0/kneo_client/_generated/api/runs/list_runs_v1_runs_get.py +240 -0
  34. kneo_client-0.1.0/kneo_client/_generated/api/security/__init__.py +1 -0
  35. kneo_client-0.1.0/kneo_client/_generated/api/security/credential_inventory_v1_security_credentials_get.py +212 -0
  36. kneo_client-0.1.0/kneo_client/_generated/api/specs/__init__.py +1 -0
  37. kneo_client-0.1.0/kneo_client/_generated/api/specs/compile_spec_v1_specs_compile_post.py +166 -0
  38. kneo_client-0.1.0/kneo_client/_generated/api/specs/explain_spec_v1_specs_explain_post.py +166 -0
  39. kneo_client-0.1.0/kneo_client/_generated/api/specs/policy_report_spec_v1_specs_policy_report_post.py +166 -0
  40. kneo_client-0.1.0/kneo_client/_generated/api/specs/run_spec_v1_specs_run_post.py +181 -0
  41. kneo_client-0.1.0/kneo_client/_generated/api/specs/validate_spec_v1_specs_validate_post.py +170 -0
  42. kneo_client-0.1.0/kneo_client/_generated/client.py +282 -0
  43. kneo_client-0.1.0/kneo_client/_generated/errors.py +16 -0
  44. kneo_client-0.1.0/kneo_client/_generated/models/__init__.py +195 -0
  45. kneo_client-0.1.0/kneo_client/_generated/models/audit_event_list_response.py +69 -0
  46. kneo_client-0.1.0/kneo_client/_generated/models/audit_event_list_response_events_item.py +47 -0
  47. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response.py +183 -0
  48. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_added_item.py +47 -0
  49. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_changed_item.py +47 -0
  50. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_from_checkpoint.py +47 -0
  51. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_removed_item.py +47 -0
  52. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_diff_response_to_checkpoint.py +47 -0
  53. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_list_response.py +148 -0
  54. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_list_response_checkpoints_item.py +47 -0
  55. kneo_client-0.1.0/kneo_client/_generated/models/checkpoint_list_response_sort_order.py +9 -0
  56. kneo_client-0.1.0/kneo_client/_generated/models/credential_inventory_response.py +53 -0
  57. kneo_client-0.1.0/kneo_client/_generated/models/credential_inventory_response_inventory.py +47 -0
  58. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_list_response.py +61 -0
  59. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_list_response_policies.py +76 -0
  60. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_list_response_policies_additional_property.py +47 -0
  61. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_request.py +101 -0
  62. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_response.py +138 -0
  63. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_response_policy_type_0.py +47 -0
  64. kneo_client-0.1.0/kneo_client/_generated/models/environment_policy_response_previous_policy_type_0.py +47 -0
  65. kneo_client-0.1.0/kneo_client/_generated/models/get_trace_v1_runs_run_id_trace_get_sort_order.py +9 -0
  66. kneo_client-0.1.0/kneo_client/_generated/models/health_response.py +85 -0
  67. kneo_client-0.1.0/kneo_client/_generated/models/health_response_metadata.py +47 -0
  68. kneo_client-0.1.0/kneo_client/_generated/models/http_validation_error.py +79 -0
  69. kneo_client-0.1.0/kneo_client/_generated/models/human_resume_request.py +116 -0
  70. kneo_client-0.1.0/kneo_client/_generated/models/human_resume_request_decision.py +12 -0
  71. kneo_client-0.1.0/kneo_client/_generated/models/human_resume_request_metadata.py +47 -0
  72. kneo_client-0.1.0/kneo_client/_generated/models/human_resume_response.py +102 -0
  73. kneo_client-0.1.0/kneo_client/_generated/models/human_resume_response_metadata.py +47 -0
  74. kneo_client-0.1.0/kneo_client/_generated/models/human_task_list_response.py +137 -0
  75. kneo_client-0.1.0/kneo_client/_generated/models/human_task_list_response_sort_order.py +9 -0
  76. kneo_client-0.1.0/kneo_client/_generated/models/human_task_list_response_tasks_item.py +47 -0
  77. kneo_client-0.1.0/kneo_client/_generated/models/human_task_response.py +82 -0
  78. kneo_client-0.1.0/kneo_client/_generated/models/human_task_response_request_type_0.py +47 -0
  79. kneo_client-0.1.0/kneo_client/_generated/models/list_checkpoints_v1_runs_run_id_checkpoints_get_sort_order.py +9 -0
  80. kneo_client-0.1.0/kneo_client/_generated/models/list_human_tasks_v1_human_tasks_get_sort_order.py +9 -0
  81. kneo_client-0.1.0/kneo_client/_generated/models/list_runs_v1_runs_get_sort_order.py +9 -0
  82. kneo_client-0.1.0/kneo_client/_generated/models/run_create_request.py +196 -0
  83. kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_metadata.py +47 -0
  84. kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_overrides.py +47 -0
  85. kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_spec_type_0.py +47 -0
  86. kneo_client-0.1.0/kneo_client/_generated/models/run_create_request_target.py +9 -0
  87. kneo_client-0.1.0/kneo_client/_generated/models/run_create_response.py +131 -0
  88. kneo_client-0.1.0/kneo_client/_generated/models/run_create_response_metadata.py +47 -0
  89. kneo_client-0.1.0/kneo_client/_generated/models/run_list_response.py +131 -0
  90. kneo_client-0.1.0/kneo_client/_generated/models/run_list_response_runs_item.py +47 -0
  91. kneo_client-0.1.0/kneo_client/_generated/models/run_list_response_sort_order.py +9 -0
  92. kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response.py +303 -0
  93. kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response_error_type_0.py +47 -0
  94. kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response_pending_human_request_type_0.py +47 -0
  95. kneo_client-0.1.0/kneo_client/_generated/models/run_recovery_response_replay_context.py +47 -0
  96. kneo_client-0.1.0/kneo_client/_generated/models/run_replay_response.py +175 -0
  97. kneo_client-0.1.0/kneo_client/_generated/models/run_replay_response_replay_context.py +47 -0
  98. kneo_client-0.1.0/kneo_client/_generated/models/run_replay_response_timeline_item.py +47 -0
  99. kneo_client-0.1.0/kneo_client/_generated/models/run_status_response.py +355 -0
  100. kneo_client-0.1.0/kneo_client/_generated/models/run_status_response_error_type_0.py +47 -0
  101. kneo_client-0.1.0/kneo_client/_generated/models/run_status_response_metadata.py +47 -0
  102. kneo_client-0.1.0/kneo_client/_generated/models/run_status_response_pending_human_request_type_0.py +47 -0
  103. kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_request.py +155 -0
  104. kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_request_overrides.py +47 -0
  105. kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_request_spec_type_0.py +47 -0
  106. kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_response.py +96 -0
  107. kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_response_diagnostics_item.py +47 -0
  108. kneo_client-0.1.0/kneo_client/_generated/models/spec_compile_response_summary.py +47 -0
  109. kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_request.py +97 -0
  110. kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_request_spec_type_0.py +47 -0
  111. kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_response.py +49 -0
  112. kneo_client-0.1.0/kneo_client/_generated/models/spec_explain_response_summary.py +47 -0
  113. kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_request.py +154 -0
  114. kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_request_overrides.py +47 -0
  115. kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_request_spec_type_0.py +47 -0
  116. kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_response.py +64 -0
  117. kneo_client-0.1.0/kneo_client/_generated/models/spec_policy_report_response_report.py +47 -0
  118. kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_request.py +148 -0
  119. kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_request_overrides.py +47 -0
  120. kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_request_spec_type_0.py +47 -0
  121. kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_response.py +78 -0
  122. kneo_client-0.1.0/kneo_client/_generated/models/spec_validate_response_diagnostics_item.py +47 -0
  123. kneo_client-0.1.0/kneo_client/_generated/models/trace_response.py +140 -0
  124. kneo_client-0.1.0/kneo_client/_generated/models/trace_response_events_item.py +47 -0
  125. kneo_client-0.1.0/kneo_client/_generated/models/trace_response_sort_order.py +9 -0
  126. kneo_client-0.1.0/kneo_client/_generated/models/validation_error.py +123 -0
  127. kneo_client-0.1.0/kneo_client/_generated/models/validation_error_context.py +47 -0
  128. kneo_client-0.1.0/kneo_client/_generated/types.py +54 -0
  129. kneo_client-0.1.0/kneo_client/agent/__init__.py +14 -0
  130. kneo_client-0.1.0/kneo_client/agent/_base.py +32 -0
  131. kneo_client-0.1.0/kneo_client/agent/client.py +20 -0
  132. kneo_client-0.1.0/kneo_client/agent/specs.py +121 -0
  133. kneo_client-0.1.0/kneo_client/core/__init__.py +90 -0
  134. kneo_client-0.1.0/kneo_client/core/auth.py +46 -0
  135. kneo_client-0.1.0/kneo_client/core/errors.py +173 -0
  136. kneo_client-0.1.0/kneo_client/core/idempotency.py +40 -0
  137. kneo_client-0.1.0/kneo_client/core/logging.py +48 -0
  138. kneo_client-0.1.0/kneo_client/core/pagination.py +74 -0
  139. kneo_client-0.1.0/kneo_client/core/profiles.py +201 -0
  140. kneo_client-0.1.0/kneo_client/core/request_id.py +18 -0
  141. kneo_client-0.1.0/kneo_client/core/retries.py +75 -0
  142. kneo_client-0.1.0/kneo_client/core/transport.py +295 -0
  143. kneo_client-0.1.0/kneo_client/platform/__init__.py +26 -0
  144. kneo_client-0.1.0/kneo_client/platform/_base.py +45 -0
  145. kneo_client-0.1.0/kneo_client/platform/audit.py +51 -0
  146. kneo_client-0.1.0/kneo_client/platform/client.py +30 -0
  147. kneo_client-0.1.0/kneo_client/platform/credentials.py +22 -0
  148. kneo_client-0.1.0/kneo_client/platform/health.py +29 -0
  149. kneo_client-0.1.0/kneo_client/platform/human_tasks.py +64 -0
  150. kneo_client-0.1.0/kneo_client/platform/policies.py +50 -0
  151. kneo_client-0.1.0/kneo_client/platform/runs.py +247 -0
  152. kneo_client-0.1.0/kneo_client/py.typed +0 -0
  153. kneo_client-0.1.0/kneo_client.egg-info/PKG-INFO +66 -0
  154. kneo_client-0.1.0/kneo_client.egg-info/SOURCES.txt +157 -0
  155. kneo_client-0.1.0/kneo_client.egg-info/dependency_links.txt +1 -0
  156. kneo_client-0.1.0/kneo_client.egg-info/requires.txt +24 -0
  157. kneo_client-0.1.0/kneo_client.egg-info/top_level.txt +1 -0
  158. kneo_client-0.1.0/pyproject.toml +128 -0
  159. 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,8 @@
1
+ """A client library for accessing Kneo Agent Platform API"""
2
+
3
+ from .client import AuthenticatedClient, Client
4
+
5
+ __all__ = (
6
+ "AuthenticatedClient",
7
+ "Client",
8
+ )
@@ -0,0 +1 @@
1
+ """Contains methods for accessing the API"""
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""
@@ -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