agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.3__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 (476) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +25 -12
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +421 -232
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/a2a/_space_client_events.py +381 -0
  5. ksadk/a2a/event_adapter.py +156 -64
  6. ksadk/a2a/executor.py +179 -63
  7. ksadk/a2a/space_client.py +6 -333
  8. ksadk/a2ui/core.py +222 -53
  9. ksadk/agui/_agent_helpers.py +247 -0
  10. ksadk/agui/a2ui_projection.py +12 -5
  11. ksadk/agui/agent.py +443 -259
  12. ksadk/api/client.py +528 -27
  13. ksadk/builders/code_builder.py +284 -8
  14. ksadk/builders/container_builder.py +8 -1
  15. ksadk/builders/managed_runtime_builder.py +42 -35
  16. ksadk/cli/__init__.py +23 -0
  17. ksadk/cli/cmd_dashboard.py +15 -1
  18. ksadk/cli/cmd_deploy.py +10 -2
  19. ksadk/cli/cmd_eval.py +66 -9
  20. ksadk/cli/cmd_evalset.py +284 -0
  21. ksadk/cli/cmd_files.py +5 -1
  22. ksadk/cli/cmd_hermes.py +1 -126
  23. ksadk/cli/cmd_invoke.py +28 -38
  24. ksadk/cli/cmd_managed_runtime.py +95 -0
  25. ksadk/cli/cmd_observe.py +85 -0
  26. ksadk/cli/cmd_openclaw.py +1 -435
  27. ksadk/cli/cmd_plugin.py +657 -0
  28. ksadk/cli/cmd_replay.py +28 -4
  29. ksadk/cli/cmd_studio.py +99 -8
  30. ksadk/cli/cmd_web.py +10 -2
  31. ksadk/cli/hermes_env.py +151 -0
  32. ksadk/cli/invoke_payload.py +49 -0
  33. ksadk/cli/openclaw_env.py +458 -0
  34. ksadk/codex/client.py +180 -30
  35. ksadk/codex/runtime.py +475 -331
  36. ksadk/configs/env_registry.py +94 -12
  37. ksadk/configs/env_registry_pcm.py +181 -0
  38. ksadk/configs/env_var_spec.py +18 -0
  39. ksadk/configs/global_config.py +5 -0
  40. ksadk/configs/settings.py +9 -0
  41. ksadk/context_engine/__init__.py +98 -0
  42. ksadk/context_engine/assembler.py +176 -0
  43. ksadk/context_engine/baseline.py +419 -0
  44. ksadk/context_engine/cache_observability.py +228 -0
  45. ksadk/context_engine/capabilities.py +443 -0
  46. ksadk/context_engine/contributors.py +409 -0
  47. ksadk/context_engine/hosted_pipeline.py +417 -0
  48. ksadk/context_engine/models.py +117 -0
  49. ksadk/context_engine/planner.py +698 -0
  50. ksadk/context_engine/policies.py +319 -0
  51. ksadk/context_engine/projection.py +31 -0
  52. ksadk/context_engine/shadow_plan.py +266 -0
  53. ksadk/context_engine/tokenizer.py +164 -0
  54. ksadk/conversations/__init__.py +19 -0
  55. ksadk/conversations/context.py +230 -30
  56. ksadk/conversations/contracts.py +266 -0
  57. ksadk/conversations/message_projection.py +308 -26
  58. ksadk/conversations/model_context.py +49 -3
  59. ksadk/conversations/projector.py +616 -0
  60. ksadk/conversations/reducer.py +98 -0
  61. ksadk/conversations/runtime_compaction.py +207 -5
  62. ksadk/conversations/runtime_input.py +184 -2
  63. ksadk/conversations/runtime_invocation.py +81 -3
  64. ksadk/conversations/runtime_observability.py +141 -0
  65. ksadk/conversations/runtime_payloads.py +42 -0
  66. ksadk/conversations/runtime_preparation.py +272 -2
  67. ksadk/conversations/runtime_resume.py +20 -1
  68. ksadk/conversations/runtime_stream_events.py +94 -9
  69. ksadk/conversations/semantic_summary.py +311 -1
  70. ksadk/conversations/session_lock.py +51 -0
  71. ksadk/deployment/env_forward.py +72 -0
  72. ksadk/deployment/managed_runtime.py +5 -0
  73. ksadk/deployment/providers/serverless.py +143 -69
  74. ksadk/evaluation/__init__.py +32 -0
  75. ksadk/evaluation/a2a_adapter.py +9 -1
  76. ksadk/evaluation/adapters.py +18 -5
  77. ksadk/evaluation/agent_eval_client.py +395 -0
  78. ksadk/evaluation/cloud_binding.py +80 -0
  79. ksadk/evaluation/cloud_converter.py +194 -0
  80. ksadk/evaluation/cloud_service.py +199 -0
  81. ksadk/evaluation/contracts.py +73 -4
  82. ksadk/evaluation/evaluators.py +183 -17
  83. ksadk/evaluation/evidence.py +258 -0
  84. ksadk/evaluation/executor.py +31 -6
  85. ksadk/evaluation/local_adapter.py +550 -0
  86. ksadk/evaluation/service_env.py +27 -0
  87. ksadk/evaluation/studio_build_adapter.py +253 -0
  88. ksadk/evaluation/target.py +15 -6
  89. ksadk/events/__init__.py +13 -13
  90. ksadk/events/_v1_compat/__init__.py +1 -0
  91. ksadk/events/_v1_compat/models.py +299 -0
  92. ksadk/events/_v1_compat/parser.py +247 -0
  93. ksadk/events/_v1_compat/projection.py +755 -0
  94. ksadk/events/adapters/__init__.py +34 -0
  95. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  96. ksadk/events/adapters/_a2a_support.py +275 -0
  97. ksadk/events/adapters/_codex_interactions.py +375 -0
  98. ksadk/events/adapters/_codex_items.py +801 -0
  99. ksadk/events/adapters/_codex_validators.py +311 -0
  100. ksadk/events/adapters/_langgraph_support.py +785 -0
  101. ksadk/events/adapters/a2a.py +841 -0
  102. ksadk/events/adapters/adk.py +503 -0
  103. ksadk/events/adapters/codex.py +907 -0
  104. ksadk/events/adapters/langgraph.py +745 -0
  105. ksadk/events/canonical.py +440 -0
  106. ksadk/events/canonical_replay.py +497 -0
  107. ksadk/events/canonical_store.py +468 -0
  108. ksadk/events/cold_recovery.py +257 -0
  109. ksadk/events/content.py +89 -0
  110. ksadk/events/identity.py +86 -0
  111. ksadk/events/pipeline.py +455 -0
  112. ksadk/events/projections.py +66 -0
  113. ksadk/events/reducer.py +661 -0
  114. ksadk/events/replay.py +3 -36
  115. ksadk/events/runtime_event.py +20 -265
  116. ksadk/events/session_event.py +324 -0
  117. ksadk/events/store.py +3 -316
  118. ksadk/events/v1_compat.py +41 -0
  119. ksadk/harness/__init__.py +45 -35
  120. ksadk/harness/runtime.py +220 -58
  121. ksadk/identity/resolver.py +4 -3
  122. ksadk/interaction/__init__.py +28 -0
  123. ksadk/interaction/contracts.py +136 -0
  124. ksadk/interaction/ledger.py +189 -0
  125. ksadk/interaction/provider.py +122 -0
  126. ksadk/interaction/providers/__init__.py +52 -0
  127. ksadk/interaction/providers/adk.py +40 -0
  128. ksadk/interaction/providers/codex.py +94 -0
  129. ksadk/interaction/providers/langgraph.py +58 -0
  130. ksadk/kernel/__init__.py +117 -0
  131. ksadk/kernel/authorization.py +258 -0
  132. ksadk/kernel/bootstrap.py +1074 -0
  133. ksadk/kernel/contract_fingerprints.py +62 -0
  134. ksadk/kernel/contracts.py +370 -0
  135. ksadk/kernel/control.py +220 -0
  136. ksadk/kernel/errors.py +79 -0
  137. ksadk/kernel/ingress.py +1123 -0
  138. ksadk/kernel/mapping.py +111 -0
  139. ksadk/kernel/memory_store.py +1134 -0
  140. ksadk/kernel/postgres_store.py +1757 -0
  141. ksadk/kernel/recovery.py +452 -0
  142. ksadk/kernel/runtime_identity.py +103 -0
  143. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  144. ksadk/kernel/sqlite_store.py +1411 -0
  145. ksadk/kernel/state.py +145 -0
  146. ksadk/kernel/store.py +232 -0
  147. ksadk/kernel/worker.py +964 -0
  148. ksadk/knowledge_base/client.py +7 -0
  149. ksadk/knowledge_base/service.py +32 -5
  150. ksadk/memory/__init__.py +61 -0
  151. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  152. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  153. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  154. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  155. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  156. ksadk/memory/coordinator.py +461 -0
  157. ksadk/memory/events.py +202 -0
  158. ksadk/memory/extraction.py +228 -0
  159. ksadk/memory/ltm_backend_factory.py +16 -3
  160. ksadk/memory/models.py +316 -0
  161. ksadk/memory/policy.py +215 -0
  162. ksadk/memory/provider.py +47 -0
  163. ksadk/memory/provider_adapter.py +159 -0
  164. ksadk/memory/provider_resolver.py +71 -0
  165. ksadk/memory/providers/__init__.py +5 -0
  166. ksadk/memory/providers/local_sqlite.py +497 -0
  167. ksadk/memory/resolved_policy.py +145 -0
  168. ksadk/memory/service.py +188 -6
  169. ksadk/model_proxy/bootstrap.py +16 -9
  170. ksadk/model_proxy/detect.py +202 -9
  171. ksadk/model_proxy/namespace.py +39 -15
  172. ksadk/model_proxy/server.py +24 -5
  173. ksadk/model_proxy/transform.py +60 -2
  174. ksadk/observability/__init__.py +25 -0
  175. ksadk/observability/session_log.py +420 -0
  176. ksadk/observability/trajectory.py +105 -0
  177. ksadk/plugins/__init__.py +167 -0
  178. ksadk/plugins/bridges/__init__.py +45 -0
  179. ksadk/plugins/bridges/codex.py +552 -0
  180. ksadk/plugins/bridges/dsh.py +1116 -0
  181. ksadk/plugins/builtins.py +747 -0
  182. ksadk/plugins/bundle.py +246 -0
  183. ksadk/plugins/bundle_security.py +167 -0
  184. ksadk/plugins/composition.py +529 -0
  185. ksadk/plugins/context_contributor.py +437 -0
  186. ksadk/plugins/contracts.py +451 -0
  187. ksadk/plugins/dsh_toolchain.py +935 -0
  188. ksadk/plugins/ecosystem_bridge.py +1105 -0
  189. ksadk/plugins/ecosystem_probe.py +191 -0
  190. ksadk/plugins/host.py +724 -0
  191. ksadk/plugins/providers/__init__.py +85 -0
  192. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  193. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  194. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  195. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  196. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  197. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  198. ksadk/plugins/providers/codex.py +722 -0
  199. ksadk/plugins/providers/codex_dsh.py +83 -0
  200. ksadk/plugins/providers/dsh.py +951 -0
  201. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  202. ksadk/plugins/providers/harness.py +627 -0
  203. ksadk/plugins/providers/harness_dsh.py +91 -0
  204. ksadk/plugins/providers/legacy.py +215 -0
  205. ksadk/plugins/providers/legacy_catalog.py +100 -0
  206. ksadk/plugins/providers/shipped_dsh.py +370 -0
  207. ksadk/plugins/resolver.py +331 -0
  208. ksadk/plugins/subagent_providers/__init__.py +12 -0
  209. ksadk/plugins/subagent_providers/codex.py +443 -0
  210. ksadk/plugins/subagents.py +333 -0
  211. ksadk/prompts/__init__.py +71 -0
  212. ksadk/prompts/compiler.py +215 -0
  213. ksadk/prompts/models.py +82 -0
  214. ksadk/prompts/projection.py +89 -0
  215. ksadk/prompts/resolved.py +137 -0
  216. ksadk/prompts/sources.py +233 -0
  217. ksadk/runners/_langgraph_runner_streams.py +822 -0
  218. ksadk/runners/adk_runner.py +5 -5
  219. ksadk/runners/base_runner.py +16 -0
  220. ksadk/runners/factory.py +1 -2
  221. ksadk/runners/langgraph_runner.py +198 -437
  222. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  223. ksadk/runtime/_runner_adapter/stream_mapping.py +797 -0
  224. ksadk/runtime/adapter.py +119 -2
  225. ksadk/runtime/conversation_execution.py +316 -182
  226. ksadk/runtime/executor.py +144 -3
  227. ksadk/runtime/factory.py +268 -8
  228. ksadk/runtime/framework_adapters.py +18 -0
  229. ksadk/runtime/hosted_finalizer.py +268 -0
  230. ksadk/runtime/launch.py +14 -1
  231. ksadk/runtime/preprocessing.py +25 -3
  232. ksadk/runtime/runner_adapter.py +293 -508
  233. ksadk/runtime/usage.py +33 -0
  234. ksadk/sandbox/__init__.py +2 -1
  235. ksadk/sandbox/backends/e2b.py +35 -2
  236. ksadk/sandbox/factory.py +72 -0
  237. ksadk/scheduler/__init__.py +18 -0
  238. ksadk/scheduler/calendar.py +102 -0
  239. ksadk/scheduler/contracts.py +254 -0
  240. ksadk/scheduler/dispatcher.py +129 -0
  241. ksadk/scheduler/engine.py +416 -0
  242. ksadk/scheduler/sqlite_store.py +563 -0
  243. ksadk/server/composition.py +8 -0
  244. ksadk/server/factory.py +69 -6
  245. ksadk/server/routes/kernel_ingress.py +258 -0
  246. ksadk/server/routes/openai_compat.py +88 -8
  247. ksadk/server/routes/projection.py +35 -20
  248. ksadk/server/routes/run.py +94 -0
  249. ksadk/server/routes/sessions.py +2 -0
  250. ksadk/server/routes/streaming.py +5 -2
  251. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
  252. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-BXk1l-G1.js} +4 -4
  253. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  254. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-D9uB55Oh.js} +4 -4
  255. ksadk/server/static/assets/MermaidBlock--OEYoXIJ.js +312 -0
  256. ksadk/server/static/assets/NativeTerminalPanel-DrEe1syq.js +1 -0
  257. ksadk/server/static/assets/abnfDiagram-VCTEODGH-eeTFJLvo.js +1 -0
  258. ksadk/server/static/assets/arc-S3ZNbIAd.js +1 -0
  259. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
  260. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-CRjgEJDX.js +36 -0
  261. ksadk/server/static/assets/blockDiagram-NRAW4CY4-C7bsBoNH.js +129 -0
  262. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-BX3c33Ob.js +38 -0
  263. ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
  264. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
  265. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
  266. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
  267. ksadk/server/static/assets/chunk-G27WJ6UU-CZwF3oUP.js +231 -0
  268. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
  269. ksadk/server/static/assets/chunk-LCL6LL3I-CnorGV5q.js +206 -0
  270. ksadk/server/static/assets/chunk-POPQ4Y6H-CexntQA-.js +1 -0
  271. ksadk/server/static/assets/chunk-RHFEMEQ7-CHTC7UxA.js +168 -0
  272. ksadk/server/static/assets/chunk-SVP7TREG-BC1EWt_-.js +88 -0
  273. ksadk/server/static/assets/chunk-XXDRQBXY-BTG24xN0.js +1 -0
  274. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
  275. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
  276. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
  277. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
  278. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-DEOCBe15.js +62 -0
  279. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  280. ksadk/server/static/assets/dagre-3AP2YEHR-DBThPuLa.js +4 -0
  281. ksadk/server/static/assets/dagre-ClTPrTht.js +1 -0
  282. ksadk/server/static/assets/diagram-S7CK7UJ4-DsZHrnpJ.js +30 -0
  283. ksadk/server/static/assets/diagram-UQ7AKVKN-BJR4nhVr.js +41 -0
  284. ksadk/server/static/assets/diagram-VSXAHHWV-xzcERX0a.js +3 -0
  285. ksadk/server/static/assets/diagram-VX7I27RA-tn2xM1xu.js +24 -0
  286. ksadk/server/static/assets/diagram-Z3DM3KII-BZPGBkw5.js +24 -0
  287. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-4zN1_tq5.js} +1 -1
  288. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-8VWI-2bZ.js} +1 -1
  289. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-B-46q3Hk.js} +1 -1
  290. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-B0gdk4rl.js} +1 -1
  291. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-B1oWRmrH.js} +1 -1
  292. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-BI1qQH4n.js} +1 -1
  293. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-BJLUwH6W.js} +1 -1
  294. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Bbwqa8TG.js} +1 -1
  295. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-Btyo4vX4.js} +1 -1
  296. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-C71CsujO.js} +1 -1
  297. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-CXpH_Rdd.js} +1 -1
  298. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-Cq4OL6nO.js} +1 -1
  299. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-D1V3f1B4.js} +1 -1
  300. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-DJmCPRVB.js} +1 -1
  301. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DQAB0qn_.js} +2 -2
  302. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DUwKa_l6.js} +1 -1
  303. ksadk/server/static/assets/dist-DdRBIceA.js +1 -0
  304. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-DfGFrb0v.js} +1 -1
  305. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-DjhwGUgZ.js} +1 -1
  306. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-DyqV4fL4.js} +1 -1
  307. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-M67Hwu0n.js} +1 -1
  308. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-u8tVH5Ak.js} +1 -1
  309. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-DVfMsLge.js +1 -0
  310. ksadk/server/static/assets/erDiagram-SSCWMZ5O-CWEZSYaw.js +99 -0
  311. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
  312. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
  313. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-TWIxoyYL.js +292 -0
  314. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
  315. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-DDh2hd2S.js +106 -0
  316. ksadk/server/static/assets/index-B2k_urY8.js +241 -0
  317. ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
  318. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
  319. ksadk/server/static/assets/infoDiagram-RXCK75RN-CgoyWiDR.js +2 -0
  320. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +6 -6
  321. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +6 -6
  322. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-CNP3ui66.js} +10 -10
  323. ksadk/server/static/assets/katex-DWEzQy1d.js +257 -0
  324. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-C-qHp7d2.js} +1 -1
  325. ksadk/server/static/assets/mermaid-parser.core-Cl-K943T.js +166 -0
  326. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +29 -29
  327. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
  328. ksadk/server/static/assets/pegDiagram-XKGWAZYB-BQVc9ia_.js +1 -0
  329. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
  330. ksadk/server/static/assets/pieDiagram-E7YTZNPT-B6UCAvtY.js +39 -0
  331. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +6 -6
  332. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
  333. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
  334. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
  335. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
  336. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
  337. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-Dt3FFDmK.js +1 -0
  338. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-Cz_vQtgF.js +84 -0
  339. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +7 -7
  340. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +10 -10
  341. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-DXX54iyO.js +1 -0
  342. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-Dp_lw9II.js +1 -0
  343. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
  344. ksadk/server/static/assets/swimlanes-XN3QIQJK-D8O5UlLG.js +1 -0
  345. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
  346. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +7 -7
  347. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
  348. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
  349. ksadk/server/static/assets/vennDiagram-4TSXK5OY-EnNl0DE7.js +34 -0
  350. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
  351. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DBu5fbYr.js +78 -0
  352. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-BSVXs4IY.js +7 -0
  353. ksadk/server/static/index.html +2 -2
  354. ksadk/sessions/__init__.py +26 -9
  355. ksadk/sessions/_local_service_sync.py +688 -0
  356. ksadk/sessions/_local_tables.py +21 -0
  357. ksadk/sessions/_postgres_schema.py +305 -0
  358. ksadk/sessions/_postgres_tables.py +15 -0
  359. ksadk/sessions/base.py +80 -1
  360. ksadk/sessions/in_memory.py +53 -2
  361. ksadk/sessions/local_service.py +63 -604
  362. ksadk/sessions/postgres_service.py +58 -148
  363. ksadk/sessions/resilient.py +35 -1
  364. ksadk/skills/service_client.py +48 -0
  365. ksadk/studio/agent_lifecycle.py +26 -20
  366. ksadk/studio/api.py +1063 -69
  367. ksadk/studio/api_catalog_routes.py +5 -0
  368. ksadk/studio/api_contracts.py +148 -6
  369. ksadk/studio/api_memory_routes.py +82 -0
  370. ksadk/studio/api_plugin_routes.py +480 -0
  371. ksadk/studio/attachment_store.py +187 -0
  372. ksadk/studio/authoring.py +259 -28
  373. ksadk/studio/authoring_coordinator.py +809 -67
  374. ksadk/studio/builder.py +197 -40
  375. ksadk/studio/capabilities.py +17 -0
  376. ksadk/studio/cloud.py +1920 -95
  377. ksadk/studio/codex_agent_service.py +137 -15
  378. ksadk/studio/codex_authoring.py +469 -0
  379. ksadk/studio/codex_builder.py +177 -25
  380. ksadk/studio/codex_manifest.py +71 -22
  381. ksadk/studio/codex_run.py +59 -4
  382. ksadk/studio/compatibility_report.py +445 -0
  383. ksadk/studio/compiler.py +7 -1
  384. ksadk/studio/contracts.py +234 -4
  385. ksadk/studio/dsh_provider_registration.py +768 -0
  386. ksadk/studio/event_store.py +79 -101
  387. ksadk/studio/framework_run.py +264 -3
  388. ksadk/studio/hosted_kernel.py +317 -0
  389. ksadk/studio/manifest_resolver.py +131 -0
  390. ksadk/studio/model_client.py +95 -9
  391. ksadk/studio/model_profile_service.py +1 -1
  392. ksadk/studio/operations.py +47 -5
  393. ksadk/studio/otel_trace.py +348 -42
  394. ksadk/studio/pcm_memory.py +85 -0
  395. ksadk/studio/plugin_composition.py +301 -0
  396. ksadk/studio/plugin_kernel_adapter.py +128 -0
  397. ksadk/studio/plugin_runtime.py +652 -0
  398. ksadk/studio/repository.py +23 -2
  399. ksadk/studio/resource_catalog.py +49 -1
  400. ksadk/studio/run_service.py +1266 -202
  401. ksadk/studio/runtime_source.py +51 -17
  402. ksadk/studio/scheduler_runtime.py +374 -0
  403. ksadk/studio/scheduler_service.py +211 -0
  404. ksadk/studio/service.py +1815 -117
  405. ksadk/studio/shared_web.py +199 -50
  406. ksadk/studio/soul.py +52 -0
  407. ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
  408. ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
  409. ksadk/studio/static/index.html +2 -2
  410. ksadk/studio/templates.py +100 -8
  411. ksadk/studio/validator.py +20 -1
  412. ksadk/studio/workspace.py +31 -32
  413. ksadk/tracing/setup.py +304 -3
  414. ksadk/version.py +1 -1
  415. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  416. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  417. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  418. ksadk/events/parser.py +0 -191
  419. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  420. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  421. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  422. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  423. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  424. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  425. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  426. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  427. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  428. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  429. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  430. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  431. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  432. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  435. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  436. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  437. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  438. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  439. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  440. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  441. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  442. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  443. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  444. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  445. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  446. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  447. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  448. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  449. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  450. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  451. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  452. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  453. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  454. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  455. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  456. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  457. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  458. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  459. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  460. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  461. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  462. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  463. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  464. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  465. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  466. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  467. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  468. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  469. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  470. ksadk/studio/evaluation.py +0 -192
  471. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  472. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  473. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
  474. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
  475. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
  476. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_replay.py CHANGED
@@ -17,8 +17,13 @@ import json
17
17
  import click
18
18
 
19
19
  from ksadk.cli.resource_common import CONTEXT_SETTINGS
20
- from ksadk.events.replay import replay_transcript
20
+ from ksadk.events.reducer import StreamReducer
21
21
  from ksadk.events.store import RuntimeEventStore
22
+ from ksadk.events.v1_compat import (
23
+ RuntimeEventV1Parser,
24
+ RuntimeEventV1ProjectionContext,
25
+ project_to_v1,
26
+ )
22
27
 
23
28
  _HELP = dict(help_option_names=["-h", "--help"])
24
29
 
@@ -43,9 +48,28 @@ async def _run(session_id: str, *, after_seq_id: int, before_seq_id: int | None,
43
48
  from ksadk.sessions import resolve_session_service
44
49
 
45
50
  store = RuntimeEventStore(resolve_session_service())
46
- parser = await replay_transcript(
47
- store, session_id, after_seq_id=after_seq_id, before_seq_id=before_seq_id
48
- )
51
+ service = resolve_session_service()
52
+ session = await service.get_session(session_id)
53
+ events = await store.list(session_id)
54
+ parser = RuntimeEventV1Parser()
55
+ reducers: dict[str, StreamReducer] = {}
56
+ for event in events:
57
+ reducer = reducers.get(event.run_id)
58
+ if reducer is not None and reducer.snapshot().status in {"completed", "failed", "canceled"}:
59
+ reducer = None
60
+ if reducer is None:
61
+ reducer = StreamReducer()
62
+ reducers[event.run_id] = reducer
63
+ reducer.apply(event)
64
+ projection = reducer.snapshot()
65
+ context = RuntimeEventV1ProjectionContext(
66
+ agent_id=session.agent_id if session else "",
67
+ user_id=session.user_id if session else "",
68
+ session_id=session_id,
69
+ projection=projection,
70
+ )
71
+ for v1_event in project_to_v1(event, mode="identity_replace", context=context):
72
+ parser.feed(v1_event)
49
73
  transcript = parser.transcript()
50
74
  if fmt == "json":
51
75
  click.echo(json.dumps(transcript, ensure_ascii=False, sort_keys=True))
ksadk/cli/cmd_studio.py CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import logging
5
6
  import os
6
7
  import secrets
7
8
  import webbrowser
@@ -12,14 +13,67 @@ import uvicorn
12
13
 
13
14
  from ksadk.cli.env_options import load_env_file
14
15
  from ksadk.cli.ui import print_info, print_kv, print_success, print_title
16
+
17
+ # veadk 风格:日志行带模块名与行号(filename:lineno),本地排障时能直接定位代码。
18
+ _LOG_FORMAT = "%(asctime)s %(levelname)s %(name)s %(filename)s:%(lineno)d %(message)s"
19
+
20
+ _STUDIO_LOG_CONFIG = {
21
+ "version": 1,
22
+ "disable_existing_loggers": False,
23
+ "formatters": {
24
+ "default": {"format": _LOG_FORMAT},
25
+ "access": {"format": _LOG_FORMAT},
26
+ },
27
+ "handlers": {
28
+ "default": {
29
+ "class": "logging.StreamHandler",
30
+ "formatter": "default",
31
+ "stream": "ext://sys.stderr",
32
+ },
33
+ "access": {
34
+ "class": "logging.StreamHandler",
35
+ "formatter": "access",
36
+ "stream": "ext://sys.stdout",
37
+ },
38
+ },
39
+ "loggers": {
40
+ "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
41
+ "uvicorn.error": {"level": "INFO"},
42
+ "uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
43
+ },
44
+ "root": {"handlers": ["default"], "level": "INFO"},
45
+ }
46
+
15
47
  from ksadk.studio.api import create_studio_app
16
48
  from ksadk.studio.service import StudioService
17
49
 
50
+ # 模型环境变量白名单。OPENAI_BASE_URL 与 OPENAI_API_BASE 互为别名,两者都接受;
51
+ # 加载时做别名归一(见 studio()),运行时统一 OPENAI_BASE_URL 优先(与 cmd_config/cmd_model
52
+ # /api.py 一致,方案 §2.4 第 5 点)。
18
53
  _MODEL_ENV_KEYS = (
54
+ "OPENAI_BASE_URL",
19
55
  "OPENAI_API_BASE",
20
56
  "OPENAI_API_KEY",
21
57
  "OPENAI_MODEL_NAME",
22
58
  )
59
+ # Cloud-control credentials are intentionally process-only as well. Studio
60
+ # needs them to use the Server Action API for a deployed Agent, but they must
61
+ # never become browser settings, workspace files, or runtime environment.
62
+ _CLOUD_CONTROL_ENV_KEYS = (
63
+ "KSYUN_ACCESS_KEY",
64
+ "KSYUN_SECRET_KEY",
65
+ "KSYUN_REGION",
66
+ "AGENTENGINE_REGION",
67
+ "AGENTENGINE_SERVER_URL",
68
+ "AGENTENGINE_STREAM_SERVER_URL",
69
+ "AGENTENGINE_SIGN_SERVICE",
70
+ "KS3_BUCKET",
71
+ "KS3_ACCESS_KEY",
72
+ "KS3_SECRET_KEY",
73
+ )
74
+ _STUDIO_ENV_FILE_KEYS = (*_MODEL_ENV_KEYS, *_CLOUD_CONTROL_ENV_KEYS)
75
+ # 别名归一:两者任一有值时,把另一个也设上,保证下游无论读哪个都命中。
76
+ _MODEL_BASE_URL_ALIASES = ("OPENAI_BASE_URL", "OPENAI_API_BASE")
23
77
 
24
78
 
25
79
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@@ -29,7 +83,10 @@ _MODEL_ENV_KEYS = (
29
83
  @click.option(
30
84
  "--env-file",
31
85
  type=click.Path(exists=True, dir_okay=False),
32
- help="模型环境文件;只读取 OPENAI_API_BASE/API_KEY/MODEL_NAME",
86
+ help=(
87
+ "本地模型与云端控制环境文件;只读取允许的 OPENAI/KSYUN/KS3 "
88
+ "字段,且仅保留在 Studio 进程"
89
+ ),
33
90
  )
34
91
  @click.option(
35
92
  "--codex-proxy",
@@ -52,7 +109,7 @@ def studio(
52
109
  """
53
110
 
54
111
  root = Path(workspace).expanduser().resolve()
55
- managed_keys = (*_MODEL_ENV_KEYS, "KSADK_CODEX_USE_PROXY")
112
+ managed_keys = (*_STUDIO_ENV_FILE_KEYS, "KSADK_CODEX_USE_PROXY")
56
113
  previous = {key: os.environ.get(key) for key in managed_keys}
57
114
  previously_present = {key for key in managed_keys if key in os.environ}
58
115
  try:
@@ -61,14 +118,42 @@ def studio(
61
118
  values = load_env_file(env_file)
62
119
  except ValueError as exc:
63
120
  raise click.ClickException(str(exc)) from exc
64
- loaded = 0
121
+ loaded_models = 0
122
+ loaded_cloud_control = 0
65
123
  for key, value in values.items():
66
- if key not in _MODEL_ENV_KEYS or not value:
124
+ if key not in _STUDIO_ENV_FILE_KEYS or not value:
67
125
  continue
68
- loaded += 1
69
- if key not in os.environ:
126
+ if key in _MODEL_ENV_KEYS:
127
+ loaded_models += 1
128
+ else:
129
+ loaded_cloud_control += 1
130
+ # An explicit --env-file is the operator's selected cloud
131
+ # identity. Do not silently reuse inherited AK/SK from the
132
+ # shell, which can point Studio at another tenant. Model
133
+ # values keep their historical shell-first precedence.
134
+ if key in _CLOUD_CONTROL_ENV_KEYS or key not in os.environ:
70
135
  os.environ[key] = value
71
- print_kv("模型环境", f"已安全加载 {loaded}/{len(_MODEL_ENV_KEYS)} 个字段")
136
+ # 别名归一(方案 §2.4 第 5 点):OPENAI_BASE_URL 与 OPENAI_API_BASE 互为别名。
137
+ # 加载后任一有值则把另一个也设上,保证下游无论读哪个都命中;OPENAI_BASE_URL 优先。
138
+ resolved_base_url = os.environ.get("OPENAI_BASE_URL") or os.environ.get(
139
+ "OPENAI_API_BASE"
140
+ )
141
+ if resolved_base_url:
142
+ os.environ["OPENAI_BASE_URL"] = resolved_base_url
143
+ os.environ["OPENAI_API_BASE"] = resolved_base_url
144
+ # base_url 至少算一次,避免显示 0/4 误导。
145
+ loaded_models = max(loaded_models, 2)
146
+ print_kv(
147
+ "模型环境",
148
+ f"已安全加载 {loaded_models}/{len(_MODEL_ENV_KEYS)} 个字段",
149
+ )
150
+ if loaded_cloud_control:
151
+ print_kv(
152
+ "云端控制",
153
+ "已安全加载 "
154
+ f"{loaded_cloud_control}/{len(_CLOUD_CONTROL_ENV_KEYS)} 个字段"
155
+ "(仅本地进程)",
156
+ )
72
157
  if codex_proxy == "forced":
73
158
  os.environ["KSADK_CODEX_USE_PROXY"] = "1"
74
159
  elif codex_proxy == "direct":
@@ -95,12 +180,18 @@ def studio(
95
180
  print_info("按 Ctrl+C 停止")
96
181
  if not no_open:
97
182
  webbrowser.open(launch_url)
183
+ # 业务日志(ksadk.*)走 root handler,同样带 filename:lineno。
184
+ logging.basicConfig(level=logging.INFO, format=_LOG_FORMAT)
98
185
  uvicorn.run(
99
186
  app,
100
187
  host="127.0.0.1",
101
188
  port=port,
102
189
  log_level="info",
103
- access_log=False,
190
+ # Access logging stays enabled through the Studio log config while
191
+ # retaining filename/line-number context for both API and business
192
+ # logs. This preserves master's observability intent and the
193
+ # branch's richer diagnostic format.
194
+ log_config=_STUDIO_LOG_CONFIG,
104
195
  )
105
196
  finally:
106
197
  for key in managed_keys:
ksadk/cli/cmd_web.py CHANGED
@@ -227,9 +227,14 @@ def configure_local_runtime_persistence(
227
227
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
228
228
  @click.argument("agent_dir", default=".", type=click.Path(exists=True))
229
229
  @click.option("--port", "-p", default=8080, help="Web UI 端口")
230
+ @click.option(
231
+ "--host",
232
+ default="127.0.0.1",
233
+ help="Web UI 绑定地址(容器部署用 0.0.0.0)",
234
+ )
230
235
  @click.option("--model", help="指定模型名称 (覆盖 .env 配置)")
231
236
  @click.option("--no-open", is_flag=True, help="仅打印 URL,不自动打开浏览器")
232
- def web(agent_dir: str, port: int, model: str, no_open: bool):
237
+ def web(agent_dir: str, port: int, host: str, model: str, no_open: bool):
233
238
  """启动本地统一 Web UI(Invoke UI)
234
239
 
235
240
  \b
@@ -249,6 +254,9 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
249
254
 
250
255
  agent_path = Path(agent_dir).resolve()
251
256
  command_args = ["web", str(agent_path), "--port", str(port)]
257
+ if host != "127.0.0.1":
258
+ # re-exec 进项目 venv 时透传非默认 host(容器/远端托管场景绑 0.0.0.0)
259
+ command_args.extend(["--host", host])
252
260
  if model:
253
261
  command_args.extend(["--model", model])
254
262
  if no_open:
@@ -357,7 +365,7 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
357
365
  webbrowser.open(launch_url)
358
366
 
359
367
  try:
360
- uvicorn.run(runtime_app, host="127.0.0.1", port=port)
368
+ uvicorn.run(runtime_app, host=host, port=port)
361
369
  except KeyboardInterrupt:
362
370
  raise SystemExit(0)
363
371
  except Exception as e:
@@ -0,0 +1,151 @@
1
+ """Hermes deploy 的运行时环境变量构建。
2
+
3
+ 从 cmd_hermes.py 拆出(模块体积治理);``_env_value`` 与全局 env 缓存仍留在
4
+ cmd_hermes(测试 monkeypatch 点),此处通过延迟 import 访问。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import os
10
+ from typing import Any, Optional
11
+
12
+ from ksadk.cli.env_options import apply_explicit_env_with_shell_priority
13
+ from ksadk.configs.env_registry import is_sensitive_env_var
14
+ from ksadk.deployment.env_forward import forward_shell_process_env
15
+ from ksadk.model_policy import build_runtime_model_policy_env
16
+
17
+
18
+ def _env_value(*names: str) -> str:
19
+ from ksadk.cli import cmd_hermes
20
+
21
+ return cmd_hermes._env_value(*names)
22
+
23
+
24
+ def _normalize_hermes_ui_locale(raw: Optional[str]) -> str:
25
+ """标准化 Hermes UI 语言代码,当前 upstream 只支持 en / zh。"""
26
+ text = str(raw or "").strip()
27
+ if not text:
28
+ return "zh"
29
+
30
+ base = text.split(".", 1)[0].replace("_", "-").strip().lower()
31
+ if base in {"c", "c-utf-8", "c.utf-8", "posix"}:
32
+ return "zh"
33
+ if base.startswith("en"):
34
+ return "en"
35
+ if base.startswith("zh"):
36
+ return "zh"
37
+ return "zh"
38
+
39
+
40
+ def _default_context_length_for_model(model: str | None) -> str:
41
+ from ksadk.cli import cmd_hermes
42
+
43
+ normalized = str(model or "").strip().lower()
44
+ if not normalized:
45
+ return ""
46
+ for model_fragment, context_length in cmd_hermes.DEFAULT_HERMES_CONTEXT_LENGTHS:
47
+ if model_fragment in normalized:
48
+ return context_length
49
+ return ""
50
+
51
+
52
+ def _normalize_hermes_runtime_base_url(base_url: str | None) -> str:
53
+ normalized = str(base_url or "").strip()
54
+ return normalized
55
+
56
+
57
+ def _build_hermes_env_vars(
58
+ *,
59
+ model_base_url: str | None = None,
60
+ model_api_key: str | None = None,
61
+ default_model: str | None = None,
62
+ model_metadata: dict[str, Any] | None = None,
63
+ cli_env: dict[str, str] | None = None,
64
+ auto_dotenv: dict[str, str] | None = None,
65
+ shell_keys: set[str] | None = None,
66
+ ) -> list[dict[str, Any]]:
67
+ from ksadk.cli import cmd_hermes
68
+
69
+ raw_model_base_url = model_base_url or _env_value("OPENAI_BASE_URL")
70
+ resolved_model_base_url = (
71
+ _normalize_hermes_runtime_base_url(raw_model_base_url)
72
+ if raw_model_base_url
73
+ else cmd_hermes.DEFAULT_HERMES_RUNTIME_BASE_URL
74
+ )
75
+ resolved_default_model = (
76
+ default_model or _env_value("OPENAI_MODEL_NAME") or cmd_hermes.DEFAULT_HERMES_MODEL_NAME
77
+ )
78
+ metadata_context_length = ""
79
+ if isinstance(model_metadata, dict):
80
+ metadata_context_length = str(model_metadata.get("context_window_tokens") or "").strip()
81
+ context_length = (
82
+ _env_value("HERMES_CONTEXT_LENGTH", "OPENAI_CONTEXT_LENGTH", "MODEL_CONTEXT_LENGTH")
83
+ or metadata_context_length
84
+ or _default_context_length_for_model(resolved_default_model)
85
+ )
86
+ ui_locale = _normalize_hermes_ui_locale(_env_value("HERMES_UI_LOCALE", "LANG", "LC_ALL"))
87
+ raw = {
88
+ "OPENAI_API_KEY": model_api_key or _env_value("OPENAI_API_KEY"),
89
+ "OPENAI_BASE_URL": resolved_model_base_url,
90
+ "OPENAI_MODEL_NAME": resolved_default_model,
91
+ "API_SERVER_ENABLED": "true",
92
+ "API_SERVER_HOST": "127.0.0.1",
93
+ "API_SERVER_PORT": "8642",
94
+ "HERMES_DASHBOARD_HOST": "127.0.0.1",
95
+ "HERMES_DASHBOARD_PORT": "9119",
96
+ "KSADK_RUNTIME_PORT": _env_value("PORT") or "8080",
97
+ "HERMES_UI_LOCALE": ui_locale,
98
+ }
99
+ if context_length:
100
+ raw["HERMES_CONTEXT_LENGTH"] = context_length
101
+ fallback_model = _env_value("HERMES_FALLBACK_MODEL", "OPENAI_FALLBACK_MODEL_NAME")
102
+ if fallback_model:
103
+ raw["HERMES_FALLBACK_PROVIDER"] = _env_value("HERMES_FALLBACK_PROVIDER") or "custom"
104
+ raw["HERMES_FALLBACK_MODEL"] = fallback_model
105
+ raw["HERMES_FALLBACK_BASE_URL"] = (
106
+ _env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url
107
+ )
108
+ api_server_key = _env_value("API_SERVER_KEY", "HERMES_API_SERVER_KEY")
109
+ if api_server_key:
110
+ raw["API_SERVER_KEY"] = api_server_key
111
+ # Observability routes and credentials are platform-managed. The Hermes
112
+ # deploy CLI must not translate or forward legacy Langfuse SDK variables;
113
+ # server/runtime inject the standard OTLP primary and CloudMonitor secondary.
114
+ for key in (
115
+ "WPSXIEZUO_APP_ID",
116
+ "WPSXIEZUO_APP_KEY",
117
+ "WPSXIEZUO_API_BASE",
118
+ "WPSXIEZUO_WS_ENDPOINT",
119
+ "WPSXIEZUO_GROUP_AT_ONLY",
120
+ "WPSXIEZUO_ALLOWED_USERS",
121
+ "WPSXIEZUO_ALLOW_ALL_USERS",
122
+ "WPSXIEZUO_HOME_CHANNEL",
123
+ ):
124
+ value = _env_value(key)
125
+ if value:
126
+ raw[key] = value
127
+ raw = build_runtime_model_policy_env(raw, runtime="hermes")
128
+ # shell 前缀转发 (KSADK_/OPENAI_/KSYUN_/E2B_ + allowlist),对齐通用 deploy;
129
+ # setdefault 语义不覆盖上面已 resolve 的固定键,--env/--env-file 仍可覆盖。
130
+ forward_shell_process_env(raw)
131
+ if raw.get("HERMES_FALLBACK_MODEL"):
132
+ raw.setdefault(
133
+ "HERMES_FALLBACK_PROVIDER", _env_value("HERMES_FALLBACK_PROVIDER") or "custom"
134
+ )
135
+ raw.setdefault(
136
+ "HERMES_FALLBACK_BASE_URL",
137
+ _env_value("HERMES_FALLBACK_BASE_URL") or resolved_model_base_url,
138
+ )
139
+ if cli_env or auto_dotenv:
140
+ apply_explicit_env_with_shell_priority(
141
+ raw, cli_env or {}, auto_dotenv or {}, shell_keys or set(os.environ)
142
+ )
143
+ return [
144
+ {
145
+ "Key": key,
146
+ "Value": str(value),
147
+ "IsSensitive": is_sensitive_env_var(key),
148
+ }
149
+ for key, value in raw.items()
150
+ if value is not None and str(value).strip() != ""
151
+ ]
@@ -0,0 +1,49 @@
1
+ """ksadk invoke 的 OpenAI 兼容请求载荷构造。
2
+
3
+ 从 cmd_invoke.py 抽出,避免 cli 模块继续膨胀(架构守护限制 1000 行,
4
+ cmd_invoke 已处于 legacy 白名单,只许缩不许涨)。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Any, Optional
10
+
11
+
12
+ def build_chat_request(
13
+ endpoint: str,
14
+ message: str,
15
+ *,
16
+ session_id: Optional[str] = None,
17
+ model: Optional[str] = None,
18
+ api_format: str = "chat_completions",
19
+ default_model: Optional[str] = None,
20
+ stream: bool = False,
21
+ ) -> tuple[str, dict[str, Any]]:
22
+ """构造 (url, payload),按 api_format 区分 chat/completions 与 responses。
23
+
24
+ OpenClaw gateway 2026.7.1+ 的 /v1/responses 特殊处理:
25
+ - input 传纯字符串,不再接受 {role, content} 对象数组(服务端自行包装 user turn)
26
+ - 拒绝顶层 session_id,会话标识放 metadata 传递
27
+ - model 必填且只接受 "openclaw"/"openclaw/<agentId>"(业务模型由 gateway 配置决定),
28
+ 未显式传 --model 时用 default_model 补默认路由值,避免 400
29
+ """
30
+ normalized_api_format = str(api_format or "chat_completions").strip().lower()
31
+ if normalized_api_format == "responses":
32
+ url = f"{endpoint.rstrip('/')}/v1/responses"
33
+ payload: dict[str, Any] = {"input": message, "stream": stream}
34
+ else:
35
+ url = f"{endpoint.rstrip('/')}/v1/chat/completions"
36
+ payload = {"messages": [{"role": "user", "content": message}], "stream": stream}
37
+
38
+ if session_id:
39
+ if normalized_api_format == "responses":
40
+ payload.setdefault("metadata", {})["session_id"] = session_id
41
+ else:
42
+ payload["session_id"] = session_id
43
+
44
+ if model:
45
+ payload["model"] = model
46
+ elif default_model and normalized_api_format == "responses":
47
+ payload["model"] = default_model
48
+
49
+ return url, payload