agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__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 (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
@@ -5,12 +5,6 @@ Monkey patch for langchain-openai to support reasoning_content field (e.g. for D
5
5
  import logging
6
6
  from typing import Any, Mapping, cast
7
7
 
8
- from ksadk.conversations.model_options import (
9
- model_options_for_chat_completions,
10
- model_options_for_responses,
11
- )
12
- from ksadk.runtime_context import get_current_invocation_context
13
-
14
8
  from langchain_core.messages import (
15
9
  AIMessageChunk,
16
10
  BaseMessageChunk,
@@ -22,6 +16,12 @@ from langchain_core.messages import (
22
16
  )
23
17
  from langchain_core.messages.tool import tool_call_chunk
24
18
 
19
+ from ksadk.conversations.model_options import (
20
+ model_options_for_chat_completions,
21
+ model_options_for_responses,
22
+ )
23
+ from ksadk.runtime_context import get_current_invocation_context
24
+
25
25
  logger = logging.getLogger(__name__)
26
26
 
27
27
  # Original function reference (to avoid recursion if patched multiple times)
@@ -95,22 +95,22 @@ _original_chat_get_request_payload = None
95
95
  def _patched_convert_message_to_dict(message, *args, **kwargs):
96
96
  """Patched version to include reasoning_content in outgoing requests."""
97
97
  from langchain_core.messages import AIMessage
98
-
98
+
99
99
  # Call original function first
100
100
  result = _original_convert_message_to_dict(message, *args, **kwargs)
101
-
101
+
102
102
  # If this is an AIMessage with tool_calls and reasoning_content in additional_kwargs
103
103
  if isinstance(message, AIMessage):
104
- additional_kwargs = getattr(message, 'additional_kwargs', {}) or {}
105
- reasoning = additional_kwargs.get('reasoning_content')
106
-
104
+ additional_kwargs = getattr(message, "additional_kwargs", {}) or {}
105
+ reasoning = additional_kwargs.get("reasoning_content")
106
+
107
107
  # Only add if we have tool_calls (required by some thinking models)
108
108
  if message.tool_calls and reasoning is not None:
109
- result['reasoning_content'] = reasoning
109
+ result["reasoning_content"] = reasoning
110
110
  elif message.tool_calls and reasoning is None:
111
111
  # Force add empty reasoning_content for thinking models
112
- result['reasoning_content'] = ''
113
-
112
+ result["reasoning_content"] = ""
113
+
114
114
  return result
115
115
 
116
116
 
@@ -168,7 +168,7 @@ def apply_patch():
168
168
  # Patch 1: Fix receiving responses (capture reasoning_content)
169
169
  _original_convert_delta = base_module._convert_delta_to_message_chunk
170
170
  base_module._convert_delta_to_message_chunk = _patched_convert_delta_to_message_chunk
171
-
171
+
172
172
  # Patch 2: Fix sending requests (include reasoning_content for tool_call messages)
173
173
  _original_convert_message_to_dict = base_module._convert_message_to_dict
174
174
  base_module._convert_message_to_dict = _patched_convert_message_to_dict
@@ -177,7 +177,7 @@ def apply_patch():
177
177
  base_module.BaseChatOpenAI._get_request_payload = _patched_base_get_request_payload
178
178
  _original_chat_get_request_payload = base_module.ChatOpenAI._get_request_payload
179
179
  base_module.ChatOpenAI._get_request_payload = _patched_chat_get_request_payload
180
-
180
+
181
181
  base_module._ksadk_patched = True
182
182
 
183
183
  # logger.info("Applied langchain-openai patch for reasoning_content support")
@@ -47,7 +47,9 @@ class RemoteRunner(BaseRunner):
47
47
  self._responses_text_streamed = False
48
48
  self._responses_reasoning_streamed = False
49
49
  self._observed_model: str | None = None # 流式回包里观察到的真实模型名
50
- self.available_models: list[dict[str, Any]] | None = None # ListAgentModels 拿到的可选模型列表
50
+ self.available_models: list[dict[str, Any]] | None = (
51
+ None # ListAgentModels 拿到的可选模型列表
52
+ )
51
53
 
52
54
  @staticmethod
53
55
  def _normalize_api_format(api_format: Optional[str]) -> str:
@@ -112,19 +114,45 @@ class RemoteRunner(BaseRunner):
112
114
  return str(user_input or "")
113
115
 
114
116
  @staticmethod
115
- def _build_responses_conversation_history(history: Any, current_input: Any) -> list[dict[str, Any]]:
116
- if not isinstance(history, Sequence) or isinstance(
117
- history, (str, bytes, bytearray)
118
- ):
117
+ def _build_responses_conversation_history(
118
+ history: Any, current_input: Any
119
+ ) -> list[dict[str, Any]]:
120
+ if not isinstance(history, Sequence) or isinstance(history, (str, bytes, bytearray)):
119
121
  return []
120
122
 
121
123
  messages: list[dict[str, Any]] = []
124
+ current_output_call_ids: set[str] = set()
125
+ if isinstance(current_input, Mapping):
126
+ current_items = [current_input]
127
+ elif isinstance(current_input, Sequence) and not isinstance(
128
+ current_input, (str, bytes, bytearray)
129
+ ):
130
+ current_items = [item for item in current_input if isinstance(item, Mapping)]
131
+ else:
132
+ current_items = []
133
+ for item in current_items:
134
+ if str(item.get("type") or "").strip().lower() != "function_call_output":
135
+ continue
136
+ call_id = str(item.get("call_id") or "").strip()
137
+ if call_id:
138
+ current_output_call_ids.add(call_id)
122
139
  current_text = RemoteRunner._responses_message_text(
123
140
  {"role": "user", "content": current_input}
124
141
  ).strip()
125
142
  for item in history:
126
143
  if not isinstance(item, Mapping):
127
144
  continue
145
+ item_type = str(item.get("type") or "").strip().lower()
146
+ if item_type in {"function_call", "function_call_output"}:
147
+ # Responses tool items are already protocol-shaped. Do not
148
+ # reinterpret them as chat messages or they lose call_id.
149
+ if (
150
+ item_type == "function_call_output"
151
+ and str(item.get("call_id") or "").strip() in current_output_call_ids
152
+ ):
153
+ continue
154
+ messages.append(dict(item))
155
+ continue
128
156
  role = str(item.get("role") or "").strip().lower()
129
157
  if role == "model":
130
158
  role = "assistant"
@@ -144,7 +172,9 @@ class RemoteRunner(BaseRunner):
144
172
  return messages
145
173
 
146
174
  @staticmethod
147
- def _responses_conversation_name(input_data: Mapping[str, Any], session_id: Optional[str]) -> str:
175
+ def _responses_conversation_name(
176
+ input_data: Mapping[str, Any], session_id: Optional[str]
177
+ ) -> str:
148
178
  if not session_id:
149
179
  return ""
150
180
  platform_context = input_data.get("platform_context")
@@ -181,10 +211,27 @@ class RemoteRunner(BaseRunner):
181
211
  "input": self._build_responses_input(user_input),
182
212
  "stream": stream,
183
213
  }
184
- history_enabled = bool(input_data.get("responses_conversation")) and not previous_response_id
214
+ history_enabled = (
215
+ bool(input_data.get("responses_conversation"))
216
+ or bool(input_data.get("responses_history"))
217
+ ) and not previous_response_id
185
218
  if history_enabled:
219
+ structured_history = input_data.get("responses_history")
220
+ history_input: Sequence[Any] | None
221
+ if isinstance(structured_history, Sequence) and not isinstance(
222
+ structured_history, (str, bytes, bytearray)
223
+ ):
224
+ history_input = structured_history
225
+ else:
226
+ fallback_history = input_data.get("history")
227
+ history_input = (
228
+ fallback_history
229
+ if isinstance(fallback_history, Sequence)
230
+ and not isinstance(fallback_history, (str, bytes, bytearray))
231
+ else None
232
+ )
186
233
  history = self._build_responses_conversation_history(
187
- input_data.get("history"),
234
+ history_input,
188
235
  user_input,
189
236
  )
190
237
  if history:
@@ -193,9 +240,7 @@ class RemoteRunner(BaseRunner):
193
240
  if conversation and not previous_response_id:
194
241
  payload["conversation"] = conversation
195
242
  elif (
196
- input_data.get("responses_conversation")
197
- and session_id
198
- and not previous_response_id
243
+ input_data.get("responses_conversation") and session_id and not previous_response_id
199
244
  ):
200
245
  conversation = self._responses_conversation_name(input_data, str(session_id))
201
246
  if conversation:
@@ -209,9 +254,15 @@ class RemoteRunner(BaseRunner):
209
254
  return payload
210
255
 
211
256
  @staticmethod
212
- def _builtin_response_tool_schemas(input_data: Mapping[str, Any] | None = None) -> list[dict[str, Any]]:
257
+ def _builtin_response_tool_schemas(
258
+ input_data: Mapping[str, Any] | None = None,
259
+ ) -> list[dict[str, Any]]:
213
260
  try:
214
- from ksadk.toolsets import builtin_tool_descriptors_for_runtime, builtin_tools_mode, describe_agentengine_tools
261
+ from ksadk.toolsets import (
262
+ builtin_tool_descriptors_for_runtime,
263
+ builtin_tools_mode,
264
+ describe_agentengine_tools,
265
+ )
215
266
 
216
267
  mode = builtin_tools_mode(default="off")
217
268
  descriptors = builtin_tool_descriptors_for_runtime(mode=mode)
@@ -220,7 +271,9 @@ class RemoteRunner(BaseRunner):
220
271
  deferred_names = RemoteRunner._deferred_tool_names(input_data)
221
272
  if deferred_names:
222
273
  try:
223
- direct_descriptors = describe_agentengine_tools(include=deferred_names, profile="coding")
274
+ direct_descriptors = describe_agentengine_tools(
275
+ include=deferred_names, profile="coding"
276
+ )
224
277
  except Exception:
225
278
  direct_descriptors = []
226
279
  direct_descriptors = [
@@ -347,7 +400,9 @@ class RemoteRunner(BaseRunner):
347
400
  usage = self._response_usage_payload(data)
348
401
 
349
402
  if self.api_format == "responses":
350
- result = {"output": self._extract_responses_output_text(data) or str(data)}
403
+ result: dict[str, Any] = {
404
+ "output": self._extract_responses_output_text(data) or str(data)
405
+ }
351
406
  if usage:
352
407
  result["usage"] = usage
353
408
  return result
@@ -440,7 +495,9 @@ class RemoteRunner(BaseRunner):
440
495
  # 兜底:api_format 标成 chat 但 runtime 实发 responses 格式
441
496
  # 事件(event_name 或 data.type 以 response. 开头)→ 按 responses
442
497
  # 解析,否则 response.reasoning.delta 会被 chat 路径当顶层 text 显示。
443
- _ev = event_name or (str(data.get("type")) if isinstance(data, Mapping) else "")
498
+ _ev = event_name or (
499
+ str(data.get("type")) if isinstance(data, Mapping) else ""
500
+ )
444
501
  if _ev.startswith("response."):
445
502
  async for item in self._iter_responses_stream_events(
446
503
  data, event_name=event_name
@@ -592,7 +649,13 @@ class RemoteRunner(BaseRunner):
592
649
  else item.get("args", item.get("input"))
593
650
  )
594
651
  self._remember_responses_tool(key, item, name, args)
595
- yield {"type": "tool_call", "tool_name": name, "tool_args": args, "status": status, "call_id": key}
652
+ yield {
653
+ "type": "tool_call",
654
+ "tool_name": name,
655
+ "tool_args": args,
656
+ "status": status,
657
+ "call_id": key,
658
+ }
596
659
  return
597
660
 
598
661
  if item_type == "function_call_output":
@@ -605,7 +668,12 @@ class RemoteRunner(BaseRunner):
605
668
  output = self._stringify_responses_payload(
606
669
  item.get("output") if "output" in item else item.get("result", item.get("content"))
607
670
  )
608
- yield {"type": "tool_result", "tool_name": name, "tool_output": output, "call_id": call_id or key}
671
+ yield {
672
+ "type": "tool_result",
673
+ "tool_name": name,
674
+ "tool_output": output,
675
+ "call_id": call_id or key,
676
+ }
609
677
  return
610
678
 
611
679
  if item_type == "mcp_approval_request":
@@ -687,9 +755,17 @@ class RemoteRunner(BaseRunner):
687
755
  # ksadk/runtime 特有 tool 事件(对标 hosted UI responses-stream.js:176-186)
688
756
  if event_type in {"response.tool_call", "response.ksadk.stage_tool_call"}:
689
757
  name = str(data.get("name") or data.get("tool_name") or "tool")
690
- args = self._stringify_responses_payload(data.get("args") if "args" in data else data.get("arguments"))
758
+ args = self._stringify_responses_payload(
759
+ data.get("args") if "args" in data else data.get("arguments")
760
+ )
691
761
  cid = str(data.get("call_id") or data.get("item_id") or data.get("run_id") or "")
692
- yield {"type": "tool_call", "tool_name": name, "tool_args": args, "status": "running", "call_id": cid}
762
+ yield {
763
+ "type": "tool_call",
764
+ "tool_name": name,
765
+ "tool_args": args,
766
+ "status": "running",
767
+ "call_id": cid,
768
+ }
693
769
  return
694
770
  if event_type in {
695
771
  "response.tool_result",
@@ -697,7 +773,9 @@ class RemoteRunner(BaseRunner):
697
773
  "response.ksadk.stage_tool_result",
698
774
  }:
699
775
  name = str(data.get("name") or data.get("tool_name") or "tool")
700
- output = self._stringify_responses_payload(data.get("output") if "output" in data else data.get("result"))
776
+ output = self._stringify_responses_payload(
777
+ data.get("output") if "output" in data else data.get("result")
778
+ )
701
779
  cid = str(data.get("call_id") or data.get("item_id") or data.get("run_id") or "")
702
780
  yield {
703
781
  "type": "tool_result",
@@ -712,7 +790,13 @@ class RemoteRunner(BaseRunner):
712
790
  args = f"{self._responses_tool_args.get(key, '')}{str(data.get('delta') or '')}"
713
791
  if key:
714
792
  self._responses_tool_args[key] = args
715
- yield {"type": "tool_call", "tool_name": name, "tool_args": args, "status": "running", "call_id": key}
793
+ yield {
794
+ "type": "tool_call",
795
+ "tool_name": name,
796
+ "tool_args": args,
797
+ "status": "running",
798
+ "call_id": key,
799
+ }
716
800
  return
717
801
  if event_type == "response.function_call_arguments.done":
718
802
  key = str(data.get("item_id") or data.get("call_id") or "")
@@ -722,16 +806,27 @@ class RemoteRunner(BaseRunner):
722
806
  )
723
807
  if key:
724
808
  self._responses_tool_args[key] = args
725
- yield {"type": "tool_call", "tool_name": name, "tool_args": args, "status": "running", "call_id": key}
809
+ yield {
810
+ "type": "tool_call",
811
+ "tool_name": name,
812
+ "tool_args": args,
813
+ "status": "running",
814
+ "call_id": key,
815
+ }
726
816
  return
727
817
  if event_type == "response.completed":
728
- response = data.get("response") if isinstance(data.get("response"), dict) else data
729
- output = response.get("output") if isinstance(response, dict) else None
730
- if isinstance(output, list):
818
+ nested_response = data.get("response")
819
+ response_data: dict[str, Any] = (
820
+ dict(nested_response) if isinstance(nested_response, dict) else data
821
+ )
822
+ completed_output = (
823
+ response_data.get("output") if isinstance(response_data, dict) else None
824
+ )
825
+ if isinstance(completed_output, list):
731
826
  replayed_item_keys = set(self._responses_streamed_item_keys)
732
827
  replay_completed_text = not self._responses_text_streamed
733
828
  replay_completed_reasoning = not self._responses_reasoning_streamed
734
- for item in output:
829
+ for item in completed_output:
735
830
  if isinstance(item, dict):
736
831
  key = self._responses_item_key(item, {"item": item})
737
832
  call_id = str(item.get("call_id") or "")
@@ -748,13 +843,13 @@ class RemoteRunner(BaseRunner):
748
843
  yield projected
749
844
  chunk = {
750
845
  "type": "responses_output",
751
- "output": output,
752
- "response_id": response.get("id"),
846
+ "output": completed_output,
847
+ "response_id": response_data.get("id"),
753
848
  }
754
- usage = response.get("usage")
849
+ usage = response_data.get("usage")
755
850
  if isinstance(usage, Mapping):
756
851
  chunk["usage"] = dict(usage)
757
- metadata = response.get("metadata")
852
+ metadata = response_data.get("metadata")
758
853
  if isinstance(metadata, Mapping):
759
854
  chunk["metadata"] = dict(metadata)
760
855
  yield chunk
@@ -762,9 +857,15 @@ class RemoteRunner(BaseRunner):
762
857
  # response.content_part.delta:glm 等模型把 reasoning 走这个事件,
763
858
  # partType 含 "reasoning" → thinking(不显示),否则 text(对标 hosted UI)。
764
859
  if event_type == "response.content_part.delta":
765
- part = data.get("part") if isinstance(data.get("part"), dict) else {}
860
+ part_value = data.get("part")
861
+ part: dict[str, Any] = dict(part_value) if isinstance(part_value, dict) else {}
766
862
  delta = data.get("delta")
767
- part_type = str(part.get("type") or (delta.get("type") if isinstance(delta, dict) else "") or data.get("content_type") or "")
863
+ part_type = str(
864
+ part.get("type")
865
+ or (delta.get("type") if isinstance(delta, dict) else "")
866
+ or data.get("content_type")
867
+ or ""
868
+ )
768
869
  text = ""
769
870
  if isinstance(delta, dict):
770
871
  text = str(delta.get("text") or delta.get("content") or "")
@@ -6,6 +6,7 @@ cached_tokens;Anthropic 经 langchain_anthropic 转换后 input_tokens 含 cache
6
6
  cache_creation),直接相加不重复;input_token_details 键名不统一(cached/cache_read/
7
7
  cache_creation),逐键求和作诊断明细。
8
8
  """
9
+
9
10
  from __future__ import annotations
10
11
 
11
12
  from typing import Any
@@ -157,7 +157,7 @@ def get_langfuse_callbacks() -> list[Any]:
157
157
  return callbacks
158
158
 
159
159
 
160
- def get_langfuse_metadata(session_id: str = None) -> dict:
160
+ def get_langfuse_metadata(session_id: str | None = None) -> dict[str, Any]:
161
161
  """获取 Langfuse 的 metadata 字典
162
162
 
163
163
  通过 metadata 字段传递 trace 属性:
@@ -171,7 +171,7 @@ def get_langfuse_metadata(session_id: str = None) -> dict:
171
171
  Returns:
172
172
  包含 Langfuse 属性的 metadata 字典
173
173
  """
174
- metadata = {}
174
+ metadata: dict[str, Any] = {}
175
175
 
176
176
  if session_id:
177
177
  metadata["langfuse_session_id"] = session_id
@@ -201,7 +201,7 @@ def get_langfuse_metadata(session_id: str = None) -> dict:
201
201
  return metadata
202
202
 
203
203
 
204
- def prepare_trace_metadata(session_id: str = None) -> tuple:
204
+ def prepare_trace_metadata(session_id: str | None = None) -> tuple[Any, list[Any], Any, Any]:
205
205
  """准备 Trace 元数据
206
206
 
207
207
  Returns:
@@ -18,37 +18,37 @@ def load_agent_module(
18
18
  force_reload: bool = False,
19
19
  ) -> Any:
20
20
  """加载 Agent 模块
21
-
21
+
22
22
  Args:
23
23
  project_dir: 项目目录
24
24
  entry_point: 入口文件 (e.g., "agent.py")
25
25
  agent_variable: Agent 变量名 (e.g., "root_agent", "graph")
26
-
26
+
27
27
  Returns:
28
28
  加载的 Agent 对象
29
-
29
+
30
30
  Raises:
31
31
  ImportError: 模块导入失败
32
32
  AttributeError: 未找到 Agent 变量
33
33
  """
34
34
  project_path = Path(project_dir).resolve()
35
-
35
+
36
36
  # 添加项目目录到 Python 路径
37
37
  if str(project_path) not in sys.path:
38
38
  sys.path.insert(0, str(project_path))
39
39
  src_path = project_path / "src"
40
40
  if src_path.is_dir() and str(src_path) not in sys.path:
41
41
  sys.path.insert(0, str(src_path))
42
-
42
+
43
43
  # 确定模块名
44
44
  if entry_point.endswith(".py"):
45
45
  module_name = entry_point[:-3]
46
46
  else:
47
47
  module_name = entry_point
48
-
48
+
49
49
  # 路径转换为模块路径
50
50
  module_name = module_name.replace("/", ".").replace("\\", ".")
51
-
51
+
52
52
  try:
53
53
  if force_reload and module_name in sys.modules:
54
54
  module = importlib.reload(sys.modules[module_name])
@@ -0,0 +1,41 @@
1
+ """RuntimeAdapter 平台接口包 (goal-03 冻结签名 + goal-07 框架实现)。"""
2
+
3
+ from ksadk.runtime.adapter import (
4
+ CONVERSATION_PREPROCESSING_METADATA_KEY,
5
+ BaseRuntime,
6
+ CancelResult,
7
+ CheckpointCapability,
8
+ CheckpointDescriptor,
9
+ ConversationPreprocessingRequest,
10
+ ResumePayload,
11
+ ResumeTarget,
12
+ RunHandle,
13
+ RuntimeAdapter,
14
+ RuntimeRegistry,
15
+ StartRequest,
16
+ )
17
+ from ksadk.runtime.framework_adapters import (
18
+ ADKRuntimeAdapter,
19
+ LangGraphRuntimeAdapter,
20
+ build_default_registry,
21
+ )
22
+ from ksadk.runtime.runner_adapter import RunnerRuntimeAdapter
23
+
24
+ __all__ = [
25
+ "ADKRuntimeAdapter",
26
+ "BaseRuntime",
27
+ "CancelResult",
28
+ "CheckpointCapability",
29
+ "CheckpointDescriptor",
30
+ "ConversationPreprocessingRequest",
31
+ "CONVERSATION_PREPROCESSING_METADATA_KEY",
32
+ "LangGraphRuntimeAdapter",
33
+ "ResumePayload",
34
+ "ResumeTarget",
35
+ "RunHandle",
36
+ "RunnerRuntimeAdapter",
37
+ "RuntimeAdapter",
38
+ "RuntimeRegistry",
39
+ "StartRequest",
40
+ "build_default_registry",
41
+ ]