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/api/environment.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Small control-plane payload helpers shared by Agent API operations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from ksadk.configs.env_registry import is_sensitive_env_var
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def environment_variables_payload(value: Any) -> list[dict[str, Any]]:
|
|
11
|
+
"""Normalize environment variables while preserving their sensitivity flag."""
|
|
12
|
+
|
|
13
|
+
if isinstance(value, dict):
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
"Key": str(key),
|
|
17
|
+
"Value": str(item),
|
|
18
|
+
"IsSensitive": is_sensitive_env_var(str(key)),
|
|
19
|
+
}
|
|
20
|
+
for key, item in value.items()
|
|
21
|
+
]
|
|
22
|
+
if isinstance(value, list):
|
|
23
|
+
return value
|
|
24
|
+
return []
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
__all__ = ["environment_variables_payload"]
|
ksadk/builders/code_builder.py
CHANGED
|
@@ -9,6 +9,7 @@ Code Builder - zip 打包模式构建
|
|
|
9
9
|
|
|
10
10
|
import ast
|
|
11
11
|
import hashlib
|
|
12
|
+
import importlib.metadata as importlib_metadata
|
|
12
13
|
import json
|
|
13
14
|
import os
|
|
14
15
|
import re
|
|
@@ -19,8 +20,9 @@ import threading
|
|
|
19
20
|
import time
|
|
20
21
|
import zipfile
|
|
21
22
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
23
|
+
from datetime import datetime, timezone
|
|
22
24
|
from pathlib import Path
|
|
23
|
-
from typing import List, Optional, Set
|
|
25
|
+
from typing import Any, List, Optional, Set
|
|
24
26
|
from urllib.parse import urlparse
|
|
25
27
|
from urllib.request import Request, urlopen
|
|
26
28
|
|
|
@@ -30,6 +32,7 @@ from packaging.requirements import InvalidRequirement, Requirement
|
|
|
30
32
|
from ksadk.builders.base import BaseBuilder, BuildResult
|
|
31
33
|
from ksadk.builders.framework_requirements import (
|
|
32
34
|
FASTAPI_REQUIREMENT,
|
|
35
|
+
STARLETTE_REQUIREMENT,
|
|
33
36
|
code_requirements_for_framework,
|
|
34
37
|
)
|
|
35
38
|
from ksadk.builders.requirements_utils import (
|
|
@@ -38,6 +41,154 @@ from ksadk.builders.requirements_utils import (
|
|
|
38
41
|
parse_requirements_text,
|
|
39
42
|
)
|
|
40
43
|
|
|
44
|
+
BUILD_INFO_SCHEMA = "ksadk-build-info/v1"
|
|
45
|
+
BUILD_INFO_ARCNAME = "ksadk/BUILD-INFO.json"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _sha256_file(path: Path) -> str:
|
|
49
|
+
digest = hashlib.sha256()
|
|
50
|
+
with open(path, "rb") as f:
|
|
51
|
+
for chunk in iter(lambda: f.read(1024 * 1024), b""):
|
|
52
|
+
digest.update(chunk)
|
|
53
|
+
return digest.hexdigest()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _bundled_content_fingerprint(files: List[Any]) -> str:
|
|
57
|
+
"""对 (relative, file_path) 列表计算确定性内容指纹。
|
|
58
|
+
|
|
59
|
+
指纹只依赖相对路径与逐文件 sha256,同一来源目录重复打包结果一致,
|
|
60
|
+
可用于在线上快速判断 zip 里的源码快照是否与某次构建/提交一致。
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
digest = hashlib.sha256()
|
|
64
|
+
digest.update(f"fingerprint:{BUILD_INFO_SCHEMA}\n".encode("utf-8"))
|
|
65
|
+
for relative, file_path in sorted(files, key=lambda item: item[0]):
|
|
66
|
+
digest.update(relative.encode("utf-8"))
|
|
67
|
+
digest.update(b"\0")
|
|
68
|
+
digest.update(_sha256_file(file_path).encode("ascii"))
|
|
69
|
+
digest.update(b"\n")
|
|
70
|
+
return digest.hexdigest()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _git_provenance(start: Path) -> Optional[dict]:
|
|
74
|
+
"""返回 start 所在 git 仓库的提交信息;非 git 目录返回 None。"""
|
|
75
|
+
|
|
76
|
+
def _git(*args: str) -> Optional[str]:
|
|
77
|
+
try:
|
|
78
|
+
proc = subprocess.run(
|
|
79
|
+
["git", "-C", str(start), *args],
|
|
80
|
+
capture_output=True,
|
|
81
|
+
text=True,
|
|
82
|
+
timeout=10,
|
|
83
|
+
)
|
|
84
|
+
except Exception:
|
|
85
|
+
return None
|
|
86
|
+
if proc.returncode != 0:
|
|
87
|
+
return None
|
|
88
|
+
return proc.stdout.strip()
|
|
89
|
+
|
|
90
|
+
toplevel = _git("rev-parse", "--show-toplevel")
|
|
91
|
+
if not toplevel:
|
|
92
|
+
return None
|
|
93
|
+
commit = _git("rev-parse", "HEAD")
|
|
94
|
+
branch = _git("rev-parse", "--abbrev-ref", "HEAD")
|
|
95
|
+
status = _git("status", "--porcelain")
|
|
96
|
+
return {
|
|
97
|
+
"repo_root": toplevel,
|
|
98
|
+
"commit": commit,
|
|
99
|
+
"branch": branch or None,
|
|
100
|
+
"dirty": bool(status),
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _package_provenance(package_name: str, package_root: Path) -> dict:
|
|
105
|
+
"""采集被 vendored 包的安装来源:dist 元信息 / 本地路径 / git 提交。"""
|
|
106
|
+
|
|
107
|
+
info: dict[str, Any] = {
|
|
108
|
+
"source_dir": str(package_root),
|
|
109
|
+
"dist_version": None,
|
|
110
|
+
"installer": None,
|
|
111
|
+
"direct_url": None,
|
|
112
|
+
"source_type": "unknown",
|
|
113
|
+
"git": None,
|
|
114
|
+
}
|
|
115
|
+
try:
|
|
116
|
+
dist = importlib_metadata.distribution(package_name)
|
|
117
|
+
except Exception:
|
|
118
|
+
dist = None
|
|
119
|
+
if dist is not None:
|
|
120
|
+
info["dist_version"] = dist.version
|
|
121
|
+
installer = (dist.read_text("INSTALLER") or "").strip()
|
|
122
|
+
info["installer"] = installer or None
|
|
123
|
+
raw_direct_url = dist.read_text("direct_url.json")
|
|
124
|
+
if raw_direct_url:
|
|
125
|
+
try:
|
|
126
|
+
direct_url = json.loads(raw_direct_url)
|
|
127
|
+
except ValueError:
|
|
128
|
+
direct_url = None
|
|
129
|
+
if isinstance(direct_url, dict):
|
|
130
|
+
info["direct_url"] = direct_url.get("url")
|
|
131
|
+
url = str(direct_url.get("url") or "")
|
|
132
|
+
dir_info = direct_url.get("dir_info") or {}
|
|
133
|
+
archive_info = direct_url.get("archive_info") or {}
|
|
134
|
+
if url.startswith("file://"):
|
|
135
|
+
if dir_info.get("editable"):
|
|
136
|
+
info["source_type"] = "editable-install"
|
|
137
|
+
elif url.endswith(".whl"):
|
|
138
|
+
info["source_type"] = "local-wheel"
|
|
139
|
+
else:
|
|
140
|
+
info["source_type"] = "local-path"
|
|
141
|
+
elif archive_info:
|
|
142
|
+
info["source_type"] = "remote-dist"
|
|
143
|
+
if info["direct_url"] is None and info["dist_version"] is not None:
|
|
144
|
+
# pip 从 index 安装的常规 dist 通常不写 direct_url.json
|
|
145
|
+
info["source_type"] = "installed-dist"
|
|
146
|
+
if info["source_type"] in {"editable-install", "local-path", "unknown"}:
|
|
147
|
+
info["git"] = _git_provenance(package_root)
|
|
148
|
+
return info
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def build_bundled_source_manifest(
|
|
152
|
+
package_roots: dict,
|
|
153
|
+
bundled_files: List[Any],
|
|
154
|
+
) -> dict:
|
|
155
|
+
"""生成随 zip 下发的 BUILD-INFO 内容。
|
|
156
|
+
|
|
157
|
+
- ``package_roots``: {package_name: 源码目录}
|
|
158
|
+
- ``bundled_files``: _iter_bundled_source_files() 的 (name, relative, path) 三元组
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
grouped: dict[str, List[Any]] = {}
|
|
162
|
+
for package_name, relative, file_path in bundled_files:
|
|
163
|
+
grouped.setdefault(package_name, []).append((relative, file_path))
|
|
164
|
+
|
|
165
|
+
packages: dict[str, Any] = {}
|
|
166
|
+
for package_name, files in sorted(grouped.items()):
|
|
167
|
+
package_root = package_roots.get(package_name)
|
|
168
|
+
provenance = (
|
|
169
|
+
_package_provenance(package_name, package_root)
|
|
170
|
+
if package_root is not None
|
|
171
|
+
else {"source_dir": None, "source_type": "unknown"}
|
|
172
|
+
)
|
|
173
|
+
packages[package_name] = {
|
|
174
|
+
**provenance,
|
|
175
|
+
"file_count": len(files),
|
|
176
|
+
"content_fingerprint_sha256": _bundled_content_fingerprint(files),
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
"schema": BUILD_INFO_SCHEMA,
|
|
181
|
+
"built_at": datetime.now(timezone.utc).isoformat(timespec="seconds"),
|
|
182
|
+
"packages": packages,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
_NONRELEASE_SOURCE_TYPES = {"editable-install", "local-path", "local-wheel", "unknown"}
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _is_release_like_source(provenance: dict) -> bool:
|
|
190
|
+
return provenance.get("source_type") in {"installed-dist", "remote-dist"}
|
|
191
|
+
|
|
41
192
|
|
|
42
193
|
class CodeBuilder(BaseBuilder):
|
|
43
194
|
"""Code 模式构建器 - 打包 zip + 依赖"""
|
|
@@ -111,10 +262,14 @@ class CodeBuilder(BaseBuilder):
|
|
|
111
262
|
}
|
|
112
263
|
BUNDLED_KSADK_CORE_RUNTIME_REQUIREMENTS = (
|
|
113
264
|
"a2a-sdk>=0.3.22",
|
|
265
|
+
"culsans>=0.11.0",
|
|
114
266
|
"httpx-sse>=0.4.0",
|
|
115
267
|
"sse-starlette>=2.1.0",
|
|
116
268
|
"python-multipart>=0.0.9,<1.0.0",
|
|
117
269
|
"requests>=2.28.0",
|
|
270
|
+
"sqlalchemy>=2.0.0",
|
|
271
|
+
"aiosqlite>=0.19.0",
|
|
272
|
+
"greenlet>=3.0.0",
|
|
118
273
|
"requests-aws4auth>=1.2.0",
|
|
119
274
|
"kingsoftcloud-sdk-python>=1.5.8.94",
|
|
120
275
|
"cryptography>=44.0.0",
|
|
@@ -224,6 +379,7 @@ class CodeBuilder(BaseBuilder):
|
|
|
224
379
|
self._save_input_fingerprint(zip_path, detection_result)
|
|
225
380
|
zip_size = zip_path.stat().st_size / (1024 * 1024)
|
|
226
381
|
click.secho(f"\n✅ 使用已有构建: {zip_path.name} ({zip_size:.2f} MB)", fg="green")
|
|
382
|
+
self._emit_bundled_ksadk_identity(zip_path)
|
|
227
383
|
click.echo(
|
|
228
384
|
" (如需只重新打包当前代码/runtime,请使用 --repackage;"
|
|
229
385
|
"如需重装依赖,请使用 --no-cache)"
|
|
@@ -270,6 +426,7 @@ class CodeBuilder(BaseBuilder):
|
|
|
270
426
|
package_started_at = time.monotonic()
|
|
271
427
|
self._package_zip(zip_path, detection_result)
|
|
272
428
|
click.echo(f" ✓ 打包耗时: {self._format_elapsed(package_started_at)}")
|
|
429
|
+
self._emit_bundled_ksadk_identity(zip_path)
|
|
273
430
|
self._save_input_fingerprint(zip_path, detection_result)
|
|
274
431
|
|
|
275
432
|
zip_size = zip_path.stat().st_size
|
|
@@ -652,15 +809,18 @@ class CodeBuilder(BaseBuilder):
|
|
|
652
809
|
"file_digests": file_digests,
|
|
653
810
|
}
|
|
654
811
|
|
|
655
|
-
def
|
|
812
|
+
def _bundled_source_package_roots(self) -> dict:
|
|
656
813
|
import ksadk
|
|
657
814
|
import ksadk_runtime_common
|
|
658
815
|
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
"ksadk_runtime_common",
|
|
662
|
-
|
|
663
|
-
|
|
816
|
+
return {
|
|
817
|
+
"ksadk": Path(ksadk.__file__).resolve().parent,
|
|
818
|
+
"ksadk_runtime_common": Path(ksadk_runtime_common.__file__).resolve().parent,
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
def _iter_bundled_source_files(self):
|
|
822
|
+
for package_name, package_root in self._bundled_source_package_roots().items():
|
|
823
|
+
yield from self._iter_bundled_source_package(package_name, package_root)
|
|
664
824
|
|
|
665
825
|
def _iter_bundled_source_package(self, package_name: str, package_root: Path):
|
|
666
826
|
for file_path in sorted(package_root.rglob("*")):
|
|
@@ -680,6 +840,32 @@ class CodeBuilder(BaseBuilder):
|
|
|
680
840
|
parts = relative_path.parts
|
|
681
841
|
return len(parts) >= 2 and parts[0] == "server" and parts[1] == "web-ui"
|
|
682
842
|
|
|
843
|
+
def _warn_on_nonrelease_bundled_source(self, build_info: dict) -> None:
|
|
844
|
+
"""vendored ksadk 源码来自本地路径/editable/来源不明时给出醒目提示。
|
|
845
|
+
|
|
846
|
+
历史事故:打包机 environment 里的 ksadk 是正式 release 之前的 dev 快照,
|
|
847
|
+
vendored 进 zip 上线后 runtime 行为与正式版不一致且无从追溯。
|
|
848
|
+
"""
|
|
849
|
+
|
|
850
|
+
for package_name, package_info in (build_info.get("packages") or {}).items():
|
|
851
|
+
if _is_release_like_source(package_info):
|
|
852
|
+
continue
|
|
853
|
+
source_desc = (
|
|
854
|
+
f"type={package_info.get('source_type')} " f"dir={package_info.get('source_dir')}"
|
|
855
|
+
)
|
|
856
|
+
git_info = package_info.get("git") or {}
|
|
857
|
+
if git_info.get("commit"):
|
|
858
|
+
dirty = " (有未提交改动)" if git_info.get("dirty") else ""
|
|
859
|
+
source_desc += (
|
|
860
|
+
f" git={git_info.get('branch') or '?'}@{str(git_info['commit'])[:12]}{dirty}"
|
|
861
|
+
)
|
|
862
|
+
click.secho(
|
|
863
|
+
f" ⚠ 打包进 zip 的 {package_name} 不是正式发行版来源 ({source_desc})。"
|
|
864
|
+
"若这不是有意为之,请先用官方渠道的正式版本重装后再打包; "
|
|
865
|
+
f"解压 zip 后查看 {BUILD_INFO_ARCNAME} 可核对来源与内容指纹。",
|
|
866
|
+
fg="yellow",
|
|
867
|
+
)
|
|
868
|
+
|
|
683
869
|
def _iter_project_files(self):
|
|
684
870
|
for item in sorted(self.project_dir.iterdir(), key=lambda p: p.name):
|
|
685
871
|
if self._should_skip_root_path(item):
|
|
@@ -796,17 +982,18 @@ class CodeBuilder(BaseBuilder):
|
|
|
796
982
|
deps = [
|
|
797
983
|
# Core
|
|
798
984
|
FASTAPI_REQUIREMENT,
|
|
985
|
+
STARLETTE_REQUIREMENT,
|
|
799
986
|
"uvicorn>=0.23.0",
|
|
800
987
|
"python-dotenv>=1.0.0",
|
|
801
988
|
"pydantic>=2.0.0",
|
|
802
989
|
"pyyaml>=6.0.0",
|
|
803
990
|
"httpx>=0.24.0",
|
|
804
|
-
# Tracing
|
|
991
|
+
# Tracing — OTLP 双写收敛:只用 OTel + openinference 自动插桩,
|
|
992
|
+
# 不再安装 Langfuse SDK(callback 路径已删除,Langfuse 通过标准 OTLP 接收)。
|
|
805
993
|
"opentelemetry-api>=1.37.0",
|
|
806
994
|
"opentelemetry-sdk>=1.37.0",
|
|
807
995
|
"opentelemetry-exporter-otlp>=1.37.0",
|
|
808
996
|
"openinference-instrumentation-langchain>=0.1.0",
|
|
809
|
-
"langfuse>=2.0.0",
|
|
810
997
|
]
|
|
811
998
|
|
|
812
999
|
framework = detection_result.type.value
|
|
@@ -1611,6 +1798,26 @@ class CodeBuilder(BaseBuilder):
|
|
|
1611
1798
|
)
|
|
1612
1799
|
self._finish_package_progress()
|
|
1613
1800
|
|
|
1801
|
+
# This provenance module is written after the bundled source so a
|
|
1802
|
+
# Code archive can attest to the KsADK source it actually imports.
|
|
1803
|
+
# It deliberately comes from local package bytes / Git only; no
|
|
1804
|
+
# environment value is copied into the archive.
|
|
1805
|
+
zf.writestr(
|
|
1806
|
+
"ksadk/_bundle_identity.py",
|
|
1807
|
+
self._bundle_runtime_identity_source(bundled_source_files),
|
|
1808
|
+
)
|
|
1809
|
+
# 写入 runtime 来源清单:排查"zip 里 vendored 的 ksadk 到底是什么快照"时,
|
|
1810
|
+
# 解压 ksadk/BUILD-INFO.json 即可看到来源/版本/commit/内容指纹,不用进 pod 翻文件。
|
|
1811
|
+
build_info = build_bundled_source_manifest(
|
|
1812
|
+
self._bundled_source_package_roots(),
|
|
1813
|
+
bundled_source_files,
|
|
1814
|
+
)
|
|
1815
|
+
zf.writestr(
|
|
1816
|
+
BUILD_INFO_ARCNAME,
|
|
1817
|
+
json.dumps(build_info, ensure_ascii=False, indent=2, sort_keys=True) + "\n",
|
|
1818
|
+
)
|
|
1819
|
+
self._warn_on_nonrelease_bundled_source(build_info)
|
|
1820
|
+
|
|
1614
1821
|
click.echo(f" ✓ 打包运行时源码: {bundled_source_count} 个文件")
|
|
1615
1822
|
|
|
1616
1823
|
# 添加 entrypoint
|
|
@@ -1620,6 +1827,75 @@ class CodeBuilder(BaseBuilder):
|
|
|
1620
1827
|
click.echo(f" ✓ 打包完成: {len(project_files)} 个项目文件 + {deps_count} 个依赖文件")
|
|
1621
1828
|
self._emit_package_size_report(zip_path)
|
|
1622
1829
|
|
|
1830
|
+
def _bundle_runtime_identity_source(self, bundled_source_files) -> str:
|
|
1831
|
+
"""Generate package-local provenance for a Code archive."""
|
|
1832
|
+
|
|
1833
|
+
digest = hashlib.sha256()
|
|
1834
|
+
for package_name, relative, file_path in bundled_source_files:
|
|
1835
|
+
if package_name != "ksadk":
|
|
1836
|
+
continue
|
|
1837
|
+
digest.update(relative.encode("utf-8"))
|
|
1838
|
+
digest.update(b"\0")
|
|
1839
|
+
digest.update(file_path.read_bytes())
|
|
1840
|
+
digest.update(b"\0")
|
|
1841
|
+
|
|
1842
|
+
import ksadk
|
|
1843
|
+
from ksadk.version import VERSION
|
|
1844
|
+
|
|
1845
|
+
source_root = Path(ksadk.__file__).resolve().parent
|
|
1846
|
+
commit = ""
|
|
1847
|
+
try:
|
|
1848
|
+
result = subprocess.run(
|
|
1849
|
+
["git", "-C", str(source_root.parent), "rev-parse", "HEAD"],
|
|
1850
|
+
capture_output=True,
|
|
1851
|
+
check=True,
|
|
1852
|
+
text=True,
|
|
1853
|
+
timeout=3,
|
|
1854
|
+
)
|
|
1855
|
+
candidate = result.stdout.strip().lower()
|
|
1856
|
+
if re.fullmatch(r"[0-9a-f]{40,64}", candidate):
|
|
1857
|
+
commit = candidate
|
|
1858
|
+
except (OSError, subprocess.SubprocessError):
|
|
1859
|
+
pass
|
|
1860
|
+
|
|
1861
|
+
payload = {
|
|
1862
|
+
"ksadk_version": VERSION,
|
|
1863
|
+
"ksadk_commit": commit,
|
|
1864
|
+
"ksadk_source_digest": digest.hexdigest(),
|
|
1865
|
+
}
|
|
1866
|
+
return (
|
|
1867
|
+
"# Generated by KsADK CodeBuilder; do not edit.\n"
|
|
1868
|
+
f"BUNDLE_IDENTITY = {payload!r}\n"
|
|
1869
|
+
)
|
|
1870
|
+
|
|
1871
|
+
def _emit_bundled_ksadk_identity(self, zip_path: Path) -> None:
|
|
1872
|
+
"""Print the KsADK provenance embedded in *this exact* Code archive.
|
|
1873
|
+
|
|
1874
|
+
The code archive shadows packages from the base image. Reading the
|
|
1875
|
+
generated archive back here prevents a build log from accidentally
|
|
1876
|
+
describing the local CLI environment instead of what will run in the
|
|
1877
|
+
workload.
|
|
1878
|
+
"""
|
|
1879
|
+
|
|
1880
|
+
try:
|
|
1881
|
+
with zipfile.ZipFile(zip_path) as zf:
|
|
1882
|
+
source = zf.read("ksadk/_bundle_identity.py").decode("utf-8")
|
|
1883
|
+
_prefix, raw_payload = source.split("=", 1)
|
|
1884
|
+
identity = ast.literal_eval(raw_payload.strip())
|
|
1885
|
+
except (OSError, KeyError, UnicodeDecodeError, ValueError, SyntaxError):
|
|
1886
|
+
click.secho(" ⚠ 未能读取 ZIP 内的 KsADK 来源信息", fg="yellow")
|
|
1887
|
+
return
|
|
1888
|
+
|
|
1889
|
+
if not isinstance(identity, dict):
|
|
1890
|
+
click.secho(" ⚠ ZIP 内的 KsADK 来源信息格式无效", fg="yellow")
|
|
1891
|
+
return
|
|
1892
|
+
version = str(identity.get("ksadk_version") or "unknown")
|
|
1893
|
+
commit = str(identity.get("ksadk_commit") or "unavailable")
|
|
1894
|
+
source_digest = str(identity.get("ksadk_source_digest") or "unavailable")
|
|
1895
|
+
click.echo(f" KsADK: version={version}")
|
|
1896
|
+
click.echo(f" KsADK source: commit={commit}")
|
|
1897
|
+
click.echo(f" KsADK source digest: sha256={source_digest}")
|
|
1898
|
+
|
|
1623
1899
|
def _emit_package_size_report(self, zip_path: Path, *, limit: int = 8) -> None:
|
|
1624
1900
|
try:
|
|
1625
1901
|
with zipfile.ZipFile(zip_path, "r") as zf:
|
|
@@ -1735,6 +2011,9 @@ class CodeBuilder(BaseBuilder):
|
|
|
1735
2011
|
def _generate_entrypoint(self, detection_result) -> str:
|
|
1736
2012
|
"""生成 entrypoint.py"""
|
|
1737
2013
|
package_name = Path(detection_result.package_path).name
|
|
2014
|
+
runtime_config_json = json.dumps(
|
|
2015
|
+
self._load_config(), ensure_ascii=False, separators=(",", ":"), default=str
|
|
2016
|
+
)
|
|
1738
2017
|
return f'''"""
|
|
1739
2018
|
AgentEngine Code 模式入口
|
|
1740
2019
|
|
|
@@ -1748,6 +2027,7 @@ zip 包结构:
|
|
|
1748
2027
|
import sys
|
|
1749
2028
|
import os
|
|
1750
2029
|
import logging
|
|
2030
|
+
import json
|
|
1751
2031
|
from pathlib import Path
|
|
1752
2032
|
|
|
1753
2033
|
# ========== 日志配置 ==========
|
|
@@ -1808,15 +2088,11 @@ logger.info(f"PYTHONPATH: {{os.environ.get('PYTHONPATH', 'N/A')}}")
|
|
|
1808
2088
|
# 打印关键环境变量 (隐藏敏感信息)
|
|
1809
2089
|
env_keys = [
|
|
1810
2090
|
"AGENT_RUNTIME_NAME", "AGENT_RUNTIME_ID", "ACCOUNT_ID", "PORT",
|
|
1811
|
-
"LANGFUSE_BASE_URL", "LANGFUSE_HOST", "LANGFUSE_PUBLIC_KEY",
|
|
1812
|
-
"LANGFUSE_SECRET_KEY", "LANGFUSE_USE_CALLBACK",
|
|
1813
2091
|
"OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
|
|
1814
2092
|
"OTEL_EXPORTER_OTLP_HEADERS", "OTEL_EXPORTER_OTLP_TRACES_HEADERS",
|
|
1815
|
-
"OTEL_SERVICE_NAME",
|
|
1816
|
-
"
|
|
1817
|
-
"
|
|
1818
|
-
"CLOUD_MONITOR_LANGFUSE_HOST", "CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY",
|
|
1819
|
-
"CLOUD_MONITOR_LANGFUSE_SECRET_KEY", "CLOUD_MONITOR_LANGFUSE_ENABLED",
|
|
2093
|
+
"OTEL_SERVICE_NAME",
|
|
2094
|
+
"CLOUD_MONITOR_OTLP_ENDPOINT", "CLOUD_MONITOR_OTLP_TRACES_ENDPOINT",
|
|
2095
|
+
"CLOUD_MONITOR_OTLP_HEADERS", "CLOUD_MONITOR_OTLP_TRACES_HEADERS",
|
|
1820
2096
|
"LANGCHAIN_TRACING_V2", "MODEL_NAME",
|
|
1821
2097
|
]
|
|
1822
2098
|
for key in env_keys:
|
|
@@ -1833,15 +2109,9 @@ logger.info("=" * 60)
|
|
|
1833
2109
|
from ksadk.configs import setup_environment
|
|
1834
2110
|
setup_environment(Path(CODE_ROOT))
|
|
1835
2111
|
|
|
1836
|
-
try:
|
|
1837
|
-
from ksadk.runners.patch_langchain import apply_patch as apply_langchain_patch
|
|
1838
|
-
apply_langchain_patch()
|
|
1839
|
-
except ImportError:
|
|
1840
|
-
pass
|
|
1841
|
-
|
|
1842
|
-
from ksadk.runners import create_runner
|
|
1843
2112
|
from ksadk.detection import DetectionResult, FrameworkType
|
|
1844
|
-
from ksadk.
|
|
2113
|
+
from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext, build_default_runtime_registry
|
|
2114
|
+
from ksadk.server import RuntimeAppConfig, configure_runtime_app, create_runtime_app
|
|
1845
2115
|
import uvicorn
|
|
1846
2116
|
|
|
1847
2117
|
# 检测结果 (构建时固化)
|
|
@@ -1851,57 +2121,86 @@ detection_result = DetectionResult(
|
|
|
1851
2121
|
entry_point="{detection_result.entry_point}",
|
|
1852
2122
|
package_path=os.path.join(CODE_ROOT, "{package_name}"),
|
|
1853
2123
|
agent_variable="{detection_result.agent_variable}",
|
|
1854
|
-
runner_class="{getattr(detection_result,
|
|
2124
|
+
runner_class="{getattr(detection_result, "runner_class", "")}"
|
|
1855
2125
|
)
|
|
1856
2126
|
|
|
1857
2127
|
logger.info(f"框架: {{detection_result.name}}")
|
|
1858
2128
|
logger.info(f"入口: {{detection_result.entry_point}}")
|
|
1859
2129
|
|
|
1860
|
-
# 初始化 Tracing (
|
|
2130
|
+
# 初始化 Tracing (如果配置了标准 OTLP HTTP 或 CloudMonitor OTLP)
|
|
1861
2131
|
has_otlp = bool(
|
|
1862
2132
|
os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT")
|
|
1863
2133
|
or os.environ.get("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")
|
|
1864
2134
|
)
|
|
1865
2135
|
has_cloud_monitor_otlp = bool(
|
|
1866
|
-
os.environ.get("
|
|
2136
|
+
os.environ.get("CLOUD_MONITOR_OTLP_TRACES_HEADERS")
|
|
2137
|
+
or os.environ.get("CLOUD_MONITOR_OTLP_HEADERS")
|
|
1867
2138
|
or os.environ.get("CLOUD_MONITOR_OTLP_ENDPOINT")
|
|
1868
2139
|
or os.environ.get("CLOUD_MONITOR_OTLP_TRACES_ENDPOINT")
|
|
2140
|
+
or os.environ.get("CLOUD_MONITOR_APP_KEY")
|
|
1869
2141
|
)
|
|
1870
|
-
|
|
1871
|
-
os.environ.get("CLOUD_MONITOR_LANGFUSE_PUBLIC_KEY")
|
|
1872
|
-
or os.environ.get("CLOUD_MONITOR_LANGFUSE_SECRET_KEY")
|
|
1873
|
-
or os.environ.get("CLOUD_MONITOR_LANGFUSE_HOST")
|
|
1874
|
-
)
|
|
1875
|
-
if (
|
|
1876
|
-
os.environ.get("LANGFUSE_PUBLIC_KEY")
|
|
1877
|
-
or has_otlp
|
|
1878
|
-
or has_cloud_monitor_otlp
|
|
1879
|
-
or has_cloud_monitor_langfuse
|
|
1880
|
-
):
|
|
2142
|
+
if has_otlp or has_cloud_monitor_otlp:
|
|
1881
2143
|
try:
|
|
1882
2144
|
from ksadk.tracing import setup_tracing
|
|
1883
2145
|
|
|
1884
|
-
|
|
1885
|
-
os.environ.get("LANGFUSE_USE_CALLBACK", "").strip().lower()
|
|
1886
|
-
in ("1", "true", "yes", "on")
|
|
1887
|
-
)
|
|
1888
|
-
|
|
1889
|
-
setup_tracing(use_callback_only=use_callback_only)
|
|
2146
|
+
setup_tracing()
|
|
1890
2147
|
logger.info(
|
|
1891
2148
|
f"Tracing 已启用 (OTLP={{has_otlp}}, "
|
|
1892
|
-
f"CloudMonitorOTLP={{has_cloud_monitor_otlp}}
|
|
1893
|
-
f"CloudMonitorLangfuse={{has_cloud_monitor_langfuse}}, "
|
|
1894
|
-
f"CallbackOnly={{use_callback_only}})"
|
|
2149
|
+
f"CloudMonitorOTLP={{has_cloud_monitor_otlp}})"
|
|
1895
2150
|
)
|
|
1896
2151
|
except Exception as e:
|
|
1897
2152
|
logger.warning(f"Tracing 初始化失败: {{e}}")
|
|
1898
2153
|
|
|
1899
|
-
#
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
2154
|
+
# 只装配统一 RuntimeAdapter 执行链;具体 Adapter 在请求开始时由 Registry 创建。
|
|
2155
|
+
runtime_build_config = json.loads({runtime_config_json!r})
|
|
2156
|
+
runtime_context = RuntimeLaunchContext(
|
|
2157
|
+
runtime_type=detection_result.type.value,
|
|
2158
|
+
project_dir=Path(CODE_ROOT),
|
|
2159
|
+
detection=detection_result,
|
|
2160
|
+
config=dict(runtime_build_config),
|
|
2161
|
+
)
|
|
2162
|
+
# managed A2A:KSADK_A2A_RUNTIME_ID 非空时挂 discovery card + 完整数据面 route。
|
|
2163
|
+
_managed_a2a_card = None
|
|
2164
|
+
_a2a_config = None
|
|
2165
|
+
_a2a_adapter = None
|
|
2166
|
+
if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
|
|
2167
|
+
from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
|
|
2168
|
+
|
|
2169
|
+
_managed_a2a_card = build_managed_a2a_card_if_configured()
|
|
2170
|
+
try:
|
|
2171
|
+
from ksadk.a2a.routes import A2AConfig
|
|
2172
|
+
from ksadk.runtime.factory import create_runtime_adapter
|
|
2173
|
+
|
|
2174
|
+
_a2a_adapter = create_runtime_adapter(runtime_context)
|
|
2175
|
+
_base = (
|
|
2176
|
+
os.environ.get("KSADK_A2A_INTERNAL_BASE_URL", "").strip()
|
|
2177
|
+
or "http://localhost:8080"
|
|
2178
|
+
)
|
|
2179
|
+
_a2a_config = A2AConfig(
|
|
2180
|
+
enabled=True,
|
|
2181
|
+
base_url=_base,
|
|
2182
|
+
agent_name=(
|
|
2183
|
+
os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
|
|
2184
|
+
or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
|
|
2185
|
+
),
|
|
2186
|
+
streaming=True,
|
|
2187
|
+
task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
|
|
2188
|
+
)
|
|
2189
|
+
except Exception as _e:
|
|
2190
|
+
logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
|
|
2191
|
+
_a2a_config = None
|
|
2192
|
+
_a2a_adapter = None
|
|
2193
|
+
app = create_runtime_app(
|
|
2194
|
+
RuntimeAppConfig(
|
|
2195
|
+
runtime_type=detection_result.type.value,
|
|
2196
|
+
runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
|
|
2197
|
+
launch_context=runtime_context,
|
|
2198
|
+
a2a=_a2a_config or _managed_a2a_card,
|
|
2199
|
+
a2a_runtime_adapter=_a2a_adapter,
|
|
2200
|
+
),
|
|
2201
|
+
configure_runtime_app,
|
|
2202
|
+
)
|
|
2203
|
+
logger.info("RuntimeAdapter 执行链装配成功!")
|
|
1905
2204
|
|
|
1906
2205
|
if __name__ == "__main__":
|
|
1907
2206
|
port = int(os.environ.get("PORT", 8080))
|