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.
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
- agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +2 -0
- ksadk/a2a/_space_client_events.py +381 -0
- ksadk/a2a/bootstrap.py +0 -2
- ksadk/a2a/card.py +6 -111
- ksadk/a2a/control_plane.py +239 -1
- ksadk/a2a/event_adapter.py +156 -64
- ksadk/a2a/executor.py +195 -172
- ksadk/a2a/routes.py +12 -5
- ksadk/a2a/server.py +1 -8
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +43 -349
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/core.py +222 -53
- ksadk/agui/_agent_helpers.py +243 -0
- ksadk/agui/a2ui_projection.py +12 -5
- ksadk/agui/agent.py +474 -275
- ksadk/agui/config.py +11 -5
- ksadk/agui/routes.py +7 -15
- ksadk/api/client.py +530 -40
- ksadk/api/environment.py +27 -0
- ksadk/builders/code_builder.py +352 -53
- ksadk/builders/container_builder.py +71 -44
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +2 -2
- ksadk/builders/managed_runtime_builder.py +60 -28
- ksadk/cli/__init__.py +25 -0
- ksadk/cli/cmd_a2a.py +18 -31
- ksadk/cli/cmd_create.py +13 -26
- ksadk/cli/cmd_dashboard.py +15 -1
- ksadk/cli/cmd_deploy.py +28 -3
- ksadk/cli/cmd_eval.py +443 -0
- ksadk/cli/cmd_evalset.py +284 -0
- ksadk/cli/cmd_files.py +5 -1
- ksadk/cli/cmd_hermes.py +137 -163
- ksadk/cli/cmd_invoke.py +28 -38
- ksadk/cli/cmd_launch.py +12 -0
- ksadk/cli/cmd_managed_runtime.py +95 -0
- ksadk/cli/cmd_observe.py +85 -0
- ksadk/cli/cmd_openclaw.py +85 -479
- ksadk/cli/cmd_replay.py +28 -4
- ksadk/cli/cmd_run.py +29 -67
- ksadk/cli/cmd_studio.py +201 -0
- ksadk/cli/cmd_web.py +15 -6
- ksadk/cli/dry_run.py +2 -1
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/global_options.py +3 -1
- ksadk/cli/hermes_env.py +151 -0
- ksadk/cli/invoke_payload.py +49 -0
- ksadk/cli/network_options.py +7 -5
- ksadk/cli/openclaw_env.py +458 -0
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/ui.py +6 -0
- ksadk/cli/workflow_common.py +5 -5
- ksadk/codex/__init__.py +3 -3
- ksadk/codex/client.py +833 -49
- ksadk/codex/phase.py +1 -1
- ksadk/codex/runtime.py +720 -127
- ksadk/common/kop_client.py +232 -0
- ksadk/configs/__init__.py +1 -3
- ksadk/configs/env_registry.py +244 -45
- ksadk/configs/env_registry_pcm.py +181 -0
- ksadk/configs/env_var_spec.py +18 -0
- ksadk/configs/global_config.py +6 -1
- ksadk/configs/settings.py +5 -108
- ksadk/context_engine/__init__.py +98 -0
- ksadk/context_engine/assembler.py +176 -0
- ksadk/context_engine/baseline.py +419 -0
- ksadk/context_engine/cache_observability.py +228 -0
- ksadk/context_engine/capabilities.py +443 -0
- ksadk/context_engine/contributors.py +344 -0
- ksadk/context_engine/hosted_pipeline.py +417 -0
- ksadk/context_engine/models.py +117 -0
- ksadk/context_engine/planner.py +698 -0
- ksadk/context_engine/policies.py +319 -0
- ksadk/context_engine/projection.py +31 -0
- ksadk/context_engine/shadow_plan.py +266 -0
- ksadk/context_engine/tokenizer.py +164 -0
- ksadk/conversations/__init__.py +85 -94
- ksadk/conversations/context.py +126 -6
- ksadk/conversations/message_projection.py +292 -28
- ksadk/conversations/model_context.py +49 -3
- ksadk/conversations/runtime_compaction.py +207 -5
- ksadk/conversations/runtime_input.py +193 -3
- ksadk/conversations/runtime_invocation.py +81 -3
- ksadk/conversations/runtime_observability.py +157 -4
- ksadk/conversations/runtime_payloads.py +42 -0
- ksadk/conversations/runtime_preparation.py +280 -2
- ksadk/conversations/runtime_resume.py +71 -32
- ksadk/conversations/runtime_stream_events.py +94 -9
- ksadk/conversations/runtime_streaming.py +175 -22
- ksadk/conversations/semantic_summary.py +311 -1
- ksadk/conversations/session_lock.py +51 -0
- ksadk/deployment/env_forward.py +72 -0
- ksadk/deployment/managed_runtime.py +38 -0
- ksadk/deployment/manager.py +24 -8
- ksadk/deployment/providers/serverless.py +228 -92
- ksadk/evaluation/__init__.py +116 -0
- ksadk/evaluation/a2a_adapter.py +452 -0
- ksadk/evaluation/adapters.py +67 -0
- ksadk/evaluation/agent_eval_client.py +395 -0
- ksadk/evaluation/cloud_binding.py +80 -0
- ksadk/evaluation/cloud_converter.py +194 -0
- ksadk/evaluation/cloud_service.py +199 -0
- ksadk/evaluation/contracts.py +478 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +627 -0
- ksadk/evaluation/evidence.py +258 -0
- ksadk/evaluation/executor.py +143 -0
- ksadk/evaluation/local_adapter.py +550 -0
- ksadk/evaluation/service_env.py +27 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/studio_build_adapter.py +253 -0
- ksadk/evaluation/target.py +82 -0
- ksadk/events/__init__.py +13 -13
- ksadk/events/_v1_compat/__init__.py +1 -0
- ksadk/events/_v1_compat/models.py +299 -0
- ksadk/events/_v1_compat/parser.py +247 -0
- ksadk/events/_v1_compat/projection.py +753 -0
- ksadk/events/adapters/__init__.py +34 -0
- ksadk/events/adapters/_a2a_snapshot.py +622 -0
- ksadk/events/adapters/_a2a_support.py +275 -0
- ksadk/events/adapters/_codex_interactions.py +375 -0
- ksadk/events/adapters/_codex_items.py +801 -0
- ksadk/events/adapters/_codex_validators.py +311 -0
- ksadk/events/adapters/_langgraph_support.py +785 -0
- ksadk/events/adapters/a2a.py +841 -0
- ksadk/events/adapters/adk.py +503 -0
- ksadk/events/adapters/codex.py +717 -0
- ksadk/events/adapters/langgraph.py +745 -0
- ksadk/events/canonical.py +440 -0
- ksadk/events/canonical_replay.py +497 -0
- ksadk/events/canonical_store.py +468 -0
- ksadk/events/cold_recovery.py +257 -0
- ksadk/events/content.py +89 -0
- ksadk/events/identity.py +86 -0
- ksadk/events/pipeline.py +455 -0
- ksadk/events/projections.py +66 -0
- ksadk/events/reducer.py +661 -0
- ksadk/events/replay.py +3 -36
- ksadk/events/runtime_event.py +20 -256
- ksadk/events/session_event.py +324 -0
- ksadk/events/store.py +3 -316
- ksadk/events/v1_compat.py +41 -0
- ksadk/harness/__init__.py +3 -2
- ksadk/harness/app.py +114 -123
- ksadk/harness/config.py +1 -1
- ksadk/harness/runtime.py +467 -0
- ksadk/hermes_terminal.py +5 -0
- ksadk/identity/resolver.py +4 -3
- ksadk/interaction/__init__.py +28 -0
- ksadk/interaction/contracts.py +136 -0
- ksadk/interaction/ledger.py +189 -0
- ksadk/interaction/provider.py +122 -0
- ksadk/interaction/providers/__init__.py +52 -0
- ksadk/interaction/providers/adk.py +40 -0
- ksadk/interaction/providers/codex.py +94 -0
- ksadk/interaction/providers/langgraph.py +58 -0
- ksadk/kernel/__init__.py +117 -0
- ksadk/kernel/authorization.py +258 -0
- ksadk/kernel/bootstrap.py +1074 -0
- ksadk/kernel/contract_fingerprints.py +61 -0
- ksadk/kernel/contracts.py +362 -0
- ksadk/kernel/control.py +219 -0
- ksadk/kernel/errors.py +79 -0
- ksadk/kernel/ingress.py +1102 -0
- ksadk/kernel/mapping.py +111 -0
- ksadk/kernel/memory_store.py +1133 -0
- ksadk/kernel/postgres_store.py +1756 -0
- ksadk/kernel/recovery.py +452 -0
- ksadk/kernel/runtime_identity.py +103 -0
- ksadk/kernel/sql/001_agent_kernel.sql +120 -0
- ksadk/kernel/sqlite_store.py +1410 -0
- ksadk/kernel/state.py +145 -0
- ksadk/kernel/store.py +232 -0
- ksadk/kernel/worker.py +953 -0
- ksadk/knowledge_base/client.py +22 -4
- ksadk/knowledge_base/service.py +32 -5
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +16 -9
- ksadk/memory/__init__.py +61 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
- ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
- ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
- ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
- ksadk/memory/adk/long_term_memory.py +3 -2
- ksadk/memory/coordinator.py +461 -0
- ksadk/memory/events.py +202 -0
- ksadk/memory/extraction.py +228 -0
- ksadk/memory/ltm_backend_factory.py +16 -3
- ksadk/memory/models.py +316 -0
- ksadk/memory/policy.py +215 -0
- ksadk/memory/provider.py +47 -0
- ksadk/memory/provider_adapter.py +159 -0
- ksadk/memory/provider_resolver.py +71 -0
- ksadk/memory/providers/__init__.py +5 -0
- ksadk/memory/providers/local_sqlite.py +490 -0
- ksadk/memory/resolved_policy.py +145 -0
- ksadk/memory/service.py +198 -8
- ksadk/memory/tool.py +4 -0
- ksadk/model_proxy/bootstrap.py +16 -9
- ksadk/model_proxy/config.py +22 -1
- ksadk/model_proxy/detect.py +202 -9
- ksadk/model_proxy/namespace.py +67 -15
- ksadk/model_proxy/server.py +168 -6
- ksadk/model_proxy/transform.py +105 -3
- ksadk/observability/__init__.py +25 -0
- ksadk/observability/session_log.py +420 -0
- ksadk/observability/trajectory.py +105 -0
- ksadk/prompts/__init__.py +71 -0
- ksadk/prompts/compiler.py +215 -0
- ksadk/prompts/models.py +82 -0
- ksadk/prompts/projection.py +89 -0
- ksadk/prompts/resolved.py +137 -0
- ksadk/prompts/sources.py +233 -0
- ksadk/runners/_langgraph_runner_streams.py +822 -0
- ksadk/runners/adk_runner.py +14 -31
- ksadk/runners/base_runner.py +44 -3
- ksadk/runners/factory.py +3 -3
- ksadk/runners/langgraph_runner.py +252 -433
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +16 -0
- ksadk/runtime/__init__.py +67 -41
- ksadk/runtime/_runner_adapter/__init__.py +1 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
- ksadk/runtime/adapter.py +199 -16
- ksadk/runtime/conversation_execution.py +687 -0
- ksadk/runtime/executor.py +392 -0
- ksadk/runtime/factory.py +342 -0
- ksadk/runtime/framework_adapters.py +6 -12
- ksadk/runtime/hosted_finalizer.py +268 -0
- ksadk/runtime/launch.py +61 -0
- ksadk/runtime/preprocessing.py +49 -14
- ksadk/runtime/runner_adapter.py +330 -391
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime/usage.py +33 -0
- ksadk/sandbox/backends/e2b.py +36 -3
- ksadk/server/__init__.py +39 -4
- ksadk/server/app.py +18 -492
- ksadk/server/composition.py +36 -2
- ksadk/server/factory.py +210 -149
- ksadk/server/routes/common.py +15 -46
- ksadk/server/routes/control.py +13 -9
- ksadk/server/routes/kernel_ingress.py +258 -0
- ksadk/server/routes/misc.py +10 -33
- ksadk/server/routes/models.py +14 -6
- ksadk/server/routes/openai_compat.py +129 -27
- ksadk/server/routes/projection.py +84 -16
- ksadk/server/routes/run.py +347 -460
- ksadk/server/routes/sessions.py +37 -40
- ksadk/server/routes/streaming.py +52 -7
- ksadk/server/routes/workspace.py +54 -21
- ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
- ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
- ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
- ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
- ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
- ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
- ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
- ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
- ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
- ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
- ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
- ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
- ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
- ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
- ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
- ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
- ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
- ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
- ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
- ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
- ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
- ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
- ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
- ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
- ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
- ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
- ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
- ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
- ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
- ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
- ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
- ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
- ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
- ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
- ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
- ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
- ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
- ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
- ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
- ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
- ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
- ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
- ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
- ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
- ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
- ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
- ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
- ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
- ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
- ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
- ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
- ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
- ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
- ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
- ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
- ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
- ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
- ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
- ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
- ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
- ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
- ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
- ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
- ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
- ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
- ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
- ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
- ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +26 -9
- ksadk/sessions/_local_service_sync.py +688 -0
- ksadk/sessions/_local_tables.py +21 -0
- ksadk/sessions/_postgres_schema.py +305 -0
- ksadk/sessions/_postgres_tables.py +15 -0
- ksadk/sessions/base.py +80 -1
- ksadk/sessions/in_memory.py +53 -2
- ksadk/sessions/local_service.py +63 -604
- ksadk/sessions/postgres_service.py +58 -148
- ksadk/sessions/resilient.py +35 -1
- ksadk/skills/runtime/backends/e2b.py +1 -1
- ksadk/skills/service_client.py +13 -3
- ksadk/studio/__init__.py +5 -0
- ksadk/studio/agent_avatar_assets.py +120 -0
- ksadk/studio/agent_lifecycle.py +51 -0
- ksadk/studio/api.py +1598 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +286 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/api_memory_routes.py +82 -0
- ksadk/studio/authoring.py +749 -0
- ksadk/studio/authoring_coordinator.py +1017 -0
- ksadk/studio/builder.py +397 -0
- ksadk/studio/capabilities.py +368 -0
- ksadk/studio/cloud.py +2099 -0
- ksadk/studio/codex_agent_service.py +694 -0
- ksadk/studio/codex_authoring.py +469 -0
- ksadk/studio/codex_builder.py +437 -0
- ksadk/studio/codex_manifest.py +307 -0
- ksadk/studio/codex_run.py +395 -0
- ksadk/studio/compiler.py +190 -0
- ksadk/studio/contracts.py +755 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/event_store.py +214 -0
- ksadk/studio/framework_run.py +342 -0
- ksadk/studio/hosted_kernel.py +317 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/manifest_resolver.py +131 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +629 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +275 -0
- ksadk/studio/otel_trace.py +1060 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/pcm_memory.py +85 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +327 -0
- ksadk/studio/resource_catalog.py +1260 -0
- ksadk/studio/run_service.py +1133 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +365 -0
- ksadk/studio/service.py +2249 -0
- ksadk/studio/shared_web.py +1004 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
- ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
- ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
- ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
- ksadk/studio/static/index.html +15 -0
- ksadk/studio/templates.py +722 -0
- ksadk/studio/validator.py +265 -0
- ksadk/studio/workspace.py +135 -0
- ksadk/tools/gateway.py +9 -0
- ksadk/toolsets/__init__.py +27 -1
- ksadk/toolsets/a2a.py +426 -0
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/setup.py +317 -403
- ksadk/tracing/span_utils.py +0 -44
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
- ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/events/parser.py +0 -191
- ksadk/harness/runner.py +0 -211
- ksadk/runners/codex_runner.py +0 -132
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
- ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
- ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
- ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
- ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
- ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
- ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
- ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
- ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
- ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
- ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
- ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
- ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
- ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
- ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
- ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
- ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
- ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
- ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
- ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
- ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
- ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
- ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
- ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
- ksadk/server/static/assets/katex-DATssjp1.js +0 -265
- ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
- ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
- ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
- ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
- ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
- ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
- ksadk/tracing/exporters/langfuse_exporter.py +0 -460
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.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.
|
|
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
|
-
|
|
47
|
-
|
|
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_run.py
CHANGED
|
@@ -11,14 +11,15 @@ import sys
|
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
13
|
import click
|
|
14
|
+
import uvicorn
|
|
14
15
|
|
|
15
16
|
from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
|
|
16
17
|
from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
|
|
18
|
+
from ksadk.cli.runtime_bootstrap import create_runtime_web_app
|
|
17
19
|
from ksadk.cli.ui import (
|
|
18
20
|
print_error,
|
|
19
21
|
print_info,
|
|
20
22
|
print_kv,
|
|
21
|
-
print_rule,
|
|
22
23
|
print_success,
|
|
23
24
|
print_title,
|
|
24
25
|
print_warn,
|
|
@@ -117,59 +118,45 @@ def run(
|
|
|
117
118
|
configure_local_runtime_persistence(agent_path, result.type.value)
|
|
118
119
|
|
|
119
120
|
# 2. 根据框架类型选择处理方式
|
|
120
|
-
# 所有框架统一使用 _run_custom()
|
|
121
|
-
# (Langfuse instrumentation 需要在同一进程内生效)
|
|
121
|
+
# 所有框架统一使用 _run_custom(),让 OTel instrumentation 在同一进程生效。
|
|
122
122
|
_run_custom(
|
|
123
123
|
result, agent_path, port, interactive, no_trace, show_thinking, no_stream, no_alt_screen
|
|
124
124
|
)
|
|
125
125
|
|
|
126
126
|
|
|
127
127
|
def _run_adk_cli(agent_path: Path, port: int = 8080, command: str = "run"):
|
|
128
|
-
"""运行 ADK Agent
|
|
129
|
-
|
|
130
|
-
对于 Langfuse 集成,我们需要在同一进程内运行 ADK,
|
|
131
|
-
因为 OpenTelemetry instrumentation 只在进程内生效。
|
|
132
|
-
"""
|
|
128
|
+
"""运行 ADK Agent,使用标准 OTLP 配置。"""
|
|
133
129
|
import os
|
|
134
130
|
|
|
135
|
-
|
|
131
|
+
has_otlp = bool(
|
|
132
|
+
os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
|
133
|
+
or os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
|
|
134
|
+
or os.getenv("CLOUD_MONITOR_OTLP_ENDPOINT")
|
|
135
|
+
or os.getenv("CLOUD_MONITOR_OTLP_TRACES_ENDPOINT")
|
|
136
|
+
)
|
|
136
137
|
|
|
137
138
|
# 必须先初始化 Tracing(在导入 ADK 之前)
|
|
138
|
-
if
|
|
139
|
+
if has_otlp:
|
|
139
140
|
try:
|
|
140
141
|
from ksadk.tracing import setup_tracing
|
|
141
142
|
|
|
142
143
|
setup_tracing(
|
|
143
144
|
enable_inmemory=False,
|
|
144
|
-
enable_langfuse=True,
|
|
145
145
|
enable_adk_instrumentation=True,
|
|
146
146
|
)
|
|
147
|
-
print_info("Tracing: Enabled (
|
|
147
|
+
print_info("Tracing: Enabled (OTLP + ADK Instrumentation)")
|
|
148
148
|
except Exception as e:
|
|
149
|
-
print_warn(f"
|
|
149
|
+
print_warn(f"OTLP tracing 初始化失败: {e}")
|
|
150
150
|
|
|
151
151
|
print_kv("调用 ADK 原生 CLI", f"adk {command}")
|
|
152
152
|
|
|
153
|
-
#
|
|
154
|
-
# ADK CLI 本身不支持 Langfuse,需要用户在项目中集成
|
|
153
|
+
# 子进程继承标准 OTLP 环境变量;项目内 instrumentation 负责创建 spans。
|
|
155
154
|
if command == "run":
|
|
156
155
|
cmd = [sys.executable, "-m", "google.adk.cli", "run", "."]
|
|
157
156
|
else:
|
|
158
157
|
cmd = [sys.executable, "-m", "google.adk.cli", "web", ".", "--port", str(port)]
|
|
159
158
|
|
|
160
|
-
# 传递 Langfuse 环境变量
|
|
161
159
|
env = os.environ.copy()
|
|
162
|
-
langfuse_vars = ["LANGFUSE_PUBLIC_KEY", "LANGFUSE_SECRET_KEY", "LANGFUSE_BASE_URL"]
|
|
163
|
-
for var in langfuse_vars:
|
|
164
|
-
if var in os.environ:
|
|
165
|
-
env[var] = os.environ[var]
|
|
166
|
-
|
|
167
|
-
# 提示用户如何在 ADK 项目中启用 Langfuse
|
|
168
|
-
if has_langfuse:
|
|
169
|
-
print_rule("ADK 项目 Langfuse 集成提示")
|
|
170
|
-
print_info("在 agent.py 中添加以下代码:")
|
|
171
|
-
print_info("from openinference.instrumentation.google_adk import GoogleADKInstrumentor")
|
|
172
|
-
print_info("GoogleADKInstrumentor().instrument()")
|
|
173
160
|
|
|
174
161
|
try:
|
|
175
162
|
subprocess.run(cmd, cwd=str(agent_path), check=True, env=env)
|
|
@@ -191,8 +178,7 @@ def _run_custom(
|
|
|
191
178
|
no_stream: bool = False,
|
|
192
179
|
no_alt_screen: bool = False,
|
|
193
180
|
):
|
|
194
|
-
"""
|
|
195
|
-
from ksadk.runners.factory import create_runner
|
|
181
|
+
"""Run one detected project through the canonical RuntimeAdapter composition."""
|
|
196
182
|
|
|
197
183
|
# 初始化 Tracing
|
|
198
184
|
if not no_trace:
|
|
@@ -201,62 +187,38 @@ def _run_custom(
|
|
|
201
187
|
|
|
202
188
|
from ksadk.tracing import setup_tracing
|
|
203
189
|
|
|
204
|
-
has_langfuse = bool(os.getenv("LANGFUSE_PUBLIC_KEY"))
|
|
205
190
|
has_otlp = bool(
|
|
206
191
|
os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
|
207
192
|
or os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
|
|
208
193
|
)
|
|
209
194
|
|
|
210
|
-
use_callback_only = os.getenv("LANGFUSE_USE_CALLBACK", "").strip().lower() in (
|
|
211
|
-
"1",
|
|
212
|
-
"true",
|
|
213
|
-
"yes",
|
|
214
|
-
"on",
|
|
215
|
-
)
|
|
216
|
-
|
|
217
195
|
setup_tracing(
|
|
218
196
|
enable_inmemory=True,
|
|
219
197
|
enable_langfuse=None,
|
|
220
|
-
use_callback_only=use_callback_only,
|
|
221
198
|
)
|
|
222
199
|
|
|
223
200
|
if has_otlp:
|
|
224
201
|
print_info("Tracing: Enabled (InMemory + OTLP HTTP)")
|
|
225
|
-
elif has_langfuse:
|
|
226
|
-
print_info(
|
|
227
|
-
f"Tracing: Enabled (InMemory + Langfuse, CallbackOnly={use_callback_only})"
|
|
228
|
-
)
|
|
229
202
|
else:
|
|
230
203
|
print_info("Tracing: Enabled")
|
|
231
204
|
except Exception as e:
|
|
232
205
|
print_warn(f"Tracing 初始化失败: {e}")
|
|
233
206
|
|
|
234
|
-
|
|
207
|
+
if interactive:
|
|
208
|
+
del show_thinking, no_stream, no_alt_screen
|
|
209
|
+
print_error(
|
|
210
|
+
"RuntimeAdapter TUI 尚未接通;请使用 `ksadk web` 或不带 --interactive 启动"
|
|
211
|
+
)
|
|
212
|
+
raise SystemExit(2)
|
|
213
|
+
|
|
235
214
|
try:
|
|
236
|
-
|
|
237
|
-
runner = create_runner(result, str(agent_path))
|
|
238
|
-
runner.load_agent()
|
|
239
|
-
print_success("Agent 加载成功")
|
|
215
|
+
runtime_app = create_runtime_web_app(result, agent_path)
|
|
240
216
|
except Exception as e:
|
|
241
|
-
print_exception("
|
|
242
|
-
# import traceback
|
|
243
|
-
# traceback.print_exc()
|
|
217
|
+
print_exception("RuntimeAdapter 初始化失败", e)
|
|
244
218
|
raise SystemExit(1)
|
|
245
219
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
run_tui(
|
|
252
|
-
runner,
|
|
253
|
-
show_thinking=show_thinking,
|
|
254
|
-
project_dir=str(agent_path),
|
|
255
|
-
no_alt_screen=no_alt_screen,
|
|
256
|
-
)
|
|
257
|
-
else:
|
|
258
|
-
print_success(f"Server running at http://0.0.0.0:{port}")
|
|
259
|
-
print_kv("API Docs", f"http://0.0.0.0:{port}/docs")
|
|
260
|
-
print_kv("Chat API", f"http://0.0.0.0:{port}/chat")
|
|
261
|
-
print_info("Press Ctrl+C to stop")
|
|
262
|
-
runner.run_server(port=port)
|
|
220
|
+
print_success(f"Server running at http://127.0.0.1:{port}")
|
|
221
|
+
print_kv("API Docs", f"http://127.0.0.1:{port}/docs")
|
|
222
|
+
print_kv("Chat API", f"http://127.0.0.1:{port}/chat")
|
|
223
|
+
print_info("Press Ctrl+C to stop")
|
|
224
|
+
uvicorn.run(runtime_app, host="127.0.0.1", port=port)
|
ksadk/cli/cmd_studio.py
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"""agentengine studio - start the local-first Agent authoring control plane."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import secrets
|
|
8
|
+
import webbrowser
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import click
|
|
12
|
+
import uvicorn
|
|
13
|
+
|
|
14
|
+
from ksadk.cli.env_options import load_env_file
|
|
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
|
+
|
|
47
|
+
from ksadk.studio.api import create_studio_app
|
|
48
|
+
from ksadk.studio.service import StudioService
|
|
49
|
+
|
|
50
|
+
# 模型环境变量白名单。OPENAI_BASE_URL 与 OPENAI_API_BASE 互为别名,两者都接受;
|
|
51
|
+
# 加载时做别名归一(见 studio()),运行时统一 OPENAI_BASE_URL 优先(与 cmd_config/cmd_model
|
|
52
|
+
# /api.py 一致,方案 §2.4 第 5 点)。
|
|
53
|
+
_MODEL_ENV_KEYS = (
|
|
54
|
+
"OPENAI_BASE_URL",
|
|
55
|
+
"OPENAI_API_BASE",
|
|
56
|
+
"OPENAI_API_KEY",
|
|
57
|
+
"OPENAI_MODEL_NAME",
|
|
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")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
|
|
80
|
+
@click.argument("workspace", default=".", type=click.Path())
|
|
81
|
+
@click.option("--port", "-p", default=8080, type=click.IntRange(1, 65535))
|
|
82
|
+
@click.option("--no-open", is_flag=True, help="仅打印 URL,不自动打开浏览器")
|
|
83
|
+
@click.option(
|
|
84
|
+
"--env-file",
|
|
85
|
+
type=click.Path(exists=True, dir_okay=False),
|
|
86
|
+
help=(
|
|
87
|
+
"本地模型与云端控制环境文件;只读取允许的 OPENAI/KSYUN/KS3 "
|
|
88
|
+
"字段,且仅保留在 Studio 进程"
|
|
89
|
+
),
|
|
90
|
+
)
|
|
91
|
+
@click.option(
|
|
92
|
+
"--codex-proxy",
|
|
93
|
+
type=click.Choice(["inherit", "auto", "forced", "direct"]),
|
|
94
|
+
default="inherit",
|
|
95
|
+
show_default=True,
|
|
96
|
+
help="Codex Responses→Chat 代理策略",
|
|
97
|
+
)
|
|
98
|
+
def studio(
|
|
99
|
+
workspace: str,
|
|
100
|
+
port: int,
|
|
101
|
+
no_open: bool,
|
|
102
|
+
env_file: str | None,
|
|
103
|
+
codex_proxy: str,
|
|
104
|
+
) -> None:
|
|
105
|
+
"""启动本地 AgentKit Studio。
|
|
106
|
+
|
|
107
|
+
\b
|
|
108
|
+
WORKSPACE: Agent 工作区目录,目录不存在时自动初始化。
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
root = Path(workspace).expanduser().resolve()
|
|
112
|
+
managed_keys = (*_STUDIO_ENV_FILE_KEYS, "KSADK_CODEX_USE_PROXY")
|
|
113
|
+
previous = {key: os.environ.get(key) for key in managed_keys}
|
|
114
|
+
previously_present = {key for key in managed_keys if key in os.environ}
|
|
115
|
+
try:
|
|
116
|
+
if env_file:
|
|
117
|
+
try:
|
|
118
|
+
values = load_env_file(env_file)
|
|
119
|
+
except ValueError as exc:
|
|
120
|
+
raise click.ClickException(str(exc)) from exc
|
|
121
|
+
loaded_models = 0
|
|
122
|
+
loaded_cloud_control = 0
|
|
123
|
+
for key, value in values.items():
|
|
124
|
+
if key not in _STUDIO_ENV_FILE_KEYS or not value:
|
|
125
|
+
continue
|
|
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:
|
|
135
|
+
os.environ[key] = value
|
|
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
|
+
)
|
|
157
|
+
if codex_proxy == "forced":
|
|
158
|
+
os.environ["KSADK_CODEX_USE_PROXY"] = "1"
|
|
159
|
+
elif codex_proxy == "direct":
|
|
160
|
+
os.environ["KSADK_CODEX_USE_PROXY"] = "0"
|
|
161
|
+
elif codex_proxy == "auto":
|
|
162
|
+
os.environ.pop("KSADK_CODEX_USE_PROXY", None)
|
|
163
|
+
session_token = os.environ.get("KSADK_STUDIO_SESSION_TOKEN") or secrets.token_urlsafe(32)
|
|
164
|
+
csrf_token = secrets.token_urlsafe(24)
|
|
165
|
+
service = StudioService(root)
|
|
166
|
+
app = create_studio_app(
|
|
167
|
+
root,
|
|
168
|
+
service=service,
|
|
169
|
+
session_token=session_token,
|
|
170
|
+
csrf_token=csrf_token,
|
|
171
|
+
security_enabled=os.environ.get("KSADK_STUDIO_NO_SECURITY") != "1",
|
|
172
|
+
)
|
|
173
|
+
base_url = f"http://127.0.0.1:{port}/"
|
|
174
|
+
launch_url = f"{base_url}#session={session_token}"
|
|
175
|
+
|
|
176
|
+
print_title("启动 AgentKit Local Studio")
|
|
177
|
+
print_kv("工作区", str(root))
|
|
178
|
+
print_kv("访问地址", launch_url, value_style="#58a6ff")
|
|
179
|
+
print_success("构建与运行均在本地执行")
|
|
180
|
+
print_info("按 Ctrl+C 停止")
|
|
181
|
+
if not no_open:
|
|
182
|
+
webbrowser.open(launch_url)
|
|
183
|
+
# 业务日志(ksadk.*)走 root handler,同样带 filename:lineno。
|
|
184
|
+
logging.basicConfig(level=logging.INFO, format=_LOG_FORMAT)
|
|
185
|
+
uvicorn.run(
|
|
186
|
+
app,
|
|
187
|
+
host="127.0.0.1",
|
|
188
|
+
port=port,
|
|
189
|
+
log_level="info",
|
|
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,
|
|
195
|
+
)
|
|
196
|
+
finally:
|
|
197
|
+
for key in managed_keys:
|
|
198
|
+
if key in previously_present:
|
|
199
|
+
os.environ[key] = previous[key] or ""
|
|
200
|
+
else:
|
|
201
|
+
os.environ.pop(key, None)
|
ksadk/cli/cmd_web.py
CHANGED
|
@@ -6,10 +6,12 @@ import webbrowser
|
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
8
|
import click
|
|
9
|
+
import uvicorn
|
|
9
10
|
import yaml
|
|
10
11
|
|
|
11
12
|
from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
|
|
12
13
|
from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
|
|
14
|
+
from ksadk.cli.runtime_bootstrap import create_runtime_web_app
|
|
13
15
|
from ksadk.cli.ui import (
|
|
14
16
|
print_error,
|
|
15
17
|
print_info,
|
|
@@ -20,7 +22,6 @@ from ksadk.cli.ui import (
|
|
|
20
22
|
)
|
|
21
23
|
from ksadk.configs import setup_environment
|
|
22
24
|
from ksadk.detection import FrameworkDetector
|
|
23
|
-
from ksadk.runners.factory import create_runner
|
|
24
25
|
|
|
25
26
|
_PERSISTENT_STM_FRAMEWORKS = {"adk", "langgraph", "langchain", "deepagents"}
|
|
26
27
|
_STM_ENV_NAMES = (
|
|
@@ -226,9 +227,14 @@ def configure_local_runtime_persistence(
|
|
|
226
227
|
@click.command(context_settings=dict(help_option_names=["-h", "--help"]))
|
|
227
228
|
@click.argument("agent_dir", default=".", type=click.Path(exists=True))
|
|
228
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
|
+
)
|
|
229
235
|
@click.option("--model", help="指定模型名称 (覆盖 .env 配置)")
|
|
230
236
|
@click.option("--no-open", is_flag=True, help="仅打印 URL,不自动打开浏览器")
|
|
231
|
-
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):
|
|
232
238
|
"""启动本地统一 Web UI(Invoke UI)
|
|
233
239
|
|
|
234
240
|
\b
|
|
@@ -248,6 +254,9 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
|
|
|
248
254
|
|
|
249
255
|
agent_path = Path(agent_dir).resolve()
|
|
250
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])
|
|
251
260
|
if model:
|
|
252
261
|
command_args.extend(["--model", model])
|
|
253
262
|
if no_open:
|
|
@@ -340,10 +349,10 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
|
|
|
340
349
|
launch_path = _configure_custom_ui_env(agent_path)
|
|
341
350
|
|
|
342
351
|
try:
|
|
343
|
-
print_info("初始化
|
|
344
|
-
|
|
352
|
+
print_info("初始化 RuntimeAdapter...")
|
|
353
|
+
runtime_app = create_runtime_web_app(result, agent_path)
|
|
345
354
|
except Exception as e:
|
|
346
|
-
print_exception("
|
|
355
|
+
print_exception("RuntimeAdapter 初始化失败", e)
|
|
347
356
|
raise SystemExit(1)
|
|
348
357
|
|
|
349
358
|
print_success("启动统一 Web UI")
|
|
@@ -356,7 +365,7 @@ def web(agent_dir: str, port: int, model: str, no_open: bool):
|
|
|
356
365
|
webbrowser.open(launch_url)
|
|
357
366
|
|
|
358
367
|
try:
|
|
359
|
-
|
|
368
|
+
uvicorn.run(runtime_app, host=host, port=port)
|
|
360
369
|
except KeyboardInterrupt:
|
|
361
370
|
raise SystemExit(0)
|
|
362
371
|
except Exception as e:
|
ksadk/cli/dry_run.py
CHANGED
|
@@ -13,6 +13,7 @@ from click.core import ParameterSource
|
|
|
13
13
|
from ksadk.api.client import DryRunExit
|
|
14
14
|
from ksadk.cli.resource_common import build_dry_run_envelope
|
|
15
15
|
from ksadk.cli.ui import emit_json, is_json_output
|
|
16
|
+
from ksadk.configs.env_registry import is_sensitive_env_var
|
|
16
17
|
|
|
17
18
|
_T = TypeVar("_T")
|
|
18
19
|
_DEFAULT_DONE_MSG = "✅ Dry Run Completed: 请求已打印,未执行实际变更。"
|
|
@@ -117,7 +118,7 @@ def _mask_if_sensitive(value: Any, *, sensitive: bool) -> Any:
|
|
|
117
118
|
def _sanitize_dry_run_value(value: Any, *, parent_key: str | None = None) -> Any:
|
|
118
119
|
if isinstance(value, dict):
|
|
119
120
|
env_key = str(value.get("Key") or "")
|
|
120
|
-
env_sensitive = bool(value.get("IsSensitive")) or
|
|
121
|
+
env_sensitive = bool(value.get("IsSensitive")) or is_sensitive_env_var(env_key)
|
|
121
122
|
sanitized: dict[str, Any] = {}
|
|
122
123
|
for key, item in value.items():
|
|
123
124
|
key_text = str(key)
|
ksadk/cli/env_options.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
import os
|
|
4
5
|
import re
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
@@ -62,11 +63,93 @@ def resolve_explicit_env_vars(
|
|
|
62
63
|
env_pairs: tuple[str, ...] | list[str] | None,
|
|
63
64
|
base_dir: Path,
|
|
64
65
|
) -> dict[str, str]:
|
|
66
|
+
"""Resolve explicit env vars from ``--env-file``/``--env`` (no auto-``./.env``).
|
|
67
|
+
|
|
68
|
+
Used by the generic ``agentengine deploy``/``launch`` which read model
|
|
69
|
+
config from ``agentengine.yaml``, not from ``./.env``. Framework-specific
|
|
70
|
+
deploys (hermes/openclaw) use ``resolve_runtime_env_overrides`` instead,
|
|
71
|
+
which auto-discovers ``./.env`` and returns shell_keys for os.environ merge.
|
|
72
|
+
"""
|
|
65
73
|
env_vars = load_env_file(env_file, base_dir=base_dir)
|
|
66
74
|
env_vars.update(parse_env_pairs(env_pairs))
|
|
67
75
|
return env_vars
|
|
68
76
|
|
|
69
77
|
|
|
78
|
+
def apply_explicit_env_with_shell_priority(
|
|
79
|
+
base_env: dict[str, str],
|
|
80
|
+
cli_env: dict[str, str],
|
|
81
|
+
auto_dotenv: dict[str, str],
|
|
82
|
+
shell_keys: set[str],
|
|
83
|
+
) -> dict[str, str]:
|
|
84
|
+
"""Merge env into base with precedence: cli_env > shell > auto_dotenv.
|
|
85
|
+
|
|
86
|
+
``shell_keys`` is the snapshot of ``os.environ`` keys captured BEFORE any
|
|
87
|
+
env load. ``cli_env`` (``--env``/``--env-file``) is the highest explicit
|
|
88
|
+
CLI intent and overwrites everything. ``auto_dotenv`` (auto-discovered
|
|
89
|
+
``./.env``) only fills keys not already set by shell.
|
|
90
|
+
"""
|
|
91
|
+
for key, value in auto_dotenv.items():
|
|
92
|
+
if key in shell_keys:
|
|
93
|
+
continue
|
|
94
|
+
base_env.setdefault(key, value)
|
|
95
|
+
for key, value in cli_env.items():
|
|
96
|
+
base_env[key] = value
|
|
97
|
+
return base_env
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def inject_env_to_environ(
|
|
101
|
+
cli_env: dict[str, str],
|
|
102
|
+
auto_dotenv: dict[str, str],
|
|
103
|
+
shell_keys: set[str],
|
|
104
|
+
) -> int:
|
|
105
|
+
"""Apply env to ``os.environ`` with precedence: cli_env > shell > auto_dotenv.
|
|
106
|
+
|
|
107
|
+
``auto_dotenv`` only fills keys absent from shell (shell wins over auto
|
|
108
|
+
``./.env``). ``cli_env`` overwrites shell (explicit CLI intent wins).
|
|
109
|
+
Returns the number of keys injected from ``auto_dotenv`` (for user-facing
|
|
110
|
+
messages); ``cli_env`` overwrites are not counted.
|
|
111
|
+
"""
|
|
112
|
+
loaded = 0
|
|
113
|
+
for key, value in auto_dotenv.items():
|
|
114
|
+
if key in shell_keys:
|
|
115
|
+
continue
|
|
116
|
+
os.environ.setdefault(key, value)
|
|
117
|
+
loaded += 1
|
|
118
|
+
for key, value in cli_env.items():
|
|
119
|
+
os.environ[key] = value
|
|
120
|
+
return loaded
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def resolve_runtime_env_overrides(
|
|
124
|
+
*,
|
|
125
|
+
env_file: str | None,
|
|
126
|
+
extra_env: tuple[str, ...] | list[str] | None,
|
|
127
|
+
base_dir: Path,
|
|
128
|
+
) -> tuple[dict[str, str], dict[str, str], set[str], str | None]:
|
|
129
|
+
"""Resolve runtime env overrides with precedence ``--env > --env-file > shell > auto ./.env``.
|
|
130
|
+
|
|
131
|
+
Returns ``(cli_env, auto_dotenv, shell_keys, source)``:
|
|
132
|
+
- ``cli_env``: merged ``--env-file`` + ``--env`` (``--env`` wins); explicit
|
|
133
|
+
CLI intent, overwrites shell at merge time.
|
|
134
|
+
- ``auto_dotenv``: auto-discovered ``./.env`` (only when ``env_file`` is
|
|
135
|
+
None); does NOT overwrite shell.
|
|
136
|
+
- ``shell_keys``: snapshot of ``os.environ`` captured before any load.
|
|
137
|
+
- ``source``: the file path used (for user-facing messages) or ``None``.
|
|
138
|
+
"""
|
|
139
|
+
shell_keys = set(os.environ)
|
|
140
|
+
explicit_file_env = load_env_file(env_file, base_dir=base_dir) if env_file else {}
|
|
141
|
+
auto_dotenv: dict[str, str] = {}
|
|
142
|
+
auto_source: str | None = None
|
|
143
|
+
if not env_file:
|
|
144
|
+
auto_path = base_dir / ".env"
|
|
145
|
+
if auto_path.exists():
|
|
146
|
+
auto_dotenv = load_env_file(str(auto_path), base_dir=base_dir)
|
|
147
|
+
auto_source = str(auto_path)
|
|
148
|
+
pair_env = parse_env_pairs(extra_env)
|
|
149
|
+
cli_env = {**explicit_file_env, **pair_env}
|
|
150
|
+
return cli_env, auto_dotenv, shell_keys, env_file or auto_source
|
|
151
|
+
|
|
152
|
+
|
|
70
153
|
def env_options(func):
|
|
71
154
|
func = click.option(
|
|
72
155
|
"--env-file",
|
ksadk/cli/global_options.py
CHANGED
|
@@ -18,7 +18,9 @@ def ensure_global_cli_options(command: click.Command) -> click.Command:
|
|
|
18
18
|
"""Inject hidden common options into groups/commands that do not declare them locally."""
|
|
19
19
|
if not _has_long_option(command, "--dry-run"):
|
|
20
20
|
command.params.insert(0, build_dry_run_click_option(hidden=True, expose_value=False))
|
|
21
|
-
if not
|
|
21
|
+
if not getattr(command, "disable_global_output_option", False) and not _has_long_option(
|
|
22
|
+
command, "--output"
|
|
23
|
+
):
|
|
22
24
|
command.params.insert(0, build_output_click_option(hidden=True, expose_value=False))
|
|
23
25
|
if not _has_long_option(command, "--no-color"):
|
|
24
26
|
command.params.insert(0, build_no_color_click_option(hidden=True, expose_value=False))
|