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/configs/settings.py CHANGED
@@ -6,32 +6,34 @@ AgentEngine 统一配置管理
6
6
 
7
7
  使用方式:
8
8
  from ksadk.configs import settings
9
-
9
+
10
10
  # 访问模型配置
11
11
  print(settings.model.api_key)
12
12
  print(settings.model.api_base)
13
-
14
- # 访问 Langfuse 配置
15
- print(settings.langfuse.public_key)
16
-
13
+
14
+ # 访问标准 OpenTelemetry 配置
15
+ print(settings.otel.otlp_endpoint)
16
+
17
17
  # 访问 Agent 运行时信息
18
18
  print(settings.agent.agent_id)
19
19
  """
20
20
 
21
- import os
21
+ import importlib
22
22
  import json
23
23
  import logging
24
+ import os
24
25
  import time
25
- from typing import Optional, List, Dict, Any
26
26
  from dataclasses import dataclass, field
27
+ from pathlib import Path
28
+ from typing import Any, Dict, List, Optional
27
29
  from urllib.parse import urlsplit, urlunsplit
28
30
 
29
31
  logger = logging.getLogger(__name__)
30
32
 
31
33
 
32
- def _get_env(*keys: str, default: str = None) -> Optional[str]:
34
+ def _get_env(*keys: str, default: Optional[str] = None) -> Optional[str]:
33
35
  """从多个环境变量 key 中获取第一个存在的值
34
-
36
+
35
37
  按优先级顺序匹配,支持别名兼容。
36
38
  """
37
39
  for key in keys:
@@ -69,44 +71,45 @@ def _is_public_kspmas_url(url: Optional[str]) -> bool:
69
71
 
70
72
  def check_endpoint_reachable(host: str, port: int = 80, timeout: float = 1.0) -> bool:
71
73
  """检测指定端点是否可达
72
-
74
+
73
75
  通用函数,可用于检测任意服务的内网地址是否可达。
74
76
  结果会被缓存,相同 host 只检测一次。
75
-
77
+
76
78
  Args:
77
79
  host: 主机名或 IP 地址
78
80
  port: 端口号 (默认 80)
79
81
  timeout: 超时时间 (默认 1.0 秒)
80
-
82
+
81
83
  Returns:
82
84
  True 如果可达, False 否则
83
-
85
+
84
86
  Usage:
85
87
  # KSPMAS 内网检测
86
88
  if check_endpoint_reachable("kspmas-internal.sdns.ksyun.com"):
87
89
  api_base = "http://kspmas-internal.sdns.ksyun.com/v1"
88
-
90
+
89
91
  # KS3 内网检测
90
92
  if check_endpoint_reachable("ks3-cn-beijing-internal.ksyuncs.com"):
91
93
  ks3_endpoint = "http://ks3-cn-beijing-internal.ksyuncs.com"
92
94
  """
93
95
  if host in _endpoint_cache:
94
96
  return _endpoint_cache[host]
95
-
97
+
96
98
  try:
97
99
  import socket
100
+
98
101
  # 尝试建立 TCP 连接 (比 ping 更可靠,且不依赖 ICMP)
99
102
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
100
103
  s.settimeout(timeout)
101
104
  s.connect((host, port))
102
105
  s.close()
103
-
106
+
104
107
  _endpoint_cache[host] = True
105
108
  logger.debug(f"Endpoint reachable: {host}:{port}")
106
109
  except (socket.timeout, socket.error, OSError):
107
110
  _endpoint_cache[host] = False
108
111
  logger.debug(f"Endpoint not reachable: {host}:{port}")
109
-
112
+
110
113
  return _endpoint_cache[host]
111
114
 
112
115
 
@@ -125,13 +128,13 @@ DEFAULT_MODEL_NAME = "glm-5.2"
125
128
 
126
129
  def optimize_kspmas_url(url: str) -> str:
127
130
  """优化 KSPMAS URL
128
-
131
+
129
132
  如果是 KSPMAS 的公网地址,且检测到内网可达(或在 Serverless 环境),
130
133
  将其替换为内网地址以提高速度和稳定性。
131
134
  """
132
135
  if not url:
133
136
  return url
134
-
137
+
135
138
  parsed = urlsplit(url)
136
139
  if parsed.hostname != "kspmas.ksyun.com":
137
140
  return url
@@ -147,13 +150,13 @@ def optimize_kspmas_url(url: str) -> str:
147
150
  if parsed.port:
148
151
  netloc = f"{netloc}:{parsed.port}"
149
152
  return urlunsplit(("http", netloc, parsed.path, parsed.query, parsed.fragment))
150
-
153
+
151
154
  return url
152
155
 
153
156
 
154
157
  def get_kspmas_api_base() -> str:
155
158
  """获取 KSPMAS 模型服务的 API Base URL
156
-
159
+
157
160
  自动检测内网可达性,优先使用内网地址。
158
161
  **特殊逻辑**: 如果在 Serverless 托管环境 (AGENT_RUNTIME_ID 存在),强制使用内网地址。
159
162
  """
@@ -164,7 +167,7 @@ def get_kspmas_api_base() -> str:
164
167
  # 2. 自动检测内网可达性
165
168
  if check_endpoint_reachable(KSPMAS_INTERNAL_HOST):
166
169
  return KSPMAS_INTERNAL_URL
167
-
170
+
168
171
  # 3. 默认使用公网
169
172
  return KSPMAS_PUBLIC_URL
170
173
 
@@ -173,82 +176,83 @@ def get_kspmas_api_base() -> str:
173
176
  # 模型配置 (LLM)
174
177
  # =============================================================================
175
178
 
179
+
176
180
  @dataclass
177
181
  class ModelConfig:
178
182
  """模型配置
179
-
183
+
180
184
  标准环境变量 (优先):
181
185
  OPENAI_API_KEY - API Key (OpenAI 标准)
182
186
  OPENAI_BASE_URL - API Base URL (OpenAI 标准)
183
187
  OPENAI_MODEL_NAME - 模型名称
184
-
188
+
185
189
  通用格式:
186
190
  MODEL_NAME - 模型名称
187
-
191
+
188
192
  Serverless 平台兼容:
189
193
  LLM_API_KEY - 模型 API Key
190
194
  LLM_API_BASE - 模型 API 地址
191
195
  LLM_MODEL - 模型名称
192
-
196
+
193
197
  别名 (兼容):
194
198
  OPENAI_API_BASE - API Base URL 别名
195
-
199
+
196
200
  默认值:
197
201
  OPENAI_BASE_URL: 自动检测内网/外网,使用金山云模型服务
198
202
  MODEL_NAME: glm-5.2
199
203
  """
200
-
204
+
201
205
  @property
202
206
  def api_key(self) -> Optional[str]:
203
207
  """获取模型 API Key"""
204
208
  return _get_env(
205
- "OPENAI_API_KEY", # OpenAI 标准 (优先)
206
- "LLM_API_KEY", # Serverless 平台兼容
207
- "MODEL_API_KEY", # 通用
209
+ "OPENAI_API_KEY", # OpenAI 标准 (优先)
210
+ "LLM_API_KEY", # Serverless 平台兼容
211
+ "MODEL_API_KEY", # 通用
208
212
  )
209
-
213
+
210
214
  @property
211
215
  def api_base(self) -> str:
212
216
  """获取模型 API Base URL
213
-
217
+
214
218
  如果未配置,默认使用金山云模型服务地址(自动检测内网)。
215
219
  如果已配置且为 KSPMAS 公网地址,也会尝试优化为内网地址。
216
220
  """
217
221
  configured = _get_env(
218
- "OPENAI_BASE_URL", # OpenAI 标准 (优先)
219
- "OPENAI_API_BASE", # OpenAI 别名 (兼容)
220
- "LLM_API_BASE", # Serverless 平台兼容
221
- "MODEL_API_BASE", # 通用
222
+ "OPENAI_BASE_URL", # OpenAI 标准 (优先)
223
+ "OPENAI_API_BASE", # OpenAI 别名 (兼容)
224
+ "LLM_API_BASE", # Serverless 平台兼容
225
+ "MODEL_API_BASE", # 通用
222
226
  )
223
-
227
+
224
228
  if configured:
225
229
  return optimize_kspmas_url(configured)
226
-
230
+
227
231
  return get_kspmas_api_base()
228
-
232
+
229
233
  @property
230
234
  def model_name(self) -> str:
231
235
  """获取模型名称
232
-
236
+
233
237
  如果未配置,默认使用 glm-5.2。
234
238
  """
235
239
  configured = _get_env(
236
- "OPENAI_MODEL_NAME", # OpenAI 格式 (优先)
237
- "MODEL_NAME", # 通用
238
- "LLM_MODEL", # Serverless 平台兼容
240
+ "OPENAI_MODEL_NAME", # OpenAI 格式 (优先)
241
+ "MODEL_NAME", # 通用
242
+ "LLM_MODEL", # Serverless 平台兼容
239
243
  )
240
244
  return configured or DEFAULT_MODEL_NAME
241
-
245
+
242
246
  @property
243
247
  def is_configured(self) -> bool:
244
248
  """是否已配置 API Key"""
245
249
  return bool(self.api_key)
246
-
250
+
247
251
  @property
248
252
  def is_using_internal_network(self) -> bool:
249
253
  """是否使用内网地址"""
250
254
  return KSPMAS_INTERNAL_URL in self.api_base
251
-
255
+
252
256
  def to_dict(self) -> dict:
253
257
  """转换为字典 (用于 LiteLLM 等)"""
254
258
  result = {}
@@ -259,81 +263,19 @@ class ModelConfig:
259
263
  return result
260
264
 
261
265
 
262
- # =============================================================================
263
- # Langfuse 配置
264
- # =============================================================================
265
-
266
- @dataclass
267
- class LangfuseConfig:
268
- """Langfuse 可观测性配置
269
-
270
- 标准环境变量 (Langfuse 官方):
271
- LANGFUSE_PUBLIC_KEY - API Public Key
272
- LANGFUSE_SECRET_KEY - API Secret Key
273
- LANGFUSE_HOST - Langfuse 服务地址
274
-
275
- Serverless 平台扩展:
276
- LANGFUSE_PROJECT_ID - 项目 ID (区分用户)
277
- LANGCHAIN_TRACING_V2 - 启用 LangChain 追踪
278
- """
279
-
280
- @property
281
- def public_key(self) -> Optional[str]:
282
- return os.getenv("LANGFUSE_PUBLIC_KEY")
283
-
284
- @property
285
- def secret_key(self) -> Optional[str]:
286
- return os.getenv("LANGFUSE_SECRET_KEY")
287
-
288
- @property
289
- def host(self) -> str:
290
- return _get_env(
291
- "LANGFUSE_HOST",
292
- "LANGFUSE_BASE_URL",
293
- default="http://localhost:3000"
294
- )
295
-
296
- @property
297
- def project_id(self) -> Optional[str]:
298
- """Langfuse 项目 ID (Serverless 平台扩展)"""
299
- return os.getenv("LANGFUSE_PROJECT_ID")
300
-
301
- @property
302
- def tracing_enabled(self) -> bool:
303
- """是否启用 LangChain tracing"""
304
- return os.getenv("LANGCHAIN_TRACING_V2", "").lower() == "true"
305
-
306
- @property
307
- def is_enabled(self) -> bool:
308
- """是否启用 Langfuse (有 public_key 就启用)"""
309
- return bool(self.public_key)
310
-
311
- @property
312
- def is_configured(self) -> bool:
313
- """是否完整配置"""
314
- return bool(self.public_key and self.secret_key)
315
-
316
- def to_dict(self) -> dict:
317
- """转换为字典"""
318
- return {
319
- "public_key": self.public_key,
320
- "secret_key": self.secret_key,
321
- "host": self.host,
322
- }
323
-
324
-
325
266
  # =============================================================================
326
267
  # Agent 配置
327
268
  # =============================================================================
328
269
 
270
+
329
271
  @dataclass
330
272
  class AgentConfig:
331
273
  """Agent 配置
332
-
274
+
333
275
  标准环境变量 (OpenTelemetry 兼容):
334
276
  OTEL_SERVICE_NAME - 服务名称 (映射到 agent_name)
335
277
  OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value 格式)
336
-
278
+
337
279
  通用环境变量:
338
280
  AGENT_ID - Agent 唯一 ID
339
281
  AGENT_NAME - Agent 名称
@@ -341,70 +283,70 @@ class AgentConfig:
341
283
  USER_ID - 用户 ID
342
284
  ENVIRONMENT - 运行环境 (dev/staging/prod)
343
285
  VERSION - 版本号
344
-
286
+
345
287
  Serverless 平台兼容:
346
288
  AGENT_RUNTIME_ID - Agent 唯一 ID
347
289
  AGENT_RUNTIME_NAME - Agent 名称
348
290
  ACCOUNT_ID - 账户 ID (租户)
349
291
  """
350
-
292
+
351
293
  @property
352
294
  def agent_id(self) -> Optional[str]:
353
295
  """Agent 唯一 ID"""
354
296
  return _get_env(
355
- "AGENT_ID", # 通用 (优先)
356
- "AGENT_RUNTIME_ID", # Serverless 平台兼容
297
+ "AGENT_ID", # 通用 (优先)
298
+ "AGENT_RUNTIME_ID", # Serverless 平台兼容
357
299
  )
358
-
300
+
359
301
  @property
360
302
  def agent_name(self) -> Optional[str]:
361
303
  """Agent 名称"""
362
304
  return _get_env(
363
- "AGENT_NAME", # 通用 (优先)
364
- "AGENT_RUNTIME_NAME", # Serverless 平台兼容
365
- "OTEL_SERVICE_NAME", # OpenTelemetry 标准
305
+ "AGENT_NAME", # 通用 (优先)
306
+ "AGENT_RUNTIME_NAME", # Serverless 平台兼容
307
+ "OTEL_SERVICE_NAME", # OpenTelemetry 标准
366
308
  )
367
-
309
+
368
310
  @property
369
311
  def tenant_id(self) -> Optional[str]:
370
312
  """租户 ID"""
371
313
  return _get_env(
372
- "TENANT_ID", # 通用 (优先)
373
- "ACCOUNT_ID", # Serverless 平台兼容
314
+ "TENANT_ID", # 通用 (优先)
315
+ "ACCOUNT_ID", # Serverless 平台兼容
374
316
  )
375
-
317
+
376
318
  @property
377
319
  def user_id(self) -> Optional[str]:
378
320
  """用户 ID"""
379
321
  return os.getenv("USER_ID")
380
-
322
+
381
323
  @property
382
324
  def session_id(self) -> Optional[str]:
383
325
  """会话 ID (用于 Langfuse Sessions 功能)"""
384
326
  return os.getenv("SESSION_ID")
385
-
327
+
386
328
  @property
387
329
  def environment(self) -> Optional[str]:
388
330
  """运行环境 (dev/staging/prod)"""
389
331
  return os.getenv("ENVIRONMENT")
390
-
332
+
391
333
  @property
392
334
  def version(self) -> Optional[str]:
393
335
  """Agent 版本"""
394
336
  return os.getenv("VERSION")
395
-
337
+
396
338
  @property
397
339
  def tags(self) -> Optional[List[str]]:
398
340
  """标签列表 (逗号分隔)"""
399
341
  tags_str = os.getenv("TAGS", "")
400
342
  tags = [t.strip() for t in tags_str.split(",") if t.strip()]
401
343
  return tags if tags else None
402
-
344
+
403
345
  @property
404
346
  def extra_metadata(self) -> Optional[Dict[str, Any]]:
405
347
  """额外的元数据"""
406
348
  extra = {}
407
-
349
+
408
350
  # 1. 解析 JSON 格式的 metadata
409
351
  extra_json = os.getenv("METADATA")
410
352
  if extra_json:
@@ -412,7 +354,7 @@ class AgentConfig:
412
354
  extra.update(json.loads(extra_json))
413
355
  except json.JSONDecodeError:
414
356
  logger.warning(f"Invalid METADATA JSON: {extra_json}")
415
-
357
+
416
358
  # 2. 解析 OTEL_RESOURCE_ATTRIBUTES
417
359
  otel_attrs = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
418
360
  if otel_attrs:
@@ -421,73 +363,41 @@ class AgentConfig:
421
363
  key, value = pair.split("=", 1)
422
364
  if key not in ("service.name", "service.version"):
423
365
  extra[key] = value
424
-
366
+
425
367
  return extra if extra else None
426
-
368
+
427
369
  @property
428
370
  def is_configured(self) -> bool:
429
371
  """是否有 Agent 信息"""
430
372
  return bool(self.agent_id or self.agent_name)
431
-
432
- # ------------------
433
- # Langfuse 集成方法
434
- # ------------------
435
-
436
- def to_langfuse_params(self) -> dict:
437
- """转换为 Langfuse trace() 方法的原生参数"""
438
- params = {}
439
- if self.session_id:
440
- params["session_id"] = self.session_id
441
- if self.user_id:
442
- params["user_id"] = self.user_id
443
- if self.tags:
444
- params["tags"] = self.tags
445
- if self.version:
446
- params["version"] = self.version
447
- return params
448
-
449
- def to_langfuse_metadata(self) -> dict:
450
- """转换为 Langfuse metadata 字段"""
451
- metadata = {}
452
- if self.agent_id:
453
- metadata["agent_id"] = self.agent_id
454
- if self.agent_name:
455
- metadata["agent_name"] = self.agent_name
456
- if self.tenant_id:
457
- metadata["tenant_id"] = self.tenant_id
458
- if self.environment:
459
- metadata["environment"] = self.environment
460
- if self.extra_metadata:
461
- metadata.update(self.extra_metadata)
462
- return metadata
463
-
464
373
 
465
374
  # =============================================================================
466
375
  # 金山云配置
467
376
  # =============================================================================
468
377
 
378
+
469
379
  @dataclass
470
380
  class KingsoftCloudConfig:
471
381
  """金山云 SDK 配置
472
-
382
+
473
383
  环境变量:
474
384
  KS_ACCESS_KEY_ID - Access Key ID
475
385
  KS_SECRET_ACCESS_KEY - Secret Access Key
476
386
  KS_REGION - 区域 (默认 cn-beijing-6)
477
387
  """
478
-
388
+
479
389
  @property
480
390
  def access_key_id(self) -> Optional[str]:
481
391
  return os.getenv("KS_ACCESS_KEY_ID")
482
-
392
+
483
393
  @property
484
394
  def secret_access_key(self) -> Optional[str]:
485
395
  return os.getenv("KS_SECRET_ACCESS_KEY")
486
-
396
+
487
397
  @property
488
398
  def region(self) -> str:
489
399
  return os.getenv("KS_REGION", "cn-beijing-6")
490
-
400
+
491
401
  @property
492
402
  def is_configured(self) -> bool:
493
403
  """是否已配置"""
@@ -498,23 +408,24 @@ class KingsoftCloudConfig:
498
408
  # Code 模式配置
499
409
  # =============================================================================
500
410
 
411
+
501
412
  @dataclass
502
413
  class CodeModeConfig:
503
414
  """Code 模式配置 (Serverless 平台)
504
-
415
+
505
416
  环境变量:
506
417
  PYTHONPATH - Python 模块路径
507
418
  CODE_PATH - 代码目录
508
419
  """
509
-
420
+
510
421
  @property
511
422
  def python_path(self) -> Optional[str]:
512
423
  return os.getenv("PYTHONPATH")
513
-
424
+
514
425
  @property
515
426
  def code_path(self) -> Optional[str]:
516
427
  return os.getenv("CODE_PATH")
517
-
428
+
518
429
  @property
519
430
  def is_code_mode(self) -> bool:
520
431
  """是否为 Code 模式"""
@@ -525,41 +436,42 @@ class CodeModeConfig:
525
436
  # OpenTelemetry 配置
526
437
  # =============================================================================
527
438
 
439
+
528
440
  @dataclass
529
441
  class OTelConfig:
530
442
  """OpenTelemetry 配置 (标准环境变量)
531
-
443
+
532
444
  环境变量:
533
445
  OTEL_SERVICE_NAME - 服务名称
534
446
  OTEL_RESOURCE_ATTRIBUTES - 资源属性 (key=value,key2=value2)
535
447
  OTEL_EXPORTER_OTLP_ENDPOINT - OTLP 导出端点
536
448
  """
537
-
449
+
538
450
  @property
539
451
  def service_name(self) -> Optional[str]:
540
452
  return os.getenv("OTEL_SERVICE_NAME")
541
-
453
+
542
454
  @property
543
455
  def resource_attributes(self) -> Optional[Dict[str, str]]:
544
456
  """解析 OTEL_RESOURCE_ATTRIBUTES"""
545
457
  attrs_str = os.getenv("OTEL_RESOURCE_ATTRIBUTES", "")
546
458
  if not attrs_str:
547
459
  return None
548
-
460
+
549
461
  attrs = {}
550
462
  for pair in attrs_str.split(","):
551
463
  if "=" in pair:
552
464
  key, value = pair.split("=", 1)
553
465
  attrs[key] = value
554
466
  return attrs if attrs else None
555
-
467
+
556
468
  @property
557
469
  def otlp_endpoint(self) -> Optional[str]:
558
470
  return _get_env(
559
471
  "OTEL_EXPORTER_OTLP_ENDPOINT",
560
472
  "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
561
473
  )
562
-
474
+
563
475
  @property
564
476
  def is_enabled(self) -> bool:
565
477
  """是否启用 OTLP 导出"""
@@ -570,45 +482,49 @@ class OTelConfig:
570
482
  # 统一配置入口
571
483
  # =============================================================================
572
484
 
485
+
573
486
  @dataclass
574
487
  class Settings:
575
488
  """统一配置入口
576
-
489
+
577
490
  使用方式:
578
491
  from ksadk.configs import settings
579
-
492
+
580
493
  # 模型配置
581
494
  if settings.model.is_configured:
582
495
  llm = LiteLLM(api_key=settings.model.api_key)
583
-
584
- # Langfuse 配置
585
- if settings.langfuse.is_enabled:
586
- setup_tracing(langfuse_config=settings.langfuse.to_dict())
587
-
496
+
497
+ # 标准 OTLP 配置
498
+ if settings.otel.is_enabled:
499
+ setup_tracing()
500
+
588
501
  # Agent 信息
589
502
  print(settings.agent.agent_id)
590
503
  """
504
+
591
505
  model: ModelConfig = field(default_factory=ModelConfig)
592
- langfuse: LangfuseConfig = field(default_factory=LangfuseConfig)
593
506
  agent: AgentConfig = field(default_factory=AgentConfig)
594
507
  cloud: KingsoftCloudConfig = field(default_factory=KingsoftCloudConfig)
595
508
  code: CodeModeConfig = field(default_factory=CodeModeConfig)
596
509
  otel: OTelConfig = field(default_factory=OTelConfig)
597
-
510
+
598
511
  def summary(self) -> str:
599
512
  """输出配置摘要"""
600
513
  lines = ["AgentEngine Configuration:"]
601
- lines.append(f" Model: {'✅ Configured' if self.model.is_configured else '❌ Not configured'}")
602
- lines.append(f" Langfuse: {'✅ Enabled' if self.langfuse.is_enabled else '⚪ Disabled'}")
603
-
514
+ lines.append(
515
+ f" Model: {'✅ Configured' if self.model.is_configured else '❌ Not configured'}"
516
+ )
604
517
  agent_info = self.agent.agent_id or self.agent.agent_name
605
518
  lines.append(f" Agent: {'✅ ' + agent_info if agent_info else '⚪ No info'}")
606
-
607
- lines.append(f" Cloud: {'✅ Configured' if self.cloud.is_configured else '⚪ Not configured'}")
608
- lines.append(f" CodeMode: {'✅ ' + self.code.code_path if self.code.is_code_mode else '⚪ Container mode'}")
519
+
520
+ lines.append(
521
+ f" Cloud: {'✅ Configured' if self.cloud.is_configured else '⚪ Not configured'}"
522
+ )
523
+ code_path = self.code.code_path
524
+ lines.append(f" CodeMode: {'✅ ' + code_path if code_path else '⚪ Container mode'}")
609
525
  lines.append(f" OTEL: {'✅ Enabled' if self.otel.is_enabled else '⚪ Disabled'}")
610
526
  return "\n".join(lines)
611
-
527
+
612
528
  def __repr__(self) -> str:
613
529
  return self.summary()
614
530
 
@@ -624,32 +540,30 @@ settings = Settings()
624
540
  DEFAULT_RUNTIME_TIMEZONE = "Asia/Shanghai"
625
541
 
626
542
 
627
- def setup_environment(agent_path: "Path"):
543
+ def setup_environment(agent_path: Path | str):
628
544
  """加载环境变量并注入智能默认配置
629
-
545
+
630
546
  1. 加载项目根目录的 .env 文件 (override=True)
631
547
  2. 注入 OPENAI_API_BASE (智能检测)
632
548
  3. 注入 OPENAI_MODEL_NAME (默认值)
633
549
  """
634
550
  import click
635
- import os
636
- from pathlib import Path
551
+
637
552
  try:
638
- from dotenv import load_dotenv
553
+ dotenv_module = importlib.import_module("dotenv")
639
554
  except ImportError:
640
- # 如果没有安装 python-dotenv,则跳过 loading .env
641
- load_dotenv = None
642
-
555
+ dotenv_module = None
556
+
643
557
  # 1. 加载 .env
644
- if load_dotenv:
558
+ if dotenv_module is not None:
645
559
  # Ensure agent_path is a Path object
646
560
  if isinstance(agent_path, str):
647
561
  agent_path = Path(agent_path)
648
-
562
+
649
563
  env_file = agent_path / ".env"
650
564
  if env_file.exists():
651
565
  # override=False: 保留通过 API/Serverless 平台注入的环境变量 (优先级高)
652
- load_dotenv(env_file, override=False)
566
+ dotenv_module.load_dotenv(env_file, override=False)
653
567
 
654
568
  # 本地调试与托管运行时统一默认北京时间;用户通过 shell/.env/平台显式指定 TZ 时不覆盖。
655
569
  os.environ.setdefault("TZ", DEFAULT_RUNTIME_TIMEZONE)
@@ -696,7 +610,7 @@ def setup_environment(agent_path: "Path"):
696
610
  if not os.getenv("OPENAI_API_BASE"):
697
611
  os.environ["OPENAI_API_BASE"] = api_base
698
612
  click.echo(f"🔧 API Base: {click.style(api_base, fg='cyan')} (Auto-detected)")
699
-
613
+
700
614
  # Model Name
701
615
  if not os.getenv("OPENAI_MODEL_NAME"):
702
616
  model_name = settings.model.model_name
@@ -704,3 +618,13 @@ def setup_environment(agent_path: "Path"):
704
618
  click.echo(f"🧠 Model: {click.style(model_name, fg='cyan')} (Default)")
705
619
  if not os.getenv("MODEL_NAME") and os.getenv("OPENAI_MODEL_NAME"):
706
620
  os.environ["MODEL_NAME"] = os.getenv("OPENAI_MODEL_NAME", "")
621
+
622
+ # 4. 模型出口协议转换层(v2.2):gate 开启且模型在白名单时懒起进程内 ProxyServer,
623
+ # 把 OPENAI_BASE_URL 重定向到它。默认 gate 关,不重定向,历史路径零影响。
624
+ # codex 不走此路(它走 AsyncCodexClient 的 v2.1 provider 注入)。
625
+ try:
626
+ from ksadk.model_proxy.bootstrap import setup_proxy_redirect_if_enabled
627
+
628
+ setup_proxy_redirect_if_enabled()
629
+ except Exception: # noqa: BLE001 代理可选,失败不影响主流程(默认关时本就不触发)
630
+ pass