agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.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"
@@ -101,9 +104,13 @@ class KnowledgeBaseClient(BaseModel):
101
104
  return self._aicp_client
102
105
 
103
106
  try:
104
- from ksyun.common import credential
105
- from ksyun.common.profile.client_profile import ClientProfile
106
- from ksyun.common.profile.http_profile import HttpProfile
107
+ from ksyun.common import credential # type: ignore[import-untyped]
108
+ from ksyun.common.profile.client_profile import ( # type: ignore[import-untyped]
109
+ ClientProfile,
110
+ )
111
+ from ksyun.common.profile.http_profile import ( # type: ignore[import-untyped]
112
+ HttpProfile,
113
+ )
107
114
  except ImportError:
108
115
  raise ImportError(
109
116
  "kingsoftcloud-sdk-python is required for knowledge base. "
@@ -129,7 +136,9 @@ class KnowledgeBaseClient(BaseModel):
129
136
  "Ensure kingsoftcloud-sdk-python is installed and up to date."
130
137
  )
131
138
 
132
- cred = credential.Credential(self.access_key, self.secret_key)
139
+ cred = credential.Credential(
140
+ self.access_key, self.secret_key, self.session_token or None
141
+ )
133
142
 
134
143
  http_profile = HttpProfile()
135
144
  http_profile.endpoint = self.endpoint
@@ -140,9 +149,7 @@ class KnowledgeBaseClient(BaseModel):
140
149
  client_profile = ClientProfile()
141
150
  client_profile.httpProfile = http_profile
142
151
 
143
- self._aicp_client = aicp_module.AicpClient(
144
- cred, self.region, profile=client_profile
145
- )
152
+ self._aicp_client = aicp_module.AicpClient(cred, self.region, profile=client_profile)
146
153
 
147
154
  # 强制覆写 API 版本为 RetrieveKnowledge 所需的 2025-11-14
148
155
  # SDK 的 _apiVersion 由导入的模块版本决定,可能不匹配
@@ -159,19 +166,20 @@ class KnowledgeBaseClient(BaseModel):
159
166
  """构建 RetrieveKnowledge 请求参数 (JSON 嵌套格式)"""
160
167
  effective_top_k = top_k if top_k is not None else self.top_k
161
168
 
162
- params = {
169
+ retrieval_model: dict[str, Any] = {
170
+ "SearchMethod": self.search_method,
171
+ "TopK": effective_top_k,
172
+ "RerankingEnable": self.reranking_enable,
173
+ }
174
+ params: dict[str, Any] = {
163
175
  "DatasetId": self.dataset_id,
164
176
  "Query": query,
165
- "RetrievalModel": {
166
- "SearchMethod": self.search_method,
167
- "TopK": effective_top_k,
168
- "RerankingEnable": self.reranking_enable,
169
- },
177
+ "RetrievalModel": retrieval_model,
170
178
  }
171
179
 
172
180
  if self.score_threshold_enabled:
173
- params["RetrievalModel"]["ScoreThresholdEnabled"] = True
174
- params["RetrievalModel"]["ScoreThreshold"] = self.score_threshold
181
+ retrieval_model["ScoreThresholdEnabled"] = True
182
+ retrieval_model["ScoreThreshold"] = self.score_threshold
175
183
 
176
184
  return params
177
185
 
@@ -205,9 +213,7 @@ class KnowledgeBaseClient(BaseModel):
205
213
 
206
214
  return results
207
215
 
208
- def search(
209
- self, query: str, top_k: Optional[int] = None
210
- ) -> List[KnowledgeBaseResult]:
216
+ def search(self, query: str, top_k: Optional[int] = None) -> List[KnowledgeBaseResult]:
211
217
  """检索知识库
212
218
 
213
219
  Args:
@@ -221,18 +227,14 @@ class KnowledgeBaseClient(BaseModel):
221
227
  params = self._build_params(query, top_k)
222
228
 
223
229
  logger.info(
224
- f"Searching knowledge base: dataset_id={self.dataset_id}, "
225
- f"query='{query[:50]}'"
230
+ f"Searching knowledge base: dataset_id={self.dataset_id}, " f"query='{query[:50]}'"
226
231
  )
227
232
 
228
233
  try:
229
- response = client.call(
230
- "RetrieveKnowledge", params, options={"IsPostJson": True}
231
- )
234
+ response = client.call("RetrieveKnowledge", params, options={"IsPostJson": True})
232
235
  results = self._parse_response(response)
233
236
  logger.info(
234
- f"Knowledge base returned {len(results)} results "
235
- f"for query='{query[:50]}'"
237
+ f"Knowledge base returned {len(results)} results " f"for query='{query[:50]}'"
236
238
  )
237
239
  return results
238
240
  except Exception as e:
@@ -252,19 +254,23 @@ class KnowledgeBaseClient(BaseModel):
252
254
  dataset_id = os.environ.get("KSADK_KB_DATASET_ID", "")
253
255
  if not dataset_id:
254
256
  raise ValueError(
255
- "KSADK_KB_DATASET_ID environment variable is required "
256
- "to enable knowledge base."
257
+ "KSADK_KB_DATASET_ID environment variable is required " "to enable knowledge base."
257
258
  )
258
259
 
259
260
  access_key = (
260
261
  os.environ.get("KSADK_KB_ACCESS_KEY")
261
262
  or os.environ.get("KSYUN_ACCESS_KEY")
263
+ or os.environ.get("KSYUN_ACCESS_KEY_ID")
262
264
  or os.environ.get("KSYUN_SECRET_ID", "")
263
265
  )
264
266
  secret_key = (
265
267
  os.environ.get("KSADK_KB_SECRET_KEY")
266
268
  or os.environ.get("KSYUN_SECRET_KEY")
267
- or os.environ.get("KSYUN_SECRET_KEY", "")
269
+ or os.environ.get("KSYUN_SECRET_ACCESS_KEY", "")
270
+ )
271
+ session_token = (
272
+ os.environ.get("KSADK_KB_SESSION_TOKEN")
273
+ or os.environ.get("KSYUN_SESSION_TOKEN", "")
268
274
  )
269
275
 
270
276
  score_threshold_str = os.environ.get("KSADK_KB_SCORE_THRESHOLD", "")
@@ -279,13 +285,12 @@ class KnowledgeBaseClient(BaseModel):
279
285
  dataset_id=dataset_id,
280
286
  access_key=access_key,
281
287
  secret_key=secret_key,
288
+ session_token=session_token,
282
289
  region=connection["region"],
283
290
  endpoint=connection["endpoint"],
284
291
  scheme=connection["scheme"],
285
292
  top_k=int(os.environ.get("KSADK_KB_TOP_K", "5")),
286
- search_method=os.environ.get(
287
- "KSADK_KB_SEARCH_METHOD", "intelligence_search"
288
- ),
293
+ search_method=os.environ.get("KSADK_KB_SEARCH_METHOD", "intelligence_search"),
289
294
  score_threshold=score_threshold,
290
295
  score_threshold_enabled=score_threshold_enabled,
291
296
  reranking_enable=reranking_enable,
@@ -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
+ ]
@@ -0,0 +1,195 @@
1
+ """Managed runtime configuration and version resolution."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import subprocess
6
+ from dataclasses import dataclass
7
+ from importlib.metadata import PackageNotFoundError
8
+ from importlib.metadata import version as package_version
9
+ from typing import Any
10
+
11
+
12
+ class ManagedRuntimeError(ValueError):
13
+ """Raised when a managed runtime contract cannot be resolved safely."""
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class ResolvedRuntime:
18
+ name: str
19
+ version: str
20
+ source: str
21
+ package_requirement: str = ""
22
+
23
+
24
+ def runtime_config(config: dict[str, Any]) -> tuple[str, str]:
25
+ value = config.get("runtime")
26
+ if not isinstance(value, dict):
27
+ raise ManagedRuntimeError("ManagedRuntime 项目缺少 runtime 配置")
28
+ name = str(value.get("name") or "").strip().lower()
29
+ requested_version = str(value.get("version") or "").strip()
30
+ if not name:
31
+ raise ManagedRuntimeError("ManagedRuntime 项目缺少 runtime.name")
32
+ return name, requested_version
33
+
34
+
35
+ def extract_bootstrap_runtime(
36
+ bootstrap: dict[str, Any] | None,
37
+ runtime_name: str,
38
+ ) -> ResolvedRuntime | None:
39
+ if not isinstance(bootstrap, dict):
40
+ return None
41
+ configs = bootstrap.get("configs") or bootstrap.get("Configs")
42
+ if not isinstance(configs, dict):
43
+ return None
44
+ version = str(
45
+ configs.get("runtime.default_version")
46
+ or configs.get(f"runtime.{runtime_name}.default_version")
47
+ or ""
48
+ ).strip()
49
+ if not version:
50
+ return None
51
+ package = str(
52
+ configs.get("runtime.package")
53
+ or configs.get(f"runtime.{runtime_name}.package")
54
+ or ""
55
+ ).strip()
56
+ return ResolvedRuntime(
57
+ name=runtime_name,
58
+ version=version,
59
+ source="server",
60
+ package_requirement=package,
61
+ )
62
+
63
+
64
+ async def resolve_managed_runtime(
65
+ config: dict[str, Any],
66
+ *,
67
+ region: str,
68
+ bootstrap: dict[str, Any] | None = None,
69
+ ) -> ResolvedRuntime:
70
+ name, requested_version = runtime_config(config)
71
+ if requested_version:
72
+ return ResolvedRuntime(name=name, version=requested_version, source="manifest")
73
+
74
+ resolved = extract_bootstrap_runtime(bootstrap, name)
75
+ if resolved is not None:
76
+ return resolved
77
+
78
+ if bootstrap is None:
79
+ from ksadk.api.client import AgentEngineClient
80
+ from ksadk.version import VERSION as CLI_VERSION
81
+
82
+ try:
83
+ async with AgentEngineClient(region=region) as client:
84
+ payload = await client.get_client_bootstrap_config(
85
+ product="agentengine",
86
+ framework=name,
87
+ region=region,
88
+ client_type="cli",
89
+ client_version=CLI_VERSION,
90
+ ignore_dry_run=True,
91
+ )
92
+ except Exception as exc:
93
+ raise ManagedRuntimeError(
94
+ "无法从 AgentEngine 获取 ManagedRuntime 默认版本;"
95
+ "请连接服务端或在 agentengine.yaml 中显式配置 runtime.version"
96
+ ) from exc
97
+ resolved = extract_bootstrap_runtime(payload, name)
98
+ if resolved is not None:
99
+ return resolved
100
+
101
+ raise ManagedRuntimeError(
102
+ f"AgentEngine 未下发 {name} 的默认 Runtime 版本;"
103
+ "请配置服务端 Runtime catalog 或显式设置 runtime.version"
104
+ )
105
+
106
+
107
+ def installed_runtime_version(runtime_name: str) -> str:
108
+ package_name = {"codex": "openai-codex"}.get(runtime_name, runtime_name)
109
+ try:
110
+ return package_version(package_name)
111
+ except PackageNotFoundError:
112
+ return ""
113
+
114
+
115
+ def validate_installed_runtime(resolved: ResolvedRuntime) -> str:
116
+ installed = installed_runtime_version(resolved.name)
117
+ if not installed:
118
+ raise ManagedRuntimeError(
119
+ f"本地缺少 {resolved.name} runtime;请安装 `pip install 'ksadk[{resolved.name}]'`"
120
+ )
121
+ if resolved.version and installed != resolved.version:
122
+ raise ManagedRuntimeError(
123
+ f"本地 {resolved.name} runtime 版本为 {installed},"
124
+ f"配置要求 {resolved.version};请安装匹配版本后重试"
125
+ )
126
+ validate_runtime_binary(resolved)
127
+ return installed
128
+
129
+
130
+ def validate_runtime_binary(resolved: ResolvedRuntime) -> str:
131
+ if resolved.name != "codex":
132
+ return ""
133
+ try:
134
+ from codex_cli_bin import ( # type: ignore[import-not-found, import-untyped]
135
+ bundled_codex_path,
136
+ )
137
+
138
+ codex_bin = bundled_codex_path()
139
+ completed = subprocess.run(
140
+ [str(codex_bin), "--version"],
141
+ check=True,
142
+ capture_output=True,
143
+ text=True,
144
+ timeout=15,
145
+ )
146
+ except (ImportError, OSError, subprocess.SubprocessError) as exc:
147
+ raise ManagedRuntimeError(
148
+ "本地 Codex 平台二进制不可用;请重新安装 `pip install --force-reinstall "
149
+ "'ksadk[codex]'`"
150
+ ) from exc
151
+ output = f"{completed.stdout}\n{completed.stderr}".strip()
152
+ if resolved.version and resolved.version not in output:
153
+ raise ManagedRuntimeError(
154
+ f"Codex CLI 版本输出为 {output or '(empty)'},配置要求 {resolved.version}"
155
+ )
156
+ return output
157
+
158
+
159
+ async def resolve_local_managed_runtime(
160
+ config: dict[str, Any],
161
+ *,
162
+ region: str,
163
+ ) -> ResolvedRuntime:
164
+ """Resolve and verify the native runtime used by ``ksadk web``."""
165
+ name, requested_version = runtime_config(config)
166
+ if requested_version:
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
174
+
175
+ catalog_runtime: ResolvedRuntime | None = None
176
+ try:
177
+ catalog_runtime = await resolve_managed_runtime(config, region=region)
178
+ except ManagedRuntimeError:
179
+ pass
180
+ if catalog_runtime is not None:
181
+ validate_installed_runtime(catalog_runtime)
182
+ return catalog_runtime
183
+
184
+ installed = installed_runtime_version(name)
185
+ if not installed:
186
+ raise ManagedRuntimeError(
187
+ f"本地缺少 {name} runtime;请安装 `pip install 'ksadk[{name}]'`"
188
+ )
189
+ resolved = ResolvedRuntime(
190
+ name=name,
191
+ version=installed,
192
+ source="installed-unlocked",
193
+ )
194
+ validate_runtime_binary(resolved)
195
+ return resolved
ksadk/markdown.py CHANGED
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
4
 
5
-
6
5
  _FENCE_MARKER_CHARS = ("`", "~")
7
6
  _LIST_PREFIXES = ("- ", "* ", "+ ")
8
7
 
@@ -157,7 +156,11 @@ def _is_closing_fence(candidate: str, open_marker: str) -> bool:
157
156
 
158
157
 
159
158
  def _is_table_line(stripped_line: str) -> bool:
160
- return stripped_line.startswith("|") and stripped_line.endswith("|") and stripped_line.count("|") >= 2
159
+ return (
160
+ stripped_line.startswith("|")
161
+ and stripped_line.endswith("|")
162
+ and stripped_line.count("|") >= 2
163
+ )
161
164
 
162
165
 
163
166
  def _is_list_line(stripped_line: str) -> bool:
@@ -1,18 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import inspect
3
4
  import json
4
5
  import os
5
- import inspect
6
6
  from dataclasses import dataclass
7
- from typing import Any, Sequence
7
+ from typing import Any, Coroutine, Sequence, cast
8
8
  from urllib.parse import urlparse
9
9
 
10
10
  import httpx
11
- from google.adk.tools.mcp_tool.mcp_session_manager import (
11
+
12
+ from ksadk.compat.adk_compat import (
12
13
  CheckableMcpHttpClientFactory,
14
+ McpToolset,
13
15
  StreamableHTTPConnectionParams,
14
16
  )
15
- from google.adk.tools.mcp_tool.mcp_toolset import McpToolset
16
17
 
17
18
  MCP_TOOLSET_KEY_ATTR = "_ksadk_mcp_toolset_key"
18
19
 
@@ -64,7 +65,9 @@ def build_connection_params(
64
65
  httpx_client_factory: CheckableMcpHttpClientFactory | None = None,
65
66
  ) -> StreamableHTTPConnectionParams:
66
67
  kwargs: dict[str, Any] = {"url": config.url, "headers": config.headers}
67
- kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(config.url)
68
+ kwargs["httpx_client_factory"] = httpx_client_factory or _default_httpx_client_factory(
69
+ config.url
70
+ )
68
71
  return StreamableHTTPConnectionParams(**kwargs)
69
72
 
70
73
 
@@ -146,7 +149,7 @@ def _mcp_toolset_tools_sync(toolset: Any) -> list[Any]:
146
149
  try:
147
150
  asyncio.get_running_loop()
148
151
  except RuntimeError:
149
- result = asyncio.run(result)
152
+ result = asyncio.run(cast(Coroutine[Any, Any, Any], result))
150
153
  else:
151
154
  close = getattr(result, "close", None)
152
155
  if callable(close):
ksadk/memory/__init__.py CHANGED
@@ -13,9 +13,9 @@
13
13
 
14
14
  from typing import TYPE_CHECKING
15
15
 
16
- from ksadk.memory.manager import MemoryManager, get_memory_manager
17
16
  from ksadk.memory.backends.base import BaseMemoryBackend
18
17
  from ksadk.memory.backends.memory import InMemoryBackend
18
+ from ksadk.memory.manager import MemoryManager, get_memory_manager
19
19
 
20
20
  if TYPE_CHECKING:
21
21
  from ksadk.memory.service import LongTermMemoryService
@@ -39,10 +39,12 @@ if TYPE_CHECKING:
39
39
  def __getattr__(name):
40
40
  if name == "ShortTermMemory":
41
41
  from ksadk.memory.adk.short_term_memory import ShortTermMemory
42
+
42
43
  return ShortTermMemory
43
44
 
44
45
  if name == "LongTermMemory":
45
46
  from ksadk.memory.adk.long_term_memory import LongTermMemory
47
+
46
48
  return LongTermMemory
47
49
 
48
50
  raise AttributeError(f"module 'ksadk.memory.adk' has no attribute '{name}'")
@@ -21,9 +21,7 @@ class BaseLongTermMemoryBackend(ABC, BaseModel):
21
21
  index: str = ""
22
22
 
23
23
  @abstractmethod
24
- def save_memory(
25
- self, user_id: str, event_strings: List[str], **kwargs
26
- ) -> bool:
24
+ def save_memory(self, user_id: str, event_strings: List[str], **kwargs) -> bool:
27
25
  """保存记忆
28
26
 
29
27
  Args:
@@ -36,9 +34,7 @@ class BaseLongTermMemoryBackend(ABC, BaseModel):
36
34
  pass
37
35
 
38
36
  @abstractmethod
39
- def search_memory(
40
- self, user_id: str, query: str, top_k: int = 5, **kwargs
41
- ) -> List[str]:
37
+ def search_memory(self, user_id: str, query: str, top_k: int = 5, **kwargs) -> List[str]:
42
38
  """检索记忆
43
39
 
44
40
  Args: