agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__py3-none-any.whl

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 (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,755 @@
1
+ """Pydantic contracts for local authoring, builds, runs, and deployment."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from datetime import datetime, timezone
7
+ from enum import Enum
8
+ from typing import Any, Literal
9
+
10
+ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
11
+
12
+
13
+ def _to_camel(value: str) -> str:
14
+ head, *tail = value.split("_")
15
+ return head + "".join(part.capitalize() for part in tail)
16
+
17
+
18
+ class ContractModel(BaseModel):
19
+ model_config = ConfigDict(
20
+ alias_generator=_to_camel,
21
+ populate_by_name=True,
22
+ extra="forbid",
23
+ use_enum_values=True,
24
+ )
25
+
26
+
27
+ class DiagnosticSeverity(str, Enum):
28
+ INFO = "info"
29
+ WARNING = "warning"
30
+ ERROR = "error"
31
+
32
+
33
+ class Diagnostic(ContractModel):
34
+ severity: DiagnosticSeverity
35
+ code: str
36
+ message: str
37
+ field: str | None = None
38
+ hint: str | None = None
39
+
40
+
41
+ class Instructions(ContractModel):
42
+ system: str = Field(default="", max_length=32768)
43
+ task: str = Field(default="", max_length=32768)
44
+
45
+
46
+ class ModelParameters(ContractModel):
47
+ # 三者 None=未配置:请求 payload 一律不携带该字段,使用服务端默认,
48
+ # 规避各模型族对 temperature/max_tokens 的硬约束(如 kimi 只接受默认温度)。
49
+ temperature: float | None = Field(default=None, ge=0, le=2)
50
+ max_tokens: int | None = Field(default=None, ge=1, le=131072)
51
+ top_p: float | None = Field(default=None, gt=0, le=1)
52
+ # 是否允许在 chat 请求中携带 response_format(json_object 结构化输出)。
53
+ # 关闭后 compose 等结构化调用退回纯文本输出,兼容不支持该字段的网关。
54
+ allow_json_response_format: bool = Field(default=True)
55
+
56
+
57
+ class ModelSpec(ContractModel):
58
+ provider: str = Field(default="openai-compatible", min_length=1, max_length=64)
59
+ model: str = Field(min_length=1, max_length=256)
60
+ endpoint_url: str | None = None
61
+ base_url: str | None = None
62
+ wire_api: Literal["chat", "responses"] | None = None
63
+ credential_ref: str = Field(min_length=1, max_length=512)
64
+ parameters: ModelParameters = Field(default_factory=ModelParameters)
65
+ metadata: dict[str, Any] = Field(default_factory=dict)
66
+ discovery: dict[str, Any] = Field(default_factory=dict)
67
+
68
+ @model_validator(mode="after")
69
+ def validate_address(self) -> "ModelSpec":
70
+ if bool(self.endpoint_url) == bool(self.base_url):
71
+ raise ValueError("endpointUrl 和 baseUrl 必须且只能配置一个")
72
+ return self
73
+
74
+
75
+ class CapabilityRef(ContractModel):
76
+ name: str = Field(min_length=1, max_length=128)
77
+ version: str = Field(min_length=1, max_length=64)
78
+ digest: str | None = None
79
+ enabled: bool = True
80
+
81
+
82
+ class MCPServerRef(CapabilityRef):
83
+ transport: Literal["stdio", "http", "sse"] = "stdio"
84
+ command: str | None = None
85
+ args: list[str] = Field(default_factory=list)
86
+ endpoint_url: str | None = None
87
+ env_refs: dict[str, str] = Field(default_factory=dict)
88
+
89
+ @model_validator(mode="after")
90
+ def validate_transport(self) -> "MCPServerRef":
91
+ if self.transport == "stdio" and not self.command:
92
+ raise ValueError("stdio MCP 必须配置 command")
93
+ if self.transport in {"http", "sse"} and not self.endpoint_url:
94
+ raise ValueError("HTTP/SSE MCP 必须配置 endpointUrl")
95
+ return self
96
+
97
+
98
+ class ToolContract(ContractModel):
99
+ name: str = Field(min_length=1, max_length=128)
100
+ version: str = Field(min_length=1, max_length=64)
101
+ description: str = Field(default="", max_length=1024)
102
+ input_schema: dict[str, Any] = Field(
103
+ default_factory=lambda: {"type": "object", "properties": {}}
104
+ )
105
+ output_schema: dict[str, Any] = Field(
106
+ default_factory=lambda: {"type": "object", "properties": {}}
107
+ )
108
+ permissions: list[str] = Field(default_factory=list)
109
+ timeout_seconds: int = Field(default=20, ge=1, le=3600)
110
+ side_effect: Literal["none", "read", "write", "external"] = "none"
111
+ approval: Literal["never", "always", "policy"] = "never"
112
+ executor: Literal["builtin", "mcp", "deferred", "python"] = "builtin"
113
+ mcp_server: str | None = None
114
+ source_path: str | None = Field(default=None, min_length=1, max_length=1024)
115
+ callable_name: str | None = Field(default=None, min_length=1, max_length=256)
116
+ source_sha256: str | None = None
117
+ digest: str | None = None
118
+ group: str | None = None
119
+ risk_level: str | None = None
120
+ boundary: str | None = None
121
+ backend: str | None = None
122
+ enabled: bool = True
123
+
124
+ @model_validator(mode="after")
125
+ def validate_executor(self) -> "ToolContract":
126
+ if self.executor == "mcp" and not self.mcp_server:
127
+ raise ValueError("MCP Tool 必须配置 mcpServer")
128
+ if self.executor != "mcp" and self.mcp_server:
129
+ raise ValueError("只有 MCP Tool 可以配置 mcpServer")
130
+ if self.executor == "python":
131
+ if not self.source_path or not self.callable_name:
132
+ raise ValueError("Python Tool 必须配置 sourcePath 和 callableName")
133
+ normalized = self.source_path.strip().replace("\\", "/")
134
+ if (
135
+ normalized.startswith("/")
136
+ or normalized == ".."
137
+ or normalized.startswith("../")
138
+ or "/../" in normalized
139
+ ):
140
+ raise ValueError("Python Tool sourcePath 必须位于工作区内")
141
+ self.source_path = normalized
142
+ elif self.source_path or self.callable_name or self.source_sha256:
143
+ raise ValueError("只有 Python Tool 可以配置源码字段")
144
+ return self
145
+
146
+
147
+ class ResourceDescriptor(ContractModel):
148
+ resource_id: str = Field(min_length=3, max_length=256)
149
+ kind: Literal["model", "tool", "mcp", "skill"]
150
+ name: str = Field(min_length=1, max_length=128)
151
+ display_name: str = Field(min_length=1, max_length=128)
152
+ version: str = Field(min_length=1, max_length=64)
153
+ digest: str
154
+ source: Literal["builtin", "provider", "local", "market"] = "local"
155
+ status: Literal[
156
+ "ready",
157
+ "unhealthy",
158
+ "invalid",
159
+ "missing-secret",
160
+ "unresolved",
161
+ ] = "ready"
162
+ description: str = Field(default="", max_length=4096)
163
+ category: str = Field(default="general", max_length=64)
164
+ installed: bool = True
165
+ required_secret_refs: list[str] = Field(default_factory=list)
166
+ contract: dict[str, Any] = Field(default_factory=dict)
167
+ health: dict[str, Any] = Field(default_factory=dict)
168
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
169
+ updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
170
+
171
+
172
+ class CapabilityBinding(ContractModel):
173
+ resource_id: str = Field(min_length=3, max_length=256)
174
+ enabled: bool = True
175
+ approval: Literal["never", "always", "policy"] | None = None
176
+ config: dict[str, Any] = Field(default_factory=dict)
177
+
178
+
179
+ class AgentBindings(ContractModel):
180
+ model_profile_id: str | None = None
181
+ model_profile_ids: list[str] = Field(default_factory=list)
182
+ model_parameters: ModelParameters | None = None
183
+ policy_template: Literal["loose", "strict", "custom"] = "strict"
184
+ tools: list[CapabilityBinding] = Field(default_factory=list)
185
+ mcp_servers: list[CapabilityBinding] = Field(default_factory=list)
186
+ skills: list[CapabilityBinding] = Field(default_factory=list)
187
+
188
+ @model_validator(mode="after")
189
+ def validate_model_profiles(self) -> "AgentBindings":
190
+ if len(set(self.model_profile_ids)) != len(self.model_profile_ids):
191
+ raise ValueError("modelProfileIds 不能包含重复资源")
192
+ if self.model_profile_ids and not self.model_profile_id:
193
+ raise ValueError("绑定多个模型时必须指定默认 modelProfileId")
194
+ if (
195
+ self.model_profile_id
196
+ and self.model_profile_ids
197
+ and self.model_profile_id not in self.model_profile_ids
198
+ ):
199
+ raise ValueError("默认 modelProfileId 必须包含在 modelProfileIds 中")
200
+ return self
201
+
202
+
203
+ class CapabilitiesSpec(ContractModel):
204
+ skills: list[CapabilityRef] = Field(default_factory=list)
205
+ mcp_servers: list[MCPServerRef] = Field(default_factory=list)
206
+ tools: list[ToolContract] = Field(default_factory=list)
207
+
208
+
209
+ class RetryPolicy(ContractModel):
210
+ max_attempts: int = Field(default=2, ge=1, le=10)
211
+ backoff_seconds: float = Field(default=1, ge=0, le=60)
212
+
213
+
214
+ class ExecutionSpec(ContractModel):
215
+ strategy: Literal["direct", "plan-act-observe"] = "direct"
216
+ max_steps: int = Field(default=12, ge=1, le=100)
217
+ timeout_seconds: int = Field(default=120, ge=1, le=3600)
218
+ retry: RetryPolicy = Field(default_factory=RetryPolicy)
219
+ sandbox: str | None = None
220
+ approval_mode: str | None = None
221
+
222
+
223
+ class CompactionSpec(ContractModel):
224
+ enabled: bool = True
225
+ threshold_ratio: float = Field(default=0.8, gt=0, le=1)
226
+ # PCM:双阈值(方案 §8.2 / §9.1)。soft=主动整理,hard=强制压缩。
227
+ soft_threshold_ratio: float = Field(default=0.50, gt=0, le=1)
228
+ hard_threshold_ratio: float = Field(default=0.85, gt=0, le=1)
229
+ preserve_working_state: bool = True
230
+ flush_memory_before_compaction: bool = True
231
+
232
+ @model_validator(mode="after")
233
+ def validate_ratios(self) -> "CompactionSpec":
234
+ if self.soft_threshold_ratio >= self.hard_threshold_ratio:
235
+ raise ValueError("softThresholdRatio 必须小于 hardThresholdRatio")
236
+ return self
237
+
238
+
239
+ class ContextContributorsSpec(ContractModel):
240
+ """ContextContributor 开关与预算(方案 §5.1 / §8.7)。默认按 policy,可显式开关。"""
241
+
242
+ workspace_rules: bool | None = None
243
+ skill_manifest: bool | None = None
244
+ memory_recall: bool | None = None
245
+
246
+
247
+ class RolloutSpec(ContractModel):
248
+ """AgentVersion 级灰度/回退状态(方案 §8.5)。替代环境变量控制正式灰度。"""
249
+
250
+ context_engine: Literal["off", "shadow", "enabled"] = "shadow"
251
+ memory_write: Literal["off", "shadow", "enabled"] = "shadow"
252
+
253
+
254
+ class ContextSpec(ContractModel):
255
+ max_input_tokens: int = Field(default=32000, ge=1024)
256
+ reserve_output_tokens: int = Field(default=4096, ge=1)
257
+ compaction: CompactionSpec = Field(default_factory=CompactionSpec)
258
+ # prompt_ownership:标记本 Agent 的 system prompt 归属。
259
+ # framework(默认)= 框架自带 SystemMessage,ksadk 不接管 Runner 输入;
260
+ # ksadk = 由 ksadk 的 PromptCompiler 编译 CompiledPrompt 并接管 instructions。
261
+ prompt_ownership: Literal["framework", "ksadk"] = "framework"
262
+ # PCM:ownership 高阶字段(方案 §5.1)。auto=按 capability 推导,向后兼容现有
263
+ # prompt_ownership;显式 ksadk/framework/native 时覆盖。Studio 据 capability 限制选项。
264
+ ownership: Literal["auto", "ksadk", "framework", "native"] = "auto"
265
+ tokenizer: Literal["auto", "heuristic"] = "auto"
266
+ policy_version: str = Field(default="context-v2", max_length=64)
267
+ contributors: ContextContributorsSpec = Field(default_factory=ContextContributorsSpec)
268
+ rollout: RolloutSpec = Field(default_factory=RolloutSpec)
269
+
270
+ @model_validator(mode="after")
271
+ def validate_budget(self) -> "ContextSpec":
272
+ if self.reserve_output_tokens >= self.max_input_tokens:
273
+ raise ValueError("reserveOutputTokens 必须小于 maxInputTokens")
274
+ # ownership 与 prompt_ownership 一致性:显式 ownership 收窄 prompt_ownership(§5.2)。
275
+ if self.ownership == "ksadk":
276
+ self.prompt_ownership = "ksadk"
277
+ elif self.ownership == "framework":
278
+ self.prompt_ownership = "framework"
279
+ # native 不收窄 prompt_ownership(native runtime 的 prompt 投影由 Adapter 决定)。
280
+ return self
281
+
282
+
283
+ class MemoryRecallSpec(ContractModel):
284
+ enabled: bool = True
285
+ max_tokens: int = Field(default=1600, ge=0)
286
+ top_k: int = Field(default=8, ge=1, le=64)
287
+ min_score: float = Field(default=0.45, ge=0, le=1)
288
+
289
+
290
+ class MemoryWriteSpec(ContractModel):
291
+ mode: Literal["off", "explicit_only", "candidate"] = "candidate"
292
+ flush_before_compaction: bool = True
293
+
294
+
295
+ class MemorySpec(ContractModel):
296
+ """AgentVersion 级 Memory 策略(方案 §5.1 / §10)。Build 只存 providerRef,不存凭证。"""
297
+
298
+ enabled: bool = False
299
+ provider_ref: str = Field(default="local-default", max_length=128)
300
+ recall: MemoryRecallSpec = Field(default_factory=MemoryRecallSpec)
301
+ write: MemoryWriteSpec = Field(default_factory=MemoryWriteSpec)
302
+ scopes: list[Literal["tenant", "workspace", "agent", "user"]] = Field(
303
+ default_factory=lambda: ["workspace", "agent", "user"]
304
+ )
305
+
306
+
307
+ class NetworkPolicy(ContractModel):
308
+ mode: Literal["restricted", "open"] = "restricted"
309
+ allowed_hosts: list[str] = Field(default_factory=list)
310
+ allow_private_network: bool = False
311
+
312
+
313
+ class SecuritySpec(ContractModel):
314
+ tool_policy: Literal["deny-by-default", "allow-listed"] = "deny-by-default"
315
+ allowed_permissions: list[str] = Field(default_factory=list)
316
+ network: NetworkPolicy = Field(default_factory=NetworkPolicy)
317
+
318
+
319
+ class EvaluationSpec(ContractModel):
320
+ suite_refs: list[str] = Field(default_factory=list)
321
+ minimum_pass_rate: float = Field(default=1, ge=0, le=1)
322
+
323
+
324
+ class RuntimeRef(ContractModel):
325
+ """Per-Agent reference to one registered RuntimeAdapter implementation.
326
+
327
+ Studio is a control plane and therefore must not have a process-wide runtime
328
+ mode. Each Agent declares the adapter type and, for Python frameworks, the
329
+ project entrypoint that is snapshotted by its Build.
330
+ """
331
+
332
+ type: Literal["codex", "adk", "langgraph"]
333
+ project_path: str | None = Field(default=None, min_length=1, max_length=1024)
334
+ entry_point: str | None = Field(default=None, min_length=1, max_length=1024)
335
+ agent_variable: str = Field(default="root_agent", min_length=1, max_length=256)
336
+ version: str | None = Field(default=None, min_length=1, max_length=64)
337
+ detection: Literal["declared", "auto"] = "declared"
338
+
339
+ @field_validator("project_path", "entry_point")
340
+ @classmethod
341
+ def validate_relative_path(cls, value: str | None) -> str | None:
342
+ if value is None:
343
+ return None
344
+ normalized = value.strip().replace("\\", "/")
345
+ if (
346
+ not normalized
347
+ or normalized.startswith("/")
348
+ or normalized == ".."
349
+ or normalized.startswith("../")
350
+ or "/../" in normalized
351
+ ):
352
+ raise ValueError("Runtime 路径必须是工作区内的相对路径")
353
+ return normalized
354
+
355
+ @model_validator(mode="after")
356
+ def validate_framework_source(self) -> "RuntimeRef":
357
+ if self.type in {"adk", "langgraph"}:
358
+ if not self.project_path:
359
+ raise ValueError(f"{self.type} Runtime 必须配置 projectPath")
360
+ if self.detection == "declared" and not self.entry_point:
361
+ raise ValueError(f"{self.type} Runtime 使用 declared 检测时必须配置 entryPoint")
362
+ return self
363
+
364
+
365
+ class AgentSpec(ContractModel):
366
+ description: str = Field(default="", max_length=1024)
367
+ runtime: RuntimeRef | None = None
368
+ instructions: Instructions = Field(default_factory=Instructions)
369
+ model: ModelSpec | None = None
370
+ capabilities: CapabilitiesSpec = Field(default_factory=CapabilitiesSpec)
371
+ bindings: AgentBindings = Field(default_factory=AgentBindings)
372
+ execution: ExecutionSpec = Field(default_factory=ExecutionSpec)
373
+ context: ContextSpec = Field(default_factory=ContextSpec)
374
+ memory: MemorySpec = Field(default_factory=MemorySpec)
375
+ security: SecuritySpec = Field(default_factory=SecuritySpec)
376
+ evaluation: EvaluationSpec = Field(default_factory=EvaluationSpec)
377
+
378
+
379
+ _AGENT_ID_PATTERN = re.compile(r"^[a-z][a-z0-9-]{2,62}$")
380
+ _AGENT_AVATAR_URL_PATTERN = re.compile(r"^/api/v1/assets/agent-avatars/[0-9a-f]{64}\.(?:png|webp)$")
381
+
382
+
383
+ class AgentAppearance(ContractModel):
384
+ icon: Literal["bot", "sparkles", "search", "code", "workflow"] = "bot"
385
+ color: str = Field(default="#426ea8", pattern=r"^#[0-9a-fA-F]{6}$")
386
+ image_url: str | None = Field(default=None, max_length=160)
387
+
388
+ @field_validator("color")
389
+ @classmethod
390
+ def normalize_color(cls, value: str) -> str:
391
+ return value.lower()
392
+
393
+ @field_validator("image_url")
394
+ @classmethod
395
+ def validate_image_url(cls, value: str | None) -> str | None:
396
+ if value is not None and not _AGENT_AVATAR_URL_PATTERN.fullmatch(value):
397
+ raise ValueError("imageUrl 必须引用当前工作区的内容寻址头像资源")
398
+ return value
399
+
400
+
401
+ class AgentMetadata(ContractModel):
402
+ id: str
403
+ name: str = Field(min_length=1, max_length=128)
404
+ revision: int = Field(default=1, ge=1)
405
+ labels: dict[str, str] = Field(default_factory=dict)
406
+ appearance: AgentAppearance = Field(default_factory=AgentAppearance)
407
+
408
+ @field_validator("id")
409
+ @classmethod
410
+ def validate_agent_id(cls, value: str) -> str:
411
+ if not _AGENT_ID_PATTERN.fullmatch(value):
412
+ raise ValueError("id 必须以小写字母开头,仅包含小写字母、数字和连字符,长度 3..63")
413
+ return value
414
+
415
+
416
+ class AgentDraft(ContractModel):
417
+ api_version: Literal["agentkit.ksyun.com/v1alpha1"] = "agentkit.ksyun.com/v1alpha1"
418
+ kind: Literal["Agent"] = "Agent"
419
+ metadata: AgentMetadata
420
+ spec: AgentSpec = Field(default_factory=AgentSpec)
421
+
422
+
423
+ class AgentTemplateComposeRequest(ContractModel):
424
+ prompt: str = Field(default="", max_length=32768)
425
+ goal: str = Field(default="", max_length=4096)
426
+ description: str = Field(default="", max_length=1024)
427
+ task_prompt: str = Field(default="", max_length=32768)
428
+ audience: str = Field(default="技术与业务决策者", min_length=1, max_length=256)
429
+ language: Literal["zh-CN", "en-US"] = "zh-CN"
430
+ depth: Literal["focused", "standard", "deep"] = "deep"
431
+ output_format: Literal["brief", "report", "evidence-table"] = "report"
432
+ model_profile_id: str | None = None
433
+ model_profile_ids: list[str] = Field(default_factory=list)
434
+ tool_resource_ids: list[str] = Field(default_factory=list)
435
+ skill_resource_ids: list[str] = Field(default_factory=list)
436
+ mcp_resource_ids: list[str] = Field(default_factory=list)
437
+ policy_template: Literal["loose", "strict", "custom"] = "strict"
438
+ execution_strategy: Literal["direct", "plan-act-observe"] = "direct"
439
+ max_steps: int = Field(default=12, ge=1, le=100)
440
+ timeout_seconds: int = Field(default=120, ge=1, le=3600)
441
+ auto_bind_tools: bool = True
442
+ auto_bind_mcp: bool = True
443
+
444
+ @model_validator(mode="after")
445
+ def validate_authoring_prompt(self) -> "AgentTemplateComposeRequest":
446
+ if not self.prompt.strip() and not self.goal.strip():
447
+ raise ValueError("prompt 和 goal 至少填写一项")
448
+ return self
449
+
450
+
451
+ class AgentTemplateRecommendation(ContractModel):
452
+ kind: Literal["model", "tool", "mcp", "skill"]
453
+ status: Literal["bound", "available", "missing", "warning"]
454
+ title: str
455
+ reason: str
456
+ resource_id: str | None = None
457
+
458
+
459
+ class AgentBehaviorDesign(ContractModel):
460
+ """Human-readable explanation of the generated Agent behavior contract."""
461
+
462
+ role: str
463
+ objective: str
464
+ operating_principles: list[str] = Field(default_factory=list)
465
+ workflow: list[str] = Field(default_factory=list)
466
+ explicit_boundaries: list[str] = Field(default_factory=list)
467
+ safety_boundaries: list[str] = Field(default_factory=list)
468
+ output_expectations: list[str] = Field(default_factory=list)
469
+ source_notes: list[str] = Field(default_factory=list)
470
+
471
+
472
+ class AgentTemplateComposition(ContractModel):
473
+ template_id: Literal["blank", "research"]
474
+ spec: AgentSpec
475
+ behavior_design: AgentBehaviorDesign | None = None
476
+ recommendations: list[AgentTemplateRecommendation] = Field(default_factory=list)
477
+ warnings: list[str] = Field(default_factory=list)
478
+
479
+
480
+ class ResolvedModel(ContractModel):
481
+ provider: str
482
+ model: str
483
+ endpoint_url: str
484
+ credential_ref: str
485
+ parameters: ModelParameters
486
+ wire_api: str | None = None
487
+
488
+
489
+ class ResolvedCapabilities(ContractModel):
490
+ skills: list[dict[str, Any]] = Field(default_factory=list)
491
+ mcp_servers: list[dict[str, Any]] = Field(default_factory=list)
492
+ tools: list[ToolContract] = Field(default_factory=list)
493
+
494
+
495
+ class ResolvedAgentSpec(ContractModel):
496
+ schema_version: Literal["agentkit.resolved/v1"] = "agentkit.resolved/v1"
497
+ agent_id: str
498
+ source_revision: int
499
+ compiler_version: str = "1"
500
+ instructions: Instructions
501
+ model: ResolvedModel
502
+ capabilities: ResolvedCapabilities
503
+ execution: ExecutionSpec
504
+ context: ContextSpec
505
+ memory: MemorySpec
506
+ security: SecuritySpec
507
+ evaluation: EvaluationSpec
508
+ source_digest: str
509
+ resolved_digest: str = ""
510
+
511
+
512
+ class ValidationResult(ContractModel):
513
+ valid: bool
514
+ level: Literal["schema", "build", "release"] = "build"
515
+ diagnostics: list[Diagnostic] = Field(default_factory=list)
516
+
517
+
518
+ class BuildStatus(str, Enum):
519
+ QUEUED = "QUEUED"
520
+ VALIDATING = "VALIDATING"
521
+ RESOLVING = "RESOLVING"
522
+ COMPILING = "COMPILING"
523
+ PACKAGING = "PACKAGING"
524
+ SUCCEEDED = "SUCCEEDED"
525
+ FAILED = "FAILED"
526
+ CANCELLED = "CANCELLED"
527
+ INTERRUPTED = "INTERRUPTED"
528
+
529
+
530
+ class FileEntry(ContractModel):
531
+ path: str
532
+ sha256: str
533
+ size: int = Field(ge=0)
534
+
535
+
536
+ class BundleManifest(ContractModel):
537
+ # v1 remains readable for existing local Build records. Every new Studio
538
+ # build uses v2 because Server admission requires a deterministic plugin
539
+ # lock even when the lock is empty.
540
+ bundle_format: Literal["agentkit.bundle/v1", "agentkit.bundle/v2"] = "agentkit.bundle/v1"
541
+ agent_id: str
542
+ source_revision: int
543
+ resolved_digest: str
544
+ runtime_type: str = ""
545
+ source_digest: str = ""
546
+ runtime_contract: Literal["agentkit.runtime/v1"] = "agentkit.runtime/v1"
547
+ plugin_lock_digest: str = ""
548
+ hosted_kernel_requirement_digest: str = ""
549
+ files: list[FileEntry]
550
+ created_at: str = "1970-01-01T00:00:00Z"
551
+ bundle_digest: str = ""
552
+
553
+
554
+ class BuildRecord(ContractModel):
555
+ id: str
556
+ agent_id: str
557
+ source_revision: int
558
+ status: BuildStatus
559
+ resolved_digest: str = ""
560
+ runtime_type: str = ""
561
+ source_digest: str = ""
562
+ runtime_lock: dict[str, Any] = Field(default_factory=dict)
563
+ bundle_digest: str = ""
564
+ artifact_path: str | None = None
565
+ diagnostics: list[Diagnostic] = Field(default_factory=list)
566
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
567
+ completed_at: datetime | None = None
568
+
569
+
570
+ class OperationKind(str, Enum):
571
+ BUILD = "BUILD"
572
+ RUN = "RUN"
573
+ EVALUATION = "EVALUATION"
574
+ DEPLOYMENT = "DEPLOYMENT"
575
+
576
+
577
+ class OperationStatus(str, Enum):
578
+ QUEUED = "QUEUED"
579
+ RUNNING = "RUNNING"
580
+ SUCCEEDED = "SUCCEEDED"
581
+ FAILED = "FAILED"
582
+ CANCELLED = "CANCELLED"
583
+ INTERRUPTED = "INTERRUPTED"
584
+
585
+
586
+ class Operation(ContractModel):
587
+ id: str
588
+ kind: OperationKind
589
+ status: OperationStatus = OperationStatus.QUEUED
590
+ resource_id: str
591
+ metadata: dict[str, Any] = Field(default_factory=dict)
592
+ error: dict[str, Any] | None = None
593
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
594
+ completed_at: datetime | None = None
595
+
596
+
597
+ class OperationEvent(ContractModel):
598
+ id: int = Field(ge=1)
599
+ operation_id: str
600
+ type: str
601
+ data: dict[str, Any] = Field(default_factory=dict)
602
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
603
+
604
+
605
+ class RunStatus(str, Enum):
606
+ CREATED = "CREATED"
607
+ RUNNING = "RUNNING"
608
+ PAUSED = "PAUSED"
609
+ WAITING_INPUT = "WAITING_INPUT"
610
+ COMPLETED = "COMPLETED"
611
+ FAILED = "FAILED"
612
+ CANCELLED = "CANCELLED"
613
+ INTERRUPTED = "INTERRUPTED"
614
+ TIMED_OUT = "TIMED_OUT"
615
+
616
+
617
+ class Usage(ContractModel):
618
+ input_tokens: int = Field(default=0, ge=0)
619
+ output_tokens: int = Field(default=0, ge=0)
620
+ total_tokens: int = Field(default=0, ge=0)
621
+ cached_input_tokens: int = Field(default=0, ge=0)
622
+ reasoning_output_tokens: int = Field(default=0, ge=0)
623
+ reported: bool = False
624
+ source: str | None = None
625
+
626
+
627
+ class RunRecord(ContractModel):
628
+ id: str
629
+ build_id: str
630
+ agent_id: str
631
+ session_id: str
632
+ trace_id: str
633
+ manifest_sha256: str = ""
634
+ runtime_type: str = ""
635
+ model: str = ""
636
+ collaboration_mode: str = ""
637
+ goal_objective: str = ""
638
+ runtime_handle: dict[str, Any] = Field(default_factory=dict)
639
+ status: RunStatus = RunStatus.CREATED
640
+ input: str
641
+ output: str = ""
642
+ usage: Usage = Field(default_factory=Usage)
643
+ error: dict[str, Any] | None = None
644
+ started_at: datetime | None = None
645
+ completed_at: datetime | None = None
646
+ duration_ms: int | None = None
647
+ duration_source: Literal["runtime", "studio"] | None = None
648
+ # PR-S4:PCM evidence(方案 §6.3)。由 run_service 以 shadow 方式捕获(不进真实输入),
649
+ # 供 Context Inspector 展示 planned/projected/actual + 精度。默认空(未捕获)。
650
+ context_plan: dict[str, Any] | None = None
651
+ prompt_evidence: dict[str, Any] | None = None
652
+ working_state: dict[str, Any] | None = None
653
+
654
+
655
+ class RunEvent(ContractModel):
656
+ id: int = Field(ge=1)
657
+ run_id: str
658
+ type: str
659
+ data: dict[str, Any] = Field(default_factory=dict)
660
+ created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
661
+
662
+
663
+ class AssertionSpec(ContractModel):
664
+ type: Literal[
665
+ "contains",
666
+ "equals",
667
+ "notContains",
668
+ "jsonSchema",
669
+ "maxLatencyMs",
670
+ "maxInputTokens",
671
+ "maxOutputTokens",
672
+ "toolCalled",
673
+ "toolNotCalled",
674
+ ]
675
+ value: Any
676
+
677
+
678
+ class EvaluationCase(ContractModel):
679
+ id: str = Field(min_length=1, max_length=128)
680
+ input: str
681
+ assertions: list[AssertionSpec] = Field(min_length=1)
682
+
683
+
684
+ class EvaluationSuite(ContractModel):
685
+ api_version: Literal["agentkit.ksyun.com/v1alpha1"] = "agentkit.ksyun.com/v1alpha1"
686
+ kind: Literal["EvaluationSuite"] = "EvaluationSuite"
687
+ metadata: dict[str, Any]
688
+ cases: list[EvaluationCase] = Field(min_length=1)
689
+
690
+
691
+ class AssertionResult(ContractModel):
692
+ assertion: AssertionSpec
693
+ passed: bool
694
+ message: str = ""
695
+
696
+
697
+ class EvaluationCaseResult(ContractModel):
698
+ case_id: str
699
+ run_id: str
700
+ passed: bool
701
+ assertions: list[AssertionResult]
702
+
703
+
704
+ class EvaluationRun(ContractModel):
705
+ id: str
706
+ build_id: str
707
+ status: RunStatus = RunStatus.CREATED
708
+ total: int = 0
709
+ passed: int = 0
710
+ failed: int = 0
711
+ pass_rate: float = 0
712
+ results: list[EvaluationCaseResult] = Field(default_factory=list)
713
+
714
+
715
+ class DeploymentTarget(ContractModel):
716
+ region: str = Field(min_length=1, max_length=64)
717
+ environment: str = Field(min_length=1, max_length=64)
718
+
719
+
720
+ class EnvironmentBinding(ContractModel):
721
+ model: dict[str, str] = Field(default_factory=dict)
722
+ secrets: dict[str, str] = Field(default_factory=dict)
723
+ mcp_servers: dict[str, str] = Field(default_factory=dict)
724
+
725
+
726
+ class ReleasePolicy(ContractModel):
727
+ strategy: Literal["rolling", "recreate"] = "rolling"
728
+ approval: Literal["none", "manual"] = "none"
729
+
730
+
731
+ class DeploymentRequest(ContractModel):
732
+ target: DeploymentTarget
733
+ binding: EnvironmentBinding = Field(default_factory=EnvironmentBinding)
734
+ release_policy: ReleasePolicy = Field(default_factory=ReleasePolicy)
735
+
736
+
737
+ class DeploymentRecord(ContractModel):
738
+ id: str
739
+ build_id: str
740
+ bundle_digest: str
741
+ version_id: str
742
+ status: Literal["ADMITTING", "DEPLOYING", "READY", "FAILED", "ROLLED_BACK"]
743
+ target: DeploymentTarget
744
+ # These are receipts from the existing Agent creation control plane, not
745
+ # Studio-generated deployment identities.
746
+ agent_id: str | None = None
747
+ instance_id: str | None = None
748
+ endpoint: str | None = None
749
+ # Immutable KS3 object selected by this receipt. It is a deployment fact,
750
+ # not a browser-supplied credential or a mutable "latest" alias.
751
+ bundle_uri: str | None = None
752
+ artifact_id: str | None = None
753
+ # New direct-cloud receipts are expected to pass AgentKernel/v1 admission.
754
+ # Older receipts intentionally default to false for read compatibility.
755
+ requires_kernel: bool = False