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/a2a/client.py DELETED
@@ -1,309 +0,0 @@
1
- """Client helpers for invoking remote A2A agents from KsADK code."""
2
-
3
- from __future__ import annotations
4
-
5
- from collections.abc import AsyncIterator
6
- from typing import Any
7
- from uuid import uuid4
8
-
9
- import httpx
10
- from a2a.client import Client, ClientConfig, ClientFactory
11
- from a2a.types import (
12
- Message,
13
- MessageSendConfiguration,
14
- Part,
15
- Role,
16
- Task,
17
- TaskArtifactUpdateEvent,
18
- TaskState,
19
- TaskStatusUpdateEvent,
20
- TextPart,
21
- )
22
- from a2a.utils import get_artifact_text, get_message_text
23
-
24
- _FAILED_TASK_STATES = {
25
- TaskState.canceled,
26
- TaskState.failed,
27
- TaskState.rejected,
28
- }
29
-
30
-
31
- def _build_text_message(
32
- text: str,
33
- *,
34
- context_id: str | None = None,
35
- task_id: str | None = None,
36
- ) -> Message:
37
- return Message(
38
- role=Role.user,
39
- parts=[Part(root=TextPart(text=text))],
40
- message_id=str(uuid4()),
41
- context_id=context_id,
42
- task_id=task_id,
43
- )
44
-
45
-
46
- def _task_output(task: Task) -> str:
47
- outputs = []
48
- for artifact in task.artifacts or []:
49
- artifact_text = get_artifact_text(artifact, delimiter="")
50
- if artifact_text:
51
- outputs.append(artifact_text)
52
- if outputs:
53
- return "".join(outputs)
54
-
55
- if task.status.message is not None:
56
- return get_message_text(task.status.message)
57
-
58
- if task.history:
59
- for message in reversed(task.history):
60
- if message.role == Role.agent:
61
- message_text = get_message_text(message)
62
- if message_text:
63
- return message_text
64
-
65
- return ""
66
-
67
-
68
- def _task_error(task: Task) -> str:
69
- text = _task_output(task)
70
- if text:
71
- return text
72
- return f"Remote A2A task ended in state: {task.status.state.value}"
73
-
74
-
75
- class RemoteA2AClient:
76
- """Thin client wrapper for interacting with a remote A2A endpoint."""
77
-
78
- def __init__(
79
- self,
80
- endpoint: str,
81
- *,
82
- http_client: httpx.AsyncClient | None = None,
83
- timeout: float = 120.0,
84
- ) -> None:
85
- self.endpoint = endpoint.rstrip("/") or endpoint
86
- self.timeout = timeout
87
- self._http_client = http_client
88
- self._owns_http_client = http_client is None
89
- self._streaming_client: Client | None = None
90
- self._blocking_client: Client | None = None
91
-
92
- async def get_card(self) -> Any:
93
- client = await self._ensure_client(streaming=True)
94
- return await client.get_card()
95
-
96
- async def invoke(
97
- self,
98
- text: str,
99
- *,
100
- context_id: str | None = None,
101
- task_id: str | None = None,
102
- metadata: dict[str, Any] | None = None,
103
- ) -> dict[str, Any]:
104
- client = await self._ensure_client(streaming=False)
105
- message = _build_text_message(
106
- text,
107
- context_id=context_id,
108
- task_id=task_id,
109
- )
110
- final_task: Task | None = None
111
-
112
- async for event in client.send_message(
113
- message,
114
- configuration=MessageSendConfiguration(blocking=True),
115
- request_metadata=metadata,
116
- ):
117
- if isinstance(event, Message):
118
- return {
119
- "output": get_message_text(event),
120
- "task_id": event.task_id,
121
- "context_id": event.context_id,
122
- "message": event,
123
- }
124
- final_task, _ = event
125
-
126
- if final_task is None:
127
- raise RuntimeError("A2A response did not include a task result")
128
-
129
- self._raise_for_failed_task(final_task)
130
- return {
131
- "output": _task_output(final_task),
132
- "task_id": final_task.id,
133
- "context_id": final_task.context_id,
134
- "task": final_task,
135
- }
136
-
137
- async def stream(
138
- self,
139
- text: str,
140
- *,
141
- context_id: str | None = None,
142
- task_id: str | None = None,
143
- metadata: dict[str, Any] | None = None,
144
- ) -> AsyncIterator[dict[str, Any]]:
145
- client = await self._ensure_client(streaming=True)
146
- message = _build_text_message(
147
- text,
148
- context_id=context_id,
149
- task_id=task_id,
150
- )
151
- emitted_output = False
152
- latest_task: Task | None = None
153
-
154
- async for event in client.send_message(
155
- message,
156
- configuration=MessageSendConfiguration(blocking=True),
157
- request_metadata=metadata,
158
- ):
159
- if isinstance(event, Message):
160
- text_output = get_message_text(event)
161
- if text_output:
162
- emitted_output = True
163
- yield {
164
- "delta": text_output,
165
- "type": "text",
166
- "task_id": event.task_id,
167
- "context_id": event.context_id,
168
- }
169
- return
170
-
171
- latest_task, update = event
172
- if isinstance(update, TaskArtifactUpdateEvent):
173
- artifact_text = get_artifact_text(update.artifact)
174
- if artifact_text:
175
- emitted_output = True
176
- yield {
177
- "delta": artifact_text,
178
- "type": "text",
179
- "task_id": update.task_id,
180
- "context_id": update.context_id,
181
- }
182
- continue
183
-
184
- if isinstance(update, TaskStatusUpdateEvent) and update.final:
185
- self._raise_for_failed_task(latest_task)
186
-
187
- if latest_task is None:
188
- return
189
-
190
- self._raise_for_failed_task(latest_task)
191
- if emitted_output:
192
- return
193
-
194
- task_text = _task_output(latest_task)
195
- if task_text:
196
- yield {
197
- "delta": task_text,
198
- "type": "text",
199
- "task_id": latest_task.id,
200
- "context_id": latest_task.context_id,
201
- }
202
-
203
- async def close(self) -> None:
204
- if self._owns_http_client and self._http_client is not None:
205
- await self._http_client.aclose()
206
- self._http_client = None
207
- self._streaming_client = None
208
- self._blocking_client = None
209
-
210
- async def __aenter__(self) -> "RemoteA2AClient":
211
- await self._ensure_client(streaming=True)
212
- return self
213
-
214
- async def __aexit__(self, *_: Any) -> None:
215
- await self.close()
216
-
217
- async def _ensure_client(self, *, streaming: bool) -> Client:
218
- cached_client = (
219
- self._streaming_client if streaming else self._blocking_client
220
- )
221
- if cached_client is not None:
222
- return cached_client
223
-
224
- if self._http_client is None:
225
- self._http_client = httpx.AsyncClient(timeout=self.timeout)
226
-
227
- client = await ClientFactory.connect(
228
- self.endpoint,
229
- client_config=ClientConfig(
230
- httpx_client=self._http_client,
231
- streaming=streaming,
232
- polling=False,
233
- accepted_output_modes=["text/plain"],
234
- ),
235
- )
236
- if streaming:
237
- self._streaming_client = client
238
- else:
239
- self._blocking_client = client
240
- return client
241
-
242
- @staticmethod
243
- def _raise_for_failed_task(task: Task) -> None:
244
- if task.status.state in _FAILED_TASK_STATES:
245
- raise RuntimeError(_task_error(task))
246
-
247
-
248
- class RemoteA2AAgent:
249
- """Runner-like adapter for using a remote A2A endpoint inside KsADK flows."""
250
-
251
- def __init__(
252
- self,
253
- endpoint: str,
254
- *,
255
- name: str = "remote_a2a_agent",
256
- http_client: httpx.AsyncClient | None = None,
257
- timeout: float = 120.0,
258
- ) -> None:
259
- self.name = name
260
- self._client = RemoteA2AClient(
261
- endpoint=endpoint,
262
- http_client=http_client,
263
- timeout=timeout,
264
- )
265
-
266
- async def get_card(self) -> Any:
267
- return await self._client.get_card()
268
-
269
- async def invoke(self, input_data: dict[str, Any]) -> dict[str, Any]:
270
- response = await self._client.invoke(
271
- str(input_data.get("input", "")),
272
- context_id=input_data.get("context_id") or input_data.get("session_id"),
273
- task_id=input_data.get("task_id"),
274
- metadata=self._build_metadata(input_data),
275
- )
276
- return {
277
- "output": response["output"],
278
- "task_id": response.get("task_id"),
279
- "context_id": response.get("context_id"),
280
- }
281
-
282
- async def stream(
283
- self,
284
- input_data: dict[str, Any],
285
- ) -> AsyncIterator[dict[str, Any]]:
286
- async for event in self._client.stream(
287
- str(input_data.get("input", "")),
288
- context_id=input_data.get("context_id") or input_data.get("session_id"),
289
- task_id=input_data.get("task_id"),
290
- metadata=self._build_metadata(input_data),
291
- ):
292
- yield event
293
-
294
- async def close(self) -> None:
295
- await self._client.close()
296
-
297
- @staticmethod
298
- def _build_metadata(input_data: dict[str, Any]) -> dict[str, Any] | None:
299
- metadata = dict(input_data.get("metadata") or {})
300
-
301
- state = input_data.get("state")
302
- if isinstance(state, dict) and state:
303
- metadata["state"] = dict(state)
304
-
305
- branch = input_data.get("branch")
306
- if isinstance(branch, str) and branch:
307
- metadata["branch"] = branch
308
-
309
- return metadata or None
@@ -1,230 +0,0 @@
1
- """
2
- Langfuse 集成工具
3
-
4
- 提供 LangChain/LangGraph Runner 共用的 Langfuse 集成功能
5
- """
6
-
7
- import logging
8
- import os
9
- from typing import Any
10
-
11
- logger = logging.getLogger(__name__)
12
-
13
- # 全局缓存
14
- _langfuse_callback = None
15
- _cloud_monitor_langfuse_callback = None
16
-
17
-
18
- def _env_flag_enabled(name: str) -> bool:
19
- return os.getenv(name, "").strip().lower() in {"1", "true", "yes", "on"}
20
-
21
-
22
- def _env_flag_disabled(name: str) -> bool:
23
- return os.getenv(name, "").strip().lower() in {"0", "false", "no", "off", "disabled"}
24
-
25
-
26
- def _first_env(*names: str) -> str:
27
- for name in names:
28
- value = os.getenv(name, "").strip()
29
- if value:
30
- return value
31
- return ""
32
-
33
-
34
- def _create_langfuse_callback(
35
- *,
36
- label: str,
37
- public_key: str,
38
- secret_key: str = "",
39
- host: str = "",
40
- ) -> Any | None:
41
- try:
42
- from langfuse import Langfuse
43
- from langfuse.langchain import CallbackHandler
44
- from opentelemetry.sdk.resources import Resource
45
- from opentelemetry.sdk.trace import TracerProvider
46
-
47
- resource_attributes = {}
48
- service_name = os.getenv("OTEL_SERVICE_NAME", "").strip()
49
- if service_name:
50
- resource_attributes["service.name"] = service_name
51
- tracer_provider = TracerProvider(resource=Resource.create(resource_attributes))
52
- Langfuse(
53
- public_key=public_key,
54
- secret_key=secret_key or None,
55
- base_url=host or None,
56
- tracer_provider=tracer_provider,
57
- )
58
- try:
59
- handler = CallbackHandler(public_key=public_key)
60
- except TypeError:
61
- handler = CallbackHandler()
62
- logger.info(
63
- "%s Langfuse CallbackHandler initialized "
64
- "(host: %s public_key_present=%s secret_key_present=%s isolated_provider=True)",
65
- label,
66
- host or "default",
67
- bool(public_key),
68
- bool(secret_key),
69
- )
70
- return handler
71
- except ImportError as e:
72
- logger.warning("Langfuse not installed for %s callback: %s", label, e)
73
- return None
74
- except Exception as e:
75
- logger.error("Failed to create %s Langfuse CallbackHandler: %s", label, e)
76
- return None
77
-
78
-
79
- def get_langfuse_callback():
80
- """获取 Langfuse CallbackHandler
81
-
82
- Returns:
83
- CallbackHandler 实例,未配置时返回 None
84
- """
85
- global _langfuse_callback
86
-
87
- if not _env_flag_enabled("LANGFUSE_USE_CALLBACK"):
88
- logger.debug("Langfuse CallbackHandler disabled; using OTLP direct exporter by default")
89
- return None
90
-
91
- if _langfuse_callback is not None:
92
- return _langfuse_callback
93
-
94
- # 检查是否配置了 Langfuse
95
- public_key = os.getenv("LANGFUSE_PUBLIC_KEY", "").strip()
96
- if not public_key:
97
- return None
98
-
99
- _langfuse_callback = _create_langfuse_callback(
100
- label="Primary",
101
- public_key=public_key,
102
- secret_key=os.getenv("LANGFUSE_SECRET_KEY", "").strip(),
103
- host=_first_env("LANGFUSE_HOST", "LANGFUSE_BASE_URL"),
104
- )
105
- return _langfuse_callback
106
-
107
-
108
- def get_cloud_monitor_langfuse_callback():
109
- """获取云监控 Langfuse SDK CallbackHandler。"""
110
- global _cloud_monitor_langfuse_callback
111
-
112
- if not _env_flag_enabled("LANGFUSE_USE_CALLBACK"):
113
- return None
114
- if _env_flag_disabled("CLOUD_MONITOR_LANGFUSE_ENABLED"):
115
- logger.info(
116
- "CloudMonitor Langfuse CallbackHandler disabled by CLOUD_MONITOR_LANGFUSE_ENABLED"
117
- )
118
- return None
119
- if _cloud_monitor_langfuse_callback is not None:
120
- return _cloud_monitor_langfuse_callback
121
-
122
- public_key = os.getenv("CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY", "").strip()
123
- secret_key = os.getenv("CLOUD_MONITOR_LANGFUSE_SECRET_KEY", "").strip()
124
- host = _first_env("CLOUD_MONITOR_LANGFUSE_HOST", "CLOUD_MONITOR_OTLP_ENDPOINT")
125
- if not public_key and not secret_key and not host:
126
- return None
127
- if not public_key or not secret_key or not host:
128
- logger.warning(
129
- "CloudMonitor Langfuse CallbackHandler skipped: public_key_present=%s "
130
- "secret_key_present=%s host_present=%s",
131
- bool(public_key),
132
- bool(secret_key),
133
- bool(host),
134
- )
135
- return None
136
-
137
- _cloud_monitor_langfuse_callback = _create_langfuse_callback(
138
- label="CloudMonitor",
139
- public_key=public_key,
140
- secret_key=secret_key,
141
- host=host,
142
- )
143
- return _cloud_monitor_langfuse_callback
144
-
145
-
146
- def get_langfuse_callbacks() -> list[Any]:
147
- """获取所有 Langfuse CallbackHandler,原平台和云监控各自独立。"""
148
- callbacks = []
149
- primary = get_langfuse_callback()
150
- if primary:
151
- callbacks.append(primary)
152
-
153
- cloud_monitor = get_cloud_monitor_langfuse_callback()
154
- if cloud_monitor:
155
- callbacks.append(cloud_monitor)
156
-
157
- return callbacks
158
-
159
-
160
- def get_langfuse_metadata(session_id: str = None) -> dict:
161
- """获取 Langfuse 的 metadata 字典
162
-
163
- 通过 metadata 字段传递 trace 属性:
164
- - langfuse_user_id
165
- - langfuse_session_id
166
- - langfuse_tags
167
-
168
- Args:
169
- session_id: 会话 ID (可选)
170
-
171
- Returns:
172
- 包含 Langfuse 属性的 metadata 字典
173
- """
174
- metadata = {}
175
-
176
- if session_id:
177
- metadata["langfuse_session_id"] = session_id
178
-
179
- try:
180
- from ksadk.configs import settings
181
-
182
- agent_config = settings.agent
183
-
184
- if agent_config.user_id:
185
- metadata["langfuse_user_id"] = agent_config.user_id
186
-
187
- if not session_id and agent_config.session_id:
188
- metadata["langfuse_session_id"] = agent_config.session_id
189
-
190
- tags = list(agent_config.tags or [])
191
- if agent_config.environment and agent_config.environment not in tags:
192
- tags.append(agent_config.environment)
193
- if agent_config.agent_name and agent_config.agent_name not in tags:
194
- tags.append(agent_config.agent_name)
195
- if tags:
196
- metadata["langfuse_tags"] = tags
197
-
198
- except (ImportError, Exception):
199
- pass
200
-
201
- return metadata
202
-
203
-
204
- def prepare_trace_metadata(session_id: str = None) -> tuple:
205
- """准备 Trace 元数据
206
-
207
- Returns:
208
- (user_id, tags, version, agent_name) 元组
209
- """
210
- user_id = None
211
- tags = []
212
- version = None
213
- agent_name = None
214
-
215
- try:
216
- from ksadk.configs import settings
217
-
218
- agent_config = settings.agent
219
- user_id = agent_config.user_id
220
- tags = list(agent_config.tags or [])
221
- version = agent_config.version
222
- agent_name = agent_config.agent_name
223
-
224
- if agent_config.environment and agent_config.environment not in tags:
225
- tags.append(agent_config.environment)
226
-
227
- except (ImportError, Exception):
228
- pass
229
-
230
- return user_id, tags, version, agent_name