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