agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.2__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 (411) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +22 -2
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/RECORD +356 -222
  3. ksadk/a2a/_space_client_events.py +381 -0
  4. ksadk/a2a/event_adapter.py +156 -64
  5. ksadk/a2a/executor.py +179 -63
  6. ksadk/a2a/space_client.py +6 -333
  7. ksadk/a2ui/core.py +222 -53
  8. ksadk/agui/_agent_helpers.py +243 -0
  9. ksadk/agui/a2ui_projection.py +12 -5
  10. ksadk/agui/agent.py +443 -259
  11. ksadk/api/client.py +525 -27
  12. ksadk/builders/code_builder.py +284 -8
  13. ksadk/builders/container_builder.py +8 -1
  14. ksadk/builders/managed_runtime_builder.py +39 -35
  15. ksadk/cli/__init__.py +17 -0
  16. ksadk/cli/cmd_dashboard.py +15 -1
  17. ksadk/cli/cmd_deploy.py +10 -2
  18. ksadk/cli/cmd_eval.py +66 -9
  19. ksadk/cli/cmd_evalset.py +284 -0
  20. ksadk/cli/cmd_files.py +5 -1
  21. ksadk/cli/cmd_hermes.py +1 -126
  22. ksadk/cli/cmd_invoke.py +28 -38
  23. ksadk/cli/cmd_managed_runtime.py +95 -0
  24. ksadk/cli/cmd_observe.py +85 -0
  25. ksadk/cli/cmd_openclaw.py +1 -435
  26. ksadk/cli/cmd_replay.py +28 -4
  27. ksadk/cli/cmd_studio.py +99 -8
  28. ksadk/cli/cmd_web.py +10 -2
  29. ksadk/cli/hermes_env.py +151 -0
  30. ksadk/cli/invoke_payload.py +49 -0
  31. ksadk/cli/openclaw_env.py +458 -0
  32. ksadk/codex/client.py +180 -30
  33. ksadk/codex/runtime.py +428 -326
  34. ksadk/configs/env_registry.py +66 -12
  35. ksadk/configs/env_registry_pcm.py +181 -0
  36. ksadk/configs/env_var_spec.py +18 -0
  37. ksadk/configs/global_config.py +5 -0
  38. ksadk/context_engine/__init__.py +98 -0
  39. ksadk/context_engine/assembler.py +176 -0
  40. ksadk/context_engine/baseline.py +419 -0
  41. ksadk/context_engine/cache_observability.py +228 -0
  42. ksadk/context_engine/capabilities.py +443 -0
  43. ksadk/context_engine/contributors.py +344 -0
  44. ksadk/context_engine/hosted_pipeline.py +417 -0
  45. ksadk/context_engine/models.py +117 -0
  46. ksadk/context_engine/planner.py +698 -0
  47. ksadk/context_engine/policies.py +319 -0
  48. ksadk/context_engine/projection.py +31 -0
  49. ksadk/context_engine/shadow_plan.py +266 -0
  50. ksadk/context_engine/tokenizer.py +164 -0
  51. ksadk/conversations/context.py +126 -6
  52. ksadk/conversations/message_projection.py +292 -28
  53. ksadk/conversations/model_context.py +49 -3
  54. ksadk/conversations/runtime_compaction.py +207 -5
  55. ksadk/conversations/runtime_input.py +184 -2
  56. ksadk/conversations/runtime_invocation.py +81 -3
  57. ksadk/conversations/runtime_observability.py +141 -0
  58. ksadk/conversations/runtime_payloads.py +42 -0
  59. ksadk/conversations/runtime_preparation.py +272 -2
  60. ksadk/conversations/runtime_resume.py +20 -1
  61. ksadk/conversations/runtime_stream_events.py +94 -9
  62. ksadk/conversations/semantic_summary.py +311 -1
  63. ksadk/conversations/session_lock.py +51 -0
  64. ksadk/deployment/env_forward.py +72 -0
  65. ksadk/deployment/managed_runtime.py +5 -0
  66. ksadk/deployment/providers/serverless.py +143 -69
  67. ksadk/evaluation/__init__.py +32 -0
  68. ksadk/evaluation/a2a_adapter.py +9 -1
  69. ksadk/evaluation/adapters.py +18 -5
  70. ksadk/evaluation/agent_eval_client.py +395 -0
  71. ksadk/evaluation/cloud_binding.py +80 -0
  72. ksadk/evaluation/cloud_converter.py +194 -0
  73. ksadk/evaluation/cloud_service.py +199 -0
  74. ksadk/evaluation/contracts.py +73 -4
  75. ksadk/evaluation/evaluators.py +183 -17
  76. ksadk/evaluation/evidence.py +258 -0
  77. ksadk/evaluation/executor.py +31 -6
  78. ksadk/evaluation/local_adapter.py +550 -0
  79. ksadk/evaluation/service_env.py +27 -0
  80. ksadk/evaluation/studio_build_adapter.py +253 -0
  81. ksadk/evaluation/target.py +15 -6
  82. ksadk/events/__init__.py +13 -13
  83. ksadk/events/_v1_compat/__init__.py +1 -0
  84. ksadk/events/_v1_compat/models.py +299 -0
  85. ksadk/events/_v1_compat/parser.py +247 -0
  86. ksadk/events/_v1_compat/projection.py +753 -0
  87. ksadk/events/adapters/__init__.py +34 -0
  88. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  89. ksadk/events/adapters/_a2a_support.py +275 -0
  90. ksadk/events/adapters/_codex_interactions.py +375 -0
  91. ksadk/events/adapters/_codex_items.py +801 -0
  92. ksadk/events/adapters/_codex_validators.py +311 -0
  93. ksadk/events/adapters/_langgraph_support.py +785 -0
  94. ksadk/events/adapters/a2a.py +841 -0
  95. ksadk/events/adapters/adk.py +503 -0
  96. ksadk/events/adapters/codex.py +717 -0
  97. ksadk/events/adapters/langgraph.py +745 -0
  98. ksadk/events/canonical.py +440 -0
  99. ksadk/events/canonical_replay.py +497 -0
  100. ksadk/events/canonical_store.py +468 -0
  101. ksadk/events/cold_recovery.py +257 -0
  102. ksadk/events/content.py +89 -0
  103. ksadk/events/identity.py +86 -0
  104. ksadk/events/pipeline.py +455 -0
  105. ksadk/events/projections.py +66 -0
  106. ksadk/events/reducer.py +661 -0
  107. ksadk/events/replay.py +3 -36
  108. ksadk/events/runtime_event.py +20 -265
  109. ksadk/events/session_event.py +324 -0
  110. ksadk/events/store.py +3 -316
  111. ksadk/events/v1_compat.py +41 -0
  112. ksadk/harness/runtime.py +160 -57
  113. ksadk/identity/resolver.py +4 -3
  114. ksadk/interaction/__init__.py +28 -0
  115. ksadk/interaction/contracts.py +136 -0
  116. ksadk/interaction/ledger.py +189 -0
  117. ksadk/interaction/provider.py +122 -0
  118. ksadk/interaction/providers/__init__.py +52 -0
  119. ksadk/interaction/providers/adk.py +40 -0
  120. ksadk/interaction/providers/codex.py +94 -0
  121. ksadk/interaction/providers/langgraph.py +58 -0
  122. ksadk/kernel/__init__.py +117 -0
  123. ksadk/kernel/authorization.py +258 -0
  124. ksadk/kernel/bootstrap.py +1074 -0
  125. ksadk/kernel/contract_fingerprints.py +61 -0
  126. ksadk/kernel/contracts.py +362 -0
  127. ksadk/kernel/control.py +219 -0
  128. ksadk/kernel/errors.py +79 -0
  129. ksadk/kernel/ingress.py +1102 -0
  130. ksadk/kernel/mapping.py +111 -0
  131. ksadk/kernel/memory_store.py +1133 -0
  132. ksadk/kernel/postgres_store.py +1756 -0
  133. ksadk/kernel/recovery.py +452 -0
  134. ksadk/kernel/runtime_identity.py +103 -0
  135. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  136. ksadk/kernel/sqlite_store.py +1410 -0
  137. ksadk/kernel/state.py +145 -0
  138. ksadk/kernel/store.py +232 -0
  139. ksadk/kernel/worker.py +953 -0
  140. ksadk/knowledge_base/client.py +7 -0
  141. ksadk/knowledge_base/service.py +32 -5
  142. ksadk/memory/__init__.py +61 -0
  143. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  144. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  145. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  146. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  147. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  148. ksadk/memory/coordinator.py +461 -0
  149. ksadk/memory/events.py +202 -0
  150. ksadk/memory/extraction.py +228 -0
  151. ksadk/memory/ltm_backend_factory.py +16 -3
  152. ksadk/memory/models.py +316 -0
  153. ksadk/memory/policy.py +215 -0
  154. ksadk/memory/provider.py +47 -0
  155. ksadk/memory/provider_adapter.py +159 -0
  156. ksadk/memory/provider_resolver.py +71 -0
  157. ksadk/memory/providers/__init__.py +5 -0
  158. ksadk/memory/providers/local_sqlite.py +490 -0
  159. ksadk/memory/resolved_policy.py +145 -0
  160. ksadk/memory/service.py +188 -6
  161. ksadk/model_proxy/bootstrap.py +16 -9
  162. ksadk/model_proxy/detect.py +202 -9
  163. ksadk/model_proxy/namespace.py +39 -15
  164. ksadk/model_proxy/server.py +24 -5
  165. ksadk/model_proxy/transform.py +60 -2
  166. ksadk/observability/__init__.py +25 -0
  167. ksadk/observability/session_log.py +420 -0
  168. ksadk/observability/trajectory.py +105 -0
  169. ksadk/prompts/__init__.py +71 -0
  170. ksadk/prompts/compiler.py +215 -0
  171. ksadk/prompts/models.py +82 -0
  172. ksadk/prompts/projection.py +89 -0
  173. ksadk/prompts/resolved.py +137 -0
  174. ksadk/prompts/sources.py +233 -0
  175. ksadk/runners/_langgraph_runner_streams.py +822 -0
  176. ksadk/runners/adk_runner.py +5 -5
  177. ksadk/runners/base_runner.py +16 -0
  178. ksadk/runners/factory.py +1 -2
  179. ksadk/runners/langgraph_runner.py +198 -437
  180. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  181. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  182. ksadk/runtime/adapter.py +118 -2
  183. ksadk/runtime/conversation_execution.py +316 -182
  184. ksadk/runtime/executor.py +144 -3
  185. ksadk/runtime/factory.py +193 -7
  186. ksadk/runtime/hosted_finalizer.py +268 -0
  187. ksadk/runtime/launch.py +14 -1
  188. ksadk/runtime/preprocessing.py +25 -3
  189. ksadk/runtime/runner_adapter.py +288 -508
  190. ksadk/runtime/usage.py +33 -0
  191. ksadk/sandbox/backends/e2b.py +35 -2
  192. ksadk/server/composition.py +8 -0
  193. ksadk/server/factory.py +69 -6
  194. ksadk/server/routes/kernel_ingress.py +258 -0
  195. ksadk/server/routes/openai_compat.py +88 -8
  196. ksadk/server/routes/projection.py +35 -20
  197. ksadk/server/routes/run.py +94 -0
  198. ksadk/server/routes/sessions.py +2 -0
  199. ksadk/server/routes/streaming.py +5 -2
  200. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  201. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-DOH6MVcn.js} +4 -4
  202. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  203. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  204. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  205. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  206. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  207. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  208. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  209. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  210. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  211. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  212. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  213. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  214. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  215. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  216. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  217. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  218. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  219. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  220. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  221. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  222. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  223. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  224. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  225. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  226. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  227. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  228. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  229. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  230. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  231. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  232. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  233. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  234. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  235. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  236. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-8hqcx0sU.js} +1 -1
  237. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  238. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-BE7bu-DL.js} +1 -1
  239. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-BVDffZ0U.js} +1 -1
  240. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-BX8z72IC.js} +1 -1
  241. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-Bf2M8m3N.js} +1 -1
  242. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-BjU6y-A2.js} +1 -1
  243. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-BytlxIDT.js} +1 -1
  244. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-CSh_DE14.js} +1 -1
  245. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-CXYYBw3_.js} +1 -1
  246. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-C_wsv-Qd.js} +1 -1
  247. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-ClxGviKw.js} +1 -1
  248. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-CttYUqzS.js} +1 -1
  249. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DNp6rLRA.js} +1 -1
  250. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-DUX-id_F.js} +1 -1
  251. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-DmldrHd_.js} +1 -1
  252. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DnfXs8Vn.js} +2 -2
  253. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Dq9gLD7L.js} +1 -1
  254. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-W-TIVntx.js} +1 -1
  255. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-dDdADKFA.js} +1 -1
  256. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-dydu68Fl.js} +1 -1
  257. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-ngtN0DJB.js} +1 -1
  258. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  259. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  260. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  261. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  262. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  263. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  264. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  265. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  266. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  267. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  268. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  269. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  270. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  271. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  272. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  273. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-BHjG8b-J.js} +1 -1
  274. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  275. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  276. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  277. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  278. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  279. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  280. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  281. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  282. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  283. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  284. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  285. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  286. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  287. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  288. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  289. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  290. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  291. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  292. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  293. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  294. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  295. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  296. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  297. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  298. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  299. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  300. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  301. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  302. ksadk/server/static/index.html +2 -2
  303. ksadk/sessions/__init__.py +26 -9
  304. ksadk/sessions/_local_service_sync.py +688 -0
  305. ksadk/sessions/_local_tables.py +21 -0
  306. ksadk/sessions/_postgres_schema.py +305 -0
  307. ksadk/sessions/_postgres_tables.py +15 -0
  308. ksadk/sessions/base.py +80 -1
  309. ksadk/sessions/in_memory.py +53 -2
  310. ksadk/sessions/local_service.py +63 -604
  311. ksadk/sessions/postgres_service.py +58 -148
  312. ksadk/sessions/resilient.py +35 -1
  313. ksadk/studio/api.py +577 -25
  314. ksadk/studio/api_contracts.py +114 -5
  315. ksadk/studio/api_memory_routes.py +82 -0
  316. ksadk/studio/authoring.py +252 -27
  317. ksadk/studio/authoring_coordinator.py +799 -67
  318. ksadk/studio/builder.py +88 -11
  319. ksadk/studio/capabilities.py +17 -0
  320. ksadk/studio/cloud.py +1916 -95
  321. ksadk/studio/codex_agent_service.py +125 -14
  322. ksadk/studio/codex_authoring.py +469 -0
  323. ksadk/studio/codex_builder.py +138 -25
  324. ksadk/studio/codex_manifest.py +51 -22
  325. ksadk/studio/codex_run.py +46 -3
  326. ksadk/studio/compiler.py +1 -0
  327. ksadk/studio/contracts.py +114 -3
  328. ksadk/studio/event_store.py +25 -95
  329. ksadk/studio/framework_run.py +231 -3
  330. ksadk/studio/hosted_kernel.py +317 -0
  331. ksadk/studio/manifest_resolver.py +131 -0
  332. ksadk/studio/model_client.py +95 -9
  333. ksadk/studio/model_profile_service.py +1 -1
  334. ksadk/studio/operations.py +37 -5
  335. ksadk/studio/otel_trace.py +348 -42
  336. ksadk/studio/pcm_memory.py +85 -0
  337. ksadk/studio/repository.py +23 -2
  338. ksadk/studio/resource_catalog.py +43 -0
  339. ksadk/studio/run_service.py +563 -137
  340. ksadk/studio/runtime_source.py +42 -16
  341. ksadk/studio/service.py +1180 -72
  342. ksadk/studio/shared_web.py +32 -22
  343. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  344. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  345. ksadk/studio/static/index.html +2 -2
  346. ksadk/studio/templates.py +100 -8
  347. ksadk/studio/validator.py +19 -0
  348. ksadk/studio/workspace.py +30 -32
  349. ksadk/tracing/setup.py +304 -3
  350. ksadk/version.py +1 -1
  351. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  352. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  353. ksadk/events/parser.py +0 -191
  354. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  355. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  356. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  357. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  358. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  359. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  360. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  361. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  362. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  363. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  364. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  365. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  366. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  367. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  368. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  369. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  370. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  371. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  372. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  373. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  374. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  375. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  376. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  377. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  378. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  379. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  380. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  381. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  382. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  383. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  384. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  385. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  386. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  387. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  388. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  389. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  390. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  391. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  392. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  393. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  394. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  395. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  396. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  397. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  398. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  399. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  400. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  401. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  402. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  404. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  405. ksadk/studio/evaluation.py +0 -192
  406. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  407. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  408. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +0 -0
  409. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  410. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  411. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,458 @@
1
+ """OpenClaw deploy 的运行时环境变量构建。
2
+
3
+ 从 cmd_openclaw.py 拆出(模块体积治理);``_resolve_env`` 与全局 env 缓存仍留在
4
+ cmd_openclaw(测试 monkeypatch 点),此处通过延迟 import 访问。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ from typing import Any, Dict, Optional
11
+
12
+ from ksadk.deployment.env_forward import forward_shell_process_env
13
+ from ksadk.model_policy import build_runtime_model_policy_env
14
+
15
+ DEFAULT_TRUSTED_PROXY_USER_HEADER = "x-forwarded-user"
16
+ DEFAULT_TRUSTED_PROXY_CIDRS = [
17
+ "127.0.0.1",
18
+ "::1",
19
+ "10.0.0.0/8",
20
+ "172.16.0.0/12",
21
+ "192.168.0.0/16",
22
+ "35.0.0.0/8",
23
+ ]
24
+
25
+
26
+ def _resolve_env(*keys: str, default: Optional[str] = None) -> Optional[str]:
27
+ from ksadk.cli import cmd_openclaw
28
+
29
+ return cmd_openclaw._resolve_env(*keys, default=default)
30
+
31
+
32
+ def _resolve_model_base_url(cli_value: Optional[str]) -> Optional[str]:
33
+ """解析模型 Base URL,缺失时回退到 settings.model.api_base(KSPMAS 自动探测)。"""
34
+ if cli_value and str(cli_value).strip():
35
+ return str(cli_value).strip()
36
+
37
+ from_env = _resolve_env(
38
+ "OPENCLAW_MODEL_BASE_URL",
39
+ "OPENAI_BASE_URL",
40
+ "OPENAI_API_BASE",
41
+ "LLM_API_BASE",
42
+ "MODEL_API_BASE",
43
+ )
44
+ if from_env:
45
+ return from_env
46
+
47
+ try:
48
+ from ksadk.configs.settings import settings
49
+
50
+ api_base = settings.model.api_base
51
+ if api_base and str(api_base).strip():
52
+ return str(api_base).strip()
53
+ except Exception:
54
+ pass
55
+
56
+ return None
57
+
58
+
59
+ def _normalize_ui_locale(raw: Optional[str]) -> str:
60
+ """标准化 UI 语言代码,默认 zh-CN。"""
61
+ text = str(raw or "").strip()
62
+ if not text:
63
+ return "zh-CN"
64
+
65
+ base = text.split(".", 1)[0].replace("_", "-").strip()
66
+ low = base.lower()
67
+
68
+ if low in {"c", "c-utf-8", "c.utf-8", "posix"}:
69
+ return "zh-CN"
70
+ if (
71
+ low.startswith("zh-tw")
72
+ or low.startswith("zh-hk")
73
+ or low.startswith("zh-mo")
74
+ or low.startswith("zh-hant")
75
+ ):
76
+ return "zh-TW"
77
+ if low.startswith("zh"):
78
+ return "zh-CN"
79
+ if low.startswith("pt"):
80
+ return "pt-BR"
81
+ if low.startswith("de"):
82
+ return "de"
83
+ if low.startswith("en"):
84
+ return "en"
85
+
86
+ return "zh-CN"
87
+
88
+
89
+ def _is_truthy(raw: Optional[str]) -> bool:
90
+ text = str(raw or "").strip().lower()
91
+ return text in {"1", "true", "yes", "on"}
92
+
93
+
94
+ def _resolve_exec_profile_overrides(security_profile: Optional[str]) -> Dict[str, str]:
95
+ """根据 CLI 安全预设返回 OpenClaw 运行时环境变量覆盖项。"""
96
+ profile = str(security_profile or "").strip().lower()
97
+ if not profile:
98
+ return {}
99
+
100
+ common = {
101
+ "OPENCLAW_EXEC_HOST": "gateway",
102
+ "OPENCLAW_EXEC_AUTO_ALLOW_SKILLS": "false",
103
+ "OPENCLAW_ELEVATED_ENABLED": "false",
104
+ }
105
+ if profile == "relaxed":
106
+ return {
107
+ **common,
108
+ "OPENCLAW_EXEC_STRICT_MODE": "false",
109
+ "OPENCLAW_EXEC_UNSAFE_MODE": "true",
110
+ "OPENCLAW_EXEC_SECURITY": "full",
111
+ "OPENCLAW_EXEC_ASK": "off",
112
+ "OPENCLAW_EXEC_ASK_FALLBACK": "full",
113
+ "OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED": "false",
114
+ "OPENCLAW_FS_WORKSPACE_ONLY": "false",
115
+ }
116
+ if profile == "strict":
117
+ return {
118
+ **common,
119
+ "OPENCLAW_EXEC_STRICT_MODE": "true",
120
+ "OPENCLAW_EXEC_UNSAFE_MODE": "false",
121
+ "OPENCLAW_EXEC_SECURITY": "allowlist",
122
+ "OPENCLAW_EXEC_ASK": "off",
123
+ "OPENCLAW_EXEC_ASK_FALLBACK": "allowlist",
124
+ "OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED": "true",
125
+ "OPENCLAW_FS_WORKSPACE_ONLY": "false",
126
+ }
127
+ if profile == "strictest":
128
+ return {
129
+ **common,
130
+ "OPENCLAW_EXEC_STRICT_MODE": "true",
131
+ "OPENCLAW_EXEC_UNSAFE_MODE": "false",
132
+ "OPENCLAW_EXEC_SECURITY": "deny",
133
+ "OPENCLAW_EXEC_ASK": "off",
134
+ "OPENCLAW_EXEC_ASK_FALLBACK": "deny",
135
+ "OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED": "false",
136
+ "OPENCLAW_FS_WORKSPACE_ONLY": "true",
137
+ }
138
+ raise ValueError(f"unsupported OpenClaw security profile: {security_profile}")
139
+
140
+
141
+ def _normalize_allowed_origins(raw: str) -> str:
142
+ """标准化 OPENCLAW_ALLOWED_ORIGINS,统一输出 JSON 数组字符串。"""
143
+ text = (raw or "").strip()
144
+ if not text:
145
+ return ""
146
+
147
+ origins = []
148
+ try:
149
+ parsed = json.loads(text)
150
+ if isinstance(parsed, list):
151
+ origins = [str(x).strip() for x in parsed if str(x).strip()]
152
+ except Exception:
153
+ # Backward compatible: 支持逗号/分号/空白分隔字符串。
154
+ parts = [p.strip() for p in text.replace(";", ",").replace(" ", ",").split(",")]
155
+ origins = [p.strip() for p in parts if p.strip()]
156
+
157
+ if not origins:
158
+ origins = [text]
159
+
160
+ deduped = list(dict.fromkeys(origins))
161
+ return json.dumps(deduped, ensure_ascii=False)
162
+
163
+
164
+ def _normalize_csv_list(raw: str, *, default_items: Optional[list[str]] = None) -> str:
165
+ """标准化字符串列表为逗号分隔格式。"""
166
+ text = (raw or "").strip()
167
+ items: list[str] = []
168
+ if text:
169
+ try:
170
+ parsed = json.loads(text)
171
+ if isinstance(parsed, list):
172
+ items = [str(x).strip() for x in parsed if str(x).strip()]
173
+ except Exception:
174
+ parts = [p.strip() for p in text.replace(";", ",").replace(" ", ",").split(",")]
175
+ items = [p for p in parts if p]
176
+
177
+ if not items:
178
+ items = [str(x).strip() for x in (default_items or []) if str(x).strip()]
179
+
180
+ return ",".join(list(dict.fromkeys(items)))
181
+
182
+
183
+ def _normalize_openclaw_gateway_auth_env(env: dict[str, str]) -> dict[str, str]:
184
+ """标准化 OpenClaw gateway 鉴权模式与共享密钥配置。"""
185
+ normalized_env = dict(env or {})
186
+ raw_mode = str(normalized_env.get("OPENCLAW_GATEWAY_AUTH_MODE") or "").strip().lower()
187
+ raw_token = str(normalized_env.get("OPENCLAW_GATEWAY_TOKEN") or "").strip()
188
+ raw_password = str(normalized_env.get("OPENCLAW_GATEWAY_PASSWORD") or "").strip()
189
+
190
+ if raw_mode and raw_mode not in {"trusted-proxy", "token", "none"}:
191
+ raise ValueError("OPENCLAW_GATEWAY_AUTH_MODE 仅支持 trusted-proxy、token 或 none")
192
+
193
+ auth_mode = raw_mode or ("token" if raw_token or raw_password else "trusted-proxy")
194
+ if auth_mode == "token":
195
+ if raw_token and raw_password and raw_token != raw_password:
196
+ raise ValueError(
197
+ "OPENCLAW_GATEWAY_TOKEN 与 OPENCLAW_GATEWAY_PASSWORD 同时提供时必须一致"
198
+ )
199
+ shared_secret = raw_token or raw_password
200
+ if not shared_secret:
201
+ raise ValueError(
202
+ "OPENCLAW_GATEWAY_AUTH_MODE=token 时必须提供 "
203
+ "OPENCLAW_GATEWAY_TOKEN 或 OPENCLAW_GATEWAY_PASSWORD"
204
+ )
205
+ normalized_env["OPENCLAW_GATEWAY_AUTH_MODE"] = "token"
206
+ normalized_env["OPENCLAW_GATEWAY_TOKEN"] = shared_secret
207
+ normalized_env["OPENCLAW_GATEWAY_PASSWORD"] = shared_secret
208
+ return normalized_env
209
+
210
+ if raw_token or raw_password:
211
+ raise ValueError(
212
+ "仅在 OPENCLAW_GATEWAY_AUTH_MODE=token 时支持 "
213
+ "OPENCLAW_GATEWAY_TOKEN 或 OPENCLAW_GATEWAY_PASSWORD"
214
+ )
215
+
216
+ normalized_env["OPENCLAW_GATEWAY_AUTH_MODE"] = auth_mode
217
+ normalized_env.pop("OPENCLAW_GATEWAY_TOKEN", None)
218
+ normalized_env.pop("OPENCLAW_GATEWAY_PASSWORD", None)
219
+ return normalized_env
220
+
221
+
222
+ def _build_openclaw_env_vars(
223
+ *,
224
+ model_base_url: Optional[str] = None,
225
+ model_api_key: Optional[str] = None,
226
+ default_model: Optional[str] = None,
227
+ model_provider_id: Optional[str] = None,
228
+ gateway_port: Optional[str] = None,
229
+ public_port: Optional[str] = None,
230
+ security_profile: Optional[str] = None,
231
+ ) -> dict:
232
+ """构建 OpenClaw 所需的环境变量,自动复用 OPENAI_* 环境变量"""
233
+ env = {}
234
+ default_provider_id = "ksyun"
235
+ default_model_api = "openai-completions"
236
+ default_model_base_url = "https://kspmas.ksyun.com/v1"
237
+ exec_profile_overrides = _resolve_exec_profile_overrides(security_profile)
238
+
239
+ # 模型配置:客户端只透传用户显式配置和可选的 API Key;
240
+ # 其余默认值交给镜像 bootstrap 兜底,避免创建请求把服务端默认行为短路掉。
241
+ openclaw_explicit_model = default_model or _resolve_env("OPENCLAW_DEFAULT_MODEL")
242
+ generic_model_preference = _resolve_env("OPENAI_MODEL_NAME", "MODEL_NAME", "LLM_MODEL")
243
+ model_preference = openclaw_explicit_model or generic_model_preference
244
+ explicit_base_url = model_base_url or _resolve_env(
245
+ "OPENCLAW_MODEL_BASE_URL", "OPENAI_BASE_URL", "OPENAI_API_BASE"
246
+ )
247
+ base_url = _resolve_model_base_url(explicit_base_url)
248
+ api_key = model_api_key or _resolve_env(
249
+ "OPENCLAW_MODEL_API_KEY", "OPENAI_API_KEY", "LLM_API_KEY", "MODEL_API_KEY"
250
+ )
251
+ model = model_preference or "glm-5.2"
252
+ explicit_provider_id = model_provider_id or _resolve_env("OPENCLAW_MODEL_PROVIDER_ID")
253
+ inferred_provider_id = explicit_provider_id
254
+ if not inferred_provider_id and model and "/" in model:
255
+ inferred_provider_id = model.split("/", 1)[0].strip()
256
+ provider_id = inferred_provider_id or default_provider_id
257
+ resolved_gateway_port = gateway_port or _resolve_env("OPENCLAW_GATEWAY_PORT", "PORT") or "8080"
258
+ resolved_public_port = public_port or _resolve_env("OPENCLAW_PUBLIC_PORT") or "80"
259
+ explicit_model_api = _resolve_env("OPENCLAW_MODEL_API")
260
+ model_api = explicit_model_api or default_model_api
261
+ trusted_proxy_user_header = (
262
+ (
263
+ _resolve_env(
264
+ "OPENCLAW_TRUSTED_PROXY_USER_HEADER",
265
+ "OPENCLAW_GATEWAY_TRUSTED_PROXY_USER_HEADER",
266
+ )
267
+ or DEFAULT_TRUSTED_PROXY_USER_HEADER
268
+ )
269
+ .strip()
270
+ .lower()
271
+ )
272
+ internal_trusted_proxy_user = (
273
+ _resolve_env("OPENCLAW_INTERNAL_TRUSTED_PROXY_USER") or "openclaw-backend"
274
+ )
275
+ internal_trusted_proxy_user_header = (
276
+ (
277
+ _resolve_env("OPENCLAW_INTERNAL_TRUSTED_PROXY_USER_HEADER")
278
+ or trusted_proxy_user_header
279
+ or DEFAULT_TRUSTED_PROXY_USER_HEADER
280
+ )
281
+ .strip()
282
+ .lower()
283
+ )
284
+ trusted_proxies = _normalize_csv_list(
285
+ _resolve_env("OPENCLAW_TRUSTED_PROXIES") or "",
286
+ default_items=DEFAULT_TRUSTED_PROXY_CIDRS,
287
+ )
288
+ browser_enabled = _resolve_env("OPENCLAW_BROWSER_ENABLED")
289
+ browser_no_sandbox = _resolve_env("OPENCLAW_BROWSER_NO_SANDBOX") or "true"
290
+ browser_headless = _resolve_env("OPENCLAW_BROWSER_HEADLESS") or "true"
291
+ browser_executable = _resolve_env(
292
+ "OPENCLAW_BROWSER_EXECUTABLE_PATH", "OPENCLAW_BROWSER_EXECUTABLE"
293
+ )
294
+ ui_locale = _normalize_ui_locale(_resolve_env("OPENCLAW_UI_LOCALE", "LANG", "LC_ALL"))
295
+ exec_strict_mode_raw = (
296
+ exec_profile_overrides.get("OPENCLAW_EXEC_STRICT_MODE")
297
+ or _resolve_env("OPENCLAW_EXEC_STRICT_MODE", "OPENCLAW_EXEC_SAFE_MODE")
298
+ or "false"
299
+ )
300
+ exec_strict_mode = _is_truthy(exec_strict_mode_raw)
301
+
302
+ exec_host = (
303
+ exec_profile_overrides.get("OPENCLAW_EXEC_HOST")
304
+ or _resolve_env("OPENCLAW_EXEC_HOST")
305
+ or "gateway"
306
+ )
307
+ exec_security = (
308
+ exec_profile_overrides.get("OPENCLAW_EXEC_SECURITY")
309
+ or _resolve_env("OPENCLAW_EXEC_SECURITY")
310
+ or ("allowlist" if exec_strict_mode else "full")
311
+ )
312
+ exec_ask = (
313
+ exec_profile_overrides.get("OPENCLAW_EXEC_ASK")
314
+ or _resolve_env("OPENCLAW_EXEC_ASK")
315
+ or "off"
316
+ )
317
+ exec_ask_fallback = (
318
+ exec_profile_overrides.get("OPENCLAW_EXEC_ASK_FALLBACK")
319
+ or _resolve_env("OPENCLAW_EXEC_ASK_FALLBACK")
320
+ or ("allowlist" if exec_strict_mode else "full")
321
+ )
322
+ exec_auto_allow_skills = (
323
+ exec_profile_overrides.get("OPENCLAW_EXEC_AUTO_ALLOW_SKILLS")
324
+ or _resolve_env("OPENCLAW_EXEC_AUTO_ALLOW_SKILLS")
325
+ or "false"
326
+ )
327
+ elevated_enabled = (
328
+ exec_profile_overrides.get("OPENCLAW_ELEVATED_ENABLED")
329
+ or _resolve_env("OPENCLAW_ELEVATED_ENABLED")
330
+ or "false"
331
+ )
332
+ exec_default_allowlist_enabled = (
333
+ exec_profile_overrides.get("OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED")
334
+ or _resolve_env("OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED")
335
+ or ("true" if exec_strict_mode else "false")
336
+ )
337
+ exec_allowlist = _resolve_env("OPENCLAW_EXEC_ALLOWLIST")
338
+ fs_workspace_only = (
339
+ exec_profile_overrides.get("OPENCLAW_FS_WORKSPACE_ONLY")
340
+ or _resolve_env("OPENCLAW_FS_WORKSPACE_ONLY")
341
+ or "false"
342
+ )
343
+ model_api_key_secret_source = _resolve_env("OPENCLAW_MODEL_API_KEY_SECRET_SOURCE") or "file"
344
+ model_api_key_secret_file_path = _resolve_env("OPENCLAW_MODEL_API_KEY_SECRET_FILE_PATH")
345
+ gateway_auth_mode = _resolve_env("OPENCLAW_GATEWAY_AUTH_MODE")
346
+ gateway_token = _resolve_env("OPENCLAW_GATEWAY_TOKEN")
347
+ gateway_password = _resolve_env("OPENCLAW_GATEWAY_PASSWORD")
348
+
349
+ env["OPENCLAW_GATEWAY_BIND"] = "lan"
350
+ if gateway_auth_mode:
351
+ env["OPENCLAW_GATEWAY_AUTH_MODE"] = gateway_auth_mode
352
+ env["OPENCLAW_TRUSTED_PROXY_USER_HEADER"] = (
353
+ trusted_proxy_user_header or DEFAULT_TRUSTED_PROXY_USER_HEADER
354
+ )
355
+ env["OPENCLAW_INTERNAL_TRUSTED_PROXY_USER"] = internal_trusted_proxy_user
356
+ env["OPENCLAW_INTERNAL_TRUSTED_PROXY_USER_HEADER"] = (
357
+ internal_trusted_proxy_user_header
358
+ or trusted_proxy_user_header
359
+ or DEFAULT_TRUSTED_PROXY_USER_HEADER
360
+ )
361
+ env["OPENCLAW_TRUSTED_PROXIES"] = trusted_proxies
362
+ env["OPENCLAW_GATEWAY_PORT"] = str(resolved_gateway_port)
363
+ env["OPENCLAW_PUBLIC_PORT"] = str(resolved_public_port)
364
+ if browser_enabled:
365
+ env["OPENCLAW_BROWSER_ENABLED"] = browser_enabled
366
+ env["OPENCLAW_BROWSER_NO_SANDBOX"] = browser_no_sandbox
367
+ env["OPENCLAW_BROWSER_HEADLESS"] = browser_headless
368
+ if browser_executable:
369
+ env["OPENCLAW_BROWSER_EXECUTABLE_PATH"] = browser_executable
370
+ env["OPENCLAW_UI_LOCALE"] = ui_locale
371
+ env["OPENCLAW_EXEC_HOST"] = exec_host
372
+ env["OPENCLAW_EXEC_STRICT_MODE"] = "true" if exec_strict_mode else "false"
373
+ env["OPENCLAW_EXEC_UNSAFE_MODE"] = "false" if exec_strict_mode else "true"
374
+ env["OPENCLAW_EXEC_SECURITY"] = exec_security
375
+ env["OPENCLAW_EXEC_ASK"] = exec_ask
376
+ env["OPENCLAW_EXEC_ASK_FALLBACK"] = exec_ask_fallback
377
+ env["OPENCLAW_EXEC_AUTO_ALLOW_SKILLS"] = exec_auto_allow_skills
378
+ env["OPENCLAW_ELEVATED_ENABLED"] = elevated_enabled
379
+ env["OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED"] = exec_default_allowlist_enabled
380
+ env["OPENCLAW_FS_WORKSPACE_ONLY"] = fs_workspace_only
381
+ env["OPENCLAW_MODEL_API_KEY_SECRET_SOURCE"] = model_api_key_secret_source
382
+ if exec_allowlist:
383
+ env["OPENCLAW_EXEC_ALLOWLIST"] = exec_allowlist
384
+ if model_api_key_secret_file_path:
385
+ env["OPENCLAW_MODEL_API_KEY_SECRET_FILE_PATH"] = model_api_key_secret_file_path
386
+
387
+ if explicit_provider_id and provider_id != default_provider_id:
388
+ env["OPENCLAW_MODEL_PROVIDER_ID"] = provider_id
389
+ elif not explicit_provider_id and provider_id and provider_id != default_provider_id:
390
+ env["OPENCLAW_MODEL_PROVIDER_ID"] = provider_id
391
+ if explicit_model_api and model_api != default_model_api:
392
+ env["OPENCLAW_MODEL_API"] = model_api
393
+ if explicit_base_url and base_url and base_url != default_model_base_url:
394
+ env["OPENCLAW_MODEL_BASE_URL"] = base_url
395
+ if api_key:
396
+ env["OPENCLAW_MODEL_API_KEY"] = api_key
397
+ normalized_model = model.strip() if model else None
398
+ catalog_model_id = None
399
+ resolved_model = None
400
+ if normalized_model:
401
+ if "/" in normalized_model:
402
+ _, catalog_model_id = normalized_model.split("/", 1)
403
+ resolved_model = normalized_model
404
+ else:
405
+ resolved_model = (
406
+ f"{provider_id}/{normalized_model}" if provider_id else normalized_model
407
+ )
408
+ if openclaw_explicit_model:
409
+ env["OPENCLAW_DEFAULT_MODEL"] = resolved_model
410
+ elif generic_model_preference:
411
+ env["OPENAI_MODEL_NAME"] = resolved_model
412
+
413
+ # 额外的可选配置
414
+ catalog = _resolve_env("OPENCLAW_MODEL_CATALOG_JSON")
415
+ if catalog:
416
+ env["OPENCLAW_MODEL_CATALOG_JSON"] = catalog
417
+ openclaw_model_allowlist = _resolve_env("OPENCLAW_MODEL_ALLOWLIST")
418
+ agentengine_model_allowlist = _resolve_env("AGENTENGINE_MODEL_ALLOWLIST")
419
+ if openclaw_model_allowlist:
420
+ env["OPENCLAW_MODEL_ALLOWLIST"] = openclaw_model_allowlist
421
+ elif agentengine_model_allowlist:
422
+ env["AGENTENGINE_MODEL_ALLOWLIST"] = agentengine_model_allowlist
423
+ origins = _resolve_env("OPENCLAW_ALLOWED_ORIGINS")
424
+ if origins:
425
+ env["OPENCLAW_ALLOWED_ORIGINS"] = _normalize_allowed_origins(origins)
426
+ else:
427
+ # 统一输出 JSON 数组字符串,兼容旧版 bootstrap(仅支持 JSON.parse)。
428
+ env["OPENCLAW_ALLOWED_ORIGINS"] = json.dumps(["*"])
429
+ allow_insecure_auth = _resolve_env("OPENCLAW_ALLOW_INSECURE_AUTH")
430
+ env["OPENCLAW_ALLOW_INSECURE_AUTH"] = allow_insecure_auth if allow_insecure_auth else "true"
431
+ disable_device_auth = _resolve_env("OPENCLAW_DISABLE_DEVICE_AUTH")
432
+ env["OPENCLAW_DISABLE_DEVICE_AUTH"] = disable_device_auth if disable_device_auth else "true"
433
+ if gateway_token:
434
+ env["OPENCLAW_GATEWAY_TOKEN"] = gateway_token
435
+ if gateway_password:
436
+ env["OPENCLAW_GATEWAY_PASSWORD"] = gateway_password
437
+ for passthrough_key in [
438
+ "OPENCLAW_CHANNEL_BOOTSTRAP_JSON",
439
+ "OPENCLAW_BROWSER_SSRF_POLICY_JSON",
440
+ "OPENCLAW_WEB_FETCH_ENABLED",
441
+ "OPENCLAW_WEB_SEARCH_PROVIDER",
442
+ "OPENCLAW_WEB_SEARCH_BASE_URL",
443
+ "OPENCLAW_WEB_SEARCH_MODEL",
444
+ "OPENCLAW_WEB_SEARCH_API_KEY",
445
+ "OPENCLAW_WEB_SEARCH_API_KEY_SECRET_SOURCE",
446
+ "OPENCLAW_WEB_SEARCH_API_KEY_SECRET_PROVIDER",
447
+ "OPENCLAW_WEB_SEARCH_API_KEY_SECRET_ID",
448
+ ]:
449
+ passthrough_value = _resolve_env(passthrough_key)
450
+ if passthrough_value:
451
+ env[passthrough_key] = passthrough_value
452
+
453
+ env = _normalize_openclaw_gateway_auth_env(env)
454
+ env = build_runtime_model_policy_env(env, runtime="openclaw")
455
+ # shell 前缀转发 (KSADK_/OPENAI_/KSYUN_/E2B_ + allowlist),对齐通用 deploy;
456
+ # setdefault 语义不覆盖上面已 resolve 的固定键,--env/--env-file 仍可覆盖。
457
+ forward_shell_process_env(env)
458
+ return env