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,215 @@
1
+ """PromptCompiler —— 确定性编译 Prompt 分区(方案第 7 节)。
2
+
3
+ 第一个 PR 只落地稳定数据模型;本(第二个)PR 实现 ``compile()`` 的确定性行为:排序、
4
+ 标准化、merge policy、protected 覆盖检测、SHA-256、section token 与 stable_prefix_hash。
5
+
6
+ PR2 仍是 shadow:``CompiledPrompt`` 仅用于 hash/可观测/未来 projection,**不替换** Runner
7
+ 实际发送的 instructions→new_message/SystemMessage/base_instructions 拼装,线上行为不变。
8
+ ``CompiledPrompt.content`` 不保证等于 Runner 最终物理输入(方案 7.2)。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ import re
15
+ from dataclasses import dataclass, replace
16
+ from typing import Iterable
17
+
18
+ from ksadk.context_engine.tokenizer import get_default_token_counter
19
+ from ksadk.prompts.models import (
20
+ PROMPT_COMPILER_VERSION,
21
+ CompiledPrompt,
22
+ PromptSection,
23
+ PromptSectionKind,
24
+ )
25
+
26
+ # canonical 顺序:按 priority 升序,priority 相同按 kind 字典序。同一 section_id 的
27
+ # source/stability/merge_policy 必须固定,不因 Runner 遍历顺序变化(方案 7.3 第 8 条)。
28
+ _KIND_ORDER: tuple[PromptSectionKind, ...] = (
29
+ "platform_safety",
30
+ "agent_identity",
31
+ "agent_policy",
32
+ "runtime_capabilities",
33
+ "resource_manifest",
34
+ "request_instructions",
35
+ )
36
+
37
+
38
+ def _section_sort_key(section: PromptSection) -> tuple[int, str, str]:
39
+ kind_rank = _KIND_ORDER.index(section.kind) if section.kind in _KIND_ORDER else len(_KIND_ORDER)
40
+ kind_key = _KIND_ORDER[kind_rank] if kind_rank < len(_KIND_ORDER) else section.kind
41
+ return (section.priority, kind_key, section.section_id)
42
+
43
+
44
+ def _normalize_text(text: str) -> str:
45
+ """标准化换行与尾部空白,但不改变正文语义(方案 7.3 第 2 条)。
46
+
47
+ - CRLF/CR → LF
48
+ - 去除每行尾部空白
49
+ - 合并 3+ 连续空行为 1 行,去除首尾空白
50
+ """
51
+ if not text:
52
+ return ""
53
+ normalized = str(text).replace("\r\n", "\n").replace("\r", "\n")
54
+ lines = [line.rstrip() for line in normalized.split("\n")]
55
+ # 合并 2+ 连续空行 → 单空行(统一段落间距,不改变正文语义)
56
+ collapsed: list[str] = []
57
+ blank_run = 0
58
+ for line in lines:
59
+ if line == "":
60
+ blank_run += 1
61
+ if blank_run >= 2:
62
+ continue
63
+ collapsed.append(line)
64
+ else:
65
+ blank_run = 0
66
+ collapsed.append(line)
67
+ return "\n".join(collapsed).strip()
68
+
69
+
70
+ def _content_sha256(text: str) -> str:
71
+ return "sha256:" + hashlib.sha256(text.encode("utf-8")).hexdigest()
72
+
73
+
74
+ def _wrap_section(section: PromptSection, content: str) -> str:
75
+ """用标签消除区段歧义,但不应把所有动态上下文拼成 XML(方案 7.3 推荐格式)。"""
76
+ body = content.strip()
77
+ if not body:
78
+ return ""
79
+ return f"<{section.kind}>\n{body}\n</{section.kind}>"
80
+
81
+
82
+ def _merge_sections(sections: list[PromptSection]) -> list[PromptSection]:
83
+ """同 kind 多来源时执行显式 merge policy,禁止"最后写入悄悄覆盖"(方案 7.3 第 3 条)。
84
+
85
+ - ``replace``: 保留最后一条(同 section_id 之内)
86
+ - ``append``: 按顺序拼接
87
+ - ``merge_unique``: 去重拼接
88
+ - ``protected``: 不允许覆盖;发生覆盖尝试时抛 ``ProtectedSectionOverrideError``
89
+ """
90
+ grouped: dict[str, list[PromptSection]] = {}
91
+ order: list[str] = []
92
+ for section in sections:
93
+ if section.section_id not in grouped:
94
+ grouped[section.section_id] = []
95
+ order.append(section.section_id)
96
+ grouped[section.section_id].append(section)
97
+
98
+ merged: list[PromptSection] = []
99
+ for section_id in order:
100
+ bucket = grouped[section_id]
101
+ head = bucket[0]
102
+ if len(bucket) == 1:
103
+ merged.append(head)
104
+ continue
105
+ policy = head.merge_policy
106
+ # 同一 section_id 的来源/稳定性/merge_policy 必须固定(方案 7.3 第 8 条)。
107
+ inconsistent = any(
108
+ b.merge_policy != policy or b.stability != head.stability or b.kind != head.kind
109
+ for b in bucket[1:]
110
+ )
111
+ if inconsistent:
112
+ raise InconsistentSectionError(
113
+ f"section {section_id!r} 的来源/稳定性/merge_policy 不一致"
114
+ )
115
+ if policy == "replace":
116
+ merged.append(replace(head, content=bucket[-1].content))
117
+ elif policy == "protected":
118
+ # 任意两条同 section_id 内容不同即视为覆盖尝试。
119
+ contents = {b.content for b in bucket}
120
+ if len(contents) > 1:
121
+ raise ProtectedSectionOverrideError(
122
+ f"protected section {section_id!r} 发生覆盖尝试"
123
+ )
124
+ merged.append(head)
125
+ elif policy == "merge_unique":
126
+ seen: set[str] = set()
127
+ parts: list[str] = []
128
+ for b in bucket:
129
+ for chunk in re.split(r"\n{2,}", b.content.strip()):
130
+ chunk = chunk.strip()
131
+ if chunk and chunk not in seen:
132
+ seen.add(chunk)
133
+ parts.append(chunk)
134
+ merged.append(replace(head, content="\n\n".join(parts)))
135
+ else: # append
136
+ merged.append(
137
+ replace(
138
+ head,
139
+ content="\n\n".join(b.content.strip() for b in bucket if b.content.strip()),
140
+ )
141
+ )
142
+ return merged
143
+
144
+
145
+ class ProtectedSectionOverrideError(RuntimeError):
146
+ """``protected`` section 被尝试覆盖。编译失败并产生审计事件,不静默忽略(方案 7.3 第 9 条)。"""
147
+
148
+
149
+ class InconsistentSectionError(RuntimeError):
150
+ """同一 section_id 的来源/稳定性/merge_policy 不固定。"""
151
+
152
+
153
+ @dataclass(frozen=True)
154
+ class PromptCompiler:
155
+ """确定性 Prompt 编译器。
156
+
157
+ ``compile()`` 必须对相同输入产生相同输出(方案 7.3)。构造器无状态,可复用。
158
+ """
159
+
160
+ compiler_version: str = PROMPT_COMPILER_VERSION
161
+
162
+ def compile(self, sections: Iterable[PromptSection]) -> CompiledPrompt:
163
+ # 1. 排序(确定性)
164
+ ordered = sorted(sections, key=_section_sort_key)
165
+ # 2. merge(同 section_id 的多来源按 merge policy 合并)
166
+ merged = _merge_sections(ordered)
167
+ # 3. platform_safety 不允许被 request_instructions 覆盖(方案 7.3 第 4 条)。
168
+ # protected/replace 在 _merge_sections 内已处理;这里额外校验跨 section_id 的
169
+ # 信任边界:request_instructions 不得声明 platform 的 kind。
170
+ for section in merged:
171
+ if (
172
+ section.kind == "platform_safety"
173
+ and section.trust_level in ("untrusted", "user")
174
+ ):
175
+ raise ProtectedSectionOverrideError(
176
+ "platform_safety 不得由 untrusted/user 来源声明"
177
+ )
178
+
179
+ counter = get_default_token_counter()
180
+ # 4. 空 section 不输出占位文本(方案 7.3 第 5 条)。
181
+ section_hashes: dict[str, str] = {}
182
+ tokens_by_section: dict[str, int] = {}
183
+ wrapped_blocks: list[str] = []
184
+ for section in merged:
185
+ body = _normalize_text(section.content)
186
+ section_hashes[section.section_id] = _content_sha256(body)
187
+ tokens_by_section[section.section_id] = counter.count_text(body)
188
+ if body:
189
+ wrapped_blocks.append(_wrap_section(section, body))
190
+ canonical_content = "\n\n".join(block for block in wrapped_blocks if block).strip()
191
+
192
+ # 5. stable_prefix_hash:仅覆盖 stability="stable" 的 section(platform_safety /
193
+ # agent_identity / agent_policy)。部署级/动态 section 不进稳定前缀(方案 7.4)。
194
+ stable_body = "\n\n".join(
195
+ _wrap_section(s, _normalize_text(s.content))
196
+ for s in merged
197
+ if s.stability == "stable" and _normalize_text(s.content)
198
+ ).strip()
199
+ stable_prefix_hash = _content_sha256(stable_body) if stable_body else ""
200
+
201
+ return CompiledPrompt(
202
+ sections=tuple(merged),
203
+ content=canonical_content,
204
+ content_hash=_content_sha256(canonical_content),
205
+ estimated_tokens=counter.count_text(canonical_content),
206
+ stable_prefix_hash=stable_prefix_hash,
207
+ section_hashes=section_hashes,
208
+ tokens_by_section=tokens_by_section,
209
+ compiler_version=self.compiler_version,
210
+ )
211
+
212
+
213
+ def compile_prompt(sections: Iterable[PromptSection]) -> CompiledPrompt:
214
+ """便捷入口:用默认 compiler 编译。"""
215
+ return PromptCompiler().compile(sections)
@@ -0,0 +1,82 @@
1
+ """Prompt 分区数据模型(方案第 7 节)。
2
+
3
+ 第一个 PR 只落地稳定数据结构,公开类型从第一批开始版本化。``compiler.py`` / ``sources.py``
4
+ (确定性编译、merge、hash、指令文件发现)留第二个 PR;本模块不接管线,不改任何 Runner
5
+ 现有 instructions→new_message/SystemMessage/base_instructions 的拼装。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass, field
11
+ from typing import Literal
12
+
13
+ from ksadk.context_engine.capabilities import ContextAccuracy, ContextIntegrationMode
14
+
15
+ PROMPT_COMPILER_VERSION = "v1"
16
+
17
+ PromptSectionKind = Literal[
18
+ "platform_safety",
19
+ "agent_identity",
20
+ "agent_policy",
21
+ "runtime_capabilities",
22
+ "resource_manifest",
23
+ "request_instructions",
24
+ ]
25
+ """统一语义分区(方案 7.1)。动态历史、记忆和工具结果不属于 PromptSection。"""
26
+
27
+ PromptTrustLevel = Literal["platform", "developer", "resource", "untrusted", "user"]
28
+ PromptStability = Literal["stable", "deployment", "volatile"]
29
+ PromptMergePolicy = Literal["replace", "append", "merge_unique", "protected"]
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class PromptSection:
34
+ """一个 Prompt 分区单元(方案 7.2)。"""
35
+
36
+ section_id: str
37
+ kind: PromptSectionKind
38
+ content: str
39
+ source: str
40
+ priority: int
41
+ trust_level: PromptTrustLevel
42
+ stability: PromptStability = "stable"
43
+ merge_policy: PromptMergePolicy = "append"
44
+ overridable: bool = False
45
+ metadata: dict[str, object] = field(default_factory=dict)
46
+
47
+
48
+ @dataclass(frozen=True)
49
+ class CompiledPrompt:
50
+ """按确定规则编译后的稳定 Prompt(方案 7.2)。
51
+
52
+ ``content`` 是 canonical content,不保证等于 Runner 最终物理输入。``stable_prefix_hash``
53
+ 覆盖稳定前缀(platform_safety / agent_identity / agent_policy),用于 Prompt Cache
54
+ 失效诊断(第二个 PR 实现)。
55
+ """
56
+
57
+ sections: tuple[PromptSection, ...]
58
+ content: str
59
+ content_hash: str
60
+ estimated_tokens: int
61
+ stable_prefix_hash: str
62
+ section_hashes: dict[str, str]
63
+ tokens_by_section: dict[str, int]
64
+ compiler_version: str = PROMPT_COMPILER_VERSION
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class PromptProjectionResult:
69
+ """Runner 投影 Prompt 后的可审计结果(方案 7.2)。
70
+
71
+ 第一个 PR 只保留类型信封,不接管线;由后续 PR 的 projection 逻辑填充。
72
+ """
73
+
74
+ projection_id: str
75
+ runner_type: str
76
+ integration_mode: ContextIntegrationMode
77
+ projection_version: str
78
+ section_hashes: tuple[str, ...]
79
+ projected_roles: tuple[str, ...]
80
+ accounting_accuracy: ContextAccuracy
81
+ estimated_tokens: int | None
82
+ warnings: tuple[str, ...] = ()
@@ -0,0 +1,89 @@
1
+ """Prompt Projection —— CompiledPrompt → 目标 Runner 的可审计投影(方案 §7.1 / §7.2)。
2
+
3
+ Projection 把 ``CompiledPrompt`` 的 canonical section 按目标 Runner 的合法承载形式映射
4
+ (Codex ``base_instructions``、ADK ``instruction``、LangGraph ``system_message``),并输出
5
+ 可审计的 ``PromptProjectionResult``。Projection 可以改变物理承载形式,但必须保留 section
6
+ source、hash、信任级别和覆盖决策;不得改变安全优先级与信任边界(方案 §7.1)。
7
+
8
+ PR B 之前 Projection 仅用于可观测/审计,不替换 Runner 实际发送的 instructions。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import uuid
14
+ from typing import Any
15
+
16
+ from ksadk.context_engine.capabilities import ContextAccuracy, ContextIntegrationMode
17
+ from ksadk.prompts.models import CompiledPrompt, PromptProjectionResult
18
+
19
+ PROJECTION_VERSION = "v1"
20
+
21
+ # 各 integration_mode 的合法投影承载形式(方案 §6.2 / §7.1)。
22
+ _PROJECTION_ROLES: dict[ContextIntegrationMode, tuple[str, ...]] = {
23
+ "ksadk_hosted": ("system_message", "instruction"),
24
+ "framework_assisted": ("system_message", "state", "instruction", "session", "memory_service"),
25
+ "native_runtime": ("base_instructions", "thread"),
26
+ }
27
+
28
+
29
+ def project_compiled_prompt(
30
+ compiled: CompiledPrompt,
31
+ *,
32
+ runner_type: str,
33
+ integration_mode: ContextIntegrationMode,
34
+ accounting_accuracy: ContextAccuracy,
35
+ warnings: tuple[str, ...] = (),
36
+ ) -> PromptProjectionResult:
37
+ """投影 CompiledPrompt 到目标 Runner,输出可审计结果(方案 §7.2)。
38
+
39
+ 只读 ``compiled``,不改 Runner 输入。``projected_roles`` 反映该 integration_mode 的合法承载
40
+ 形式集合;``section_hashes`` 直接取自编译结果,保证投影前后 hash 一致、可校验顺序漂移。
41
+ """
42
+ roles = _PROJECTION_ROLES.get(integration_mode, ())
43
+ if not roles:
44
+ warnings = (*warnings, f"unknown_integration_mode:{integration_mode}")
45
+ # 校验安全优先级未被投影改变:platform_safety 必须存在且 trust_level=platform(若编译含它)。
46
+ safety_sections = [s for s in compiled.sections if s.kind == "platform_safety"]
47
+ for s in safety_sections:
48
+ if s.trust_level != "platform":
49
+ warnings = (*warnings, f"platform_safety_wrong_trust:{s.trust_level}")
50
+ return PromptProjectionResult(
51
+ projection_id=f"pj_{uuid.uuid4().hex[:16]}",
52
+ runner_type=runner_type,
53
+ integration_mode=integration_mode,
54
+ projection_version=PROJECTION_VERSION,
55
+ section_hashes=tuple(
56
+ compiled.section_hashes.get(s.section_id, "") for s in compiled.sections
57
+ ),
58
+ projected_roles=roles,
59
+ accounting_accuracy=accounting_accuracy,
60
+ estimated_tokens=compiled.estimated_tokens,
61
+ warnings=warnings,
62
+ )
63
+
64
+
65
+ def project_to_runner_payload(
66
+ compiled: CompiledPrompt,
67
+ *,
68
+ integration_mode: ContextIntegrationMode,
69
+ ) -> dict[str, Any]:
70
+ """把 CompiledPrompt.content 投影成目标 Runner 的 payload 字段(方案 §7.1)。
71
+
72
+ ksadk_hosted/framework_assisted(LangGraph 系) → ``{"system_message": content}``;
73
+ framework_assisted(ADK) → ``{"instruction": content}``;
74
+ native_runtime(Codex) → ``{"base_instructions": content}``。调用方据 capability 选字段。
75
+ """
76
+ if integration_mode == "native_runtime":
77
+ return {"base_instructions": compiled.content}
78
+ if integration_mode == "framework_assisted":
79
+ # ADK 用 instruction;LangGraph 用 system_message。两者都返回,调用方按 capability 选。
80
+ return {"instruction": compiled.content, "system_message": compiled.content}
81
+ # ksadk_hosted
82
+ return {"system_message": compiled.content, "instruction": compiled.content}
83
+
84
+
85
+ __all__ = [
86
+ "PROJECTION_VERSION",
87
+ "project_compiled_prompt",
88
+ "project_to_runner_payload",
89
+ ]
@@ -0,0 +1,137 @@
1
+ """Prompt Source Contract —— ResolvedPromptSources + PlatformPolicySource(PR A)。
2
+
3
+ 把 Studio agent 的 instructions.system/task 与 request_instructions 聚合成统一来源,
4
+ 编译真实 ``CompiledPrompt``(带稳定 section hash),用于 hash/trace/future projection。
5
+
6
+ PR A **不改 Runner 输入**:``payload["instructions"]`` 仍由 request 级 instructions 决定。
7
+ ``compiled_prompt`` 只挂在 ``PreparedConversationTurn`` 供可观测与后续 PR B 投影。
8
+
9
+ platform_safety 暂不注入生产:``PlatformPolicySource`` 接口存在,``EnvPlatformPolicySource``
10
+ 仅本地 dev override(``KSADK_PLATFORM_SAFETY_TEXT``),未设时不产 platform_safety section。
11
+ 当前硬编码 ``PLATFORM_SAFETY_TEXT`` 只作测试/shadow fixture。
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import os
17
+ from dataclasses import dataclass
18
+ from typing import Any, Protocol
19
+
20
+ from ksadk.prompts.compiler import PromptCompiler
21
+ from ksadk.prompts.models import PromptSection
22
+ from ksadk.prompts.sources import (
23
+ agent_identity_section,
24
+ agent_policy_section,
25
+ platform_safety_section,
26
+ request_instructions_section,
27
+ )
28
+
29
+ RESOLVED_PROMPT_SOURCES_VERSION = "v1"
30
+
31
+
32
+ class PlatformPolicySource(Protocol):
33
+ """可信平台安全规则来源接口(方案 7.5 / 评测 PCM-PROMPT-001)。
34
+
35
+ 生产实现应由部署级配置提供(带版本与来源标识)。未提供可信来源时返回 ``None``,
36
+ 不产 ``platform_safety`` section——不硬编码生产安全文本。
37
+ """
38
+
39
+ source: str
40
+ version: str
41
+
42
+ def resolve(self) -> str | None: ...
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ class EnvPlatformPolicySource:
47
+ """本地开发 override:从 env ``KSADK_PLATFORM_SAFETY_TEXT`` 读平台安全文本。
48
+
49
+ 仅用于本地 dev / 测试。未设 env 时 ``resolve()`` 返回 ``None``。
50
+ 生产环境应替换为部署级 ``PlatformPolicySource`` 实现。
51
+ """
52
+
53
+ env_var: str = "KSADK_PLATFORM_SAFETY_TEXT"
54
+ source: str = "env_local_dev"
55
+ version: str = "env"
56
+
57
+ def resolve(self) -> str | None:
58
+ text = (os.environ.get(self.env_var, "") or "").strip()
59
+ return text or None
60
+
61
+
62
+ def get_default_platform_policy_source() -> PlatformPolicySource | None:
63
+ """返回默认 PlatformPolicySource(EnvPlatformPolicySource)。
64
+
65
+ 当前唯一实现是 env override;生产实现留后续 PR。返回值供
66
+ ``compile_resolved_prompt_dict`` 决定是否产 platform_safety。
67
+ """
68
+ return EnvPlatformPolicySource()
69
+
70
+
71
+ @dataclass(frozen=True)
72
+ class ResolvedPromptSources:
73
+ """一次模型调用的 Prompt 来源聚合(方案 7.6)。
74
+
75
+ ``agent_system`` / ``agent_task`` 来自 Studio agent 配置(``Instructions.system/task``),
76
+ ``request_instructions`` 来自 API request 级 instructions,
77
+ ``platform_policy_source`` 为可信平台安全来源(可空)。
78
+ """
79
+
80
+ agent_system: str = ""
81
+ agent_task: str = ""
82
+ request_instructions: str = ""
83
+ platform_policy_source: PlatformPolicySource | None = None
84
+ version: str = RESOLVED_PROMPT_SOURCES_VERSION
85
+
86
+
87
+ def sections_from_resolved_sources(sources: ResolvedPromptSources) -> list[PromptSection]:
88
+ """把 ResolvedPromptSources 投影成 PromptSection 列表(canonical 顺序)。
89
+
90
+ 空 content 的 section 跳过。platform_safety 仅在可信来源返回非空文本时产生。
91
+ """
92
+ sections: list[PromptSection] = []
93
+ if sources.agent_system.strip():
94
+ sections.append(agent_identity_section(sources.agent_system.strip()))
95
+ if sources.agent_task.strip():
96
+ sections.append(agent_policy_section(sources.agent_task.strip()))
97
+ if sources.request_instructions.strip():
98
+ sections.append(request_instructions_section(sources.request_instructions.strip()))
99
+ policy_source = sources.platform_policy_source
100
+ if policy_source is not None:
101
+ policy_text = policy_source.resolve()
102
+ if policy_text:
103
+ sections.append(
104
+ platform_safety_section(content=policy_text, source=policy_source.source)
105
+ )
106
+ return sections
107
+
108
+
109
+ def compile_resolved_prompt_dict(sources: ResolvedPromptSources) -> dict[str, Any] | None:
110
+ """编译真实 CompiledPrompt 的 plain dict 投影(PR A,shadow/trace 用)。
111
+
112
+ 返回 ``None`` 表示无任何非空 section(agent_system/agent_task/request_instructions
113
+ 全空且无 platform_policy)。键名沿用 ``compile_shadow_prompt_dict`` 的 ``prompt_*``
114
+ 前缀,保证可被 ``build_shadow_context_plan_dict`` 直接 spread,且
115
+ ``_set_prompt_cache_attributes`` 自动拿到真实 hash。
116
+ """
117
+ sections = sections_from_resolved_sources(sources)
118
+ if not sections:
119
+ return None
120
+ compiled = PromptCompiler().compile(sections)
121
+ policy_source = sources.platform_policy_source
122
+ policy_active = bool(policy_source is not None and policy_source.resolve())
123
+ return {
124
+ "prompt_content_hash": compiled.content_hash,
125
+ "prompt_stable_prefix_hash": compiled.stable_prefix_hash,
126
+ "prompt_section_hashes": dict(compiled.section_hashes),
127
+ "prompt_tokens_by_section": dict(compiled.tokens_by_section),
128
+ "prompt_estimated_tokens": compiled.estimated_tokens,
129
+ "prompt_section_count": len(compiled.sections),
130
+ "prompt_compiler_version": compiled.compiler_version,
131
+ "prompt_resolved_sources_version": sources.version,
132
+ "prompt_platform_policy_version": (policy_source.version if policy_active else None),
133
+ "prompt_platform_policy_source": (policy_source.source if policy_active else None),
134
+ # PR B:真实正文。供接管注入读 ``prepared.compiled_prompt["prompt_content"]``。
135
+ # 注意:含明文,**不得**进 shadow plan/trace(build_shadow_context_plan_dict 会剥离)。
136
+ "prompt_content": compiled.content,
137
+ }