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/knowledge_base/client.py
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
环境变量:
|
|
7
7
|
KSADK_KB_DATASET_ID: 知识库 ID (必填,存在即启用)
|
|
8
|
-
KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY)
|
|
9
|
-
KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY)
|
|
8
|
+
KSADK_KB_ACCESS_KEY: AK (可选,默认取 KSYUN_ACCESS_KEY / KSYUN_ACCESS_KEY_ID)
|
|
9
|
+
KSADK_KB_SECRET_KEY: SK (可选,默认取 KSYUN_SECRET_KEY / KSYUN_SECRET_ACCESS_KEY)
|
|
10
|
+
KSADK_KB_SESSION_TOKEN: STS 临时会话 token (可选,默认取 KSYUN_SESSION_TOKEN)
|
|
10
11
|
KSADK_KB_REGION: 区域 (默认 cn-beijing-6)
|
|
11
12
|
KSADK_KB_ENDPOINT: API 端点 (默认 aicp.api.ksyun.com)
|
|
12
13
|
KSADK_KB_TOP_K: 返回结果数 (默认 5)
|
|
@@ -59,6 +60,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
59
60
|
dataset_id: 知识库 ID (DatasetId)
|
|
60
61
|
access_key: 访问密钥 ID (AK)
|
|
61
62
|
secret_key: 访问密钥 (SK)
|
|
63
|
+
session_token: STS 临时会话 token
|
|
62
64
|
region: API 区域
|
|
63
65
|
endpoint: API 端点
|
|
64
66
|
top_k: 返回结果数
|
|
@@ -71,6 +73,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
71
73
|
dataset_id: str
|
|
72
74
|
access_key: str = ""
|
|
73
75
|
secret_key: str = ""
|
|
76
|
+
session_token: str = ""
|
|
74
77
|
region: str = "cn-beijing-6"
|
|
75
78
|
endpoint: str = "aicp.api.ksyun.com"
|
|
76
79
|
scheme: str = "https"
|
|
@@ -79,6 +82,10 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
79
82
|
score_threshold: float = 0.0
|
|
80
83
|
score_threshold_enabled: bool = False
|
|
81
84
|
reranking_enable: bool = False
|
|
85
|
+
# 最近一次检索失败原因(成功调用前置空,失败时填充)。供
|
|
86
|
+
# KnowledgeBaseService.build_context 区分"后端吞错返空"与"真无结果",
|
|
87
|
+
# 避免错误伪装成"未找到"注入模型上下文。
|
|
88
|
+
last_error: str = ""
|
|
82
89
|
|
|
83
90
|
_aicp_client: Any = None
|
|
84
91
|
|
|
@@ -133,7 +140,9 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
133
140
|
"Ensure kingsoftcloud-sdk-python is installed and up to date."
|
|
134
141
|
)
|
|
135
142
|
|
|
136
|
-
cred = credential.Credential(
|
|
143
|
+
cred = credential.Credential(
|
|
144
|
+
self.access_key, self.secret_key, self.session_token or None
|
|
145
|
+
)
|
|
137
146
|
|
|
138
147
|
http_profile = HttpProfile()
|
|
139
148
|
http_profile.endpoint = self.endpoint
|
|
@@ -183,6 +192,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
183
192
|
try:
|
|
184
193
|
data = json.loads(response) if isinstance(response, str) else response
|
|
185
194
|
except (json.JSONDecodeError, TypeError):
|
|
195
|
+
self.last_error = f"Failed to parse response: {str(response)[:200]}"
|
|
186
196
|
logger.error(f"Failed to parse response: {str(response)[:200]}")
|
|
187
197
|
return []
|
|
188
198
|
|
|
@@ -225,6 +235,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
225
235
|
f"Searching knowledge base: dataset_id={self.dataset_id}, " f"query='{query[:50]}'"
|
|
226
236
|
)
|
|
227
237
|
|
|
238
|
+
self.last_error = ""
|
|
228
239
|
try:
|
|
229
240
|
response = client.call("RetrieveKnowledge", params, options={"IsPostJson": True})
|
|
230
241
|
results = self._parse_response(response)
|
|
@@ -233,6 +244,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
233
244
|
)
|
|
234
245
|
return results
|
|
235
246
|
except Exception as e:
|
|
247
|
+
self.last_error = str(e)
|
|
236
248
|
logger.error(f"Knowledge base search failed: {e}")
|
|
237
249
|
raise
|
|
238
250
|
|
|
@@ -255,12 +267,17 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
255
267
|
access_key = (
|
|
256
268
|
os.environ.get("KSADK_KB_ACCESS_KEY")
|
|
257
269
|
or os.environ.get("KSYUN_ACCESS_KEY")
|
|
270
|
+
or os.environ.get("KSYUN_ACCESS_KEY_ID")
|
|
258
271
|
or os.environ.get("KSYUN_SECRET_ID", "")
|
|
259
272
|
)
|
|
260
273
|
secret_key = (
|
|
261
274
|
os.environ.get("KSADK_KB_SECRET_KEY")
|
|
262
275
|
or os.environ.get("KSYUN_SECRET_KEY")
|
|
263
|
-
or os.environ.get("
|
|
276
|
+
or os.environ.get("KSYUN_SECRET_ACCESS_KEY", "")
|
|
277
|
+
)
|
|
278
|
+
session_token = (
|
|
279
|
+
os.environ.get("KSADK_KB_SESSION_TOKEN")
|
|
280
|
+
or os.environ.get("KSYUN_SESSION_TOKEN", "")
|
|
264
281
|
)
|
|
265
282
|
|
|
266
283
|
score_threshold_str = os.environ.get("KSADK_KB_SCORE_THRESHOLD", "")
|
|
@@ -275,6 +292,7 @@ class KnowledgeBaseClient(BaseModel):
|
|
|
275
292
|
dataset_id=dataset_id,
|
|
276
293
|
access_key=access_key,
|
|
277
294
|
secret_key=secret_key,
|
|
295
|
+
session_token=session_token,
|
|
278
296
|
region=connection["region"],
|
|
279
297
|
endpoint=connection["endpoint"],
|
|
280
298
|
scheme=connection["scheme"],
|
ksadk/knowledge_base/service.py
CHANGED
|
@@ -44,6 +44,15 @@ class KnowledgeBaseService:
|
|
|
44
44
|
self._client = KnowledgeBaseClient.from_env()
|
|
45
45
|
return self._client
|
|
46
46
|
|
|
47
|
+
@property
|
|
48
|
+
def last_error(self) -> str:
|
|
49
|
+
"""最近一次检索失败原因(成功前置空,失败填充;含响应解析失败)。
|
|
50
|
+
|
|
51
|
+
供 ``build_context`` 区分"后端吞错/解析失败返空"与"真无结果"。
|
|
52
|
+
客户端尚未懒加载时视为无错误。
|
|
53
|
+
"""
|
|
54
|
+
return str(getattr(self._client, "last_error", "") or "")
|
|
55
|
+
|
|
47
56
|
def search(self, query: str, top_k: Optional[int] = None) -> list[KnowledgeBaseResult]:
|
|
48
57
|
return self._get_client().search(query, top_k)
|
|
49
58
|
|
|
@@ -54,13 +63,31 @@ class KnowledgeBaseService:
|
|
|
54
63
|
logger.error("search_knowledge failed: %s", exc)
|
|
55
64
|
return f"知识库检索失败: {exc}"
|
|
56
65
|
|
|
57
|
-
def build_context(
|
|
66
|
+
def build_context(
|
|
67
|
+
self,
|
|
68
|
+
query: str,
|
|
69
|
+
top_k: Optional[int] = None,
|
|
70
|
+
) -> dict[str, str] | None:
|
|
71
|
+
"""构造环境知识库上下文。失败时返回 ``formatted_text=""`` + 独立 ``error`` 字段,
|
|
72
|
+
不把错误字符串塞进 ``formatted_text``(避免错误伪装成知识库正文注入模型)。
|
|
73
|
+
|
|
74
|
+
- 检索抛错(网络/鉴权失败)→ except 捕获,返 ``error`` 字段。
|
|
75
|
+
- 响应解析失败返空列表(``_parse_response``)→ client ``last_error`` 非空,
|
|
76
|
+
返回 ``error`` 字段。
|
|
77
|
+
- 真无结果(检索正常返空)→ ``formatted_text`` 为"未找到…"(语义真实,可注入)。
|
|
78
|
+
"""
|
|
58
79
|
normalized = str(query or "").strip()
|
|
59
|
-
if not normalized:
|
|
60
|
-
return None
|
|
61
|
-
if not self.is_configured():
|
|
80
|
+
if not normalized or not self.is_configured():
|
|
62
81
|
return None
|
|
82
|
+
try:
|
|
83
|
+
results = self.search(normalized, top_k)
|
|
84
|
+
except Exception as exc:
|
|
85
|
+
logger.error("search_knowledge failed: %s", exc)
|
|
86
|
+
return {"query": normalized, "formatted_text": "", "error": str(exc)}
|
|
87
|
+
client_error = self.last_error
|
|
88
|
+
if not results and client_error:
|
|
89
|
+
return {"query": normalized, "formatted_text": "", "error": client_error}
|
|
63
90
|
return {
|
|
64
91
|
"query": normalized,
|
|
65
|
-
"formatted_text":
|
|
92
|
+
"formatted_text": format_knowledge_results(results),
|
|
66
93
|
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""Platform-layer discovery-only AgentCard mount for managed A2A Runtime.
|
|
2
|
+
|
|
3
|
+
v1 scope (this module):
|
|
4
|
+
Mount ``GET /.well-known/agent-card.json`` only. No JSON-RPC, no identity
|
|
5
|
+
middleware, no TaskStore/ContextStore/ResumeStore. The card is available as
|
|
6
|
+
soon as the runtime starts, *before* any A2A Agent is registered, so the
|
|
7
|
+
server-side ``GetAToAAgentCard(hosted)`` probe can fetch it and break the
|
|
8
|
+
registration chicken-and-egg cycle.
|
|
9
|
+
|
|
10
|
+
The card mounts whenever ``KSADK_A2A_RUNTIME_ID`` (ar-*, available at deploy
|
|
11
|
+
time) is non-empty. It does **not** depend on ``KSADK_A2A_AGENT_ID``
|
|
12
|
+
(only known after the A2A Agent is registered). skills default to empty;
|
|
13
|
+
:func:`ksadk.a2a_card.build_agent_card` fills a ``general`` skill when none
|
|
14
|
+
are provided.
|
|
15
|
+
|
|
16
|
+
v2 scope (future, not this module):
|
|
17
|
+
:class:`ksadk.a2a.bootstrap.AgentEngineA2ABootstrap` adds JSON-RPC on top
|
|
18
|
+
of the same card and the same identity env. The bootstrap replaces this
|
|
19
|
+
mount in ``RuntimeAppConfig.a2a`` once shared durable storage and a real
|
|
20
|
+
gateway-forward identity verifier are in place.
|
|
21
|
+
|
|
22
|
+
Wire 1.0 conformance:
|
|
23
|
+
The card is built with :func:`build_agent_card` (same factory used by the
|
|
24
|
+
full A2A server), so ``supportedInterfaces`` / ``protocolVersion`` /
|
|
25
|
+
``defaultInputModes`` / ``defaultOutputModes`` match wire 1.0 exactly.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import os
|
|
31
|
+
from dataclasses import dataclass
|
|
32
|
+
from typing import Optional, Sequence
|
|
33
|
+
|
|
34
|
+
from a2a.types import AgentSkill
|
|
35
|
+
from fastapi import FastAPI
|
|
36
|
+
|
|
37
|
+
from ksadk.a2a_card import build_agent_card
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _env(name: str) -> str:
|
|
41
|
+
return os.getenv(name, "").strip()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class ManagedA2ACardConfig:
|
|
46
|
+
"""Database-free configuration for the managed discovery-only route."""
|
|
47
|
+
|
|
48
|
+
enabled: bool = True
|
|
49
|
+
base_url: str = "http://127.0.0.1:8000"
|
|
50
|
+
agent_name: str = "agent"
|
|
51
|
+
description: str = ""
|
|
52
|
+
version: str = "0.1.0"
|
|
53
|
+
skills: Sequence[str | AgentSkill] = ()
|
|
54
|
+
streaming: bool = False
|
|
55
|
+
prefer_stream: bool = False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True)
|
|
59
|
+
class ManagedA2ACardMount:
|
|
60
|
+
"""Discovery-only card endpoint; mounted by ``RuntimeAppConfig.a2a``.
|
|
61
|
+
|
|
62
|
+
Held as a plain dataclass so ``factory._wire_a2a_if_enabled`` can isinstance
|
|
63
|
+
it without importing the (optional) ``AgentEngineA2ABootstrap`` class.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
config: ManagedA2ACardConfig
|
|
67
|
+
|
|
68
|
+
def mount(self, app: FastAPI) -> None:
|
|
69
|
+
"""Mount ``GET /.well-known/agent-card.json`` into ``app``.
|
|
70
|
+
|
|
71
|
+
Directly registers a FastAPI route returning the card JSON, avoiding
|
|
72
|
+
``a2a.server.routes`` (which pulls in the full A2A server stack and its
|
|
73
|
+
``culsans`` dependency). The response body is the same AgentCard JSON
|
|
74
|
+
that ``create_agent_card_routes`` would produce.
|
|
75
|
+
"""
|
|
76
|
+
card = build_agent_card(
|
|
77
|
+
name=self.config.agent_name,
|
|
78
|
+
base_url=self.config.base_url,
|
|
79
|
+
description=self.config.description,
|
|
80
|
+
version=self.config.version,
|
|
81
|
+
skills=self.config.skills or (),
|
|
82
|
+
streaming=self.config.streaming,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def _card_to_dict() -> dict:
|
|
86
|
+
# a2a.types.AgentCard is a protobuf message; serialize to the same
|
|
87
|
+
# camelCase JSON wire format the a2a-sdk route produces.
|
|
88
|
+
from google.protobuf.json_format import MessageToDict
|
|
89
|
+
|
|
90
|
+
return MessageToDict(
|
|
91
|
+
card,
|
|
92
|
+
preserving_proto_field_name=False,
|
|
93
|
+
use_integers_for_enums=False,
|
|
94
|
+
always_print_fields_with_no_presence=True,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
from fastapi import Response
|
|
99
|
+
from fastapi.responses import JSONResponse
|
|
100
|
+
|
|
101
|
+
card_payload = _card_to_dict()
|
|
102
|
+
|
|
103
|
+
async def _get_agent_card() -> Response:
|
|
104
|
+
return JSONResponse(content=card_payload)
|
|
105
|
+
|
|
106
|
+
app.add_api_route(
|
|
107
|
+
"/.well-known/agent-card.json",
|
|
108
|
+
_get_agent_card,
|
|
109
|
+
methods=["GET"],
|
|
110
|
+
name="a2a_agent_card",
|
|
111
|
+
include_in_schema=False,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
async def start(self) -> None:
|
|
115
|
+
"""No stores/middleware to initialize in v1."""
|
|
116
|
+
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
async def stop(self) -> None:
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def build_managed_a2a_card_if_configured() -> Optional[ManagedA2ACardMount]:
|
|
124
|
+
"""Read the A2A identity env vars and build a discovery-only card mount.
|
|
125
|
+
|
|
126
|
+
Returns ``None`` when the runtime is not A2A-capable
|
|
127
|
+
(``KSADK_A2A_RUNTIME_ID`` empty), so ``run_server`` skips mounting entirely.
|
|
128
|
+
Returns a mount even when ``KSADK_A2A_AGENT_ID`` is absent: the discovery
|
|
129
|
+
card is intentionally available *before* the A2A Agent is registered.
|
|
130
|
+
|
|
131
|
+
Name/version fallback chain:
|
|
132
|
+
``KSADK_A2A_AGENT_NAME`` → ``AGENTENGINE_MANAGED_RUNTIME_NAME`` →
|
|
133
|
+
``KSADK_A2A_RUNTIME_ID``.
|
|
134
|
+
"""
|
|
135
|
+
runtime_id = _env("KSADK_A2A_RUNTIME_ID")
|
|
136
|
+
if not runtime_id:
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
base_url = _env("KSADK_A2A_INTERNAL_BASE_URL") or "http://localhost:8080"
|
|
140
|
+
name = _env("KSADK_A2A_AGENT_NAME") or _env("AGENTENGINE_MANAGED_RUNTIME_NAME") or runtime_id
|
|
141
|
+
version = _env("KSADK_A2A_AGENT_VERSION") or "0.1.0"
|
|
142
|
+
|
|
143
|
+
config = ManagedA2ACardConfig(
|
|
144
|
+
enabled=True,
|
|
145
|
+
base_url=base_url,
|
|
146
|
+
agent_name=name,
|
|
147
|
+
description="",
|
|
148
|
+
version=version,
|
|
149
|
+
skills=(),
|
|
150
|
+
streaming=False,
|
|
151
|
+
prefer_stream=False,
|
|
152
|
+
)
|
|
153
|
+
return ManagedA2ACardMount(config)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
__all__ = [
|
|
157
|
+
"ManagedA2ACardConfig",
|
|
158
|
+
"ManagedA2ACardMount",
|
|
159
|
+
"build_managed_a2a_card_if_configured",
|
|
160
|
+
]
|
ksadk/managed_runtime.py
CHANGED
|
@@ -131,7 +131,9 @@ def validate_runtime_binary(resolved: ResolvedRuntime) -> str:
|
|
|
131
131
|
if resolved.name != "codex":
|
|
132
132
|
return ""
|
|
133
133
|
try:
|
|
134
|
-
from codex_cli_bin import
|
|
134
|
+
from codex_cli_bin import ( # type: ignore[import-not-found, import-untyped]
|
|
135
|
+
bundled_codex_path,
|
|
136
|
+
)
|
|
135
137
|
|
|
136
138
|
codex_bin = bundled_codex_path()
|
|
137
139
|
completed = subprocess.run(
|
|
@@ -162,17 +164,22 @@ async def resolve_local_managed_runtime(
|
|
|
162
164
|
"""Resolve and verify the native runtime used by ``ksadk web``."""
|
|
163
165
|
name, requested_version = runtime_config(config)
|
|
164
166
|
if requested_version:
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
167
|
+
explicit_runtime = ResolvedRuntime(
|
|
168
|
+
name=name,
|
|
169
|
+
version=requested_version,
|
|
170
|
+
source="manifest",
|
|
171
|
+
)
|
|
172
|
+
validate_installed_runtime(explicit_runtime)
|
|
173
|
+
return explicit_runtime
|
|
168
174
|
|
|
175
|
+
catalog_runtime: ResolvedRuntime | None = None
|
|
169
176
|
try:
|
|
170
|
-
|
|
177
|
+
catalog_runtime = await resolve_managed_runtime(config, region=region)
|
|
171
178
|
except ManagedRuntimeError:
|
|
172
|
-
|
|
173
|
-
if
|
|
174
|
-
validate_installed_runtime(
|
|
175
|
-
return
|
|
179
|
+
pass
|
|
180
|
+
if catalog_runtime is not None:
|
|
181
|
+
validate_installed_runtime(catalog_runtime)
|
|
182
|
+
return catalog_runtime
|
|
176
183
|
|
|
177
184
|
installed = installed_runtime_version(name)
|
|
178
185
|
if not installed:
|
ksadk/memory/__init__.py
CHANGED
|
@@ -54,4 +54,65 @@ def __getattr__(name):
|
|
|
54
54
|
from ksadk.memory.service import LongTermMemoryService
|
|
55
55
|
|
|
56
56
|
return LongTermMemoryService
|
|
57
|
+
# Memory v2(方案 §10):lazy import,避免在仅用旧 API 时强制加载 SQLite/tiktoken 依赖。
|
|
58
|
+
_v2_names = {
|
|
59
|
+
"MemoryRecord",
|
|
60
|
+
"MemoryCandidate",
|
|
61
|
+
"MemorySearchRequest",
|
|
62
|
+
"MemorySearchResult",
|
|
63
|
+
"MemoryCapabilities",
|
|
64
|
+
"CoreMemoryBlock",
|
|
65
|
+
"MemoryDeleteRequest",
|
|
66
|
+
"MemoryDeleteResult",
|
|
67
|
+
"MemoryProvider",
|
|
68
|
+
"MemoryPolicy",
|
|
69
|
+
"MemoryCoordinator",
|
|
70
|
+
"MemoryExtractor",
|
|
71
|
+
"SqliteMemoryProvider",
|
|
72
|
+
"build_search_request",
|
|
73
|
+
"recall_to_context_item",
|
|
74
|
+
"propose_memory_candidates",
|
|
75
|
+
}
|
|
76
|
+
if name in _v2_names:
|
|
77
|
+
if name in {
|
|
78
|
+
"MemoryRecord",
|
|
79
|
+
"MemoryCandidate",
|
|
80
|
+
"MemorySearchRequest",
|
|
81
|
+
"MemorySearchResult",
|
|
82
|
+
"MemoryCapabilities",
|
|
83
|
+
"CoreMemoryBlock",
|
|
84
|
+
"MemoryDeleteRequest",
|
|
85
|
+
"MemoryDeleteResult",
|
|
86
|
+
}:
|
|
87
|
+
from ksadk.memory import models as _models
|
|
88
|
+
|
|
89
|
+
return getattr(_models, name)
|
|
90
|
+
if name == "MemoryProvider":
|
|
91
|
+
from ksadk.memory.provider import MemoryProvider
|
|
92
|
+
|
|
93
|
+
return MemoryProvider
|
|
94
|
+
if name == "MemoryPolicy":
|
|
95
|
+
from ksadk.memory.policy import MemoryPolicy
|
|
96
|
+
|
|
97
|
+
return MemoryPolicy
|
|
98
|
+
if name == "MemoryCoordinator":
|
|
99
|
+
from ksadk.memory.coordinator import MemoryCoordinator
|
|
100
|
+
|
|
101
|
+
return MemoryCoordinator
|
|
102
|
+
if name in {"build_search_request", "recall_to_context_item"}:
|
|
103
|
+
from ksadk.memory import coordinator as _coord
|
|
104
|
+
|
|
105
|
+
return getattr(_coord, name)
|
|
106
|
+
if name == "MemoryExtractor":
|
|
107
|
+
from ksadk.memory.extraction import MemoryExtractor
|
|
108
|
+
|
|
109
|
+
return MemoryExtractor
|
|
110
|
+
if name == "propose_memory_candidates":
|
|
111
|
+
from ksadk.memory.extraction import propose_memory_candidates
|
|
112
|
+
|
|
113
|
+
return propose_memory_candidates
|
|
114
|
+
if name == "SqliteMemoryProvider":
|
|
115
|
+
from ksadk.memory.providers.local_sqlite import SqliteMemoryProvider
|
|
116
|
+
|
|
117
|
+
return SqliteMemoryProvider
|
|
57
118
|
raise AttributeError(f"module 'ksadk.memory' has no attribute {name!r}")
|
|
@@ -3,22 +3,48 @@
|
|
|
3
3
|
所有长期记忆后端必须继承此类并实现 save_memory / search_memory 方法。
|
|
4
4
|
|
|
5
5
|
参考 VeADK: veadk/memory/long_term_memory_backends/base_backend.py
|
|
6
|
+
|
|
7
|
+
扩展协议(技术改造方案 §7.3):
|
|
8
|
+
- search_records: 结构化检索,返回带 memory_id 的 LongTermMemoryRecord
|
|
9
|
+
- update_memory / delete_memory: 按 ID 原地更新/软删除
|
|
10
|
+
- capabilities: 声明 backend 支持的能力集合
|
|
11
|
+
基类对扩展方法提供默认实现:抛出 UnsupportedMemoryOperation 并在
|
|
12
|
+
capabilities 中不声明对应能力,旧 backend 无需改动即保持兼容。
|
|
6
13
|
"""
|
|
7
14
|
|
|
8
15
|
from abc import ABC, abstractmethod
|
|
9
|
-
from typing import List
|
|
16
|
+
from typing import List, Set
|
|
10
17
|
|
|
11
18
|
from pydantic import BaseModel
|
|
12
19
|
|
|
20
|
+
from ksadk.memory.models import (
|
|
21
|
+
LongTermMemoryRecord,
|
|
22
|
+
MemoryExtractionStatus,
|
|
23
|
+
MemoryMutationResult,
|
|
24
|
+
UnsupportedMemoryOperation,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
# 能力常量(§7.3)
|
|
28
|
+
CAP_SEARCH = "search"
|
|
29
|
+
CAP_ADD = "add"
|
|
30
|
+
CAP_FLUSH = "flush"
|
|
31
|
+
CAP_STRUCTURED_SEARCH = "structured_search"
|
|
32
|
+
CAP_UPDATE = "update"
|
|
33
|
+
CAP_DELETE = "delete"
|
|
34
|
+
CAP_SESSION_STATUS = "session_status"
|
|
35
|
+
|
|
13
36
|
|
|
14
37
|
class BaseLongTermMemoryBackend(ABC, BaseModel):
|
|
15
38
|
"""长期记忆存储后端抽象基类
|
|
16
39
|
|
|
17
40
|
Attributes:
|
|
18
41
|
index: 索引/集合名称,用于隔离不同应用的记忆数据
|
|
42
|
+
last_error: 最近一次 search/save 失败的原因。成功调用前置空,失败时填充。
|
|
43
|
+
上层(LongTermMemoryService.build_context)据此区分"后端吞错返空"与"真无记忆"。
|
|
19
44
|
"""
|
|
20
45
|
|
|
21
46
|
index: str = ""
|
|
47
|
+
last_error: str = ""
|
|
22
48
|
|
|
23
49
|
@abstractmethod
|
|
24
50
|
def save_memory(self, user_id: str, event_strings: List[str], **kwargs) -> bool:
|
|
@@ -46,3 +72,72 @@ class BaseLongTermMemoryBackend(ABC, BaseModel):
|
|
|
46
72
|
匹配的记忆字符串列表
|
|
47
73
|
"""
|
|
48
74
|
pass
|
|
75
|
+
|
|
76
|
+
# ---- 扩展协议(可选能力,默认 unsupported) ----
|
|
77
|
+
|
|
78
|
+
def search_records(
|
|
79
|
+
self,
|
|
80
|
+
user_id: str,
|
|
81
|
+
query: str,
|
|
82
|
+
top_k: int = 5,
|
|
83
|
+
**kwargs,
|
|
84
|
+
) -> List[LongTermMemoryRecord]:
|
|
85
|
+
"""结构化检索:返回带服务端 memory_id 的记录列表。
|
|
86
|
+
|
|
87
|
+
不支持的 backend 抛出 UnsupportedMemoryOperation,
|
|
88
|
+
不得降级为返回正文 hash 伪造的 ID。
|
|
89
|
+
"""
|
|
90
|
+
raise UnsupportedMemoryOperation(
|
|
91
|
+
f"{type(self).__name__} does not support structured search"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def update_memory(
|
|
95
|
+
self,
|
|
96
|
+
*,
|
|
97
|
+
user_id: str,
|
|
98
|
+
memory_id: str,
|
|
99
|
+
content: str,
|
|
100
|
+
**kwargs,
|
|
101
|
+
) -> MemoryMutationResult:
|
|
102
|
+
"""按 memory_id 原地更新记忆正文。
|
|
103
|
+
|
|
104
|
+
不支持的 backend 抛出 UnsupportedMemoryOperation,
|
|
105
|
+
不得静默追加一条新记忆来模拟 update。
|
|
106
|
+
"""
|
|
107
|
+
raise UnsupportedMemoryOperation(f"{type(self).__name__} does not support update")
|
|
108
|
+
|
|
109
|
+
def delete_memory(
|
|
110
|
+
self,
|
|
111
|
+
*,
|
|
112
|
+
user_id: str,
|
|
113
|
+
memory_id: str,
|
|
114
|
+
**kwargs,
|
|
115
|
+
) -> MemoryMutationResult:
|
|
116
|
+
"""按 memory_id 软删除指定记忆。
|
|
117
|
+
|
|
118
|
+
不支持的 backend 抛出 UnsupportedMemoryOperation。
|
|
119
|
+
"""
|
|
120
|
+
raise UnsupportedMemoryOperation(f"{type(self).__name__} does not support delete")
|
|
121
|
+
|
|
122
|
+
def get_extraction_status(
|
|
123
|
+
self,
|
|
124
|
+
*,
|
|
125
|
+
user_id: str,
|
|
126
|
+
session_id: str,
|
|
127
|
+
) -> MemoryExtractionStatus:
|
|
128
|
+
"""查询 Session 后台提取状态(写后确认,§7.7)。
|
|
129
|
+
|
|
130
|
+
不支持的 backend 抛出 UnsupportedMemoryOperation。
|
|
131
|
+
"""
|
|
132
|
+
raise UnsupportedMemoryOperation(f"{type(self).__name__} does not support session status")
|
|
133
|
+
|
|
134
|
+
def capabilities(self) -> Set[str]:
|
|
135
|
+
"""声明本 backend 支持的能力集合。
|
|
136
|
+
|
|
137
|
+
基类默认只声明基础读写能力;子类按真实实现覆写,
|
|
138
|
+
声明必须与实际可用方法一致(§11.1)。
|
|
139
|
+
"""
|
|
140
|
+
return {CAP_SEARCH, CAP_ADD}
|
|
141
|
+
|
|
142
|
+
def has_capability(self, capability: str) -> bool:
|
|
143
|
+
return capability in self.capabilities()
|
|
@@ -52,10 +52,10 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
|
|
|
52
52
|
def model_post_init(self, __context) -> None:
|
|
53
53
|
if not self.base_url:
|
|
54
54
|
logger.warning(
|
|
55
|
-
"HttpLTMBackend: base_url is empty.
|
|
55
|
+
"HttpLTMBackend: base_url is empty. Set KSADK_LTM_HTTP_URL environment variable."
|
|
56
56
|
)
|
|
57
57
|
logger.info(
|
|
58
|
-
f"HttpLTMBackend initialized: base_url={self.base_url[:50]}...
|
|
58
|
+
f"HttpLTMBackend initialized: base_url={self.base_url[:50]}... index={self.index}"
|
|
59
59
|
)
|
|
60
60
|
|
|
61
61
|
@property
|
|
@@ -101,13 +101,13 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
|
|
|
101
101
|
response.raise_for_status()
|
|
102
102
|
|
|
103
103
|
logger.info(
|
|
104
|
-
f"Saved {len(event_strings)} events to remote memory service
|
|
104
|
+
f"Saved {len(event_strings)} events to remote memory service for user={user_id}"
|
|
105
105
|
)
|
|
106
106
|
return True
|
|
107
107
|
|
|
108
108
|
except httpx.HTTPStatusError as e:
|
|
109
109
|
logger.error(
|
|
110
|
-
f"HTTP error saving memory: {e.response.status_code}
|
|
110
|
+
f"HTTP error saving memory: {e.response.status_code} {e.response.text[:200]}"
|
|
111
111
|
)
|
|
112
112
|
return False
|
|
113
113
|
except Exception as e:
|
|
@@ -133,6 +133,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
|
|
|
133
133
|
"""
|
|
134
134
|
if not self.base_url:
|
|
135
135
|
logger.warning("HttpLTMBackend: base_url not configured, return empty results.")
|
|
136
|
+
self.last_error = "base_url not configured"
|
|
136
137
|
return []
|
|
137
138
|
|
|
138
139
|
try:
|
|
@@ -161,7 +162,7 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
|
|
|
161
162
|
|
|
162
163
|
except httpx.HTTPStatusError as e:
|
|
163
164
|
logger.error(
|
|
164
|
-
f"HTTP error searching memory: {e.response.status_code}
|
|
165
|
+
f"HTTP error searching memory: {e.response.status_code} {e.response.text[:200]}"
|
|
165
166
|
)
|
|
166
167
|
return []
|
|
167
168
|
except Exception as e:
|
|
@@ -173,3 +174,11 @@ class HttpLTMBackend(BaseLongTermMemoryBackend):
|
|
|
173
174
|
if self._client:
|
|
174
175
|
self._client.close()
|
|
175
176
|
self._client = None
|
|
177
|
+
|
|
178
|
+
# ------------------------------------------------------------------
|
|
179
|
+
# 扩展协议(方案 §7.3):HTTP backend 为框架预留,结构化能力未定。
|
|
180
|
+
# 远程 API 对接细节待提供(见 save_memory TODO),因此不声明
|
|
181
|
+
# structured/update/delete/session_status 能力;search_records 也不降级
|
|
182
|
+
# 伪造 ID,保持 base 的 UnsupportedMemoryOperation 默认行为。
|
|
183
|
+
# 远端 schema 确认后,在此接入对应端点并覆写 capabilities()。
|
|
184
|
+
# ------------------------------------------------------------------
|