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
ksadk/common/aicp_env.py CHANGED
@@ -5,7 +5,6 @@ from __future__ import annotations
5
5
  import os
6
6
  import socket
7
7
 
8
-
9
8
  DEFAULT_AICP_REGION = "cn-beijing-6"
10
9
  DEFAULT_AICP_ENDPOINT = "aicp.api.ksyun.com"
11
10
  INTERNAL_AICP_ENDPOINT = "aicp.internal.api.ksyun.com"
ksadk/common/auth.py CHANGED
@@ -22,11 +22,11 @@ AWS Signature V4 签名认证
22
22
  response = requests.post(url, auth=auth.get_auth(), headers=headers)
23
23
  """
24
24
 
25
- import os
26
25
  import logging
26
+ import os
27
27
  from typing import Dict, Optional
28
28
 
29
- from requests_aws4auth import AWS4Auth
29
+ from requests_aws4auth import AWS4Auth # type: ignore[import-untyped]
30
30
 
31
31
  logger = logging.getLogger(__name__)
32
32
 
ksadk/common/constants.py CHANGED
@@ -3,9 +3,7 @@
3
3
  """
4
4
 
5
5
  # Serverless Endpoint (默认内网预发环境)
6
- DEFAULT_SERVERLESS_ENDPOINT = (
7
- "http://kmr.pre-online.inner.api.ksyun.com"
8
- )
6
+ DEFAULT_SERVERLESS_ENDPOINT = "http://kmr.pre-online.inner.api.ksyun.com"
9
7
 
10
8
  # KS3 Region 映射表
11
9
  # 用户输入的 region (如 cn-beijing-6) -> (外网endpoint, 内网endpoint, region_code)
@@ -0,0 +1,232 @@
1
+ """KOP (Kingsoft Open Protocol) client — 公共 AICP 控制面调用层。
2
+
3
+ skill / a2a / mcp 等运行时模块通过本层访问 agentengine-server 对外 Action
4
+ (KOP 协议:`{base}/?Action=xxx&Version=xxx` + AWS V4 签名),避免每个模块
5
+ 各自实现一遍鉴权 + URL 构造 + header 装配。
6
+
7
+ 本层是同步(基于 requests + requests-aws4auth);async 调用方用
8
+ ``asyncio.to_thread`` 包裹。AICP 控制面是低频调用,同步足够。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+ import logging
15
+ import os
16
+ from typing import Any, Mapping, Optional
17
+ from urllib.parse import urlsplit
18
+
19
+ import requests
20
+
21
+ from ksadk.common.auth import AWSV4Auth
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+ DEFAULT_API_VERSION = "2024-06-12"
26
+ DEFAULT_REGION = "cn-beijing-6"
27
+ DEFAULT_SERVICE = "aicp"
28
+
29
+ # 精确匹配 AICP 控制面域名(公网 + 内网 + internal),不接受用户自定义 URL 走签名。
30
+ _AICP_HOSTS = {
31
+ "aicp.api.ksyun.com",
32
+ "aicp.inner.api.ksyun.com",
33
+ "aicp.internal.api.ksyun.com",
34
+ }
35
+
36
+
37
+ def is_kop_endpoint(base_url: str) -> bool:
38
+ """Return True only for exact AICP control-plane hosts.
39
+
40
+ User-controlled URLs must never receive KOP signing headers.
41
+ """
42
+ host = (urlsplit(base_url or "").hostname or "").lower()
43
+ return host in _AICP_HOSTS
44
+
45
+
46
+ class KOPError(RuntimeError):
47
+ """KOP action 失败(非 2xx 或 Code != 0/200)。"""
48
+
49
+ def __init__(self, *, code: int, message: str, request_id: str = "", action: str = "") -> None:
50
+ super().__init__(f"KOP {action} failed: code={code} message={message}")
51
+ self.code = code
52
+ self.message = message
53
+ self.request_id = request_id
54
+ self.action = action
55
+
56
+
57
+ class KOPClient:
58
+ """AICP KOP 控制面调用客户端。
59
+
60
+ 凭证优先级:构造参数 > KSADK_*_ACCESS_KEY/SECRET_KEY > KSYUN_ACCESS_KEY/SECRET_KEY。
61
+ base_url 为空时按 region 探测默认 AICP(inner 优先,回落 public)。
62
+ 非 AICP base_url(如本地 server 直连)走普通 POST,不签名。
63
+ """
64
+
65
+ def __init__(
66
+ self,
67
+ *,
68
+ base_url: Optional[str] = None,
69
+ access_key: Optional[str] = None,
70
+ secret_key: Optional[str] = None,
71
+ region: Optional[str] = None,
72
+ service: Optional[str] = None,
73
+ api_version: Optional[str] = None,
74
+ account_id: Optional[str] = None,
75
+ service_token: Optional[str] = None,
76
+ timeout: float = 15.0,
77
+ ) -> None:
78
+ self.base_url = (base_url or os.getenv("KSADK_A2A_SERVICE_URL") or "").strip().rstrip("/")
79
+ if not self.base_url:
80
+ inner = os.getenv("KSADK_A2A_SERVICE_ENDPOINT", "").strip()
81
+ if inner:
82
+ scheme = os.getenv("KSADK_A2A_SERVICE_SCHEME", "https").strip() or "https"
83
+ self.base_url = f"{scheme}://{inner}".rstrip("/")
84
+ if not self.base_url:
85
+ # 默认探测:内网 inner 优先(runtime 在集群内),回落公网 public。
86
+ self.base_url = self._detect_default_base_url()
87
+ self.region = (
88
+ region
89
+ or os.getenv("KSADK_A2A_SERVICE_REGION")
90
+ or os.getenv("KSYUN_REGION")
91
+ or DEFAULT_REGION
92
+ ).strip()
93
+ self.service = (service or DEFAULT_SERVICE).strip()
94
+ self.api_version = (api_version or DEFAULT_API_VERSION).strip()
95
+ self.account_id = (
96
+ account_id
97
+ or os.getenv("KSADK_A2A_ACCOUNT_ID")
98
+ or os.getenv("KSYUN_ACCOUNT_ID")
99
+ or ""
100
+ ).strip()
101
+ self.service_token = (
102
+ service_token or os.getenv("KSADK_A2A_SERVICE_TOKEN") or ""
103
+ ).strip()
104
+ self.timeout = timeout
105
+ self._kop_mode = is_kop_endpoint(self.base_url)
106
+ ak = (
107
+ access_key
108
+ or os.getenv("KSADK_A2A_ACCESS_KEY")
109
+ or os.getenv("KSYUN_ACCESS_KEY")
110
+ or ""
111
+ ).strip()
112
+ sk = (
113
+ secret_key
114
+ or os.getenv("KSADK_A2A_SECRET_KEY")
115
+ or os.getenv("KSYUN_SECRET_KEY")
116
+ or ""
117
+ ).strip()
118
+ self._auth = AWSV4Auth(
119
+ access_key_id=ak,
120
+ secret_access_key=sk,
121
+ region=self.region,
122
+ service=self.service,
123
+ )
124
+ self._session: Optional[requests.Session] = None
125
+
126
+ @property
127
+ def is_kop_mode(self) -> bool:
128
+ return self._kop_mode
129
+
130
+ def _session_obj(self) -> requests.Session:
131
+ if self._session is None:
132
+ self._session = requests.Session()
133
+ return self._session
134
+
135
+ def _headers(self, action: str) -> dict[str, str]:
136
+ import uuid
137
+
138
+ headers = {"Accept": "application/json", "Content-Type": "application/json"}
139
+ if self.account_id:
140
+ headers["X-Ksc-Account-Id"] = self.account_id
141
+ if self.service_token:
142
+ headers["Authorization"] = f"Bearer {self.service_token}"
143
+ if self._kop_mode:
144
+ headers["Host"] = urlsplit(self.base_url).netloc
145
+ headers["X-Ksc-Request-Id"] = str(uuid.uuid4())
146
+ headers["X-Ksc-Region"] = self.region
147
+ headers["X-Ksc-Source"] = "ksadk-runtime"
148
+ # 预发环境路由:AICP 据此把请求转发到预发 server(线上 KOP 默认路由到线上 server)。
149
+ logical_region = (os.getenv("KSYUN_REGION") or "").strip().lower()
150
+ if logical_region == "pre-online":
151
+ headers["X-KSC-CUSTOM-SOURCE"] = os.getenv("AGENTENGINE_PRE_CUSTOM_SOURCE", "pre")
152
+ if action:
153
+ headers["X-Action"] = action
154
+ headers["X-Version"] = self.api_version
155
+ return headers
156
+
157
+ def _build_url(self, action: str) -> str:
158
+ if self._kop_mode:
159
+ return f"{self.base_url}/?Action={action}&Version={self.api_version}"
160
+ return f"{self.base_url}/agentengine/api/v1/{action}"
161
+
162
+ def post_action(
163
+ self, action: str, payload: Optional[Mapping[str, Any]] = None
164
+ ) -> dict[str, Any]:
165
+ """POST 一个 KOP Action,返回 Data 字段(已解包信封)。
166
+
167
+ 非KOP 模式走 ``/agentengine/api/v1/{action}``;KOP 模式走 ``?Action=&Version=`` + 签名。
168
+ """
169
+ url = self._build_url(action)
170
+ headers = self._headers(action)
171
+ body = json.dumps(dict(payload or {}), ensure_ascii=False)
172
+ auth = (
173
+ self._auth.get_auth()
174
+ if self._kop_mode and self._auth.is_enabled and not self.service_token
175
+ else None
176
+ )
177
+ try:
178
+ response = self._session_obj().post(
179
+ url,
180
+ data=body.encode("utf-8"),
181
+ headers=headers,
182
+ auth=auth,
183
+ timeout=self.timeout,
184
+ )
185
+ except requests.RequestException as exc:
186
+ raise KOPError(
187
+ code=503,
188
+ message=f"KOP control plane unavailable: {exc}",
189
+ action=action,
190
+ ) from exc
191
+ if not 200 <= response.status_code < 300:
192
+ raise KOPError(
193
+ code=response.status_code,
194
+ message=f"KOP HTTP error: {response.text[:200]}",
195
+ action=action,
196
+ )
197
+ try:
198
+ envelope = response.json()
199
+ except ValueError as exc:
200
+ raise KOPError(
201
+ code=response.status_code or 502,
202
+ message="non-JSON response",
203
+ action=action,
204
+ ) from exc
205
+ if not isinstance(envelope, dict):
206
+ raise KOPError(
207
+ code=response.status_code or 502,
208
+ message="response not an object",
209
+ action=action,
210
+ )
211
+ code = int(envelope.get("Code") or 0)
212
+ if code and code != 200:
213
+ raise KOPError(
214
+ code=code,
215
+ message=str(envelope.get("Message") or "KOP error"),
216
+ request_id=str(envelope.get("RequestId") or ""),
217
+ action=action,
218
+ )
219
+ data = envelope.get("Data")
220
+ return data if isinstance(data, dict) else {}
221
+
222
+ def _detect_default_base_url(self) -> str:
223
+ """默认 AICP 地址探测:内网 inner 优先,失败回落公网 public。"""
224
+ inner = "http://aicp.inner.api.ksyun.com"
225
+ public = "https://aicp.api.ksyun.com"
226
+ try:
227
+ import socket
228
+ host = urlsplit(inner).hostname or ""
229
+ socket.create_connection((host, 80), timeout=1).close()
230
+ return inner
231
+ except OSError:
232
+ return public
ksadk/common/llm_utils.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """LLM Utilities"""
2
2
 
3
- import os
4
3
  import logging
4
+ import os
5
5
 
6
6
  logger = logging.getLogger(__name__)
7
7
 
@@ -10,28 +10,32 @@ PUBLIC_ENDPOINT = "https://kspmas.ksyun.com/v1/"
10
10
 
11
11
  # Internal Endpoint (Auto-injected by Platform)
12
12
  # Note: In most cases, we don't need to hardcode this because the platform injects it.
13
- # But for the purpose of "smart switching based on public URL", we might need to know what to switch TO,
13
+ # But for "smart switching based on public URL", we might need to know
14
+ # what to switch TO,
14
15
  # or simply rely on leaving it empty so the platform default takes over?
15
- #
16
+ #
16
17
  # According to user: "OPENAI_BASE_URL 不填会自动选择的" (If empty, it auto-selects).
17
- # So our strategy: If Public URL + Internal Env -> Unset OPENAI_BASE_URL (letting it fall back to platform default).
18
+ # Strategy: If Public URL + Internal Env -> Unset OPENAI_BASE_URL,
19
+ # letting it fall back to the platform default.
20
+
18
21
 
19
22
  def get_smart_openai_env() -> None:
20
23
  """Smartly configure OpenAI Environment Variables.
21
-
24
+
22
25
  If it detects that the code is running in a Ksyun Internal Environment (Serverless/KCE)
23
26
  AND the OPENAI_BASE_URL is set to the Public Endpoint, it will unset OPENAI_BASE_URL
24
27
  to allow the platform's automatic internal endpoint injection to take effect.
25
-
26
- This prevents network hangs caused by accessing public endpoints from internal-only environments.
28
+
29
+ This prevents network hangs caused by accessing public endpoints from
30
+ internal-only environments.
27
31
  """
28
32
  base_url = os.environ.get("OPENAI_BASE_URL", "").strip()
29
-
33
+
30
34
  # logic 1: Check if it is the Public Endpoint
31
35
  # Normalize by removing trailing slash for comparison
32
36
  normalized_url = base_url.rstrip("/")
33
37
  normalized_public = PUBLIC_ENDPOINT.rstrip("/")
34
-
38
+
35
39
  if normalized_url != normalized_public:
36
40
  return
37
41
 
@@ -41,11 +45,11 @@ def get_smart_openai_env() -> None:
41
45
  # - K_SERVICE (Injected by Knative/Serverless)
42
46
  # - KUBERNETES_SERVICE_HOST (Injected by K8s)
43
47
  is_internal = (
44
- "KSYUN_REGION" in os.environ
48
+ "KSYUN_REGION" in os.environ
45
49
  or "K_SERVICE" in os.environ
46
50
  or "KUBERNETES_SERVICE_HOST" in os.environ
47
51
  )
48
-
52
+
49
53
  if is_internal:
50
54
  logger.warning(
51
55
  f"Detected Public OPENAI_BASE_URL ({base_url}) in Internal Environment. "
@@ -55,7 +59,7 @@ def get_smart_openai_env() -> None:
55
59
  # Or explicitly set it to internal generic address if known?
56
60
  # User said: "OPENAI_BASE_URL 不填会自动选择". So we unset it.
57
61
  del os.environ["OPENAI_BASE_URL"]
58
-
62
+
59
63
  # Verify if successful removal
60
64
  if "OPENAI_BASE_URL" not in os.environ:
61
- logger.info("Successfully switched to Internal Endpoint mode.")
65
+ logger.info("Successfully switched to Internal Endpoint mode.")
@@ -0,0 +1,5 @@
1
+ """兼容层包 (goal-00)。"""
2
+
3
+ from ksadk.compat import adk_compat
4
+
5
+ __all__ = ["adk_compat", "copilotkit_a2ui"]
@@ -0,0 +1,200 @@
1
+ """Google ADK 多版本兼容层 (goal-00)。
2
+
3
+ ksadk 业务代码**不直接** ``import google.adk``;统一从本模块取符号。
4
+ ``google-adk`` 的版本差异只在兼容层内消化,业务代码对版本无感知。
5
+
6
+ 版本窗口
7
+ --------
8
+ 依赖约束 ``google-adk>=1.34.0,<3.0.0``:
9
+
10
+ - **1.34.x** 是最低支持锚点(不承诺 1.x 全系;1.0 缺 ``google.adk.apps`` 等,代价过大)。
11
+ - **2.x**(当前 2.5.x)是上界内最新主线。
12
+
13
+ 实测(2026-07-21, goal-00 探测,解包对比 1.34.3 vs 2.5.0):ksadk 用到的
14
+ 全部符号在两个版本**都存在**,差异仅为 2.x 的**向后兼容可选新增**:
15
+
16
+ - ``Runner.run_async`` 2.x 新增可选 ``yield_user_message``(默认 False)。
17
+ - ``RunConfig`` 2.x 新增若干可选字段(``http_options`` / ``telemetry`` /
18
+ ``model_input_context`` 等),均为可选,不传不影响。
19
+ - ``App.root_agent`` 2.x 变为可选(1.34 必填);ksadk 始终显式传,两版皆可。
20
+ - ``DatabaseSessionService`` 2.x 新增可选 ``db_engine``(``db_url`` 变可选);
21
+ ksadk 始终传 ``db_url``,两版皆可。
22
+ - ``McpToolset.header_provider`` 2.x 支持 awaitable;ksadk 未用该参数。
23
+
24
+ ksadk 现有调用**不依赖任何 2.x-only 参数**,因此 1.34 与 2.x 对 ksadk 能力对等,
25
+ 无需降级 shim。能力降级矩阵的完整文字版见
26
+ ``docs/adk-multi-version-compat.md``。
27
+
28
+ 使用 2.x-only 新能力的纪律
29
+ --------------------------
30
+ 若未来要用某个 2.x 才有的可选参数/符号,**必须**在本层用
31
+ :func:`adk_version_at_least` 判断后再下发,并对 1.34 做显式降级;不允许业务
32
+ 代码自行 ``import google.adk`` 探测。
33
+
34
+ 加载语义
35
+ --------
36
+ 本模块 import 自身**不触发** ``google.adk`` 导入(惰性,PEP 562
37
+ ``__getattr__``)。只有真正访问某个符号时才导入对应 ``google.adk`` 子模块;
38
+ 未安装 ``google-adk`` 时抛出带安装提示的 :class:`ImportError`,便于
39
+ ``memory/adk_tool`` 等调用方捕获并降级为原函数。
40
+ """
41
+
42
+ from __future__ import annotations
43
+
44
+ from importlib import import_module
45
+ from importlib.metadata import PackageNotFoundError
46
+ from importlib.metadata import version as _dist_version
47
+ from typing import TYPE_CHECKING, Any
48
+
49
+ if TYPE_CHECKING: # pragma: no cover - 仅供 mypy 静态检查,运行时不执行
50
+ pass
51
+
52
+ #: 导出符号名 -> 提供该符号的 google.adk 子模块路径。
53
+ #: 这是 ksadk 全部 google.adk 依赖的唯一登记表;新增依赖先在这里登记。
54
+ _LAZY_SYMBOLS: dict[str, str] = {
55
+ # agents
56
+ "Agent": "google.adk.agents",
57
+ "RunConfig": "google.adk.agents.run_config",
58
+ "StreamingMode": "google.adk.agents.run_config",
59
+ # apps
60
+ "App": "google.adk.apps",
61
+ "ResumabilityConfig": "google.adk.apps",
62
+ # events
63
+ "Event": "google.adk.events.event",
64
+ # memory
65
+ "BaseMemoryService": "google.adk.memory.base_memory_service",
66
+ "SearchMemoryResponse": "google.adk.memory.base_memory_service",
67
+ "MemoryEntry": "google.adk.memory.memory_entry",
68
+ # models
69
+ "LlmResponse": "google.adk.models",
70
+ "LiteLlm": "google.adk.models.lite_llm",
71
+ # runners
72
+ "Runner": "google.adk.runners",
73
+ # sessions
74
+ "BaseSessionService": "google.adk.sessions",
75
+ "InMemorySessionService": "google.adk.sessions",
76
+ "Session": "google.adk.sessions",
77
+ "DatabaseSessionService": "google.adk.sessions",
78
+ "InvocationContext": "google.adk.agents",
79
+ "ToolContext": "google.adk.tools",
80
+ "GetSessionConfig": "google.adk.sessions.base_session_service",
81
+ "ListSessionsResponse": "google.adk.sessions.base_session_service",
82
+ # tools
83
+ "FunctionTool": "google.adk.tools",
84
+ "load_memory": "google.adk.tools",
85
+ "McpTool": "google.adk.tools.mcp_tool.mcp_tool",
86
+ "McpToolset": "google.adk.tools.mcp_tool.mcp_toolset",
87
+ "CheckableMcpHttpClientFactory": "google.adk.tools.mcp_tool.mcp_session_manager",
88
+ "StreamableHTTPConnectionParams": "google.adk.tools.mcp_tool.mcp_session_manager",
89
+ }
90
+
91
+ #: 以模块形式导出的名字 -> 模块路径(如 genai types、需要 monkeypatch 的 lite_llm)。
92
+ _LAZY_MODULES: dict[str, str] = {
93
+ "genai_types": "google.genai.types",
94
+ }
95
+
96
+ _INSTALL_HINT = (
97
+ "google-adk 未安装或版本不在支持窗口 (>=1.34.0,<3.0.0)。" "安装: pip install 'ksadk[adk]'"
98
+ )
99
+
100
+ _ADK_NOT_FOUND = "google-adk 未安装"
101
+
102
+
103
+ def _raise_missing(name: str, exc: BaseException) -> None:
104
+ raise ImportError(f"无法导入 google.adk 符号 {name!r}。{_INSTALL_HINT}") from exc
105
+
106
+
107
+ def __getattr__(name: str) -> Any:
108
+ """PEP 562 惰性解析:首次访问符号时才导入对应 google.adk 子模块。"""
109
+ if name in _LAZY_SYMBOLS:
110
+ module_path = _LAZY_SYMBOLS[name]
111
+ try:
112
+ module = import_module(module_path)
113
+ except ImportError as exc:
114
+ _raise_missing(name, exc)
115
+ try:
116
+ value = getattr(module, name)
117
+ except AttributeError as exc:
118
+ raise ImportError(
119
+ f"google.adk 已安装但 {module_path} 缺少 {name!r};"
120
+ f"当前版本 {adk_version() or '未知'} 可能不在支持窗口 (>=1.34.0,<3.0.0)。"
121
+ ) from exc
122
+ # 注意: 刻意不缓存到 globals()。测试常 monkeypatch ``google.adk.*``
123
+ # 子模块符号(如把 Runner 换成 FakeRunner);若在此缓存,会把某次 patch
124
+ # 后的值泄漏给后续解析,造成跨测试污染。每次经 getattr 重新解析,
125
+ # 让既有 ``google.adk.*`` patch 点继续生效。开销可忽略(import_module
126
+ # 命中 sys.modules 缓存)。
127
+ return value
128
+ if name in _LAZY_MODULES:
129
+ module_path = _LAZY_MODULES[name]
130
+ try:
131
+ value = import_module(module_path)
132
+ except ImportError as exc:
133
+ _raise_missing(name, exc)
134
+ return value
135
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
136
+
137
+
138
+ def __dir__() -> list[str]:
139
+ return sorted(set(globals()) | set(_LAZY_SYMBOLS) | set(_LAZY_MODULES))
140
+
141
+
142
+ def is_adk_available() -> bool:
143
+ """google-adk 是否可导入(不关心版本)。"""
144
+ try:
145
+ import_module("google.adk")
146
+ except ImportError:
147
+ return False
148
+ return True
149
+
150
+
151
+ def adk_version() -> str | None:
152
+ """返回已安装的 google-adk 版本;未安装返回 None。"""
153
+ try:
154
+ return _dist_version("google-adk")
155
+ except PackageNotFoundError:
156
+ return None
157
+
158
+
159
+ def adk_version_at_least(min_version: str) -> bool:
160
+ """已安装 google-adk 版本是否 >= ``min_version``;未安装或无法解析返回 False。
161
+
162
+ 用于下发 2.x-only 能力前的版本门禁,例如::
163
+
164
+ if adk_version_at_least("2.0.0"):
165
+ kwargs["yield_user_message"] = True
166
+ """
167
+ ver = adk_version()
168
+ if ver is None:
169
+ return False
170
+ try:
171
+ from packaging.version import Version
172
+
173
+ return bool(Version(ver) >= Version(min_version))
174
+ except Exception:
175
+ return False
176
+
177
+
178
+ def lite_llm_module() -> Any:
179
+ """返回 ``google.adk.models.lite_llm`` 模块对象。
180
+
181
+ adk_runner 的 JSON 容错 patch 需要 MonkeyPatch 该模块内的
182
+ ``_message_to_generate_content_response``(私有函数),因此需要模块本身
183
+ 而非单个符号。未安装 litellm/google-adk 时抛 :class:`ImportError`。
184
+ """
185
+ try:
186
+ return import_module("google.adk.models.lite_llm")
187
+ except ImportError as exc:
188
+ _raise_missing("google.adk.models.lite_llm", exc)
189
+
190
+
191
+ __all__ = [
192
+ # 版本/能力探测
193
+ "is_adk_available",
194
+ "adk_version",
195
+ "adk_version_at_least",
196
+ "lite_llm_module",
197
+ # 惰性符号
198
+ *_LAZY_SYMBOLS.keys(),
199
+ *_LAZY_MODULES.keys(),
200
+ ]