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
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import json
5
+ import time
5
6
  from typing import Any, Callable, Dict, Mapping, Optional, Sequence
6
7
 
7
8
  from ksadk.conversations.reasoning_markup import strip_reasoning_markup
@@ -32,10 +33,13 @@ from ksadk.conversations.runtime_metadata import _update_session_metadata_after_
32
33
  from ksadk.conversations.runtime_observability import (
33
34
  _conversation_span_scope,
34
35
  _normalize_usage_payload,
36
+ _set_context_plan_attributes,
35
37
  _set_conversation_input_attributes,
36
38
  _set_conversation_output_attributes,
37
39
  _set_conversation_span_attributes,
38
40
  _set_conversation_usage_attributes,
41
+ _set_prompt_cache_attributes,
42
+ _set_prompt_source_attributes,
39
43
  _span_feedback_metadata,
40
44
  )
41
45
  from ksadk.conversations.runtime_persistence import (
@@ -59,6 +63,42 @@ from ksadk.runtime_context import (
59
63
  from ksadk.sessions import resolve_session_service
60
64
 
61
65
 
66
+ def _perf_monotonic() -> float:
67
+ return time.monotonic()
68
+
69
+
70
+ def _record_baseline_turn(
71
+ *,
72
+ prepared: Any,
73
+ model: str | None,
74
+ usage: Mapping[str, Any] | None,
75
+ ptl: bool,
76
+ attempts: int,
77
+ turn_start_monotonic: float | None,
78
+ ) -> None:
79
+ """env-gated 旁路采集:未启用时 no-op,启用时记录一条 turn 基线。
80
+
81
+ 只读 prepared.shadow_context_plan + usage + PTL/latency 信号,不进决策路径、不抛异常。
82
+ """
83
+ from ksadk.context_engine.baseline import record_baseline_turn
84
+
85
+ latency_ms = None
86
+ if turn_start_monotonic is not None:
87
+ latency_ms = int((time.monotonic() - turn_start_monotonic) * 1000)
88
+ record_baseline_turn(
89
+ getattr(prepared, "shadow_context_plan", None),
90
+ session_id=getattr(prepared, "session_id", ""),
91
+ invocation_id=getattr(prepared, "invocation_id", ""),
92
+ model=str(model or ""),
93
+ usage=usage,
94
+ compaction_triggered=bool(getattr(prepared, "compaction_triggered", False)),
95
+ compaction_trigger=str(getattr(prepared, "compaction_trigger", "") or ""),
96
+ prompt_too_long=ptl,
97
+ retry_attempts=attempts,
98
+ turn_latency_ms=latency_ms,
99
+ )
100
+
101
+
62
102
  async def invoke_conversation_once(
63
103
  *,
64
104
  runner: Any,
@@ -80,6 +120,9 @@ async def invoke_conversation_once(
80
120
  invocation_id: Optional[str] = None,
81
121
  session_service_provider: Callable[[], Any] | None = None,
82
122
  run_mode: str = RUN_MODE_FOREGROUND,
123
+ agent_system: str = "",
124
+ agent_task: str = "",
125
+ prompt_integration_mode: str = "",
83
126
  ) -> tuple[str, dict[str, Any]]:
84
127
  """非流式 turn 编排入口。
85
128
 
@@ -111,6 +154,11 @@ async def invoke_conversation_once(
111
154
  governance_state=governance,
112
155
  session_service_provider=provider,
113
156
  run_mode=entry_run_mode,
157
+ runner=runner,
158
+ runtime_type=_runner_type_name(runner),
159
+ agent_system=agent_system,
160
+ agent_task=agent_task,
161
+ prompt_integration_mode=prompt_integration_mode,
114
162
  )
115
163
  # prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
116
164
  run_mode = prepared.run_mode
@@ -135,6 +183,7 @@ async def invoke_conversation_once(
135
183
  user_id=user_id,
136
184
  user_input=prepared.user_input,
137
185
  )
186
+ prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
138
187
  runtime_context = PlatformInvocationContext(
139
188
  agent_id=agent_id,
140
189
  user_id=user_id,
@@ -155,9 +204,7 @@ async def invoke_conversation_once(
155
204
  model_options=prepared.model_options,
156
205
  kb_context=ambient_contexts.get("kb_context"),
157
206
  memory_context=ambient_contexts.get("memory_context"),
158
- tool_approval_mode=str(
159
- prepared.request_metadata.get("tool_approval_mode") or ""
160
- ),
207
+ tool_approval_mode=str(prepared.request_metadata.get("tool_approval_mode") or ""),
161
208
  )
162
209
  runner_name = _runner_name(runner)
163
210
  async with _conversation_span_scope(runner_name) as span:
@@ -172,7 +219,11 @@ async def invoke_conversation_once(
172
219
  response_id=response_id,
173
220
  )
174
221
  _set_conversation_input_attributes(span, prepared.user_input or prepared.user_display_input)
222
+ _set_context_plan_attributes(span, prepared.shadow_context_plan)
175
223
  trace_metadata = _span_feedback_metadata(span)
224
+ _baseline_turn_start = _perf_monotonic()
225
+ _baseline_ptl = False
226
+ _baseline_attempts = 0
176
227
  await append_run_status_event(
177
228
  session_id=prepared.session_id,
178
229
  author=runner_name,
@@ -218,6 +269,8 @@ async def invoke_conversation_once(
218
269
  raise
219
270
  except Exception as exc:
220
271
  if attempt == 0 and _is_prompt_too_long_error(exc):
272
+ _baseline_ptl = True
273
+ _baseline_attempts = attempt + 1
221
274
  try:
222
275
  checkpoint = await _compact_conversation_history_with_governance(
223
276
  governance,
@@ -230,6 +283,16 @@ async def invoke_conversation_once(
230
283
  trigger="prompt_too_long",
231
284
  keep_tail_groups=PTL_RETRY_KEEP_TAIL_GROUPS,
232
285
  session_service_provider=provider,
286
+ # PR D1:PTL 路径仍 force=True(trigger_band=emergency),
287
+ # 透传 ownership 便于未来按门控调 PTL 策略;当前行为等价。
288
+ prompt_integration_mode=getattr(
289
+ prepared, "prompt_integration_mode", ""
290
+ ),
291
+ compaction_owner=str(
292
+ (getattr(prepared, "shadow_context_plan", None) or {}).get(
293
+ "compaction_owner", ""
294
+ )
295
+ ),
233
296
  )
234
297
  except RuntimeCircuitOpen as circuit_exc:
235
298
  await append_run_status_event(
@@ -293,6 +356,21 @@ async def invoke_conversation_once(
293
356
  ) or (result_usage if result_usage else {})
294
357
  _set_conversation_output_attributes(span, output_text)
295
358
  _set_conversation_usage_attributes(span, result_usage)
359
+ _set_prompt_cache_attributes(
360
+ span,
361
+ session_id=prepared.session_id,
362
+ plan=prepared.shadow_context_plan,
363
+ usage=result_usage,
364
+ )
365
+ _set_prompt_source_attributes(span, getattr(prepared, "compiled_prompt", None))
366
+ _record_baseline_turn(
367
+ prepared=prepared,
368
+ model=model,
369
+ usage=result_usage,
370
+ ptl=_baseline_ptl,
371
+ attempts=_baseline_attempts,
372
+ turn_start_monotonic=_baseline_turn_start,
373
+ )
296
374
  result_agentengine_metadata = _extract_agentengine_metadata(result)
297
375
  assistant_metadata: dict[str, Any] = {
298
376
  **trace_metadata,
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  from contextlib import asynccontextmanager, nullcontext
4
5
  from typing import Any, Mapping, Sequence
5
6
 
@@ -94,13 +95,25 @@ def _responses_usage_payload(usage: Mapping[str, Any] | None) -> dict[str, Any]
94
95
  total_tokens = normalized.get("total_tokens", input_tokens + output_tokens)
95
96
  payload = {
96
97
  "input_tokens": input_tokens,
98
+ "input_tokens_details": {"cached_tokens": 0},
97
99
  "output_tokens": output_tokens,
100
+ "output_tokens_details": {"reasoning_tokens": 0},
98
101
  "total_tokens": total_tokens,
99
102
  }
100
- if isinstance(normalized.get("input_token_details"), Mapping):
101
- payload["input_token_details"] = dict(normalized["input_token_details"])
102
- if isinstance(normalized.get("output_token_details"), Mapping):
103
- payload["output_token_details"] = dict(normalized["output_token_details"])
103
+ input_details = normalized.get("input_token_details")
104
+ if isinstance(input_details, Mapping):
105
+ cached_tokens = input_details.get(
106
+ "cached_tokens",
107
+ input_details.get("cached", input_details.get("cache_read", 0)),
108
+ )
109
+ payload["input_tokens_details"]["cached_tokens"] = int(cached_tokens or 0)
110
+ output_details = normalized.get("output_token_details")
111
+ if isinstance(output_details, Mapping):
112
+ reasoning_tokens = output_details.get(
113
+ "reasoning_tokens",
114
+ output_details.get("reasoning", 0),
115
+ )
116
+ payload["output_tokens_details"]["reasoning_tokens"] = int(reasoning_tokens or 0)
104
117
  return payload
105
118
 
106
119
 
@@ -244,6 +257,62 @@ def _set_span_attribute(span: Any | None, key: str, value: Any) -> None:
244
257
  return
245
258
 
246
259
 
260
+ def _set_context_plan_attributes(span: Any | None, plan: Any | None) -> None:
261
+ """把 shadow ContextPlan 的统计/ownership/精度挂到 conversation span。
262
+
263
+ ``plan`` 为 None 或空时直接 return,对现有 span 无影响。只记录 hash/统计/精度,
264
+ 不落完整 Prompt/Memory/Tool 内容(方案 8.8 / 安全要求)。第一个 PR 只挂 plan_id/
265
+ policy_version/tokenizer/planned_input_tokens/integration_mode/accounting_accuracy/
266
+ tokens_by_kind(json)/stable_prefix_hash + ownership 摘要;projected/runtime_reported
267
+ 等留后续 PR。
268
+ """
269
+ if span is None or not plan:
270
+ return
271
+ if not isinstance(plan, Mapping):
272
+ return
273
+ _set_span_attribute(span, "context.plan_id", plan.get("plan_id"))
274
+ _set_span_attribute(span, "context.policy_version", plan.get("policy_version"))
275
+ _set_span_attribute(span, "context.tokenizer", plan.get("tokenizer"))
276
+ _set_span_attribute(span, "context.deployment_mode", plan.get("deployment_mode"))
277
+ _set_span_attribute(span, "context.runtime_type", plan.get("runtime_type"))
278
+ _set_span_attribute(span, "context.planned_input_tokens", plan.get("planned_input_tokens"))
279
+ # 方案 §6.3:projected/runtime_reported 贯穿 Trace(缺口 6)。projected=Adapter 实际投影给
280
+ # Runner 的;runtime_reported=Provider/Runner 回报的实际。None 表示该口径不可得(诚实标注)。
281
+ _set_span_attribute(span, "context.projected_input_tokens", plan.get("projected_input_tokens"))
282
+ _set_span_attribute(
283
+ span, "context.runtime_reported_input_tokens", plan.get("runtime_reported_input_tokens")
284
+ )
285
+ _set_span_attribute(span, "context.integration_mode", plan.get("integration_mode"))
286
+ _set_span_attribute(span, "context.accounting_accuracy", plan.get("accounting_accuracy"))
287
+ _set_span_attribute(span, "context.prompt_owner", plan.get("prompt_owner"))
288
+ _set_span_attribute(span, "context.history_owner", plan.get("history_owner"))
289
+ _set_span_attribute(span, "context.compaction_owner", plan.get("compaction_owner"))
290
+ _set_span_attribute(span, "context.memory_owner", plan.get("memory_owner"))
291
+ _set_span_attribute(span, "context.skill_owner", plan.get("skill_owner"))
292
+ # 方案 §6.3 / 缺口 7:native compaction 不可见时的统一展示规范。compaction_owner=native 且
293
+ # actual 不可见时,标 compaction_visibility=opaque,不把 planned 伪装成 actual。
294
+ compaction_owner = str(plan.get("compaction_owner") or "")
295
+ accuracy = str(plan.get("accounting_accuracy") or "")
296
+ if compaction_owner == "native" and accuracy in ("opaque", "estimated"):
297
+ _set_span_attribute(span, "context.compaction_visibility", "opaque")
298
+ _set_span_attribute(
299
+ span,
300
+ "context.compaction_note",
301
+ "native runtime 内部 compaction 不可见,仅记录平台 projection",
302
+ )
303
+ tokens_by_kind = plan.get("tokens_by_kind")
304
+ if tokens_by_kind:
305
+ try:
306
+ _set_span_attribute(
307
+ span,
308
+ "context.tokens_by_kind",
309
+ json.dumps(dict(tokens_by_kind), ensure_ascii=False),
310
+ )
311
+ except (TypeError, ValueError):
312
+ pass
313
+ _set_span_attribute(span, "context.stable_prefix_hash", plan.get("stable_prefix_hash"))
314
+
315
+
247
316
  def _set_conversation_input_attributes(span: Any | None, input_text: str | None) -> None:
248
317
  text = " ".join(str(input_text or "").split())
249
318
  if not text:
@@ -353,3 +422,87 @@ def _set_conversation_span_attributes(
353
422
  span.set_attribute("ksadk.response_id", response_id)
354
423
  except Exception:
355
424
  return
425
+
426
+
427
+ def _set_prompt_cache_attributes(
428
+ span: Any | None,
429
+ *,
430
+ session_id: str | None,
431
+ plan: Any | None,
432
+ usage: Mapping[str, Any] | None,
433
+ ) -> None:
434
+ """PR2:记录 shadow CompiledPrompt hash + Provider prompt cache 信号 + 失效诊断到 span。
435
+
436
+ ``plan`` 为 ``PreparedConversationTurn.shadow_context_plan``(plain dict)。``usage`` 为
437
+ Runtime 返回的 normalized usage。诊断用进程内 best-effort registry 记录上一稳定前缀,
438
+ pod 重启后清空,精度如实标注。只记录 hash/usage/break reason,不落完整 Prompt(安全要求)。
439
+ plan/usage 缺失时 no-op,对现有 span 无影响。
440
+ """
441
+ if span is None or not isinstance(plan, Mapping):
442
+ return
443
+ from ksadk.context_engine.cache_observability import (
444
+ diagnose_cache_break,
445
+ get_default_cache_break_registry,
446
+ )
447
+
448
+ stable_prefix_hash = str(
449
+ plan.get("prompt_stable_prefix_hash") or plan.get("stable_prefix_hash") or ""
450
+ )
451
+ accounting_accuracy = str(plan.get("accounting_accuracy") or "opaque")
452
+ _set_span_attribute(span, "prompt.content_hash", plan.get("prompt_content_hash"))
453
+ _set_span_attribute(span, "prompt.stable_prefix_hash", stable_prefix_hash or None)
454
+ section_hashes = plan.get("prompt_section_hashes")
455
+ if isinstance(section_hashes, Mapping) and section_hashes:
456
+ _set_span_attribute(span, "prompt.section_count", len(section_hashes))
457
+
458
+ registry = get_default_cache_break_registry()
459
+ previous_hash = registry.previous(session_id) if session_id else None
460
+ diagnosis = diagnose_cache_break(
461
+ stable_prefix_hash=stable_prefix_hash,
462
+ previous_stable_prefix_hash=previous_hash,
463
+ usage=usage,
464
+ accounting_accuracy=accounting_accuracy, # type: ignore[arg-type]
465
+ )
466
+ _set_span_attribute(span, "prompt.cache.read_input_tokens", diagnosis.cache_read_tokens or None)
467
+ _set_span_attribute(
468
+ span, "prompt.cache.creation_input_tokens", diagnosis.cache_creation_tokens or None
469
+ )
470
+ _set_span_attribute(
471
+ span, "prompt.cache.expected_invalidation", diagnosis.expected_invalidation or None
472
+ )
473
+ _set_span_attribute(span, "prompt.cache.unexpected_break", diagnosis.unexpected_break or None)
474
+ _set_span_attribute(span, "prompt.cache.break_reason", diagnosis.break_reason or None)
475
+ _set_span_attribute(span, "prompt.cache.status", diagnosis.status)
476
+ # 记录本轮稳定前缀供下一轮诊断(best-effort,进程内)。
477
+ if session_id and stable_prefix_hash:
478
+ registry.record(session_id, stable_prefix_hash)
479
+
480
+
481
+ def _set_prompt_source_attributes(span: Any | None, compiled_prompt: Any | None) -> None:
482
+ """PR A:记录真实 CompiledPrompt 的 source hash/version/section count 到 span。
483
+
484
+ ``compiled_prompt`` 为 ``PreparedConversationTurn.compiled_prompt``(plain dict,agent_system/
485
+ agent_task 非空时由 ResolvedPromptSources 编译)。None 时 no-op。只记 hash/version/count,
486
+ 不记 Prompt 正文(安全要求)。
487
+ """
488
+ if span is None or not isinstance(compiled_prompt, Mapping):
489
+ return
490
+ section_hashes = compiled_prompt.get("prompt_section_hashes")
491
+ if isinstance(section_hashes, Mapping) and section_hashes:
492
+ _set_span_attribute(
493
+ span, "prompt.source.agent_system_hash", section_hashes.get("agent_identity")
494
+ )
495
+ _set_span_attribute(
496
+ span, "prompt.source.agent_task_hash", section_hashes.get("agent_policy")
497
+ )
498
+ _set_span_attribute(span, "prompt.source.section_count", len(section_hashes))
499
+ _set_span_attribute(
500
+ span,
501
+ "prompt.source.platform_policy_version",
502
+ compiled_prompt.get("prompt_platform_policy_version"),
503
+ )
504
+ _set_span_attribute(
505
+ span,
506
+ "prompt.source.resolved_sources_version",
507
+ compiled_prompt.get("prompt_resolved_sources_version"),
508
+ )
@@ -55,6 +55,42 @@ class PreparedConversationTurn:
55
55
  request_history: list[dict[str, str]] = field(default_factory=list)
56
56
  request_responses_history: list[dict[str, Any]] = field(default_factory=list)
57
57
  responses_history: list[dict[str, Any]] = field(default_factory=list)
58
+ # shadow ContextPlan 的 plain dict 投影(P0 可观测基线)。
59
+ # 仅用启发式 tokenizer 按 kind 累加 tokens_by_kind + 标注 ownership/精度,
60
+ # 不进任何决策路径、不进 runner payload。None 表示尚未生成(resume 旁路也会填最小值)。
61
+ shadow_context_plan: dict[str, Any] | None = None
62
+ # PR A:真实 CompiledPrompt 的 plain dict 投影(agent_system/agent_task 非空时由
63
+ # ResolvedPromptSources 编译)。仅用于 hash/trace/future projection,不进 Runner payload。
64
+ # None=instructions-only 回退(canonical 路径无 agent_system/agent_task,或 resume 旁路)。
65
+ compiled_prompt: dict[str, Any] | None = None
66
+ # PR B:per-Build 接管标记。非空("ksadk_hosted")表示本 turn 由 ksadk 编译并接管
67
+ # Runner 的 instructions(仅 prompt_owner=ksadk + ksadk_hosted LangGraph 满足)。
68
+ # 默认空=framework 拥有,Runner 输入与旧逻辑一致。
69
+ prompt_integration_mode: str = ""
70
+ # PR D2:最新 checkpoint 的 WorkingState 审计 dict(仅 ksadk_hosted 路径填充)。
71
+ # 含 current_goal/active_files/pending_tools/pending_approvals/source_seq_range/content_hash。
72
+ # 用于门控重注入 Runner payload(非门控为 None,零注入)。
73
+ working_state: dict[str, Any] | None = None
74
+ # PR E:真实 ContextPlan 与组装输入(仅 ksadk_hosted + KSADK_CONTEXT_ENGINE_V2_ENABLED 时
75
+ # 由 hosted_pipeline 生成)。``context_plan`` 是 ``ContextPlan`` 的 plain dict 投影(含
76
+ # selected/decisions/budget),``assembled_input`` 是 AssembledInput 的 plain dict
77
+ memory_recall_events: list[dict[str, Any]] = field(default_factory=list)
78
+ # 平台 Memory Provider 的本轮召回结果。native runtime 由 Adapter 投影,
79
+ # framework/hosted 路径可继续通过 canonical payload 消费。
80
+ memory_context: dict[str, Any] | None = None
81
+ # (system + messages)。二者都进 trace 与 runner payload 接管;非门控为 None,零影响。
82
+ context_plan: dict[str, Any] | None = None
83
+ assembled_input: dict[str, Any] | None = None
84
+ # 可信 Principal,供平台 Memory 写入与召回使用。不能用 session_id 代替 user scope。
85
+ user_id: str = ""
86
+ agent_id: str = ""
87
+ # AgentVersion 级 Memory 写入灰度。None=旧环境策略;off/shadow=不写;enabled=写入。
88
+ memory_write_rollout: str | None = None
89
+ memory_enabled: bool | None = None
90
+ memory_recall_enabled: bool | None = None
91
+ memory_write_mode: str = "candidate"
92
+ flush_before_compaction: bool = True
93
+ provider_ref: str = "local-default"
58
94
 
59
95
 
60
96
  @dataclass
@@ -76,6 +112,12 @@ class CompactionPlan:
76
112
  compacted_until_seq_id: int | None = None
77
113
  pinned_group_indexes: list[int] = field(default_factory=list)
78
114
  pinned_state: dict[str, Any] = field(default_factory=dict)
115
+ # PR D1:双阈值(仅 ksadk_hosted 路径填充)。非门控路径为 None。
116
+ # trigger_band:"" / "none" / "soft" / "hard" / "emergency"。empty=非门控走旧单阈值;
117
+ # "emergency"=PTL force。soft/hard 用于 proactive 整理 vs 强制压缩区分。
118
+ soft_limit_tokens: int | None = None
119
+ hard_limit_tokens: int | None = None
120
+ trigger_band: str = ""
79
121
 
80
122
 
81
123
  def build_responses_payload(