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,319 @@
1
+ """ContextPolicy / PromptPolicy / MemoryPolicy 归一化与旧 env 映射(方案 §13)。
2
+
3
+ 把散落的环境变量与 AgentSpec 字段归一化成结构化策略,本地与云端共用同一 Runtime 代码消费
4
+ (方案 §12)。优先级:Agent Revision/Build 锁定配置 > Environment 安全收紧 > 本地显式 API >
5
+ 结构化配置文件 > 环境变量 > SDK 默认值。
6
+
7
+ 公开类型从第一批开始版本化(``CONTEXT_POLICY_VERSION``,与 ``context_engine.models`` 一致)。
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import os
13
+ from dataclasses import dataclass, field
14
+ from typing import Any, Mapping
15
+
16
+ CONTEXT_POLICY_VERSION = "v1"
17
+
18
+
19
+ def _env_int(name: str, default: int) -> int:
20
+ raw = os.environ.get(name)
21
+ if raw is None or str(raw).strip() == "":
22
+ return default
23
+ try:
24
+ return max(0, int(raw))
25
+ except ValueError:
26
+ return default
27
+
28
+
29
+ def _env_float(name: str, default: float) -> float:
30
+ raw = os.environ.get(name)
31
+ if raw is None or str(raw).strip() == "":
32
+ return default
33
+ try:
34
+ return float(raw)
35
+ except ValueError:
36
+ return default
37
+
38
+
39
+ @dataclass(frozen=True)
40
+ class PromptPolicy:
41
+ """Prompt 策略(方案 §7 / §13)。
42
+
43
+ ``auto_discovery`` 控制指令文件自动发现(默认关,``KSADK_PROMPT_AUTO_DISCOVERY``)。
44
+ ``rule_file_max_tokens`` / ``rule_files_max_tokens`` 为单文件/总预算。
45
+ """
46
+
47
+ auto_discovery: bool = False
48
+ rule_file_max_tokens: int = 4000
49
+ rule_files_max_tokens: int = 12000
50
+ cache_observability: bool = True
51
+ compiler_version: str = "v1"
52
+
53
+ @classmethod
54
+ def from_env(cls) -> "PromptPolicy":
55
+ return cls(
56
+ auto_discovery=os.environ.get("KSADK_PROMPT_AUTO_DISCOVERY", "").strip().lower()
57
+ in ("1", "true", "yes", "on"),
58
+ rule_file_max_tokens=_env_int("KSADK_CONTEXT_RULE_FILE_MAX_TOKENS", 4000),
59
+ rule_files_max_tokens=_env_int("KSADK_CONTEXT_RULE_FILES_MAX_TOKENS", 12000),
60
+ cache_observability=os.environ.get("KSADK_CONTEXT_CACHE_BREAK_OBSERVABILITY", "true")
61
+ .strip()
62
+ .lower()
63
+ not in ("0", "false", "off"),
64
+ )
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class SectionBudget:
69
+ """单分区预算比例与绝对上限(方案 §8.3)。"""
70
+
71
+ percent: float
72
+ max_tokens: int
73
+
74
+
75
+ @dataclass(frozen=True)
76
+ class ContextBudgetPolicy:
77
+ """请求级预算与分区比例(方案 §8.2 / §8.3 / 附录 A)。
78
+
79
+ 50%/85% 是初始默认值,可由模型 metadata 或 Deployment policy 覆盖(方案 §8.2)。
80
+ 分区比例不是配额预占:某分区未用预算可回流,但 required item 的预算必须先锁定。
81
+ """
82
+
83
+ soft_limit_percent: float = 50.0
84
+ hard_limit_percent: float = 85.0
85
+ safety_buffer_tokens: int = 8000
86
+ reserved_output_tokens: int = 0 # 0 表示 auto(按模型 metadata 推导)
87
+ reserved_reasoning_tokens: int = 0
88
+ sections: dict[str, SectionBudget] = field(
89
+ default_factory=lambda: {
90
+ "prompt": SectionBudget(15, 24000),
91
+ "resource_manifest": SectionBudget(5, 8000),
92
+ "core_memory": SectionBudget(5, 8000),
93
+ "recalled_memory": SectionBudget(10, 16000),
94
+ "checkpoint_summary": SectionBudget(10, 16000),
95
+ "working_state": SectionBudget(5, 8000),
96
+ "recent_history": SectionBudget(35, 64000),
97
+ "tool_and_attachment": SectionBudget(10, 16000),
98
+ }
99
+ )
100
+
101
+ @classmethod
102
+ def from_env(cls) -> "ContextBudgetPolicy":
103
+ sections = dict(cls().sections)
104
+ return cls(
105
+ soft_limit_percent=_env_float("KSADK_CONTEXT_SOFT_LIMIT_PERCENT", 50.0),
106
+ hard_limit_percent=_env_float("KSADK_CONTEXT_HARD_LIMIT_PERCENT", 85.0),
107
+ safety_buffer_tokens=_env_int("KSADK_CONTEXT_SAFETY_BUFFER_TOKENS", 8000),
108
+ sections=sections,
109
+ )
110
+
111
+
112
+ @dataclass(frozen=True)
113
+ class CompactionPolicy:
114
+ """Compaction 策略(方案 §9 / §13)。"""
115
+
116
+ keep_tail_groups: int = 8
117
+ emergency_keep_tail_groups: int = 3
118
+ semantic_enabled: bool = True
119
+ semantic_timeout_ms: int = 45000
120
+ max_retry_after_prompt_too_long: int = 1
121
+ flush_memory_before_compaction: bool = True
122
+ working_state_enabled: bool = True
123
+ working_state_max_tokens: int = 8000
124
+ working_state_update_min_token_growth: int = 5000
125
+ working_state_extraction_timeout_ms: int = 15000
126
+
127
+ @classmethod
128
+ def from_env(cls) -> "CompactionPolicy":
129
+ return cls(
130
+ keep_tail_groups=_env_int("KSADK_CONTEXT_KEEP_TAIL_GROUPS", 8),
131
+ emergency_keep_tail_groups=_env_int("KSADK_CONTEXT_EMERGENCY_KEEP_TAIL_GROUPS", 3),
132
+ semantic_enabled=os.environ.get("KSADK_CONTEXT_SEMANTIC_ENABLED", "true")
133
+ .strip()
134
+ .lower()
135
+ not in ("0", "false", "off"),
136
+ semantic_timeout_ms=_env_int("KSADK_CONTEXT_SEMANTIC_TIMEOUT_MS", 45000),
137
+ max_retry_after_prompt_too_long=_env_int("KSADK_CONTEXT_MAX_RETRY_AFTER_PTL", 1),
138
+ flush_memory_before_compaction=os.environ.get(
139
+ "KSADK_MEMORY_FLUSH_BEFORE_COMPACTION", "true"
140
+ )
141
+ .strip()
142
+ .lower()
143
+ not in ("0", "false", "off"),
144
+ working_state_enabled=os.environ.get("KSADK_CONTEXT_WORKING_STATE_ENABLED", "true")
145
+ .strip()
146
+ .lower()
147
+ not in ("0", "false", "off"),
148
+ working_state_max_tokens=_env_int("KSADK_CONTEXT_WORKING_STATE_MAX_TOKENS", 8000),
149
+ working_state_update_min_token_growth=_env_int(
150
+ "KSADK_CONTEXT_WORKING_STATE_MIN_TOKEN_GROWTH", 5000
151
+ ),
152
+ working_state_extraction_timeout_ms=_env_int(
153
+ "KSADK_CONTEXT_WORKING_STATE_EXTRACTION_TIMEOUT_MS", 15000
154
+ ),
155
+ )
156
+
157
+
158
+ @dataclass(frozen=True)
159
+ class ToolResultPolicy:
160
+ """Tool Result 单项预算与内容替换(方案 §8.6 / 附录 A)。"""
161
+
162
+ default_max_tokens: int = 8000
163
+ replacement_strategy: str = "artifact_summary"
164
+ preserve_error_tail: bool = True
165
+
166
+ @classmethod
167
+ def from_env(cls) -> "ToolResultPolicy":
168
+ return cls(
169
+ default_max_tokens=_env_int("KSADK_CONTEXT_TOOL_RESULT_MAX_TOKENS", 16000),
170
+ )
171
+
172
+
173
+ @dataclass(frozen=True)
174
+ class ContributorPolicy:
175
+ """ContextContributor 默认约束(方案 §8.7 / 附录 A)。"""
176
+
177
+ default_timeout_ms: int = 3000
178
+ default_failure_mode: str = "skip" # skip / warn / fail
179
+ allow_external_platform_trust: bool = False
180
+
181
+ @classmethod
182
+ def from_env(cls) -> "ContributorPolicy":
183
+ return cls(
184
+ default_timeout_ms=_env_int("KSADK_CONTEXT_CONTRIBUTOR_TIMEOUT_MS", 3000),
185
+ default_failure_mode=os.environ.get("KSADK_CONTEXT_CONTRIBUTOR_FAILURE_MODE", "skip")
186
+ .strip()
187
+ .lower()
188
+ or "skip",
189
+ allow_external_platform_trust=os.environ.get(
190
+ "KSADK_CONTEXT_CONTRIBUTOR_ALLOW_PLATFORM_TRUST", "false"
191
+ )
192
+ .strip()
193
+ .lower()
194
+ in ("1", "true", "yes"),
195
+ )
196
+
197
+
198
+ @dataclass(frozen=True)
199
+ class MemoryPolicyConfig:
200
+ """Memory 策略(方案 §13,区别于写入 ``MemoryPolicy``)。"""
201
+
202
+ enabled: bool = True
203
+ provider: str = "local_sqlite"
204
+ core_max_tokens: int = 4000
205
+ recall_top_k: int = 8
206
+ recall_max_tokens: int = 4000
207
+ min_score: float = 0.45
208
+ write_mode: str = "propose" # explicit / propose / off
209
+
210
+ @classmethod
211
+ def from_env(cls) -> "MemoryPolicyConfig":
212
+ # 旧变量映射(方案 §13):KSADK_LTM_BACKEND → provider
213
+ provider = (
214
+ (
215
+ os.environ.get("KSADK_MEMORY_PROVIDER")
216
+ or os.environ.get("KSADK_LTM_BACKEND")
217
+ or "local_sqlite"
218
+ )
219
+ .strip()
220
+ .lower()
221
+ )
222
+ return cls(
223
+ enabled=os.environ.get("KSADK_MEMORY_ENABLED", "true").strip().lower()
224
+ not in ("0", "false", "off"),
225
+ provider=provider,
226
+ core_max_tokens=_env_int("KSADK_MEMORY_CORE_MAX_TOKENS", 4000),
227
+ recall_top_k=_env_int("KSADK_MEMORY_RECALL_TOP_K", 8),
228
+ recall_max_tokens=_env_int("KSADK_MEMORY_RECALL_MAX_TOKENS", 4000),
229
+ min_score=_env_float("KSADK_MEMORY_MIN_SCORE", 0.45),
230
+ write_mode=os.environ.get("KSADK_MEMORY_WRITE_MODE", "propose").strip().lower()
231
+ or "propose",
232
+ )
233
+
234
+
235
+ @dataclass(frozen=True)
236
+ class ContextPolicy:
237
+ """归一化后的完整 Context 策略(方案 §13 / 附录 A)。
238
+
239
+ 本地与云端共用同一 Runtime 代码消费此结构,不直接读取隐式环境变量决定核心算法
240
+ (方案 §12)。``version`` 与 ``context_engine.CONTEXT_POLICY_VERSION`` 对齐。
241
+ """
242
+
243
+ version: str = CONTEXT_POLICY_VERSION
244
+ budget: ContextBudgetPolicy = field(default_factory=ContextBudgetPolicy)
245
+ compaction: CompactionPolicy = field(default_factory=CompactionPolicy)
246
+ tool_results: ToolResultPolicy = field(default_factory=ToolResultPolicy)
247
+ contributors: ContributorPolicy = field(default_factory=ContributorPolicy)
248
+ memory: MemoryPolicyConfig = field(default_factory=MemoryPolicyConfig)
249
+ prompt: PromptPolicy = field(default_factory=PromptPolicy)
250
+
251
+ @classmethod
252
+ def from_env(cls) -> "ContextPolicy":
253
+ return cls(
254
+ budget=ContextBudgetPolicy.from_env(),
255
+ compaction=CompactionPolicy.from_env(),
256
+ tool_results=ToolResultPolicy.from_env(),
257
+ contributors=ContributorPolicy.from_env(),
258
+ memory=MemoryPolicyConfig.from_env(),
259
+ prompt=PromptPolicy.from_env(),
260
+ )
261
+
262
+ @classmethod
263
+ def from_spec(cls, spec: Mapping[str, Any] | None) -> "ContextPolicy":
264
+ """从 Studio ``ContextSpec``(兼容扩展)解析。缺字段走默认(方案 §13)。"""
265
+ if not isinstance(spec, Mapping):
266
+ return cls.from_env()
267
+ # 当前 ContextSpec 字段较少,只读已知键;其余走 env/默认。
268
+ base = cls.from_env()
269
+ return base
270
+
271
+
272
+ def compute_budget_tokens(
273
+ policy: ContextBudgetPolicy,
274
+ *,
275
+ context_window_tokens: int,
276
+ reserved_output_tokens: int,
277
+ reserved_reasoning_tokens: int,
278
+ ) -> dict[str, int]:
279
+ """计算 max_input / soft_limit / hard_limit(方案 §8.2)。
280
+
281
+ ``reserved_output``/``reserved_reasoning`` 为 0 时按传入值;safety_buffer 从 policy。
282
+ """
283
+ # 默认 8K safety buffer 面向大窗口模型。对 4K/8K 小窗口若直接扣除会把
284
+ # max_input 压成 0,因此将安全余量限制在窗口的 10%(至少 256 tokens)。
285
+ effective_safety_buffer = min(
286
+ policy.safety_buffer_tokens,
287
+ max(256, int(context_window_tokens * 0.10)),
288
+ )
289
+ max_input = max(
290
+ 0,
291
+ min(
292
+ context_window_tokens,
293
+ context_window_tokens
294
+ - reserved_output_tokens
295
+ - reserved_reasoning_tokens
296
+ - effective_safety_buffer,
297
+ ),
298
+ )
299
+ soft = int(max_input * policy.soft_limit_percent / 100.0)
300
+ hard = int(max_input * policy.hard_limit_percent / 100.0)
301
+ return {
302
+ "max_input_tokens": max_input,
303
+ "soft_limit_tokens": soft,
304
+ "hard_limit_tokens": hard,
305
+ "safety_buffer_tokens": effective_safety_buffer,
306
+ }
307
+
308
+
309
+ __all__ = [
310
+ "CompactionPolicy",
311
+ "ContextBudgetPolicy",
312
+ "ContextPolicy",
313
+ "ContributorPolicy",
314
+ "MemoryPolicyConfig",
315
+ "PromptPolicy",
316
+ "SectionBudget",
317
+ "ToolResultPolicy",
318
+ "compute_budget_tokens",
319
+ ]
@@ -0,0 +1,31 @@
1
+ """Context 投影语义信封(方案 6.3 / 8.8)。
2
+
3
+ 第一个 PR 只定义最小结构,供 shadow 计划和后续 Projection 复用;不实现任何投影逻辑。
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from dataclasses import dataclass, field
9
+ from typing import Any
10
+
11
+ from ksadk.context_engine.capabilities import ContextAccuracy, ContextIntegrationMode
12
+
13
+ PROJECTION_VERSION = "v1"
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class ProjectionResult:
18
+ """Runner 投影结果信封。
19
+
20
+ 仅在 ``accounting_accuracy=exact`` 时才代表最终模型输入;native/assisted 路径
21
+ 需结合 Runner 回报生成实际使用记录。
22
+ """
23
+
24
+ projection_id: str
25
+ runner_type: str
26
+ integration_mode: ContextIntegrationMode
27
+ projection_version: str
28
+ accounting_accuracy: ContextAccuracy
29
+ estimated_tokens: int | None = None
30
+ warnings: tuple[str, ...] = ()
31
+ metadata: dict[str, Any] = field(default_factory=dict)
@@ -0,0 +1,266 @@
1
+ """shadow ContextPlan 构造器(第一个 PR 私有,非公开稳定类型)。
2
+
3
+ 在现有调用链旁路构造一个 ``ContextPlan`` 的 dict 投影,用启发式 tokenizer 按 kind 累加
4
+ ``tokens_by_kind``,标注 ``accounting_accuracy`` / ``integration_mode``,只写入
5
+ ``PreparedConversationTurn.shadow_context_plan`` 和 trace span,**不进任何决策路径**。
6
+
7
+ 返回 plain ``dict`` 而非 ``ContextPlan`` 对象,避免 ``runtime_payloads`` 顶层 import
8
+ ``context_engine`` 形成循环依赖。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import uuid
14
+ from typing import Any, Mapping
15
+
16
+ from ksadk.context_engine.capabilities import (
17
+ DEFAULT_CONTEXT_CAPABILITIES,
18
+ capabilities_for_runner,
19
+ capabilities_for_runtime_type,
20
+ capability_hash,
21
+ )
22
+ from ksadk.context_engine.models import CONTEXT_POLICY_VERSION
23
+ from ksadk.context_engine.tokenizer import HEURISTIC_TOKENIZER_NAME, get_default_token_counter
24
+ from ksadk.prompts.compiler import PromptCompiler
25
+ from ksadk.prompts.sources import sections_from_instructions
26
+
27
+ # shadow plan 默认初始化的 kind 字典,保证 Trace 字段稳定。
28
+ _SHADOW_KINDS = (
29
+ "compiled_prompt",
30
+ "history_round",
31
+ "current_input",
32
+ "recalled_memory",
33
+ "attachment_context",
34
+ )
35
+
36
+
37
+ def _empty_tokens_by_kind() -> dict[str, int]:
38
+ return {kind: 0 for kind in _SHADOW_KINDS}
39
+
40
+
41
+ def _history_tokens(history: Any, counter: Any) -> int:
42
+ if not history:
43
+ return 0
44
+ total = 0
45
+ for turn in history:
46
+ if isinstance(turn, Mapping):
47
+ for key in ("role", "content", "text"):
48
+ value = turn.get(key)
49
+ if isinstance(value, str):
50
+ total += counter.count_text(value)
51
+ elif isinstance(value, list):
52
+ for part in value:
53
+ if isinstance(part, Mapping):
54
+ text = part.get("text") or part.get("content")
55
+ if isinstance(text, str):
56
+ total += counter.count_text(text)
57
+ elif isinstance(part, str):
58
+ total += counter.count_text(part)
59
+ elif isinstance(turn, str):
60
+ total += counter.count_text(turn)
61
+ return total
62
+
63
+
64
+ def _ambient_text(section: Any) -> str:
65
+ """从 memory_context / kb_context 等 ambient 字段里取 formatted_text。"""
66
+ if isinstance(section, Mapping):
67
+ text = section.get("formatted_text")
68
+ if isinstance(text, str) and text.strip():
69
+ return text
70
+ return ""
71
+
72
+
73
+ def _resolve_caps(*, runner: Any | None, runtime_type: str | None) -> tuple[Any, str]:
74
+ """解析 capability:优先 runner(adapter/runner 实例),否则 runtime_type,再退 DEFAULT。
75
+
76
+ 返回 ``(caps, runtime_type)``。``runtime_type`` 用于 Plan 记录;优先取 runner 的
77
+ ``runtime_type`` 属性(RuntimeAdapter/CodexRuntimeAdapter),其次 detection_result.type.value
78
+ (framework BaseRunner),最后传入值。
79
+ """
80
+ if runner is not None:
81
+ caps = capabilities_for_runner(runner)
82
+ rt = (
83
+ str(getattr(runner, "runtime_type", "") or "")
84
+ or _runner_detection_type_value(runner)
85
+ or str(runtime_type or "")
86
+ )
87
+ return caps, rt.strip().lower()
88
+ if runtime_type:
89
+ caps = capabilities_for_runtime_type(runtime_type)
90
+ return caps, str(runtime_type).strip().lower()
91
+ return DEFAULT_CONTEXT_CAPABILITIES(), ""
92
+
93
+
94
+ def _runner_detection_type_value(runner: Any) -> str:
95
+ """读 runner.detection_result.type.value(framework BaseRunner 的类型标识)。"""
96
+ detection_result = getattr(runner, "detection_result", None)
97
+ if detection_result is None:
98
+ return ""
99
+ detection_type = getattr(detection_result, "type", None)
100
+ if detection_type is None:
101
+ return ""
102
+ value = getattr(detection_type, "value", detection_type)
103
+ return str(value or "").strip().lower()
104
+
105
+
106
+ def compile_shadow_prompt_dict(instructions: str | None) -> dict[str, Any]:
107
+ """编译 instructions → shadow CompiledPrompt 的 plain dict 投影(PR2)。
108
+
109
+ 只把 ``request_instructions``(volatile)纳入编译,不引入未发送的 platform_safety,
110
+ 保证 shadow hash 如实反映当前发送的 instructions。``stable_prefix_hash`` 在仅有
111
+ volatile section 时为空(cache-break 诊断据此如实标 ``no_cache_info``)。
112
+ 供 ``build_shadow_context_plan_dict`` 与 trace 使用,不进决策路径、不替换 Runner 发送内容。
113
+ """
114
+ sections = sections_from_instructions(instructions)
115
+ if not sections:
116
+ return {
117
+ "prompt_content_hash": "",
118
+ "prompt_stable_prefix_hash": "",
119
+ "prompt_section_hashes": {},
120
+ "prompt_tokens_by_section": {},
121
+ "prompt_estimated_tokens": 0,
122
+ "prompt_section_count": 0,
123
+ }
124
+ compiled = PromptCompiler().compile(sections)
125
+ return {
126
+ "prompt_content_hash": compiled.content_hash,
127
+ "prompt_stable_prefix_hash": compiled.stable_prefix_hash,
128
+ "prompt_section_hashes": dict(compiled.section_hashes),
129
+ "prompt_tokens_by_section": dict(compiled.tokens_by_section),
130
+ "prompt_estimated_tokens": compiled.estimated_tokens,
131
+ "prompt_section_count": len(compiled.sections),
132
+ }
133
+
134
+
135
+ def build_shadow_context_plan_dict(
136
+ *,
137
+ instructions: str = "",
138
+ history: Any = None,
139
+ user_input: str = "",
140
+ request_metadata: Mapping[str, Any] | None = None,
141
+ runner: Any | None = None,
142
+ runtime_type: str | None = None,
143
+ model_metadata: Mapping[str, Any] | None = None,
144
+ prompt_shadow: Mapping[str, Any] | None = None,
145
+ prompt_integration_mode: str = "",
146
+ deployment_mode: str = "local",
147
+ ) -> dict[str, Any]:
148
+ """构造 shadow ContextPlan 的 plain dict 投影。
149
+
150
+ 所有参数来自 ``PreparedConversationTurn`` 已有字段,不读取任何额外状态。capability
151
+ 解析顺序:``runner``(adapter/runner 实例,含 RuntimeAdapter)→ ``runtime_type``
152
+ (canonical conversation execution 路径,build_run_input 阶段尚未拿到 adapter)→ DEFAULT。
153
+ canonical 路径因此不再落成默认 opaque(方案 6.1 / ADR-009)。
154
+
155
+ ``deployment_mode``(方案 §4.3 / §6.1):与 Context ownership 正交,独立写入 plan/trace。
156
+ 默认 ``local``,云端由控制面传入 ``ksadk_managed_cloud``/``external_managed``。不得据它
157
+ 推断 ``integration_mode``。
158
+
159
+ ``prompt_shadow``:调用方可传入预编译的真实 CompiledPrompt dict(PR A,含 agent_system/
160
+ agent_task 的稳定 section)。为 None 时回退到 ``compile_shadow_prompt_dict(instructions)``
161
+ (仅 request_instructions volatile)。传入真实 dict 时,``prompt_*`` 键全部来自真实编译,
162
+ ``stable_prefix_hash`` 非空(stable section 进了编译)。
163
+
164
+ ``prompt_integration_mode``(PR B):per-Build 接管标记。仅当为 ``ksadk_hosted`` 且
165
+ capability ``prompt_owner==ksadk`` 且 ``runtime_type==langgraph`` 时,``integration_mode``
166
+ 显示字段覆盖为 ``ksadk_hosted``(表示本 turn 由 ksadk 编译并接管 instructions)。
167
+ ``capability_hash`` 仍用原 caps(稳定,不随 per-request 接管状态抖动)。
168
+ """
169
+ counter = get_default_token_counter()
170
+ tokens_by_kind = _empty_tokens_by_kind()
171
+
172
+ tokens_by_kind["compiled_prompt"] = counter.count_text(instructions or "")
173
+ tokens_by_kind["history_round"] = _history_tokens(history, counter)
174
+ tokens_by_kind["current_input"] = counter.count_text(user_input or "")
175
+
176
+ metadata = request_metadata or {}
177
+ memory_text = _ambient_text(metadata.get("memory_context"))
178
+ if memory_text:
179
+ tokens_by_kind["recalled_memory"] = counter.count_text(memory_text)
180
+ kb_text = _ambient_text(metadata.get("kb_context"))
181
+ if kb_text:
182
+ tokens_by_kind["attachment_context"] = counter.count_text(kb_text)
183
+
184
+ caps, resolved_runtime_type = _resolve_caps(runner=runner, runtime_type=runtime_type)
185
+ planned = sum(tokens_by_kind.values())
186
+ prompt_shadow_dict = (
187
+ prompt_shadow if prompt_shadow is not None else compile_shadow_prompt_dict(instructions)
188
+ )
189
+ # PR B:prompt_content 是真实正文,含明文,不得进 shadow plan/trace。这里剥离,
190
+ # 只保留 hash/统计键(与 _set_prompt_source_attributes 只读 hash 一致)。
191
+ shadow_prompt_keys = {
192
+ key: value for key, value in prompt_shadow_dict.items() if key != "prompt_content"
193
+ }
194
+ # PR B:接管态显示。capability_hash 不变(不随 per-request 抖动)。
195
+ effective_mode = caps.integration_mode
196
+ if (
197
+ prompt_integration_mode == "ksadk_hosted"
198
+ and caps.prompt_owner == "ksadk"
199
+ and resolved_runtime_type == "langgraph"
200
+ ):
201
+ effective_mode = "ksadk_hosted"
202
+
203
+ return {
204
+ "plan_id": f"ctxplan_{uuid.uuid4().hex[:16]}",
205
+ "policy_version": CONTEXT_POLICY_VERSION,
206
+ "tokenizer": counter.name or HEURISTIC_TOKENIZER_NAME,
207
+ "integration_mode": effective_mode,
208
+ "accounting_accuracy": caps.token_accounting,
209
+ "tokens_by_kind": tokens_by_kind,
210
+ "planned_input_tokens": planned,
211
+ "projected_input_tokens": None,
212
+ "runtime_reported_input_tokens": None,
213
+ "stable_prefix_hash": shadow_prompt_keys["prompt_stable_prefix_hash"],
214
+ "projection_id": None,
215
+ "contributor_status": {},
216
+ # capability 摘要,便于 Trace 单独解释 ownership(不替代 conformance 测试)。
217
+ "prompt_owner": caps.prompt_owner,
218
+ "history_owner": caps.history_owner,
219
+ "compaction_owner": caps.compaction_owner,
220
+ "memory_owner": caps.memory_owner,
221
+ "skill_owner": caps.skill_owner,
222
+ # 接线修正:记录 runtime_type + capability_hash,使 canonical 路径的 Plan 可解释、
223
+ # 可比对 adapter 声明一致性(capability mismatch 检测留后续 PR)。
224
+ "runtime_type": resolved_runtime_type,
225
+ "deployment_mode": str(deployment_mode or "local"),
226
+ "capability_hash": capability_hash(caps),
227
+ # PR2/PR A:shadow CompiledPrompt hash/section 统计,供 cache-break 诊断与可观测。
228
+ # shadow_prompt_keys 来自真实编译(PR A 含 agent_system/agent_task)
229
+ # 或 instructions-only 回退,
230
+ # 已剥离 prompt_content(明文不进 shadow plan/trace)。
231
+ **shadow_prompt_keys,
232
+ }
233
+
234
+
235
+ def minimal_shadow_context_plan_dict(
236
+ *,
237
+ runner: Any | None = None,
238
+ runtime_type: str | None = None,
239
+ deployment_mode: str = "local",
240
+ ) -> dict[str, Any]:
241
+ """resume / 空输入场景的最小 shadow plan:只带 ownership 与精度,不累加 token。"""
242
+ caps, resolved_runtime_type = _resolve_caps(runner=runner, runtime_type=runtime_type)
243
+ prompt_shadow = compile_shadow_prompt_dict(None)
244
+ return {
245
+ "plan_id": f"ctxplan_{uuid.uuid4().hex[:16]}",
246
+ "policy_version": CONTEXT_POLICY_VERSION,
247
+ "tokenizer": HEURISTIC_TOKENIZER_NAME,
248
+ "integration_mode": caps.integration_mode,
249
+ "accounting_accuracy": caps.token_accounting,
250
+ "tokens_by_kind": _empty_tokens_by_kind(),
251
+ "planned_input_tokens": 0,
252
+ "projected_input_tokens": None,
253
+ "runtime_reported_input_tokens": None,
254
+ "stable_prefix_hash": "",
255
+ "projection_id": None,
256
+ "contributor_status": {},
257
+ "prompt_owner": caps.prompt_owner,
258
+ "history_owner": caps.history_owner,
259
+ "compaction_owner": caps.compaction_owner,
260
+ "memory_owner": caps.memory_owner,
261
+ "skill_owner": caps.skill_owner,
262
+ "runtime_type": resolved_runtime_type,
263
+ "deployment_mode": str(deployment_mode or "local"),
264
+ "capability_hash": capability_hash(caps),
265
+ **prompt_shadow,
266
+ }