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,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
@@ -2,18 +2,8 @@
2
2
  Runner 公共工具模块
3
3
  """
4
4
 
5
- from ksadk.runners.utils.langfuse import (
6
- get_langfuse_callback,
7
- get_langfuse_callbacks,
8
- get_langfuse_metadata,
9
- prepare_trace_metadata,
10
- )
11
5
  from ksadk.runners.utils.loader import load_agent_module
12
6
 
13
7
  __all__ = [
14
- "get_langfuse_callback",
15
- "get_langfuse_callbacks",
16
- "get_langfuse_metadata",
17
- "prepare_trace_metadata",
18
8
  "load_agent_module",
19
9
  ]
@@ -18,38 +18,54 @@ 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
+ entry_file = (project_path / entry_point).resolve()
46
47
  else:
47
48
  module_name = entry_point
48
-
49
+ entry_file = None
50
+
49
51
  # 路径转换为模块路径
50
52
  module_name = module_name.replace("/", ".").replace("\\", ".")
51
-
53
+
52
54
  try:
55
+ # Studio 会在同一 Python 进程内运行多个不可变 Bundle。它们通常都以
56
+ # ``agent.py`` 为入口;仅靠 ``import_module("agent")`` 会复用上一个
57
+ # Bundle 的 sys.modules 缓存,进而加载错误的 agentVariable。只复用与
58
+ # 当前 entry 文件一致的缓存,其余情况让 import 从当前 project_path 重载。
59
+ cached = sys.modules.get(module_name)
60
+ cached_file = getattr(cached, "__file__", None)
61
+ cached_matches_entry = bool(
62
+ cached_file is not None
63
+ and entry_file is not None
64
+ and Path(str(cached_file)).resolve() == entry_file
65
+ )
66
+ if cached is not None and not cached_matches_entry:
67
+ sys.modules.pop(module_name, None)
68
+ importlib.invalidate_caches()
53
69
  if force_reload and module_name in sys.modules:
54
70
  module = importlib.reload(sys.modules[module_name])
55
71
  else:
@@ -0,0 +1,67 @@
1
+ """Side-effect-free public exports for the canonical RuntimeAdapter stack."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from importlib import import_module
6
+ from typing import Any
7
+
8
+ _EXPORTS = {
9
+ "ADKRuntimeAdapter": ("ksadk.runtime.framework_adapters", "ADKRuntimeAdapter"),
10
+ "BaseRuntime": ("ksadk.runtime.adapter", "BaseRuntime"),
11
+ "CancelResult": ("ksadk.runtime.adapter", "CancelResult"),
12
+ "PauseResult": ("ksadk.runtime.adapter", "PauseResult"),
13
+ "CheckpointCapability": ("ksadk.runtime.adapter", "CheckpointCapability"),
14
+ "CheckpointDescriptor": ("ksadk.runtime.adapter", "CheckpointDescriptor"),
15
+ "ConversationPreprocessingRequest": (
16
+ "ksadk.runtime.adapter",
17
+ "ConversationPreprocessingRequest",
18
+ ),
19
+ "CONVERSATION_PREPROCESSING_METADATA_KEY": (
20
+ "ksadk.runtime.adapter",
21
+ "CONVERSATION_PREPROCESSING_METADATA_KEY",
22
+ ),
23
+ "LangGraphRuntimeAdapter": (
24
+ "ksadk.runtime.framework_adapters",
25
+ "LangGraphRuntimeAdapter",
26
+ ),
27
+ "RESUME_START_REQUEST_NATIVE_KEY": (
28
+ "ksadk.runtime.adapter",
29
+ "RESUME_START_REQUEST_NATIVE_KEY",
30
+ ),
31
+ "ResumePayload": ("ksadk.runtime.adapter", "ResumePayload"),
32
+ "ResumeTarget": ("ksadk.runtime.adapter", "ResumeTarget"),
33
+ "RunHandle": ("ksadk.runtime.adapter", "RunHandle"),
34
+ "RunnerRuntimeAdapter": ("ksadk.runtime.runner_adapter", "RunnerRuntimeAdapter"),
35
+ "RuntimeAdapter": ("ksadk.runtime.adapter", "RuntimeAdapter"),
36
+ "RuntimeAdapterFactory": ("ksadk.runtime.adapter", "RuntimeAdapterFactory"),
37
+ "RuntimeExecutor": ("ksadk.runtime.executor", "RuntimeExecutor"),
38
+ "RuntimeStartPreparation": (
39
+ "ksadk.runtime.executor",
40
+ "RuntimeStartPreparation",
41
+ ),
42
+ "RuntimeLaunchContext": ("ksadk.runtime.adapter", "RuntimeLaunchContext"),
43
+ "RuntimeRegistry": ("ksadk.runtime.adapter", "RuntimeRegistry"),
44
+ "RuntimeServices": ("ksadk.runtime.adapter", "RuntimeServices"),
45
+ "StartRequest": ("ksadk.runtime.adapter", "StartRequest"),
46
+ "build_default_runtime_registry": (
47
+ "ksadk.runtime.factory",
48
+ "build_default_runtime_registry",
49
+ ),
50
+ "create_runtime_adapter": ("ksadk.runtime.factory", "create_runtime_adapter"),
51
+ }
52
+
53
+ __all__ = list(_EXPORTS)
54
+
55
+
56
+ def __getattr__(name: str) -> Any:
57
+ try:
58
+ module_name, attribute = _EXPORTS[name]
59
+ except KeyError:
60
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}") from None
61
+ value = getattr(import_module(module_name), attribute)
62
+ globals()[name] = value
63
+ return value
64
+
65
+
66
+ def __dir__() -> list[str]:
67
+ return sorted({*globals(), *__all__})