agentengine-sdk-python 0.8.0__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 (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,324 @@
1
+ """Catalog, credential and capability routes for Studio."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Awaitable, Callable, Literal
6
+
7
+ from fastapi import FastAPI, File, Query, UploadFile
8
+ from jsonschema import Draft202012Validator # type: ignore[import-untyped]
9
+ from jsonschema.exceptions import SchemaError # type: ignore[import-untyped]
10
+
11
+ from ksadk.studio.api_contracts import (
12
+ CredentialPutRequest,
13
+ MCPResourceCreateRequest,
14
+ ModelEndpointProbeRequest,
15
+ ModelProfileCreateRequest,
16
+ PythonToolCommitRequest,
17
+ SecretReferenceCheckRequest,
18
+ SkillDiscoveryCommitRequest,
19
+ SkillDiscoveryRequest,
20
+ ToolPolicyPreviewRequest,
21
+ ToolResourceCreateRequest,
22
+ ToolSchemaValidationRequest,
23
+ )
24
+ from ksadk.studio.contracts import MCPServerRef
25
+ from ksadk.studio.errors import StudioError
26
+ from ksadk.studio.model_profile_service import probe_model_endpoint
27
+ from ksadk.studio.service import StudioService
28
+
29
+ ModelCatalogLoader = Callable[[], Awaitable[tuple[list, str]]]
30
+
31
+
32
+ def register_catalog_routes(
33
+ app: FastAPI,
34
+ studio: StudioService,
35
+ *,
36
+ runtime_model_catalog: ModelCatalogLoader,
37
+ ) -> None:
38
+ """Register resource routes without expanding the main HTTP composition."""
39
+
40
+ @app.get("/api/v1/capabilities")
41
+ async def capabilities(kind: str | None = None, query: str = ""):
42
+ return {"items": studio.list_capabilities(kind=kind, query=query)}
43
+
44
+ @app.get("/api/v1/catalog/resources")
45
+ async def catalog_resources(
46
+ kind: Literal["model", "tool", "mcp", "skill"] | None = None,
47
+ query: str = "",
48
+ source: Literal["builtin", "provider", "local", "market"] | None = None,
49
+ status: str | None = None,
50
+ installed: bool | None = None,
51
+ limit: int = Query(default=50, ge=1, le=200),
52
+ cursor: str | None = None,
53
+ sort: Literal["default", "displayName:asc", "displayName:desc"] = "default",
54
+ ):
55
+ if kind == "model":
56
+ await runtime_model_catalog()
57
+
58
+ def effective_status(resource) -> str:
59
+ if resource.kind != "model":
60
+ return resource.status
61
+ references = list(resource.required_secret_refs or [])
62
+ reference = references[0] if references else resource.contract.get("credentialRef")
63
+ if not reference:
64
+ return resource.status
65
+ return (
66
+ "ready"
67
+ if studio.credentials.status(str(reference))["configured"]
68
+ else "missing-secret"
69
+ )
70
+
71
+ return studio.catalog.list_page(
72
+ kind=kind,
73
+ query=query,
74
+ source=source,
75
+ status=status,
76
+ installed=installed,
77
+ limit=limit,
78
+ cursor=cursor,
79
+ sort=sort,
80
+ status_resolver=effective_status,
81
+ )
82
+
83
+ @app.get("/api/v1/catalog/models")
84
+ async def catalog_models():
85
+ items, source = await runtime_model_catalog()
86
+ return {"items": items, "source": source, "nextCursor": None}
87
+
88
+ @app.get("/api/v1/catalog/runtimes")
89
+ async def catalog_runtimes():
90
+ return {"items": studio.runtime_catalog(), "nextCursor": None}
91
+
92
+ @app.get("/api/v1/catalog/resources/{resource_id}")
93
+ async def get_catalog_resource(resource_id: str):
94
+ return studio.catalog.get(resource_id)
95
+
96
+ @app.post("/api/v1/catalog/model-profiles", status_code=201)
97
+ async def create_model_profile(payload: ModelProfileCreateRequest):
98
+ return studio.catalog.create_model_profile(
99
+ name=payload.name,
100
+ display_name=payload.display_name,
101
+ version=payload.version,
102
+ description=payload.description,
103
+ spec=payload.spec,
104
+ )
105
+
106
+ @app.post("/api/v1/catalog/mcp-servers", status_code=201)
107
+ async def create_mcp_resource(payload: MCPResourceCreateRequest):
108
+ return studio.catalog.create_mcp_server(
109
+ display_name=payload.display_name,
110
+ description=payload.description,
111
+ server=payload.server,
112
+ )
113
+
114
+ @app.post("/api/v1/catalog/mcp-servers/{resource_id}:probe")
115
+ async def probe_mcp_resource(
116
+ resource_id: str,
117
+ timeout_seconds: int = Query(default=10, alias="timeoutSeconds", ge=1, le=60),
118
+ ):
119
+ descriptor = studio.catalog.get(resource_id)
120
+ if descriptor.kind != "mcp":
121
+ raise StudioError(
122
+ "RESOURCE_KIND_INVALID",
123
+ "该 Resource 不是 MCP Server",
124
+ status_code=422,
125
+ details={"resourceId": resource_id},
126
+ )
127
+ server_payload = {
128
+ key: value for key, value in descriptor.contract.items() if key != "discoveredTools"
129
+ }
130
+ server = MCPServerRef.model_validate(server_payload)
131
+ try:
132
+ result = await studio.mcp_runtime.probe(server, timeout_seconds=timeout_seconds)
133
+ except StudioError as exc:
134
+ detail = str((exc.details or {}).get("detail") or exc.message)
135
+ studio.catalog.mark_probe_failed(resource_id, code=exc.code, detail=detail)
136
+ raise
137
+ return studio.catalog.save_probe(resource_id, result=result)
138
+
139
+ @app.delete("/api/v1/catalog/resources/{resource_id}", status_code=204)
140
+ async def delete_catalog_resource(resource_id: str):
141
+ descriptor = studio.catalog.get(resource_id)
142
+ if descriptor.kind not in {"mcp", "tool", "model", "skill"}:
143
+ raise StudioError(
144
+ "RESOURCE_KIND_INVALID",
145
+ "只支持删除 MCP / Tool / Model / Skill 资源",
146
+ status_code=422,
147
+ details={"kind": descriptor.kind},
148
+ )
149
+ if descriptor.kind == "model" and descriptor.source != "local":
150
+ raise StudioError(
151
+ "RESOURCE_KIND_INVALID",
152
+ "内置或上游发现的模型不可删除;仅支持删除手动添加的模型",
153
+ status_code=422,
154
+ details={"kind": descriptor.kind, "source": descriptor.source},
155
+ )
156
+ studio.catalog.delete_resource(resource_id)
157
+ return None
158
+
159
+ @app.post("/api/v1/catalog/tools", status_code=201)
160
+ async def create_tool_resource(payload: ToolResourceCreateRequest):
161
+ return studio.catalog.create_tool(
162
+ display_name=payload.display_name,
163
+ category=payload.category,
164
+ contract=payload.contract,
165
+ )
166
+
167
+ @app.post("/api/v1/catalog/python-tools:inspect")
168
+ async def inspect_python_tool(file: UploadFile = File(...)):
169
+ content = await file.read(1024 * 1024 + 1)
170
+ return studio.catalog.inspect_python_tool(
171
+ content,
172
+ filename=file.filename or "tool.py",
173
+ )
174
+
175
+ @app.post(
176
+ "/api/v1/catalog/python-tools/{inspection_token}:commit",
177
+ status_code=201,
178
+ )
179
+ async def commit_python_tool(
180
+ inspection_token: str,
181
+ payload: PythonToolCommitRequest,
182
+ ):
183
+ return studio.catalog.commit_python_tool(
184
+ inspection_token,
185
+ display_name=payload.display_name,
186
+ name=payload.name,
187
+ callable_name=payload.callable_name,
188
+ description=payload.description,
189
+ )
190
+
191
+ @app.post("/api/v1/catalog/skills:import", status_code=201)
192
+ async def import_skill(file: UploadFile = File(...)):
193
+ content = await file.read(50 * 1024 * 1024 + 1)
194
+ return studio.catalog.import_skill_zip(content, filename=file.filename or "skill.zip")
195
+
196
+ @app.post("/api/v1/catalog/skills:discover")
197
+ async def discover_skills(payload: SkillDiscoveryRequest):
198
+ return studio.catalog.discover_skills(scan_paths=payload.scan_paths or None)
199
+
200
+ @app.get(
201
+ "/api/v1/catalog/skills/discoveries/{inspection_token}/candidates/{candidate_id}/files"
202
+ )
203
+ async def preview_discovered_skill(
204
+ inspection_token: str,
205
+ candidate_id: str,
206
+ path: str | None = Query(default=None, max_length=1024),
207
+ ):
208
+ return studio.catalog.preview_discovered_skill(
209
+ inspection_token,
210
+ candidate_id,
211
+ path=path,
212
+ )
213
+
214
+ @app.get("/api/v1/catalog/skills/{resource_id}/files")
215
+ async def preview_installed_skill(
216
+ resource_id: str,
217
+ path: str | None = Query(default=None, max_length=1024),
218
+ ):
219
+ return studio.catalog.preview_installed_skill(resource_id, path=path)
220
+
221
+ @app.post(
222
+ "/api/v1/catalog/skills/discoveries/{inspection_token}:commit",
223
+ status_code=201,
224
+ )
225
+ async def commit_discovered_skill(
226
+ inspection_token: str,
227
+ payload: SkillDiscoveryCommitRequest,
228
+ ):
229
+ return studio.catalog.commit_discovered_skill(
230
+ inspection_token,
231
+ payload.candidate_id,
232
+ overwrite=payload.overwrite,
233
+ )
234
+
235
+ @app.post("/api/v1/tool-schemas:validate")
236
+ async def validate_tool_schema(payload: ToolSchemaValidationRequest):
237
+ try:
238
+ Draft202012Validator.check_schema(payload.schema_definition)
239
+ except SchemaError as exc:
240
+ return {
241
+ "valid": False,
242
+ "diagnostics": [
243
+ {
244
+ "code": "TOOL_SCHEMA_INVALID",
245
+ "message": exc.message,
246
+ "path": list(exc.path),
247
+ }
248
+ ],
249
+ }
250
+ errors = sorted(
251
+ Draft202012Validator(payload.schema_definition).iter_errors(payload.sample),
252
+ key=lambda error: list(error.absolute_path),
253
+ )
254
+ return {
255
+ "valid": not errors,
256
+ "diagnostics": [
257
+ {
258
+ "code": "TOOL_SAMPLE_INVALID",
259
+ "message": error.message,
260
+ "path": list(error.absolute_path),
261
+ }
262
+ for error in errors
263
+ ],
264
+ }
265
+
266
+ @app.post("/api/v1/tool-policies:preview")
267
+ async def preview_tool_policy(payload: ToolPolicyPreviewRequest):
268
+ tools, permissions = studio.catalog.policy_preview(payload.bindings)
269
+ return {"tools": tools, "allowedPermissions": permissions}
270
+
271
+ @app.post("/api/v1/mcp-servers:probe")
272
+ async def probe_mcp_server(
273
+ payload: MCPServerRef,
274
+ timeout_seconds: int = Query(default=10, alias="timeoutSeconds", ge=1, le=60),
275
+ ):
276
+ return await studio.mcp_runtime.probe(payload, timeout_seconds=timeout_seconds)
277
+
278
+ @app.post("/api/v1/secret-references:check")
279
+ async def check_secret_reference(payload: SecretReferenceCheckRequest):
280
+ status = studio.credentials.status(payload.ref)
281
+ return {
282
+ "exists": status["configured"],
283
+ "scheme": payload.ref.partition("://")[0],
284
+ "source": status["source"],
285
+ }
286
+
287
+ @app.get("/api/v1/credentials/{credential_name}")
288
+ async def get_credential_status(credential_name: str):
289
+ return studio.credentials.status(f"env://{credential_name}")
290
+
291
+ @app.put("/api/v1/credentials/{credential_name}")
292
+ async def put_credential(credential_name: str, payload: CredentialPutRequest):
293
+ return studio.credentials.put_session(
294
+ credential_name,
295
+ payload.value.get_secret_value(),
296
+ )
297
+
298
+ @app.delete("/api/v1/credentials/{credential_name}")
299
+ async def delete_credential(credential_name: str):
300
+ return studio.credentials.delete_session(credential_name)
301
+
302
+ @app.post("/api/v1/model-profiles/{resource_id}:test")
303
+ async def test_model_profile(resource_id: str):
304
+ return await studio.test_model_profile(resource_id)
305
+
306
+ @app.post("/api/v1/model-endpoints:probe")
307
+ async def probe_model_endpoint_route(payload: ModelEndpointProbeRequest):
308
+ credential: str | None = None
309
+ if payload.api_key is not None:
310
+ credential = payload.api_key.get_secret_value()
311
+ elif payload.credential_ref:
312
+ try:
313
+ credential = studio.credentials.resolve(payload.credential_ref)
314
+ except Exception:
315
+ credential = None # 未配置凭证时降级为匿名探测
316
+ guard = getattr(studio.model_client, "network_guard", None)
317
+ return await probe_model_endpoint(
318
+ url=payload.url,
319
+ credential=credential,
320
+ network_guard=guard,
321
+ )
322
+
323
+
324
+ __all__ = ["register_catalog_routes"]
@@ -0,0 +1,286 @@
1
+ """HTTP request contracts used by the AgentKit Studio control plane."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Literal
6
+
7
+ from pydantic import Field, SecretStr, field_validator
8
+
9
+ from ksadk.evaluation import EvaluationConfig as PublicEvaluationConfig
10
+ from ksadk.evaluation import TargetRef
11
+ from ksadk.studio.contracts import (
12
+ AgentBindings,
13
+ AgentSpec,
14
+ ContractModel,
15
+ MCPServerRef,
16
+ ModelSpec,
17
+ RuntimeRef,
18
+ ToolContract,
19
+ )
20
+
21
+
22
+ class SessionExchangeRequest(ContractModel):
23
+ token: str = Field(min_length=16, max_length=512)
24
+
25
+
26
+ class WorkspaceOpenRequest(ContractModel):
27
+ path: str
28
+ create: bool = False
29
+
30
+
31
+ class CreateAgentRequest(ContractModel):
32
+ id: str = Field(pattern=r"^[a-z][a-z0-9-]{2,62}$")
33
+ name: str = Field(min_length=1, max_length=128)
34
+ description: str = Field(default="", max_length=1024)
35
+ template: str = "blank"
36
+ runtime: RuntimeRef | None = None
37
+ spec: AgentSpec | None = None
38
+
39
+
40
+ class ValidationRequest(ContractModel):
41
+ revision: int = Field(ge=1)
42
+ level: Literal["schema", "build", "release"] = "build"
43
+
44
+
45
+ class BuildRequest(ContractModel):
46
+ revision: int = Field(ge=1)
47
+ run_evaluation: bool = False
48
+ evaluation_suite_refs: list[str] = Field(default_factory=list)
49
+
50
+
51
+ class ImportRootRequest(ContractModel):
52
+ """一键导入根 Framework 项目(方案 §6.1)。"""
53
+ name: str | None = None
54
+ slug: str | None = None
55
+
56
+
57
+ class PromptCompileRequest(ContractModel):
58
+ """PR-S2:Prompt 编译预览请求(方案 §6.2)。只读,不写 Session/Trace。"""
59
+ revision: int = Field(default=1, ge=1)
60
+ request_instructions: str = Field(default="", max_length=32768)
61
+ include_content: bool = False # local debug 显式请求正文
62
+
63
+
64
+ class ContextPreviewRequest(ContractModel):
65
+ """PR-S2:Context 预览请求(方案 §6.2)。复用真实 Planner,不调模型。"""
66
+ revision: int = Field(default=1, ge=1)
67
+ user_input: str = Field(default="", max_length=1_000_000)
68
+ request_instructions: str = Field(default="", max_length=32768)
69
+ simulated_history: list[MessageInput] = Field(default_factory=list)
70
+ include_content: bool = False
71
+
72
+
73
+ class MessageInput(ContractModel):
74
+ role: str = "user"
75
+ content: str = Field(min_length=1, max_length=1_000_000)
76
+
77
+
78
+ class QuickAuthoringRequest(ContractModel):
79
+ name: str = Field(min_length=1, max_length=128)
80
+ slug: str | None = Field(default=None, min_length=1, max_length=63)
81
+ runtime_type: Literal["codex", "adk", "langgraph"]
82
+ template: Literal["blank", "research"] = "blank"
83
+ description: str = Field(default="", max_length=1024)
84
+ spec: AgentSpec | None = None
85
+
86
+
87
+ class AuthoringConversationMessage(ContractModel):
88
+ role: Literal["user", "assistant"]
89
+ content: str = Field(min_length=1, max_length=32768)
90
+
91
+
92
+ class ConversationAuthoringRequest(ContractModel):
93
+ messages: list[AuthoringConversationMessage] = Field(min_length=1, max_length=100)
94
+ # This is the single profile used to generate the Draft Patch. It is not
95
+ # implicitly the deployed Agent's only model: callers may bind a separate
96
+ # allow-list and default below.
97
+ model_profile_id: str = Field(min_length=3, max_length=256)
98
+ # Runtime is a Studio-owned deployment choice. The authoring model only
99
+ # supplies semantic intent and must not choose an incompatible framework
100
+ # source contract on its own.
101
+ runtime_type: Literal["codex", "adk", "langgraph"] = "codex"
102
+ agent_model_profile_ids: list[str] = Field(default_factory=list, max_length=100)
103
+ agent_default_model_profile_id: str | None = Field(
104
+ default=None,
105
+ min_length=3,
106
+ max_length=256,
107
+ )
108
+ # Resource identities are selected by the Studio user, never generated by
109
+ # the authoring model. The API resolves and validates their contracts
110
+ # before adding them to the returned Draft Patch.
111
+ tool_resource_ids: list[str] = Field(default_factory=list, max_length=100)
112
+ mcp_resource_ids: list[str] = Field(default_factory=list, max_length=100)
113
+ skill_resource_ids: list[str] = Field(default_factory=list, max_length=100)
114
+ # 可选的进度关联标识:前端生成后随请求带上,可通过
115
+ # GET /api/v1/authoring/conversations:status/{request_id} 轮询构建阶段。
116
+ request_id: str | None = Field(default=None, min_length=1, max_length=128)
117
+
118
+
119
+ class AuthoringCommitRequest(ContractModel):
120
+ name: str | None = Field(default=None, min_length=1, max_length=128)
121
+ slug: str | None = Field(default=None, min_length=1, max_length=63)
122
+ model_profile_id: str | None = Field(default=None, min_length=3, max_length=256)
123
+
124
+
125
+ class ProjectInspectRequest(ContractModel):
126
+ path: str = Field(min_length=1, max_length=4096)
127
+
128
+
129
+ class RunRequest(ContractModel):
130
+ session_id: str | None = None
131
+ model: str | None = Field(default=None, min_length=1, max_length=256)
132
+ input: MessageInput
133
+ environment: str = "local"
134
+ stream: bool = True
135
+ sandbox: str | None = None
136
+
137
+
138
+ class InteractionSubmitRequest(ContractModel):
139
+ name: str = Field(min_length=1, max_length=64)
140
+ data: dict[str, Any] = Field(default_factory=dict)
141
+
142
+
143
+ class CloudChatMessageRequest(ContractModel):
144
+ """One cloud turn submitted through Studio's loopback control plane.
145
+
146
+ The loopback process, never the browser, owns the AK/SK used to admit the
147
+ message through the cloud control plane. ``content`` uses the same
148
+ OpenAI-compatible text/image/file part shape as RunAgent; execution-policy
149
+ fields remain bounded enums and are revalidated by Server/Runtime.
150
+ """
151
+
152
+ content: str | list[dict[str, Any]]
153
+ model: str | None = Field(default=None, min_length=1, max_length=256)
154
+ model_options: dict[str, Any] = Field(default_factory=dict)
155
+ tool_approval_mode: Literal["ask", "risk", "full"] = "risk"
156
+ collaboration_mode: Literal["default", "plan"] | None = None
157
+ goal_objective: str | None = Field(default=None, min_length=1, max_length=4096)
158
+
159
+ @field_validator("content")
160
+ @classmethod
161
+ def validate_content(cls, value):
162
+ if isinstance(value, str):
163
+ if not value.strip():
164
+ raise ValueError("content must not be empty")
165
+ if len(value) > 1_000_000:
166
+ raise ValueError("text content is too large")
167
+ return value
168
+ if not 1 <= len(value) <= 9:
169
+ raise ValueError("content must contain between 1 and 9 parts")
170
+ attachment_count = 0
171
+ for part in value:
172
+ kind = str(part.get("type") or "")
173
+ if kind == "input_text":
174
+ text = part.get("text")
175
+ if not isinstance(text, str) or not text.strip() or len(text) > 1_000_000:
176
+ raise ValueError("input_text must contain bounded non-empty text")
177
+ continue
178
+ if kind == "input_image":
179
+ attachment_count += 1
180
+ url = part.get("image_url")
181
+ if not isinstance(url, str) or not url or len(url) > 14_000_000:
182
+ raise ValueError("input_image must contain a bounded image_url")
183
+ continue
184
+ if kind == "input_file":
185
+ attachment_count += 1
186
+ filename = part.get("filename")
187
+ data = part.get("file_data") or part.get("file_url")
188
+ if not isinstance(filename, str) or not filename.strip():
189
+ raise ValueError("input_file must contain a filename")
190
+ if not isinstance(data, str) or not data or len(data) > 14_000_000:
191
+ raise ValueError("input_file must contain bounded file data")
192
+ continue
193
+ raise ValueError(f"unsupported content part: {kind or '<missing>'}")
194
+ if attachment_count > 8:
195
+ raise ValueError("a turn supports at most 8 attachments")
196
+ return value
197
+
198
+
199
+ class CloudChatInteractionSubmitRequest(ContractModel):
200
+ """Public Interaction/v1 fields accepted by the local cloud-chat proxy."""
201
+
202
+ run_id: str = Field(min_length=1, max_length=256)
203
+ interaction_id: str = Field(min_length=1, max_length=256)
204
+ expected_revision: int = Field(ge=1)
205
+ action: Literal["approve", "reject", "submit", "cancel"]
206
+ response: dict[str, Any] = Field(default_factory=dict)
207
+ idempotency_key: str = Field(min_length=1, max_length=256)
208
+
209
+
210
+ class StudioEvaluationCreate(ContractModel):
211
+ """Request for the shared CLI/Studio evaluation executor."""
212
+
213
+ evalset_file: str = Field(min_length=1, max_length=4096)
214
+ target: TargetRef
215
+ config: PublicEvaluationConfig = Field(default_factory=PublicEvaluationConfig)
216
+
217
+
218
+ class SecretReferenceCheckRequest(ContractModel):
219
+ ref: str
220
+
221
+
222
+ class CredentialPutRequest(ContractModel):
223
+ value: SecretStr = Field(min_length=1, max_length=16_384)
224
+ persistence: Literal["session"] = "session"
225
+
226
+
227
+ class RollbackRequest(ContractModel):
228
+ target_build_id: str
229
+
230
+
231
+ class CloudAgentVersionRollbackRequest(ContractModel):
232
+ version_id: str = Field(min_length=1, max_length=256)
233
+
234
+
235
+ class ModelProfileCreateRequest(ContractModel):
236
+ name: str = Field(pattern=r"^[a-z][a-z0-9._-]{1,127}$")
237
+ display_name: str = Field(min_length=1, max_length=128)
238
+ version: str = Field(default="1.0.0", min_length=1, max_length=64)
239
+ description: str = Field(default="", max_length=4096)
240
+ spec: ModelSpec
241
+
242
+
243
+ class ModelEndpointProbeRequest(ContractModel):
244
+ url: str = Field(min_length=8, max_length=1024)
245
+ credential_ref: str | None = Field(default=None, max_length=512)
246
+ api_key: SecretStr | None = None
247
+
248
+
249
+ class MCPResourceCreateRequest(ContractModel):
250
+ display_name: str = Field(min_length=1, max_length=128)
251
+ description: str = Field(default="", max_length=4096)
252
+ server: MCPServerRef
253
+
254
+
255
+ class ToolResourceCreateRequest(ContractModel):
256
+ display_name: str = Field(min_length=1, max_length=128)
257
+ category: str = Field(default="custom", max_length=64)
258
+ contract: ToolContract
259
+
260
+
261
+ class PythonToolCommitRequest(ContractModel):
262
+ display_name: str = Field(min_length=1, max_length=128)
263
+ name: str = Field(pattern=r"^[A-Za-z_][A-Za-z0-9_]{0,127}$")
264
+ callable_name: str = Field(pattern=r"^[A-Za-z_][A-Za-z0-9_]{0,127}$")
265
+ description: str = Field(default="", max_length=1024)
266
+
267
+
268
+ class ToolSchemaValidationRequest(ContractModel):
269
+ schema_definition: dict[str, Any] = Field(alias="schema")
270
+ sample: Any = None
271
+
272
+
273
+ class ToolPolicyPreviewRequest(ContractModel):
274
+ bindings: AgentBindings
275
+
276
+
277
+ class SkillDiscoveryRequest(ContractModel):
278
+ scan_paths: list[str] = Field(default_factory=list, max_length=20)
279
+
280
+
281
+ class SkillDiscoveryCommitRequest(ContractModel):
282
+ candidate_id: str = Field(min_length=1, max_length=128)
283
+ overwrite: bool = False
284
+
285
+
286
+ __all__ = [name for name in globals() if name.endswith("Request")]