agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,73 @@
1
+ """Common target lifecycle shared by all evaluation adapters."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+
7
+ from .adapters import (
8
+ EvaluationNotImplementedError,
9
+ TargetAdapter,
10
+ TargetAdapterError,
11
+ create_target_adapter,
12
+ )
13
+ from .contracts import (
14
+ EvalCase,
15
+ EvalRunSpec,
16
+ EvaluationConfig,
17
+ TargetRef,
18
+ TargetRun,
19
+ TargetRunStatus,
20
+ TargetSnapshot,
21
+ )
22
+
23
+
24
+ class EvaluationExecutionError(RuntimeError):
25
+ """A classified failure from the common target execution boundary."""
26
+
27
+
28
+ class EvaluationTarget:
29
+ """Own target lifecycle; protocol details stay in the selected adapter."""
30
+
31
+ def __init__(self, target: TargetRef, config: EvaluationConfig) -> None:
32
+ self.reference = target
33
+ self._timeout_seconds = config.timeout_seconds
34
+ self._adapter: TargetAdapter = create_target_adapter(
35
+ target, timeout_seconds=config.timeout_seconds
36
+ )
37
+
38
+ async def snapshot(self) -> TargetSnapshot:
39
+ try:
40
+ return await asyncio.wait_for(
41
+ self._adapter.snapshot(self.reference),
42
+ timeout=self._timeout_seconds,
43
+ )
44
+ except TimeoutError as exc:
45
+ raise EvaluationExecutionError(
46
+ f"{self.reference.kind.value} Target 快照超时"
47
+ ) from exc
48
+ except TargetAdapterError as exc:
49
+ raise EvaluationExecutionError(f"{exc.code}: {exc}") from exc
50
+
51
+ async def run_case(
52
+ self,
53
+ spec: EvalRunSpec,
54
+ case: EvalCase,
55
+ ) -> TargetRun:
56
+ try:
57
+ return await asyncio.wait_for(
58
+ self._adapter.run_case(spec, case, attempt=spec.attempt),
59
+ timeout=self._timeout_seconds,
60
+ )
61
+ except TimeoutError:
62
+ return TargetRun(
63
+ status=TargetRunStatus.ERROR,
64
+ error_code="EVALUATION_CASE_TIMEOUT",
65
+ error_message=f"Case {case.id} 执行超时",
66
+ )
67
+
68
+
69
+ __all__ = [
70
+ "EvaluationExecutionError",
71
+ "EvaluationNotImplementedError",
72
+ "EvaluationTarget",
73
+ ]
@@ -0,0 +1,25 @@
1
+ """RuntimeEvent schema (goal-02)。见 :mod:`ksadk.events.runtime_event`。"""
2
+
3
+ from ksadk.events.parser import RuntimeEventParser
4
+ from ksadk.events.replay import replay_transcript
5
+ from ksadk.events.runtime_event import (
6
+ ALL_EVENT_TYPES,
7
+ EVENT_PAYLOAD_REQUIRED_KEYS,
8
+ SCHEMA_VERSION,
9
+ EventPhase,
10
+ EventType,
11
+ RuntimeEvent,
12
+ )
13
+ from ksadk.events.store import RuntimeEventStore
14
+
15
+ __all__ = [
16
+ "ALL_EVENT_TYPES",
17
+ "EVENT_PAYLOAD_REQUIRED_KEYS",
18
+ "EventPhase",
19
+ "EventType",
20
+ "RuntimeEvent",
21
+ "RuntimeEventParser",
22
+ "RuntimeEventStore",
23
+ "replay_transcript",
24
+ "SCHEMA_VERSION",
25
+ ]
ksadk/events/parser.py ADDED
@@ -0,0 +1,191 @@
1
+ """共享 RuntimeEvent → transcript parser (goal-12,H2 §3.2 P1-N)。
2
+
3
+ **单实现**:live 增量渲染与 replay 历史回放**共用同一个 parser**,从根上杜绝"两个仓/
4
+ 两条路各实现一遍导致的行为漂移"(H2 高风险:历史 replay 行为漂移)。
5
+
6
+ parser 把一串 :class:`RuntimeEvent` 折叠成**确定性** transcript(按事件顺序的 item 列表
7
+ + run 状态),``to_json`` 输出逐字节稳定(json sort_keys + 有序 item),供 conformance
8
+ fixture 断言 live 渲染与 replay 渲染**逐字节一致**。
9
+
10
+ 设计要点:
11
+
12
+ - text/reasoning:按 ``(invocation_id, phase)`` 分组累积 delta,``completed`` 收尾。
13
+ - tool.call:``begin`` 开工、``end`` 收尾(同名 call_id 配对)。
14
+ - artifact:``created``/``updated`` 按 name 登记/更新版本。
15
+ - run.*:按 invocation 记录最新 run 状态。
16
+ - checkpoint/usage/a2ui/a2a:记为带类型的附加项(保序,不丢事件)。
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import json
22
+ from typing import Any
23
+
24
+ from ksadk.events.runtime_event import EventType, RuntimeEvent
25
+
26
+ #: parser 消费的渲染族(其余事件类型记为 generic 附加项,不丢)。
27
+ _TEXT_TYPES = frozenset({EventType.TEXT_DELTA, EventType.TEXT_COMPLETED})
28
+ _REASONING_TYPES = frozenset({EventType.REASONING_DELTA, EventType.REASONING_COMPLETED})
29
+ _RUN_TYPES = frozenset(
30
+ {
31
+ EventType.RUN_STARTED,
32
+ EventType.RUN_PROGRESS,
33
+ EventType.RUN_INTERRUPTED,
34
+ EventType.RUN_COMPLETED,
35
+ EventType.RUN_FAILED,
36
+ EventType.RUN_CANCELED,
37
+ }
38
+ )
39
+
40
+
41
+ class RuntimeEventParser:
42
+ """RuntimeEvent → 确定性 transcript 的共享 parser(live/replay 单实现)。"""
43
+
44
+ def __init__(self) -> None:
45
+ # (invocation_id, phase) -> {"text": str, "final": bool}
46
+ self._text: dict[tuple[str, str], dict[str, Any]] = {}
47
+ self._reasoning: dict[tuple[str, str], dict[str, Any]] = {}
48
+ # call_id -> {"name","detail","done"}
49
+ self._tool_calls: dict[str, dict[str, Any]] = {}
50
+ # name -> {"version","text"}
51
+ self._artifacts: dict[str, dict[str, Any]] = {}
52
+ # invocation_id -> 最新 run 状态字符串
53
+ self._run_status: dict[str, str] = {}
54
+ # 渲染顺序:text/reasoning/tool/artifact 首次出现的键
55
+ self._order: list[tuple[str, Any]] = []
56
+ # 其他事件(checkpoint/usage/a2ui/a2a)保序附加
57
+ self._extras: list[dict[str, Any]] = []
58
+
59
+ # ---- 增量喂事件(live 与 replay 同一条路径) ----
60
+
61
+ def feed(self, event: RuntimeEvent) -> None:
62
+ et = event.event_type
63
+ if et in _TEXT_TYPES:
64
+ self._feed_text(self._text, "text", event, final=(et == EventType.TEXT_COMPLETED))
65
+ elif et in _REASONING_TYPES:
66
+ self._feed_text(
67
+ self._reasoning, "reasoning", event, final=(et == EventType.REASONING_COMPLETED)
68
+ )
69
+ elif et == EventType.TOOL_CALL_BEGIN:
70
+ call_id = str(event.payload.get("call_id") or "")
71
+ if call_id:
72
+ self._tool_calls[call_id] = {
73
+ "name": event.payload.get("name", ""),
74
+ "detail": event.payload.get("detail") or {},
75
+ "done": False,
76
+ "invocation_id": event.invocation_id,
77
+ }
78
+ self._order.append(("tool_call", call_id))
79
+ elif et == EventType.TOOL_CALL_END:
80
+ call_id = str(event.payload.get("call_id") or "")
81
+ if call_id and call_id in self._tool_calls:
82
+ self._tool_calls[call_id]["done"] = True
83
+ self._tool_calls[call_id]["result"] = event.payload.get("result")
84
+ elif et in (EventType.ARTIFACT_CREATED, EventType.ARTIFACT_UPDATED):
85
+ name = str(event.payload.get("name") or "artifact")
86
+ prev = self._artifacts.get(name, {"version": 0})
87
+ if name not in self._artifacts:
88
+ self._order.append(("artifact", name))
89
+ self._artifacts[name] = {
90
+ "version": int(event.payload.get("version") or prev["version"] + 1),
91
+ "text": str(event.payload.get("text") or ""),
92
+ "invocation_id": event.invocation_id,
93
+ }
94
+ elif et in _RUN_TYPES:
95
+ status = str(event.payload.get("status") or et)
96
+ self._run_status[event.invocation_id] = status
97
+ else:
98
+ # checkpoint/usage/a2ui/a2a 等:保序附加,不丢事件。
99
+ self._extras.append(
100
+ {
101
+ "event_type": et,
102
+ "invocation_id": event.invocation_id,
103
+ "payload": event.payload,
104
+ }
105
+ )
106
+
107
+ def _feed_text(
108
+ self,
109
+ bucket: dict[tuple[str, str], dict[str, Any]],
110
+ kind: str,
111
+ event: RuntimeEvent,
112
+ *,
113
+ final: bool,
114
+ ) -> None:
115
+ key = (event.invocation_id, str(event.phase or "commentary"))
116
+ entry = bucket.setdefault(key, {"text": "", "final": False})
117
+ if (
118
+ len(bucket) == 1
119
+ and entry["text"] == ""
120
+ and not any(k == (kind, key) for k in self._order)
121
+ ):
122
+ self._order.append((kind, key))
123
+ entry["text"] += str(event.payload.get("text") or "")
124
+ if final:
125
+ entry["final"] = True
126
+
127
+ # ---- 投影 ----
128
+
129
+ def transcript(self) -> dict[str, Any]:
130
+ """折叠为确定性 transcript(dict;``to_json`` 逐字节稳定)。"""
131
+ items: list[dict[str, Any]] = []
132
+ for kind, key in self._order:
133
+ if kind == "text":
134
+ entry = self._text.get(key, {"text": "", "final": False})
135
+ items.append(
136
+ {
137
+ "kind": "text",
138
+ "invocation_id": key[0],
139
+ "phase": key[1],
140
+ "text": entry["text"],
141
+ "final": entry["final"],
142
+ }
143
+ )
144
+ elif kind == "reasoning":
145
+ entry = self._reasoning.get(key, {"text": "", "final": False})
146
+ items.append(
147
+ {
148
+ "kind": "reasoning",
149
+ "invocation_id": key[0],
150
+ "phase": key[1],
151
+ "text": entry["text"],
152
+ "final": entry["final"],
153
+ }
154
+ )
155
+ elif kind == "tool_call":
156
+ call = self._tool_calls.get(key, {})
157
+ items.append(
158
+ {
159
+ "kind": "tool_call",
160
+ "call_id": key,
161
+ "name": call.get("name", ""),
162
+ "done": call.get("done", False),
163
+ "result": call.get("result"),
164
+ "invocation_id": call.get("invocation_id"),
165
+ }
166
+ )
167
+ elif kind == "artifact":
168
+ art = self._artifacts.get(key, {})
169
+ items.append(
170
+ {
171
+ "kind": "artifact",
172
+ "name": key,
173
+ "version": art.get("version", 1),
174
+ "text": art.get("text", ""),
175
+ "invocation_id": art.get("invocation_id"),
176
+ }
177
+ )
178
+ return {
179
+ "items": items,
180
+ "run_status": {k: self._run_status[k] for k in sorted(self._run_status)},
181
+ "extras": self._extras,
182
+ }
183
+
184
+ def to_json(self) -> str:
185
+ """确定性 JSON 序列化(sort_keys + 紧凑分隔符),供 conformance 逐字节比对。"""
186
+ return json.dumps(
187
+ self.transcript(), ensure_ascii=False, sort_keys=True, separators=(",", ":")
188
+ )
189
+
190
+
191
+ __all__ = ["RuntimeEventParser"]
ksadk/events/replay.py ADDED
@@ -0,0 +1,37 @@
1
+ """历史 replay — 基于 session 级 cursor 的跨 invocation 回放 (goal-12)。
2
+
3
+ replay 与 live 渲染**共用** :class:`~ksadk.events.parser.RuntimeEventParser`(单实现),
4
+ 回放只是"从 store 按 cursor 读事件、喂同一个 parser"。因此 live 与 replay 不可能漂移
5
+ (H2 高风险项),由 conformance fixture 逐字节断言兜底。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Optional
11
+
12
+ from ksadk.events.parser import RuntimeEventParser
13
+ from ksadk.events.store import RuntimeEventStore
14
+
15
+
16
+ async def replay_transcript(
17
+ store: RuntimeEventStore,
18
+ session_id: str,
19
+ *,
20
+ after_seq_id: int = 0,
21
+ before_seq_id: Optional[int] = None,
22
+ parser: Optional[RuntimeEventParser] = None,
23
+ ) -> RuntimeEventParser:
24
+ """跨 invocation 历史回放:按 session cursor 读事件,经共享 parser 折叠成 transcript。
25
+
26
+ 与 live 渲染同一条 parser 路径——live 是"事件边来边 feed",replay 是"从 store 读完
27
+ 再 feed 同一个 parser",产物逐字节一致(conformance fixture 证明)。
28
+ """
29
+ parser = parser or RuntimeEventParser()
30
+ events = await store.list(session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id)
31
+ for event in events:
32
+ event.validate_conformance()
33
+ parser.feed(event)
34
+ return parser
35
+
36
+
37
+ __all__ = ["replay_transcript"]
@@ -0,0 +1,273 @@
1
+ """RuntimeEvent v1 schema (goal-02 / G0.2 冻结稿)。
2
+
3
+ 事件只定义一次:Runtime 产生 → server 持久化 → gateway 透传 → UI/协议 adapter 消费。
4
+ 本模块只负责**定义层**(类型 + 序列化/反序列化 + 事件族清单);不改 runtime.py 发事件
5
+ (那是后续阶段)。
6
+
7
+ 设计约束(友商证伪,G0.2 冻结):
8
+
9
+ - **additive + ``SCHEMA_VERSION``**:只增字段/事件类型,不改既有字段语义。
10
+ - **相位字段** ``phase``:区分 ``commentary``(过程解说)vs ``final_answer``(最终答案),
11
+ 仅 text/reasoning 类事件使用。
12
+ - **工具审批一等事件**(``approval.*``),不是普通 text;审批回包走独立命令/恢复通道,
13
+ 事件流上的 ``approval.resolved`` 仅作回放/审计(非 duplex stream)。
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import time
19
+ import uuid
20
+ from enum import Enum
21
+ from typing import Any, Literal, Optional
22
+
23
+ from pydantic import BaseModel, Field
24
+
25
+ #: additive 演进锚点。冻结为 1;只增不改。
26
+ SCHEMA_VERSION: Literal[1] = 1
27
+
28
+
29
+ class EventPhase(str, Enum):
30
+ """相位:text/reasoning 类事件区分过程解说与最终答案。"""
31
+
32
+ COMMENTARY = "commentary"
33
+ FINAL_ANSWER = "final_answer"
34
+
35
+
36
+ # ---------------------------------------------------------------------------
37
+ # 事件族(event_type 常量,v1 冻结)。新增事件类型只能 additive 追加。
38
+ # ---------------------------------------------------------------------------
39
+
40
+
41
+ class EventType:
42
+ """v1 事件族清单(冻结)。按族分组;每族注释标明 payload 关键字段。"""
43
+
44
+ # text(相位:commentary/final_answer)。payload: text, message_id
45
+ TEXT_DELTA = "text.delta"
46
+ TEXT_COMPLETED = "text.completed"
47
+ # reasoning(相位恒 commentary)。payload: text, summary
48
+ REASONING_DELTA = "reasoning.delta"
49
+ REASONING_COMPLETED = "reasoning.completed"
50
+ # tool。begin: call_id, name, args;end: call_id, name, result, error, duration_ms
51
+ TOOL_CALL_BEGIN = "tool.call.begin"
52
+ TOOL_CALL_END = "tool.call.end"
53
+ # artifact。payload: name, version, uri, mime
54
+ ARTIFACT_CREATED = "artifact.created"
55
+ ARTIFACT_UPDATED = "artifact.updated"
56
+ # approval(一等)。requested: approval_id, call_id, kind, detail;
57
+ # resolved: approval_id, call_id, decision(回放/审计)
58
+ APPROVAL_REQUESTED = "approval.requested"
59
+ APPROVAL_RESOLVED = "approval.resolved"
60
+ # run 生命周期。payload: status;progress?: progress;failed: error;canceled: cancel_result
61
+ RUN_STARTED = "run.started"
62
+ RUN_PROGRESS = "run.progress"
63
+ RUN_INTERRUPTED = "run.interrupted"
64
+ RUN_COMPLETED = "run.completed"
65
+ RUN_FAILED = "run.failed"
66
+ RUN_CANCELED = "run.canceled"
67
+ # context preprocessing. payload: phase, trigger; completed also carries cursor
68
+ CONTEXT_COMPACTION_STARTED = "context.compaction.started"
69
+ CONTEXT_COMPACTION_COMPLETED = "context.compaction.completed"
70
+ # checkpoint。payload: checkpoint_id, granularity(delta|snapshot), resume_target?
71
+ CHECKPOINT_CREATED = "checkpoint.created"
72
+ CHECKPOINT_RESUMED = "checkpoint.resumed"
73
+ # usage。payload: input_tokens, output_tokens, total_tokens, cached_tokens, reasoning_tokens
74
+ USAGE_REPORTED = "usage.reported"
75
+ # A2UI。payload: surface_id, block_id?, catalog?, data?
76
+ A2UI_SURFACE_BEGIN = "a2ui.surface.begin"
77
+ A2UI_SURFACE_UPDATE = "a2ui.surface.update"
78
+ A2UI_SURFACE_END = "a2ui.surface.end"
79
+ A2UI_INTERACTION = "a2ui.interaction"
80
+ A2UI_ACTION = "a2ui.action"
81
+ # remote A2A。payload: task_id, origin(remote agent url/space), status?, artifact?
82
+ A2A_TASK_CREATED = "a2a.task.created"
83
+ A2A_TASK_STATUS = "a2a.task.status"
84
+ A2A_TASK_ARTIFACT = "a2a.task.artifact"
85
+
86
+
87
+ #: 全部 v1 事件类型(供校验/枚举)。
88
+ ALL_EVENT_TYPES: frozenset[str] = frozenset(
89
+ {
90
+ EventType.TEXT_DELTA,
91
+ EventType.TEXT_COMPLETED,
92
+ EventType.REASONING_DELTA,
93
+ EventType.REASONING_COMPLETED,
94
+ EventType.TOOL_CALL_BEGIN,
95
+ EventType.TOOL_CALL_END,
96
+ EventType.ARTIFACT_CREATED,
97
+ EventType.ARTIFACT_UPDATED,
98
+ EventType.APPROVAL_REQUESTED,
99
+ EventType.APPROVAL_RESOLVED,
100
+ EventType.RUN_STARTED,
101
+ EventType.RUN_PROGRESS,
102
+ EventType.RUN_INTERRUPTED,
103
+ EventType.RUN_COMPLETED,
104
+ EventType.RUN_FAILED,
105
+ EventType.RUN_CANCELED,
106
+ EventType.CONTEXT_COMPACTION_STARTED,
107
+ EventType.CONTEXT_COMPACTION_COMPLETED,
108
+ EventType.CHECKPOINT_CREATED,
109
+ EventType.CHECKPOINT_RESUMED,
110
+ EventType.USAGE_REPORTED,
111
+ EventType.A2UI_SURFACE_BEGIN,
112
+ EventType.A2UI_SURFACE_UPDATE,
113
+ EventType.A2UI_SURFACE_END,
114
+ EventType.A2UI_INTERACTION,
115
+ EventType.A2UI_ACTION,
116
+ EventType.A2A_TASK_CREATED,
117
+ EventType.A2A_TASK_STATUS,
118
+ EventType.A2A_TASK_ARTIFACT,
119
+ }
120
+ )
121
+
122
+ #: 各 event_type 的 payload 必填键(conformance 用;additive —— 只允许增键)。
123
+ #: 信封字段是硬冻结;payload 必填键是 v1 最低契约,后续版本只能加可选键。
124
+ EVENT_PAYLOAD_REQUIRED_KEYS: dict[str, frozenset[str]] = {
125
+ EventType.TEXT_DELTA: frozenset({"text"}),
126
+ EventType.TEXT_COMPLETED: frozenset({"text"}),
127
+ EventType.REASONING_DELTA: frozenset({"text"}),
128
+ EventType.REASONING_COMPLETED: frozenset({"text"}),
129
+ EventType.TOOL_CALL_BEGIN: frozenset({"call_id", "name"}),
130
+ EventType.TOOL_CALL_END: frozenset({"call_id", "name"}),
131
+ EventType.ARTIFACT_CREATED: frozenset({"name", "version"}),
132
+ EventType.ARTIFACT_UPDATED: frozenset({"name", "version"}),
133
+ EventType.APPROVAL_REQUESTED: frozenset({"approval_id", "call_id", "kind"}),
134
+ EventType.APPROVAL_RESOLVED: frozenset({"approval_id", "call_id", "decision"}),
135
+ EventType.RUN_STARTED: frozenset({"status"}),
136
+ EventType.RUN_PROGRESS: frozenset({"status"}),
137
+ EventType.RUN_INTERRUPTED: frozenset({"status"}),
138
+ EventType.RUN_COMPLETED: frozenset({"status"}),
139
+ EventType.RUN_FAILED: frozenset({"status", "error"}),
140
+ EventType.RUN_CANCELED: frozenset({"status"}),
141
+ EventType.CONTEXT_COMPACTION_STARTED: frozenset({"phase", "trigger"}),
142
+ EventType.CONTEXT_COMPACTION_COMPLETED: frozenset(
143
+ {"phase", "trigger", "compacted_until_seq_id"}
144
+ ),
145
+ EventType.CHECKPOINT_CREATED: frozenset({"checkpoint_id", "granularity"}),
146
+ EventType.CHECKPOINT_RESUMED: frozenset({"checkpoint_id"}),
147
+ EventType.USAGE_REPORTED: frozenset({"input_tokens", "output_tokens", "total_tokens"}),
148
+ EventType.A2UI_SURFACE_BEGIN: frozenset({"surface_id"}),
149
+ EventType.A2UI_SURFACE_UPDATE: frozenset({"surface_id"}),
150
+ EventType.A2UI_SURFACE_END: frozenset({"surface_id"}),
151
+ EventType.A2UI_INTERACTION: frozenset({"surface_id"}),
152
+ EventType.A2UI_ACTION: frozenset({"surface_id"}),
153
+ EventType.A2A_TASK_CREATED: frozenset({"task_id", "origin"}),
154
+ EventType.A2A_TASK_STATUS: frozenset({"task_id", "origin", "status"}),
155
+ EventType.A2A_TASK_ARTIFACT: frozenset({"task_id", "origin"}),
156
+ }
157
+
158
+ #: 仅 text/reasoning 类事件使用相位字段。
159
+ _PHASE_AWARE_TYPES: frozenset[str] = frozenset(
160
+ {
161
+ EventType.TEXT_DELTA,
162
+ EventType.TEXT_COMPLETED,
163
+ EventType.REASONING_DELTA,
164
+ EventType.REASONING_COMPLETED,
165
+ }
166
+ )
167
+
168
+
169
+ class RuntimeEvent(BaseModel):
170
+ """RuntimeEvent v1 信封。
171
+
172
+ 字段全部硬冻结(additive 演进只允许新增可选字段)。``payload`` 按 event_type
173
+ 承载,最低必填键见 :data:`EVENT_PAYLOAD_REQUIRED_KEYS`。
174
+ """
175
+
176
+ schema_version: Literal[1] = SCHEMA_VERSION
177
+ event_id: str
178
+ event_type: str
179
+ timestamp: float
180
+ agent_id: str
181
+ user_id: str
182
+ session_id: str
183
+ invocation_id: str
184
+ seq_id: int
185
+ phase: Optional[Literal["commentary", "final_answer"]] = None
186
+ payload: dict[str, Any] = Field(default_factory=dict)
187
+
188
+ # ---- 构造 ----
189
+
190
+ @classmethod
191
+ def create(
192
+ cls,
193
+ event_type: str,
194
+ *,
195
+ agent_id: str,
196
+ user_id: str,
197
+ session_id: str,
198
+ invocation_id: str,
199
+ seq_id: int,
200
+ payload: Optional[dict[str, Any]] = None,
201
+ phase: Optional[str] = None,
202
+ event_id: Optional[str] = None,
203
+ timestamp: Optional[float] = None,
204
+ ) -> "RuntimeEvent":
205
+ """便捷构造:自动补 event_id / timestamp,并按 event_type 校验相位与 payload。"""
206
+ event = cls(
207
+ event_id=event_id or f"evt_{uuid.uuid4().hex}",
208
+ event_type=event_type,
209
+ timestamp=time.time() if timestamp is None else timestamp,
210
+ agent_id=agent_id,
211
+ user_id=user_id,
212
+ session_id=session_id,
213
+ invocation_id=invocation_id,
214
+ seq_id=seq_id,
215
+ phase=phase, # type: ignore[arg-type]
216
+ payload=payload or {},
217
+ )
218
+ event.validate_conformance()
219
+ return event
220
+
221
+ # ---- 序列化 ----
222
+
223
+ def to_dict(self) -> dict[str, Any]:
224
+ """序列化为 dict(含全部信封字段 + payload)。"""
225
+ return self.model_dump(mode="json", exclude_none=True)
226
+
227
+ def to_json(self) -> str:
228
+ """序列化为 JSON 字符串。"""
229
+ return self.model_dump_json(exclude_none=True)
230
+
231
+ @classmethod
232
+ def from_dict(cls, data: dict[str, Any]) -> "RuntimeEvent":
233
+ """从 dict 反序列化。与 :meth:`create` 一致过 conformance:
234
+ 未知 event_type / 相位滥用 / 缺必填键抛 ``ValueError``,不得混入系统。"""
235
+ event = cls.model_validate(data)
236
+ event.validate_conformance()
237
+ return event
238
+
239
+ @classmethod
240
+ def from_json(cls, raw: str) -> "RuntimeEvent":
241
+ """从 JSON 字符串反序列化(同 :meth:`from_dict` 过 conformance)。"""
242
+ event = cls.model_validate_json(raw)
243
+ event.validate_conformance()
244
+ return event
245
+
246
+ # ---- conformance ----
247
+
248
+ def validate_conformance(self) -> None:
249
+ """按 v1 契约校验:事件类型已知、相位仅用于 text/reasoning、payload 必填键齐全。
250
+
251
+ additive 演进:允许 payload 含额外键(不作 strict 拒绝),只校验最低必填键。
252
+ 未知 event_type / 缺必填键 / 相位滥用抛 :class:`ValueError`。
253
+ """
254
+ if self.event_type not in ALL_EVENT_TYPES:
255
+ raise ValueError(f"unknown event_type: {self.event_type!r}(v1 事件族之外)")
256
+ if self.phase is not None and self.event_type not in _PHASE_AWARE_TYPES:
257
+ raise ValueError(
258
+ f"phase 仅用于 text/reasoning 事件,{self.event_type!r} 不应带 phase={self.phase!r}"
259
+ )
260
+ required = EVENT_PAYLOAD_REQUIRED_KEYS.get(self.event_type, frozenset())
261
+ missing = required - set(self.payload.keys())
262
+ if missing:
263
+ raise ValueError(f"event_type {self.event_type!r} payload 缺必填键: {sorted(missing)}")
264
+
265
+
266
+ __all__ = [
267
+ "ALL_EVENT_TYPES",
268
+ "EVENT_PAYLOAD_REQUIRED_KEYS",
269
+ "EventPhase",
270
+ "EventType",
271
+ "RuntimeEvent",
272
+ "SCHEMA_VERSION",
273
+ ]