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
@@ -5,8 +5,9 @@
5
5
 
6
6
  环境变量:
7
7
  KSADK_KB_DATASET_ID: 知识库 ID (必填,存在即启用)
8
- KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY)
9
- KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY)
8
+ KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY / KSYUN_ACCESS_KEY_ID)
9
+ KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY / KSYUN_SECRET_ACCESS_KEY)
10
+ KSADK_KB_SESSION_TOKEN: STS 临时会话 token (可选,默认取 KSYUN_SESSION_TOKEN)
10
11
  KSADK_KB_REGION: 区域 (默认 cn-beijing-6)
11
12
  KSADK_KB_ENDPOINT: API 端点 (默认 aicp.api.ksyun.com)
12
13
  KSADK_KB_TOP_K: 返回结果数 (默认 5)
@@ -59,6 +60,7 @@ class KnowledgeBaseClient(BaseModel):
59
60
  dataset_id: 知识库 ID (DatasetId)
60
61
  access_key: 访问密钥 ID (AK)
61
62
  secret_key: 访问密钥 (SK)
63
+ session_token: STS 临时会话 token
62
64
  region: API 区域
63
65
  endpoint: API 端点
64
66
  top_k: 返回结果数
@@ -71,6 +73,7 @@ class KnowledgeBaseClient(BaseModel):
71
73
  dataset_id: str
72
74
  access_key: str = ""
73
75
  secret_key: str = ""
76
+ session_token: str = ""
74
77
  region: str = "cn-beijing-6"
75
78
  endpoint: str = "aicp.api.ksyun.com"
76
79
  scheme: str = "https"
@@ -79,6 +82,10 @@ class KnowledgeBaseClient(BaseModel):
79
82
  score_threshold: float = 0.0
80
83
  score_threshold_enabled: bool = False
81
84
  reranking_enable: bool = False
85
+ # 最近一次检索失败原因(成功调用前置空,失败时填充)。供
86
+ # KnowledgeBaseService.build_context 区分"后端吞错返空"与"真无结果",
87
+ # 避免错误伪装成"未找到"注入模型上下文。
88
+ last_error: str = ""
82
89
 
83
90
  _aicp_client: Any = None
84
91
 
@@ -133,7 +140,9 @@ class KnowledgeBaseClient(BaseModel):
133
140
  "Ensure kingsoftcloud-sdk-python is installed and up to date."
134
141
  )
135
142
 
136
- cred = credential.Credential(self.access_key, self.secret_key)
143
+ cred = credential.Credential(
144
+ self.access_key, self.secret_key, self.session_token or None
145
+ )
137
146
 
138
147
  http_profile = HttpProfile()
139
148
  http_profile.endpoint = self.endpoint
@@ -183,6 +192,7 @@ class KnowledgeBaseClient(BaseModel):
183
192
  try:
184
193
  data = json.loads(response) if isinstance(response, str) else response
185
194
  except (json.JSONDecodeError, TypeError):
195
+ self.last_error = f"Failed to parse response: {str(response)[:200]}"
186
196
  logger.error(f"Failed to parse response: {str(response)[:200]}")
187
197
  return []
188
198
 
@@ -225,6 +235,7 @@ class KnowledgeBaseClient(BaseModel):
225
235
  f"Searching knowledge base: dataset_id={self.dataset_id}, " f"query='{query[:50]}'"
226
236
  )
227
237
 
238
+ self.last_error = ""
228
239
  try:
229
240
  response = client.call("RetrieveKnowledge", params, options={"IsPostJson": True})
230
241
  results = self._parse_response(response)
@@ -233,6 +244,7 @@ class KnowledgeBaseClient(BaseModel):
233
244
  )
234
245
  return results
235
246
  except Exception as e:
247
+ self.last_error = str(e)
236
248
  logger.error(f"Knowledge base search failed: {e}")
237
249
  raise
238
250
 
@@ -255,12 +267,17 @@ class KnowledgeBaseClient(BaseModel):
255
267
  access_key = (
256
268
  os.environ.get("KSADK_KB_ACCESS_KEY")
257
269
  or os.environ.get("KSYUN_ACCESS_KEY")
270
+ or os.environ.get("KSYUN_ACCESS_KEY_ID")
258
271
  or os.environ.get("KSYUN_SECRET_ID", "")
259
272
  )
260
273
  secret_key = (
261
274
  os.environ.get("KSADK_KB_SECRET_KEY")
262
275
  or os.environ.get("KSYUN_SECRET_KEY")
263
- or os.environ.get("KSYUN_SECRET_KEY", "")
276
+ or os.environ.get("KSYUN_SECRET_ACCESS_KEY", "")
277
+ )
278
+ session_token = (
279
+ os.environ.get("KSADK_KB_SESSION_TOKEN")
280
+ or os.environ.get("KSYUN_SESSION_TOKEN", "")
264
281
  )
265
282
 
266
283
  score_threshold_str = os.environ.get("KSADK_KB_SCORE_THRESHOLD", "")
@@ -275,6 +292,7 @@ class KnowledgeBaseClient(BaseModel):
275
292
  dataset_id=dataset_id,
276
293
  access_key=access_key,
277
294
  secret_key=secret_key,
295
+ session_token=session_token,
278
296
  region=connection["region"],
279
297
  endpoint=connection["endpoint"],
280
298
  scheme=connection["scheme"],
@@ -44,6 +44,15 @@ class KnowledgeBaseService:
44
44
  self._client = KnowledgeBaseClient.from_env()
45
45
  return self._client
46
46
 
47
+ @property
48
+ def last_error(self) -> str:
49
+ """最近一次检索失败原因(成功前置空,失败填充;含响应解析失败)。
50
+
51
+ 供 ``build_context`` 区分"后端吞错/解析失败返空"与"真无结果"。
52
+ 客户端尚未懒加载时视为无错误。
53
+ """
54
+ return str(getattr(self._client, "last_error", "") or "")
55
+
47
56
  def search(self, query: str, top_k: Optional[int] = None) -> list[KnowledgeBaseResult]:
48
57
  return self._get_client().search(query, top_k)
49
58
 
@@ -54,13 +63,31 @@ class KnowledgeBaseService:
54
63
  logger.error("search_knowledge failed: %s", exc)
55
64
  return f"知识库检索失败: {exc}"
56
65
 
57
- def build_context(self, query: str, top_k: Optional[int] = None) -> dict[str, str] | None:
66
+ def build_context(
67
+ self,
68
+ query: str,
69
+ top_k: Optional[int] = None,
70
+ ) -> dict[str, str] | None:
71
+ """构造环境知识库上下文。失败时返回 ``formatted_text=""`` + 独立 ``error`` 字段,
72
+ 不把错误字符串塞进 ``formatted_text``(避免错误伪装成知识库正文注入模型)。
73
+
74
+ - 检索抛错(网络/鉴权失败)→ except 捕获,返 ``error`` 字段。
75
+ - 响应解析失败返空列表(``_parse_response``)→ client ``last_error`` 非空,
76
+ 返回 ``error`` 字段。
77
+ - 真无结果(检索正常返空)→ ``formatted_text`` 为"未找到…"(语义真实,可注入)。
78
+ """
58
79
  normalized = str(query or "").strip()
59
- if not normalized:
60
- return None
61
- if not self.is_configured():
80
+ if not normalized or not self.is_configured():
62
81
  return None
82
+ try:
83
+ results = self.search(normalized, top_k)
84
+ except Exception as exc:
85
+ logger.error("search_knowledge failed: %s", exc)
86
+ return {"query": normalized, "formatted_text": "", "error": str(exc)}
87
+ client_error = self.last_error
88
+ if not results and client_error:
89
+ return {"query": normalized, "formatted_text": "", "error": client_error}
63
90
  return {
64
91
  "query": normalized,
65
- "formatted_text": self.search_text(normalized, top_k),
92
+ "formatted_text": format_knowledge_results(results),
66
93
  }
@@ -0,0 +1,160 @@
1
+ """Platform-layer discovery-only AgentCard mount for managed A2A Runtime.
2
+
3
+ v1 scope (this module):
4
+ Mount ``GET /.well-known/agent-card.json`` only. No JSON-RPC, no identity
5
+ middleware, no TaskStore/ContextStore/ResumeStore. The card is available as
6
+ soon as the runtime starts, *before* any A2A Agent is registered, so the
7
+ server-side ``GetAToAAgentCard(hosted)`` probe can fetch it and break the
8
+ registration chicken-and-egg cycle.
9
+
10
+ The card mounts whenever ``KSADK_A2A_RUNTIME_ID`` (ar-*, available at deploy
11
+ time) is non-empty. It does **not** depend on ``KSADK_A2A_AGENT_ID``
12
+ (only known after the A2A Agent is registered). skills default to empty;
13
+ :func:`ksadk.a2a_card.build_agent_card` fills a ``general`` skill when none
14
+ are provided.
15
+
16
+ v2 scope (future, not this module):
17
+ :class:`ksadk.a2a.bootstrap.AgentEngineA2ABootstrap` adds JSON-RPC on top
18
+ of the same card and the same identity env. The bootstrap replaces this
19
+ mount in ``RuntimeAppConfig.a2a`` once shared durable storage and a real
20
+ gateway-forward identity verifier are in place.
21
+
22
+ Wire 1.0 conformance:
23
+ The card is built with :func:`build_agent_card` (same factory used by the
24
+ full A2A server), so ``supportedInterfaces`` / ``protocolVersion`` /
25
+ ``defaultInputModes`` / ``defaultOutputModes`` match wire 1.0 exactly.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import os
31
+ from dataclasses import dataclass
32
+ from typing import Optional, Sequence
33
+
34
+ from a2a.types import AgentSkill
35
+ from fastapi import FastAPI
36
+
37
+ from ksadk.a2a_card import build_agent_card
38
+
39
+
40
+ def _env(name: str) -> str:
41
+ return os.getenv(name, "").strip()
42
+
43
+
44
+ @dataclass(frozen=True)
45
+ class ManagedA2ACardConfig:
46
+ """Database-free configuration for the managed discovery-only route."""
47
+
48
+ enabled: bool = True
49
+ base_url: str = "http://127.0.0.1:8000"
50
+ agent_name: str = "agent"
51
+ description: str = ""
52
+ version: str = "0.1.0"
53
+ skills: Sequence[str | AgentSkill] = ()
54
+ streaming: bool = False
55
+ prefer_stream: bool = False
56
+
57
+
58
+ @dataclass(frozen=True)
59
+ class ManagedA2ACardMount:
60
+ """Discovery-only card endpoint; mounted by ``RuntimeAppConfig.a2a``.
61
+
62
+ Held as a plain dataclass so ``factory._wire_a2a_if_enabled`` can isinstance
63
+ it without importing the (optional) ``AgentEngineA2ABootstrap`` class.
64
+ """
65
+
66
+ config: ManagedA2ACardConfig
67
+
68
+ def mount(self, app: FastAPI) -> None:
69
+ """Mount ``GET /.well-known/agent-card.json`` into ``app``.
70
+
71
+ Directly registers a FastAPI route returning the card JSON, avoiding
72
+ ``a2a.server.routes`` (which pulls in the full A2A server stack and its
73
+ ``culsans`` dependency). The response body is the same AgentCard JSON
74
+ that ``create_agent_card_routes`` would produce.
75
+ """
76
+ card = build_agent_card(
77
+ name=self.config.agent_name,
78
+ base_url=self.config.base_url,
79
+ description=self.config.description,
80
+ version=self.config.version,
81
+ skills=self.config.skills or (),
82
+ streaming=self.config.streaming,
83
+ )
84
+
85
+ def _card_to_dict() -> dict:
86
+ # a2a.types.AgentCard is a protobuf message; serialize to the same
87
+ # camelCase JSON wire format the a2a-sdk route produces.
88
+ from google.protobuf.json_format import MessageToDict
89
+
90
+ return MessageToDict(
91
+ card,
92
+ preserving_proto_field_name=False,
93
+ use_integers_for_enums=False,
94
+ always_print_fields_with_no_presence=True,
95
+ )
96
+
97
+
98
+ from fastapi import Response
99
+ from fastapi.responses import JSONResponse
100
+
101
+ card_payload = _card_to_dict()
102
+
103
+ async def _get_agent_card() -> Response:
104
+ return JSONResponse(content=card_payload)
105
+
106
+ app.add_api_route(
107
+ "/.well-known/agent-card.json",
108
+ _get_agent_card,
109
+ methods=["GET"],
110
+ name="a2a_agent_card",
111
+ include_in_schema=False,
112
+ )
113
+
114
+ async def start(self) -> None:
115
+ """No stores/middleware to initialize in v1."""
116
+
117
+ return None
118
+
119
+ async def stop(self) -> None:
120
+ return None
121
+
122
+
123
+ def build_managed_a2a_card_if_configured() -> Optional[ManagedA2ACardMount]:
124
+ """Read the A2A identity env vars and build a discovery-only card mount.
125
+
126
+ Returns ``None`` when the runtime is not A2A-capable
127
+ (``KSADK_A2A_RUNTIME_ID`` empty), so ``run_server`` skips mounting entirely.
128
+ Returns a mount even when ``KSADK_A2A_AGENT_ID`` is absent: the discovery
129
+ card is intentionally available *before* the A2A Agent is registered.
130
+
131
+ Name/version fallback chain:
132
+ ``KSADK_A2A_AGENT_NAME`` → ``AGENTENGINE_MANAGED_RUNTIME_NAME`` →
133
+ ``KSADK_A2A_RUNTIME_ID``.
134
+ """
135
+ runtime_id = _env("KSADK_A2A_RUNTIME_ID")
136
+ if not runtime_id:
137
+ return None
138
+
139
+ base_url = _env("KSADK_A2A_INTERNAL_BASE_URL") or "http://localhost:8080"
140
+ name = _env("KSADK_A2A_AGENT_NAME") or _env("AGENTENGINE_MANAGED_RUNTIME_NAME") or runtime_id
141
+ version = _env("KSADK_A2A_AGENT_VERSION") or "0.1.0"
142
+
143
+ config = ManagedA2ACardConfig(
144
+ enabled=True,
145
+ base_url=base_url,
146
+ agent_name=name,
147
+ description="",
148
+ version=version,
149
+ skills=(),
150
+ streaming=False,
151
+ prefer_stream=False,
152
+ )
153
+ return ManagedA2ACardMount(config)
154
+
155
+
156
+ __all__ = [
157
+ "ManagedA2ACardConfig",
158
+ "ManagedA2ACardMount",
159
+ "build_managed_a2a_card_if_configured",
160
+ ]
ksadk/managed_runtime.py CHANGED
@@ -131,7 +131,9 @@ def validate_runtime_binary(resolved: ResolvedRuntime) -> str:
131
131
  if resolved.name != "codex":
132
132
  return ""
133
133
  try:
134
- from codex_cli_bin import bundled_codex_path
134
+ from codex_cli_bin import ( # type: ignore[import-not-found, import-untyped]
135
+ bundled_codex_path,
136
+ )
135
137
 
136
138
  codex_bin = bundled_codex_path()
137
139
  completed = subprocess.run(
@@ -162,17 +164,22 @@ async def resolve_local_managed_runtime(
162
164
  """Resolve and verify the native runtime used by ``ksadk web``."""
163
165
  name, requested_version = runtime_config(config)
164
166
  if requested_version:
165
- resolved = ResolvedRuntime(name=name, version=requested_version, source="manifest")
166
- validate_installed_runtime(resolved)
167
- return resolved
167
+ explicit_runtime = ResolvedRuntime(
168
+ name=name,
169
+ version=requested_version,
170
+ source="manifest",
171
+ )
172
+ validate_installed_runtime(explicit_runtime)
173
+ return explicit_runtime
168
174
 
175
+ catalog_runtime: ResolvedRuntime | None = None
169
176
  try:
170
- resolved = await resolve_managed_runtime(config, region=region)
177
+ catalog_runtime = await resolve_managed_runtime(config, region=region)
171
178
  except ManagedRuntimeError:
172
- resolved = None
173
- if resolved is not None:
174
- validate_installed_runtime(resolved)
175
- return resolved
179
+ pass
180
+ if catalog_runtime is not None:
181
+ validate_installed_runtime(catalog_runtime)
182
+ return catalog_runtime
176
183
 
177
184
  installed = installed_runtime_version(name)
178
185
  if not installed:
ksadk/memory/__init__.py CHANGED
@@ -54,4 +54,65 @@ def __getattr__(name):
54
54
  from ksadk.memory.service import LongTermMemoryService
55
55
 
56
56
  return LongTermMemoryService
57
+ # Memory v2(方案 §10):lazy import,避免在仅用旧 API 时强制加载 SQLite/tiktoken 依赖。
58
+ _v2_names = {
59
+ "MemoryRecord",
60
+ "MemoryCandidate",
61
+ "MemorySearchRequest",
62
+ "MemorySearchResult",
63
+ "MemoryCapabilities",
64
+ "CoreMemoryBlock",
65
+ "MemoryDeleteRequest",
66
+ "MemoryDeleteResult",
67
+ "MemoryProvider",
68
+ "MemoryPolicy",
69
+ "MemoryCoordinator",
70
+ "MemoryExtractor",
71
+ "SqliteMemoryProvider",
72
+ "build_search_request",
73
+ "recall_to_context_item",
74
+ "propose_memory_candidates",
75
+ }
76
+ if name in _v2_names:
77
+ if name in {
78
+ "MemoryRecord",
79
+ "MemoryCandidate",
80
+ "MemorySearchRequest",
81
+ "MemorySearchResult",
82
+ "MemoryCapabilities",
83
+ "CoreMemoryBlock",
84
+ "MemoryDeleteRequest",
85
+ "MemoryDeleteResult",
86
+ }:
87
+ from ksadk.memory import models as _models
88
+
89
+ return getattr(_models, name)
90
+ if name == "MemoryProvider":
91
+ from ksadk.memory.provider import MemoryProvider
92
+
93
+ return MemoryProvider
94
+ if name == "MemoryPolicy":
95
+ from ksadk.memory.policy import MemoryPolicy
96
+
97
+ return MemoryPolicy
98
+ if name == "MemoryCoordinator":
99
+ from ksadk.memory.coordinator import MemoryCoordinator
100
+
101
+ return MemoryCoordinator
102
+ if name in {"build_search_request", "recall_to_context_item"}:
103
+ from ksadk.memory import coordinator as _coord
104
+
105
+ return getattr(_coord, name)
106
+ if name == "MemoryExtractor":
107
+ from ksadk.memory.extraction import MemoryExtractor
108
+
109
+ return MemoryExtractor
110
+ if name == "propose_memory_candidates":
111
+ from ksadk.memory.extraction import propose_memory_candidates
112
+
113
+ return propose_memory_candidates
114
+ if name == "SqliteMemoryProvider":
115
+ from ksadk.memory.providers.local_sqlite import SqliteMemoryProvider
116
+
117
+ return SqliteMemoryProvider
57
118
  raise AttributeError(f"module 'ksadk.memory' has no attribute {name!r}")
@@ -3,22 +3,48 @@
3
3
  所有长期记忆后端必须继承此类并实现 save_memory / search_memory 方法。
4
4
 
5
5
  参考 VeADK: veadk/memory/long_term_memory_backends/base_backend.py
6
+
7
+ 扩展协议(技术改造方案 §7.3):
8
+ - search_records: 结构化检索,返回带 memory_id 的 LongTermMemoryRecord
9
+ - update_memory / delete_memory: 按 ID 原地更新/软删除
10
+ - capabilities: 声明 backend 支持的能力集合
11
+ 基类对扩展方法提供默认实现:抛出 UnsupportedMemoryOperation 并在
12
+ capabilities 中不声明对应能力,旧 backend 无需改动即保持兼容。
6
13
  """
7
14
 
8
15
  from abc import ABC, abstractmethod
9
- from typing import List
16
+ from typing import List, Set
10
17
 
11
18
  from pydantic import BaseModel
12
19
 
20
+ from ksadk.memory.models import (
21
+ LongTermMemoryRecord,
22
+ MemoryExtractionStatus,
23
+ MemoryMutationResult,
24
+ UnsupportedMemoryOperation,
25
+ )
26
+
27
+ # 能力常量(§7.3)
28
+ CAP_SEARCH = "search"
29
+ CAP_ADD = "add"
30
+ CAP_FLUSH = "flush"
31
+ CAP_STRUCTURED_SEARCH = "structured_search"
32
+ CAP_UPDATE = "update"
33
+ CAP_DELETE = "delete"
34
+ CAP_SESSION_STATUS = "session_status"
35
+
13
36
 
14
37
  class BaseLongTermMemoryBackend(ABC, BaseModel):
15
38
  """长期记忆存储后端抽象基类
16
39
 
17
40
  Attributes:
18
41
  index: 索引/集合名称,用于隔离不同应用的记忆数据
42
+ last_error: 最近一次 search/save 失败的原因。成功调用前置空,失败时填充。
43
+ 上层(LongTermMemoryService.build_context)据此区分"后端吞错返空"与"真无记忆"。
19
44
  """
20
45
 
21
46
  index: str = ""
47
+ last_error: str = ""
22
48
 
23
49
  @abstractmethod
24
50
  def save_memory(self, user_id: str, event_strings: List[str], **kwargs) -> bool:
@@ -46,3 +72,72 @@ class BaseLongTermMemoryBackend(ABC, BaseModel):
46
72
  匹配的记忆字符串列表
47
73
  """
48
74
  pass
75
+
76
+ # ---- 扩展协议(可选能力,默认 unsupported) ----
77
+
78
+ def search_records(
79
+ self,
80
+ user_id: str,
81
+ query: str,
82
+ top_k: int = 5,
83
+ **kwargs,
84
+ ) -> List[LongTermMemoryRecord]:
85
+ """结构化检索:返回带服务端 memory_id 的记录列表。
86
+
87
+ 不支持的 backend 抛出 UnsupportedMemoryOperation,
88
+ 不得降级为返回正文 hash 伪造的 ID。
89
+ """
90
+ raise UnsupportedMemoryOperation(
91
+ f"{type(self).__name__} does not support structured search"
92
+ )
93
+
94
+ def update_memory(
95
+ self,
96
+ *,
97
+ user_id: str,
98
+ memory_id: str,
99
+ content: str,
100
+ **kwargs,
101
+ ) -> MemoryMutationResult:
102
+ """按 memory_id 原地更新记忆正文。
103
+
104
+ 不支持的 backend 抛出 UnsupportedMemoryOperation,
105
+ 不得静默追加一条新记忆来模拟 update。
106
+ """
107
+ raise UnsupportedMemoryOperation(f"{type(self).__name__} does not support update")
108
+
109
+ def delete_memory(
110
+ self,
111
+ *,
112
+ user_id: str,
113
+ memory_id: str,
114
+ **kwargs,
115
+ ) -> MemoryMutationResult:
116
+ """按 memory_id 软删除指定记忆。
117
+
118
+ 不支持的 backend 抛出 UnsupportedMemoryOperation。
119
+ """
120
+ raise UnsupportedMemoryOperation(f"{type(self).__name__} does not support delete")
121
+
122
+ def get_extraction_status(
123
+ self,
124
+ *,
125
+ user_id: str,
126
+ session_id: str,
127
+ ) -> MemoryExtractionStatus:
128
+ """查询 Session 后台提取状态(写后确认,§7.7)。
129
+
130
+ 不支持的 backend 抛出 UnsupportedMemoryOperation。
131
+ """
132
+ raise UnsupportedMemoryOperation(f"{type(self).__name__} does not support session status")
133
+
134
+ def capabilities(self) -> Set[str]:
135
+ """声明本 backend 支持的能力集合。
136
+
137
+ 基类默认只声明基础读写能力;子类按真实实现覆写,
138
+ 声明必须与实际可用方法一致(§11.1)。
139
+ """
140
+ return {CAP_SEARCH, CAP_ADD}
141
+
142
+ def has_capability(self, capability: str) -> bool:
143
+ return capability in self.capabilities()
@@ -52,10 +52,10 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
52
52
  def model_post_init(self, __context) -> None:
53
53
  if not self.base_url:
54
54
  logger.warning(
55
- "HttpLTMBackend: base_url is empty. " "Set KSADK_LTM_HTTP_URL environment variable."
55
+ "HttpLTMBackend: base_url is empty. Set KSADK_LTM_HTTP_URL environment variable."
56
56
  )
57
57
  logger.info(
58
- f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... " f"index={self.index}"
58
+ f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... index={self.index}"
59
59
  )
60
60
 
61
61
  @property
@@ -101,13 +101,13 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
101
101
  response.raise_for_status()
102
102
 
103
103
  logger.info(
104
- f"Saved {len(event_strings)} events to remote memory service " f"for user={user_id}"
104
+ f"Saved {len(event_strings)} events to remote memory service for user={user_id}"
105
105
  )
106
106
  return True
107
107
 
108
108
  except httpx.HTTPStatusError as e:
109
109
  logger.error(
110
- f"HTTP error saving memory: {e.response.status_code} " f"{e.response.text[:200]}"
110
+ f"HTTP error saving memory: {e.response.status_code} {e.response.text[:200]}"
111
111
  )
112
112
  return False
113
113
  except Exception as e:
@@ -133,6 +133,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
133
133
  """
134
134
  if not self.base_url:
135
135
  logger.warning("HttpLTMBackend: base_url not configured, return empty results.")
136
+ self.last_error = "base_url not configured"
136
137
  return []
137
138
 
138
139
  try:
@@ -161,7 +162,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
161
162
 
162
163
  except httpx.HTTPStatusError as e:
163
164
  logger.error(
164
- f"HTTP error searching memory: {e.response.status_code} " f"{e.response.text[:200]}"
165
+ f"HTTP error searching memory: {e.response.status_code} {e.response.text[:200]}"
165
166
  )
166
167
  return []
167
168
  except Exception as e:
@@ -173,3 +174,11 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
173
174
  if self._client:
174
175
  self._client.close()
175
176
  self._client = None
177
+
178
+ # ------------------------------------------------------------------
179
+ # 扩展协议(方案 §7.3):HTTP backend 为框架预留,结构化能力未定。
180
+ # 远程 API 对接细节待提供(见 save_memory TODO),因此不声明
181
+ # structured/update/delete/session_status 能力;search_records 也不降级
182
+ # 伪造 ID,保持 base 的 UnsupportedMemoryOperation 默认行为。
183
+ # 远端 schema 确认后,在此接入对应端点并覆写 capabilities()。
184
+ # ------------------------------------------------------------------