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,253 @@
1
+ """Evaluation adapter for immutable Studio Build artifacts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ from collections.abc import Callable
7
+ from dataclasses import dataclass
8
+ from typing import Any, Protocol
9
+
10
+ from ksadk.events.canonical import RuntimeEvent, parse_runtime_event
11
+
12
+ from .adapters import TargetAdapterError
13
+ from .contracts import (
14
+ EvalCase,
15
+ EvalRunSpec,
16
+ TargetKind,
17
+ TargetRef,
18
+ TargetRun,
19
+ TargetRunStatus,
20
+ TargetSnapshot,
21
+ ToolCallEvidence,
22
+ TraceRef,
23
+ UsageSnapshot,
24
+ )
25
+ from .evidence import EvidenceStore, project_tool_calls
26
+
27
+
28
+ class _StudioRunService(Protocol):
29
+ event_store: Any
30
+
31
+ async def run(
32
+ self,
33
+ spec: Any,
34
+ user_input: str,
35
+ *,
36
+ session_id: str,
37
+ on_event: Any = None,
38
+ ) -> Any: ...
39
+
40
+ async def events(self, run_id: str, *, after: int = 0) -> list[Any]: ...
41
+
42
+
43
+ @dataclass(frozen=True)
44
+ class StudioBuildResolution:
45
+ """Frozen Studio-owned build identity and executable run specification."""
46
+
47
+ build_id: str
48
+ agent_id: str
49
+ revision_digest: str
50
+ runtime: str
51
+ model: str | None
52
+ run_spec: Any
53
+ metadata: dict[str, Any]
54
+
55
+
56
+ class StudioBuildTargetError(TargetAdapterError):
57
+ """Classified failure resolving or executing a Studio Build."""
58
+
59
+
60
+ class StudioBuildTargetAdapter:
61
+ """Execute EvalCases through Studio's immutable Build runtime path."""
62
+
63
+ kind = TargetKind.STUDIO_BUILD
64
+
65
+ def __init__(
66
+ self,
67
+ *,
68
+ timeout_seconds: int,
69
+ resolve_build: Callable[[str], StudioBuildResolution],
70
+ run_service: _StudioRunService,
71
+ evidence_store: EvidenceStore | None = None,
72
+ ) -> None:
73
+ self._timeout_seconds = timeout_seconds
74
+ self._resolve_build = resolve_build
75
+ self._run_service = run_service
76
+ self._evidence_store = evidence_store
77
+ self._resolved: StudioBuildResolution | None = None
78
+ self._snapshot: TargetSnapshot | None = None
79
+
80
+ def _resolve(self, build_id: str) -> StudioBuildResolution:
81
+ try:
82
+ resolved = self._resolve_build(build_id)
83
+ except StudioBuildTargetError:
84
+ raise
85
+ except Exception as exc:
86
+ raise StudioBuildTargetError(
87
+ "STUDIO_BUILD_RESOLUTION_FAILED",
88
+ "Studio Build could not be resolved",
89
+ ) from exc
90
+ if resolved.build_id != build_id:
91
+ raise StudioBuildTargetError(
92
+ "STUDIO_BUILD_MISMATCH",
93
+ "Studio Build resolver returned a different immutable Build",
94
+ )
95
+ if not resolved.revision_digest or not resolved.runtime:
96
+ raise StudioBuildTargetError(
97
+ "STUDIO_BUILD_INVALID",
98
+ "Studio Build is missing immutable runtime identity",
99
+ )
100
+ return resolved
101
+
102
+ async def snapshot(self, target: TargetRef) -> TargetSnapshot:
103
+ if target.kind is not self.kind:
104
+ raise StudioBuildTargetError(
105
+ "STUDIO_BUILD_KIND_INVALID",
106
+ "Studio Build adapter received a non-Build target",
107
+ )
108
+ resolved = self._resolve(target.locator)
109
+ metadata = {
110
+ "buildId": resolved.build_id,
111
+ "agentId": resolved.agent_id,
112
+ **dict(resolved.metadata),
113
+ }
114
+ if resolved.model:
115
+ metadata["model"] = resolved.model
116
+ snapshot = TargetSnapshot(
117
+ kind=self.kind,
118
+ entrypoint=f"build:{resolved.build_id}",
119
+ revision_digest=resolved.revision_digest,
120
+ runtime=resolved.runtime,
121
+ metadata=metadata,
122
+ )
123
+ self._resolved = resolved
124
+ self._snapshot = snapshot
125
+ return snapshot
126
+
127
+ async def run_case(
128
+ self,
129
+ spec: EvalRunSpec,
130
+ case: EvalCase,
131
+ *,
132
+ attempt: int,
133
+ ) -> TargetRun:
134
+ resolved = self._resolved
135
+ snapshot = self._snapshot
136
+ if resolved is None or snapshot is None:
137
+ raise RuntimeError("Studio Build target must be snapshotted before execution")
138
+ if spec.target != snapshot:
139
+ raise RuntimeError("EvalRunSpec target does not match the Studio Build snapshot")
140
+
141
+ session_id = _scoped_id("eval-build-session", spec.id, case.id, str(attempt))
142
+ output = ""
143
+ duration_ms = 0
144
+ usage = UsageSnapshot()
145
+ trace_ref: TraceRef | None = None
146
+ trace_refs: list[TraceRef] = []
147
+ tool_calls: list[ToolCallEvidence] = []
148
+ for turn in case.turns:
149
+ record = await self._run_service.run(
150
+ resolved.run_spec,
151
+ turn.input,
152
+ session_id=session_id,
153
+ )
154
+ events = _runtime_events(await self._run_service.events(record.id))
155
+ if events:
156
+ tool_calls.extend(project_tool_calls(events))
157
+ trace_ref = _trace_ref(spec.id, record, events)
158
+ if self._evidence_store is not None and events:
159
+ persisted_ref = self._evidence_store.write_trace(
160
+ spec.id,
161
+ events,
162
+ session_id=session_id,
163
+ policy=spec.config.data_policy,
164
+ )
165
+ trace_ref = persisted_ref.model_copy(
166
+ update={"trace_id": str(getattr(record, "trace_id", "") or "") or None}
167
+ )
168
+ trace_refs.append(trace_ref)
169
+ duration_ms += max(0, int(getattr(record, "duration_ms", 0) or 0))
170
+ usage = _add_usage(usage, getattr(record, "usage", None))
171
+ status = _status_value(getattr(record, "status", ""))
172
+ if status != "COMPLETED":
173
+ error = getattr(record, "error", None) or {}
174
+ return TargetRun(
175
+ status=(
176
+ TargetRunStatus.CANCELLED
177
+ if status in {"CANCELLED", "INTERRUPTED"}
178
+ else TargetRunStatus.ERROR
179
+ ),
180
+ duration_ms=duration_ms,
181
+ usage=usage,
182
+ error_code=str(error.get("code") or "STUDIO_BUILD_RUN_FAILED"),
183
+ error_message="Studio Build runtime failed",
184
+ trace_ref=trace_ref,
185
+ trace_refs=trace_refs,
186
+ tool_calls=tool_calls,
187
+ metadata={"runtime": resolved.runtime, "turnCount": len(tool_calls)},
188
+ )
189
+ output = str(getattr(record, "output", "") or "")
190
+
191
+ return TargetRun(
192
+ status=TargetRunStatus.PASSED if output else TargetRunStatus.UNAVAILABLE,
193
+ output=output,
194
+ duration_ms=duration_ms,
195
+ usage=usage,
196
+ error_code=None if output else "STUDIO_BUILD_OUTPUT_UNAVAILABLE",
197
+ error_message=None if output else "Studio Build did not provide evaluable text output",
198
+ trace_ref=trace_ref,
199
+ trace_refs=trace_refs,
200
+ tool_calls=tool_calls,
201
+ metadata={"runtime": resolved.runtime, "turnCount": len(case.turns)},
202
+ )
203
+
204
+
205
+ def _runtime_events(stored_events: list[Any]) -> list[RuntimeEvent]:
206
+ events: list[RuntimeEvent] = []
207
+ for stored in stored_events:
208
+ data = getattr(stored, "data", None)
209
+ payload = data.get("runtimeEvent") if isinstance(data, dict) else None
210
+ if not isinstance(payload, dict):
211
+ continue
212
+ try:
213
+ events.append(parse_runtime_event(payload))
214
+ except ValueError:
215
+ continue
216
+ return sorted(events, key=lambda event: event.seq)
217
+
218
+
219
+ def _trace_ref(run_id: str, record: Any, events: list[RuntimeEvent]) -> TraceRef:
220
+ return TraceRef(
221
+ run_id=run_id,
222
+ trace_id=str(getattr(record, "trace_id", "") or "") or None,
223
+ session_id=str(getattr(record, "session_id", "") or "") or None,
224
+ invocation_id=str(getattr(record, "id", "") or "") or None,
225
+ seq_start=events[0].seq if events else None,
226
+ seq_end=events[-1].seq if events else None,
227
+ )
228
+
229
+
230
+ def _add_usage(total: UsageSnapshot, raw: Any) -> UsageSnapshot:
231
+ return UsageSnapshot(
232
+ input_tokens=total.input_tokens + max(0, int(getattr(raw, "input_tokens", 0) or 0)),
233
+ output_tokens=total.output_tokens + max(0, int(getattr(raw, "output_tokens", 0) or 0)),
234
+ total_tokens=total.total_tokens + max(0, int(getattr(raw, "total_tokens", 0) or 0)),
235
+ reported=total.reported or bool(getattr(raw, "reported", False)),
236
+ )
237
+
238
+
239
+ def _status_value(raw: Any) -> str:
240
+ value = getattr(raw, "value", raw)
241
+ return str(value or "").upper()
242
+
243
+
244
+ def _scoped_id(prefix: str, *parts: str) -> str:
245
+ payload = "\0".join(parts).encode("utf-8")
246
+ return f"{prefix}-{hashlib.sha256(payload).hexdigest()[:24]}"
247
+
248
+
249
+ __all__ = [
250
+ "StudioBuildResolution",
251
+ "StudioBuildTargetAdapter",
252
+ "StudioBuildTargetError",
253
+ ]
@@ -0,0 +1,82 @@
1
+ """Common target lifecycle shared by all evaluation adapters."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from typing import TYPE_CHECKING
7
+
8
+ from .adapters import (
9
+ EvaluationNotImplementedError,
10
+ TargetAdapter,
11
+ TargetAdapterError,
12
+ create_target_adapter,
13
+ )
14
+ from .contracts import (
15
+ EvalCase,
16
+ EvalRunSpec,
17
+ EvaluationConfig,
18
+ TargetRef,
19
+ TargetRun,
20
+ TargetRunStatus,
21
+ TargetSnapshot,
22
+ )
23
+
24
+ if TYPE_CHECKING:
25
+ from .evidence import EvidenceStore
26
+
27
+
28
+ class EvaluationExecutionError(RuntimeError):
29
+ """A classified failure from the common target execution boundary."""
30
+
31
+
32
+ class EvaluationTarget:
33
+ """Own target lifecycle; protocol details stay in the selected adapter."""
34
+
35
+ def __init__(
36
+ self,
37
+ target: TargetRef,
38
+ config: EvaluationConfig,
39
+ *,
40
+ evidence_store: EvidenceStore | None = None,
41
+ adapter: TargetAdapter | None = None,
42
+ ) -> None:
43
+ self.reference = target
44
+ self._timeout_seconds = config.timeout_seconds
45
+ self._adapter: TargetAdapter = adapter or create_target_adapter(
46
+ target, timeout_seconds=config.timeout_seconds, evidence_store=evidence_store
47
+ )
48
+
49
+ async def snapshot(self) -> TargetSnapshot:
50
+ try:
51
+ return await asyncio.wait_for(
52
+ self._adapter.snapshot(self.reference),
53
+ timeout=self._timeout_seconds,
54
+ )
55
+ except TimeoutError as exc:
56
+ raise EvaluationExecutionError(f"{self.reference.kind.value} Target 快照超时") from exc
57
+ except TargetAdapterError as exc:
58
+ raise EvaluationExecutionError(f"{exc.code}: {exc}") from exc
59
+
60
+ async def run_case(
61
+ self,
62
+ spec: EvalRunSpec,
63
+ case: EvalCase,
64
+ ) -> TargetRun:
65
+ try:
66
+ return await asyncio.wait_for(
67
+ self._adapter.run_case(spec, case, attempt=spec.attempt),
68
+ timeout=self._timeout_seconds,
69
+ )
70
+ except TimeoutError:
71
+ return TargetRun(
72
+ status=TargetRunStatus.ERROR,
73
+ error_code="EVALUATION_CASE_TIMEOUT",
74
+ error_message=f"Case {case.id} 执行超时",
75
+ )
76
+
77
+
78
+ __all__ = [
79
+ "EvaluationExecutionError",
80
+ "EvaluationNotImplementedError",
81
+ "EvaluationTarget",
82
+ ]
ksadk/events/__init__.py CHANGED
@@ -1,25 +1,25 @@
1
- """RuntimeEvent schema (goal-02)。见 :mod:`ksadk.events.runtime_event`。"""
1
+ """Canonical RuntimeEvent public API."""
2
2
 
3
- from ksadk.events.parser import RuntimeEventParser
4
- from ksadk.events.replay import replay_transcript
5
- from ksadk.events.runtime_event import (
3
+ from ksadk.events.canonical import (
6
4
  ALL_EVENT_TYPES,
7
- EVENT_PAYLOAD_REQUIRED_KEYS,
8
- SCHEMA_VERSION,
9
5
  EventPhase,
10
- EventType,
11
6
  RuntimeEvent,
7
+ dump_runtime_event,
8
+ parse_runtime_event,
12
9
  )
13
- from ksadk.events.store import RuntimeEventStore
10
+ from ksadk.events.canonical_replay import replay_projection
11
+ from ksadk.events.canonical_store import RuntimeEventStore
12
+ from ksadk.events.reducer import ProjectionPatch, RunProjection, StreamReducer
14
13
 
15
14
  __all__ = [
16
15
  "ALL_EVENT_TYPES",
17
- "EVENT_PAYLOAD_REQUIRED_KEYS",
18
16
  "EventPhase",
19
- "EventType",
17
+ "ProjectionPatch",
18
+ "RunProjection",
20
19
  "RuntimeEvent",
21
- "RuntimeEventParser",
22
20
  "RuntimeEventStore",
23
- "replay_transcript",
24
- "SCHEMA_VERSION",
21
+ "StreamReducer",
22
+ "dump_runtime_event",
23
+ "parse_runtime_event",
24
+ "replay_projection",
25
25
  ]
@@ -0,0 +1 @@
1
+ """Internal v1_compat implementation subpackage; stable API lives in ksadk.events.v1_compat."""
@@ -0,0 +1,299 @@
1
+ """v1 wire models: envelope, event-type registry, and projection context."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import time
6
+ import uuid
7
+ from dataclasses import dataclass, field
8
+ from typing import Any, Literal, Mapping, TypeAlias
9
+
10
+ from pydantic import BaseModel, ConfigDict, Field
11
+
12
+ from ksadk.events.content import ToolCallContent
13
+ from ksadk.events.reducer import ItemProjection, RunProjection
14
+
15
+ RuntimeEventV1ProjectionMode: TypeAlias = Literal["snapshot_only", "identity_replace"]
16
+
17
+
18
+ class V1ProjectionContextRequiredError(ValueError):
19
+ """Raised when a lossless v1 projection needs compat-local context."""
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class A2UISurfaceProjectionRef:
24
+ surface_id: str
25
+ catalog: str | None = None
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class A2UIInteractionProjectionRef:
30
+ surface_id: str
31
+ block_id: str | None = None
32
+
33
+
34
+ @dataclass(frozen=True)
35
+ class A2ATaskProjectionRef:
36
+ task_id: str
37
+ origin: str
38
+
39
+
40
+ @dataclass(frozen=True)
41
+ class RuntimeEventV1ProjectionContext:
42
+ """Ephemeral values absent from the canonical event envelope.
43
+
44
+ These values are supplied by the v1 read boundary. Framework adapters and
45
+ the canonical store must not manufacture or persist them for this module.
46
+ """
47
+
48
+ agent_id: str
49
+ user_id: str
50
+ session_id: str
51
+ projection: RunProjection | None
52
+ a2ui_surfaces: Mapping[tuple[str, str], A2UISurfaceProjectionRef] = field(default_factory=dict)
53
+ a2ui_interactions: Mapping[tuple[str, str], A2UIInteractionProjectionRef] = field(
54
+ default_factory=dict
55
+ )
56
+ a2a_tasks: Mapping[tuple[str, str], A2ATaskProjectionRef] = field(default_factory=dict)
57
+ artifact_versions: Mapping[tuple[str, str, str], int] = field(default_factory=dict)
58
+ compaction_phase: str = "runtime"
59
+
60
+ @classmethod
61
+ def from_projection(
62
+ cls,
63
+ projection: RunProjection | None,
64
+ *,
65
+ agent_id: str,
66
+ user_id: str,
67
+ session_id: str,
68
+ a2ui_surfaces: Mapping[tuple[str, str], A2UISurfaceProjectionRef] | None = None,
69
+ a2ui_interactions: Mapping[tuple[str, str], A2UIInteractionProjectionRef] | None = None,
70
+ a2a_tasks: Mapping[tuple[str, str], A2ATaskProjectionRef] | None = None,
71
+ artifact_versions: Mapping[tuple[str, str, str], int] | None = None,
72
+ compaction_phase: str = "runtime",
73
+ ) -> RuntimeEventV1ProjectionContext:
74
+ return cls(
75
+ agent_id=agent_id,
76
+ user_id=user_id,
77
+ session_id=session_id,
78
+ projection=projection,
79
+ a2ui_surfaces=a2ui_surfaces or {},
80
+ a2ui_interactions=a2ui_interactions or {},
81
+ a2a_tasks=a2a_tasks or {},
82
+ artifact_versions=artifact_versions or {},
83
+ compaction_phase=compaction_phase,
84
+ )
85
+
86
+ def item(self, scope_id: str, item_id: str) -> ItemProjection | None:
87
+ if self.projection is None:
88
+ return None
89
+ return next(
90
+ (
91
+ item
92
+ for item in self.projection.items
93
+ if item.scope_id == scope_id and item.item_id == item_id
94
+ ),
95
+ None,
96
+ )
97
+
98
+ def tool_name(self, scope_id: str, call_id: str) -> str:
99
+ if self.projection is None:
100
+ return ""
101
+ for item in self.projection.items:
102
+ if item.scope_id != scope_id:
103
+ continue
104
+ for part in item.parts:
105
+ if isinstance(part, ToolCallContent) and part.call_id == call_id:
106
+ return part.name
107
+ return ""
108
+
109
+ def interaction_call_id(self, scope_id: str, interaction_id: str) -> str:
110
+ if self.projection is None:
111
+ return ""
112
+ for interaction in self.projection.interactions:
113
+ if (
114
+ interaction.scope_id == scope_id
115
+ and interaction.interaction_id == interaction_id
116
+ and interaction.request.request_type == "approval"
117
+ ):
118
+ return interaction.request.call_id or ""
119
+ return ""
120
+
121
+ def artifact_version(self, scope_id: str, item_id: str, artifact_id: str) -> int:
122
+ version = self.artifact_versions.get((scope_id, item_id, artifact_id))
123
+ if isinstance(version, bool) or not isinstance(version, int) or version <= 0:
124
+ raise V1ProjectionContextRequiredError(
125
+ "artifact version must be an explicit positive integer"
126
+ )
127
+ return version
128
+
129
+
130
+ class EventTypeV1:
131
+ TEXT_DELTA = "text.delta"
132
+ TEXT_COMPLETED = "text.completed"
133
+ REASONING_DELTA = "reasoning.delta"
134
+ REASONING_COMPLETED = "reasoning.completed"
135
+ TOOL_CALL_BEGIN = "tool.call.begin"
136
+ TOOL_CALL_END = "tool.call.end"
137
+ ARTIFACT_CREATED = "artifact.created"
138
+ ARTIFACT_UPDATED = "artifact.updated"
139
+ APPROVAL_REQUESTED = "approval.requested"
140
+ APPROVAL_RESOLVED = "approval.resolved"
141
+ RUN_STARTED = "run.started"
142
+ RUN_PROGRESS = "run.progress"
143
+ RUN_INTERRUPTED = "run.interrupted"
144
+ RUN_COMPLETED = "run.completed"
145
+ RUN_FAILED = "run.failed"
146
+ RUN_CANCELED = "run.canceled"
147
+ CONTEXT_COMPACTION_STARTED = "context.compaction.started"
148
+ CONTEXT_COMPACTION_COMPLETED = "context.compaction.completed"
149
+ CHECKPOINT_CREATED = "checkpoint.created"
150
+ CHECKPOINT_RESUMED = "checkpoint.resumed"
151
+ USAGE_REPORTED = "usage.reported"
152
+ A2UI_SURFACE_BEGIN = "a2ui.surface.begin"
153
+ A2UI_SURFACE_UPDATE = "a2ui.surface.update"
154
+ A2UI_SURFACE_END = "a2ui.surface.end"
155
+ A2UI_INTERACTION = "a2ui.interaction"
156
+ A2UI_ACTION = "a2ui.action"
157
+ A2A_TASK_CREATED = "a2a.task.created"
158
+ A2A_TASK_STATUS = "a2a.task.status"
159
+ A2A_TASK_ARTIFACT = "a2a.task.artifact"
160
+
161
+
162
+ ALL_V1_EVENT_TYPES = frozenset(
163
+ value for name, value in vars(EventTypeV1).items() if name.isupper() and isinstance(value, str)
164
+ )
165
+
166
+ V1_EVENT_PAYLOAD_REQUIRED_KEYS: dict[str, frozenset[str]] = {
167
+ EventTypeV1.TEXT_DELTA: frozenset({"text"}),
168
+ EventTypeV1.TEXT_COMPLETED: frozenset({"text"}),
169
+ EventTypeV1.REASONING_DELTA: frozenset({"text"}),
170
+ EventTypeV1.REASONING_COMPLETED: frozenset({"text"}),
171
+ EventTypeV1.TOOL_CALL_BEGIN: frozenset({"call_id", "name"}),
172
+ EventTypeV1.TOOL_CALL_END: frozenset({"call_id", "name"}),
173
+ EventTypeV1.ARTIFACT_CREATED: frozenset({"name", "version"}),
174
+ EventTypeV1.ARTIFACT_UPDATED: frozenset({"name", "version"}),
175
+ EventTypeV1.APPROVAL_REQUESTED: frozenset({"approval_id", "call_id", "kind"}),
176
+ EventTypeV1.APPROVAL_RESOLVED: frozenset({"approval_id", "call_id", "decision"}),
177
+ EventTypeV1.RUN_STARTED: frozenset({"status"}),
178
+ EventTypeV1.RUN_PROGRESS: frozenset({"status"}),
179
+ EventTypeV1.RUN_INTERRUPTED: frozenset({"status"}),
180
+ EventTypeV1.RUN_COMPLETED: frozenset({"status"}),
181
+ EventTypeV1.RUN_FAILED: frozenset({"status", "error"}),
182
+ EventTypeV1.RUN_CANCELED: frozenset({"status"}),
183
+ EventTypeV1.CONTEXT_COMPACTION_STARTED: frozenset({"phase", "trigger"}),
184
+ EventTypeV1.CONTEXT_COMPACTION_COMPLETED: frozenset(
185
+ {"phase", "trigger", "compacted_until_seq_id"}
186
+ ),
187
+ EventTypeV1.CHECKPOINT_CREATED: frozenset({"checkpoint_id", "granularity"}),
188
+ EventTypeV1.CHECKPOINT_RESUMED: frozenset({"checkpoint_id"}),
189
+ EventTypeV1.USAGE_REPORTED: frozenset({"input_tokens", "output_tokens", "total_tokens"}),
190
+ EventTypeV1.A2UI_SURFACE_BEGIN: frozenset({"surface_id"}),
191
+ EventTypeV1.A2UI_SURFACE_UPDATE: frozenset({"surface_id"}),
192
+ EventTypeV1.A2UI_SURFACE_END: frozenset({"surface_id"}),
193
+ EventTypeV1.A2UI_INTERACTION: frozenset({"surface_id"}),
194
+ EventTypeV1.A2UI_ACTION: frozenset({"surface_id"}),
195
+ EventTypeV1.A2A_TASK_CREATED: frozenset({"task_id", "origin"}),
196
+ EventTypeV1.A2A_TASK_STATUS: frozenset({"task_id", "origin", "status"}),
197
+ EventTypeV1.A2A_TASK_ARTIFACT: frozenset({"task_id", "origin"}),
198
+ }
199
+
200
+ _V1_PHASE_AWARE_TYPES = frozenset(
201
+ {
202
+ EventTypeV1.TEXT_DELTA,
203
+ EventTypeV1.TEXT_COMPLETED,
204
+ EventTypeV1.REASONING_DELTA,
205
+ EventTypeV1.REASONING_COMPLETED,
206
+ }
207
+ )
208
+
209
+
210
+ class RuntimeEventV1(BaseModel):
211
+ """Frozen RuntimeEvent v1 JSON envelope."""
212
+
213
+ model_config = ConfigDict(extra="forbid")
214
+
215
+ schema_version: Literal[1] = 1
216
+ event_id: str
217
+ event_type: str
218
+ timestamp: float
219
+ agent_id: str
220
+ user_id: str
221
+ session_id: str
222
+ invocation_id: str
223
+ seq_id: int
224
+ phase: Literal["commentary", "final_answer"] | None = None
225
+ payload: dict[str, Any] = Field(default_factory=dict)
226
+
227
+ @classmethod
228
+ def create(
229
+ cls,
230
+ event_type: str,
231
+ *,
232
+ agent_id: str,
233
+ user_id: str,
234
+ session_id: str,
235
+ invocation_id: str,
236
+ seq_id: int,
237
+ payload: dict[str, Any] | None = None,
238
+ phase: str | None = None,
239
+ event_id: str | None = None,
240
+ timestamp: float | None = None,
241
+ ) -> RuntimeEventV1:
242
+ event = cls(
243
+ event_id=event_id or f"evt_{uuid.uuid4().hex}",
244
+ event_type=event_type,
245
+ timestamp=time.time() if timestamp is None else timestamp,
246
+ agent_id=agent_id,
247
+ user_id=user_id,
248
+ session_id=session_id,
249
+ invocation_id=invocation_id,
250
+ seq_id=seq_id,
251
+ phase=phase, # type: ignore[arg-type]
252
+ payload=payload or {},
253
+ )
254
+ event.validate_conformance()
255
+ return event
256
+
257
+ def validate_conformance(self) -> None:
258
+ if self.event_type not in ALL_V1_EVENT_TYPES:
259
+ raise ValueError(f"unknown event_type: {self.event_type!r} (v1 event family)")
260
+ if self.phase is not None and self.event_type not in _V1_PHASE_AWARE_TYPES:
261
+ raise ValueError(f"phase is only valid for v1 text/reasoning events: {self.event_type}")
262
+ required = V1_EVENT_PAYLOAD_REQUIRED_KEYS.get(self.event_type, frozenset())
263
+ missing = required - self.payload.keys()
264
+ if missing:
265
+ raise ValueError(
266
+ f"event_type {self.event_type!r} payload missing required keys: {sorted(missing)}"
267
+ )
268
+
269
+ def to_dict(self) -> dict[str, Any]:
270
+ return self.model_dump(mode="json", exclude_none=True)
271
+
272
+ def to_json(self) -> str:
273
+ return self.model_dump_json(exclude_none=True)
274
+
275
+ @classmethod
276
+ def from_dict(cls, data: dict[str, Any]) -> RuntimeEventV1:
277
+ event = cls.model_validate(data)
278
+ event.validate_conformance()
279
+ return event
280
+
281
+ @classmethod
282
+ def from_json(cls, raw: str) -> RuntimeEventV1:
283
+ event = cls.model_validate_json(raw)
284
+ event.validate_conformance()
285
+ return event
286
+
287
+
288
+ __all__ = [
289
+ "ALL_V1_EVENT_TYPES",
290
+ "A2ATaskProjectionRef",
291
+ "A2UIInteractionProjectionRef",
292
+ "A2UISurfaceProjectionRef",
293
+ "EventTypeV1",
294
+ "RuntimeEventV1",
295
+ "RuntimeEventV1ProjectionContext",
296
+ "RuntimeEventV1ProjectionMode",
297
+ "V1ProjectionContextRequiredError",
298
+ "V1_EVENT_PAYLOAD_REQUIRED_KEYS",
299
+ ]