agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
- agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
- ksadk/a2a/__init__.py +180 -11
- ksadk/a2a/bootstrap.py +332 -0
- ksadk/a2a/card.py +15 -0
- ksadk/a2a/context_store.py +203 -0
- ksadk/a2a/control_plane.py +1056 -0
- ksadk/a2a/credential.py +99 -0
- ksadk/a2a/event_adapter.py +149 -0
- ksadk/a2a/executor.py +361 -137
- ksadk/a2a/external_transport.py +516 -0
- ksadk/a2a/identity.py +304 -0
- ksadk/a2a/ids.py +22 -0
- ksadk/a2a/langgraph.py +285 -0
- ksadk/a2a/resume_store.py +201 -0
- ksadk/a2a/routes.py +112 -0
- ksadk/a2a/server.py +102 -62
- ksadk/a2a/service_env.py +33 -0
- ksadk/a2a/space_client.py +1122 -0
- ksadk/a2a/task_adapter.py +423 -0
- ksadk/a2a/task_event_dispatcher.py +167 -0
- ksadk/a2a/task_event_outbox.py +326 -0
- ksadk/a2a/task_store.py +206 -0
- ksadk/a2a_card.py +101 -0
- ksadk/a2ui/__init__.py +27 -0
- ksadk/a2ui/core.py +186 -0
- ksadk/a2ui/models.py +166 -0
- ksadk/a2ui/renderer.py +198 -0
- ksadk/agui/__init__.py +9 -0
- ksadk/agui/a2ui_projection.py +92 -0
- ksadk/agui/agent.py +872 -0
- ksadk/agui/config.py +92 -0
- ksadk/agui/routes.py +47 -0
- ksadk/api/client.py +238 -204
- ksadk/api/environment.py +27 -0
- ksadk/builders/__init__.py +2 -0
- ksadk/builders/base.py +16 -14
- ksadk/builders/code_builder.py +375 -270
- ksadk/builders/container_builder.py +240 -200
- ksadk/builders/framework_requirements.py +31 -12
- ksadk/builders/ks3_uploader.py +60 -29
- ksadk/builders/managed_runtime_builder.py +173 -0
- ksadk/builders/mcp_builder.py +91 -92
- ksadk/builders/requirements_utils.py +1 -5
- ksadk/cli/__init__.py +97 -171
- ksadk/cli/cmd_a2a.py +255 -84
- ksadk/cli/cmd_agent.py +19 -5
- ksadk/cli/cmd_build.py +158 -29
- ksadk/cli/cmd_completion.py +47 -35
- ksadk/cli/cmd_config.py +267 -198
- ksadk/cli/cmd_create.py +507 -740
- ksadk/cli/cmd_dashboard.py +120 -45
- ksadk/cli/cmd_deploy.py +135 -59
- ksadk/cli/cmd_destroy.py +44 -14
- ksadk/cli/cmd_eval.py +386 -0
- ksadk/cli/cmd_files.py +63 -24
- ksadk/cli/cmd_hermes.py +313 -135
- ksadk/cli/cmd_invoke.py +184 -122
- ksadk/cli/cmd_launch.py +76 -28
- ksadk/cli/cmd_mcp.py +98 -64
- ksadk/cli/cmd_model.py +14 -5
- ksadk/cli/cmd_openclaw.py +564 -268
- ksadk/cli/cmd_replay.py +71 -0
- ksadk/cli/cmd_run.py +58 -73
- ksadk/cli/cmd_status.py +80 -31
- ksadk/cli/cmd_studio.py +110 -0
- ksadk/cli/cmd_version.py +20 -13
- ksadk/cli/cmd_web.py +95 -18
- ksadk/cli/deploy_utils.py +20 -20
- ksadk/cli/dry_run.py +7 -4
- ksadk/cli/env_options.py +83 -0
- ksadk/cli/error_utils.py +37 -12
- ksadk/cli/global_options.py +4 -3
- ksadk/cli/local_runtime.py +1 -2
- ksadk/cli/model_catalog.py +6 -2
- ksadk/cli/network_options.py +41 -19
- ksadk/cli/resource_common.py +6 -2
- ksadk/cli/runtime_bootstrap.py +51 -0
- ksadk/cli/storage.py +0 -1
- ksadk/cli/ui.py +11 -3
- ksadk/cli/workflow_common.py +52 -18
- ksadk/codex/__init__.py +12 -0
- ksadk/codex/client.py +1042 -0
- ksadk/codex/phase.py +143 -0
- ksadk/codex/runtime.py +940 -0
- ksadk/common/aicp_env.py +0 -1
- ksadk/common/auth.py +2 -2
- ksadk/common/constants.py +1 -3
- ksadk/common/kop_client.py +232 -0
- ksadk/common/llm_utils.py +17 -13
- ksadk/compat/__init__.py +5 -0
- ksadk/compat/adk_compat.py +200 -0
- ksadk/compat/copilotkit_a2ui.py +330 -0
- ksadk/configs/__init__.py +12 -14
- ksadk/configs/env_registry.py +661 -116
- ksadk/configs/global_config.py +3 -2
- ksadk/configs/settings.py +133 -209
- ksadk/conversations/__init__.py +85 -92
- ksadk/conversations/attachment_storage.py +16 -11
- ksadk/conversations/attachments.py +44 -36
- ksadk/conversations/compaction_pipeline.py +12 -12
- ksadk/conversations/compaction_prompt.py +9 -5
- ksadk/conversations/context.py +221 -6
- ksadk/conversations/message_projection.py +438 -51
- ksadk/conversations/model_context.py +12 -6
- ksadk/conversations/model_options.py +0 -1
- ksadk/conversations/normalize.py +20 -16
- ksadk/conversations/reasoning_markup.py +1 -1
- ksadk/conversations/runtime.py +339 -5255
- ksadk/conversations/runtime_compaction.py +333 -0
- ksadk/conversations/runtime_constants.py +27 -0
- ksadk/conversations/runtime_governance.py +185 -0
- ksadk/conversations/runtime_input.py +660 -0
- ksadk/conversations/runtime_invocation.py +395 -0
- ksadk/conversations/runtime_metadata.py +475 -0
- ksadk/conversations/runtime_observability.py +367 -0
- ksadk/conversations/runtime_payloads.py +272 -0
- ksadk/conversations/runtime_persistence.py +440 -0
- ksadk/conversations/runtime_preparation.py +426 -0
- ksadk/conversations/runtime_resume.py +836 -0
- ksadk/conversations/runtime_stream_events.py +902 -0
- ksadk/conversations/runtime_streaming.py +700 -0
- ksadk/conversations/semantic_summary.py +17 -5
- ksadk/conversations/session_title.py +6 -3
- ksadk/deployment/__init__.py +15 -16
- ksadk/deployment/agent_access.py +12 -23
- ksadk/deployment/base.py +51 -38
- ksadk/deployment/managed_runtime.py +33 -0
- ksadk/deployment/manager.py +85 -71
- ksadk/deployment/providers/serverless.py +379 -210
- ksadk/deployment/registry.py +38 -32
- ksadk/deployment/state.py +11 -11
- ksadk/deployment/ui_config.py +1 -1
- ksadk/detection/__init__.py +1 -1
- ksadk/detection/detector.py +146 -83
- ksadk/detection/mcp_detector.py +9 -6
- ksadk/evaluation/__init__.py +84 -0
- ksadk/evaluation/a2a_adapter.py +444 -0
- ksadk/evaluation/adapters.py +54 -0
- ksadk/evaluation/contracts.py +409 -0
- ksadk/evaluation/evalset.py +351 -0
- ksadk/evaluation/evaluators.py +461 -0
- ksadk/evaluation/executor.py +118 -0
- ksadk/evaluation/storage.py +68 -0
- ksadk/evaluation/target.py +73 -0
- ksadk/events/__init__.py +25 -0
- ksadk/events/parser.py +191 -0
- ksadk/events/replay.py +37 -0
- ksadk/events/runtime_event.py +273 -0
- ksadk/events/store.py +317 -0
- ksadk/harness/__init__.py +35 -0
- ksadk/harness/app.py +269 -0
- ksadk/harness/config.py +181 -0
- ksadk/harness/reasoner.py +105 -0
- ksadk/harness/runtime.py +364 -0
- ksadk/harness/sandbox.py +141 -0
- ksadk/harness/tools.py +222 -0
- ksadk/hermes_terminal.py +28 -12
- ksadk/identity/resolver.py +15 -9
- ksadk/ids.py +32 -0
- ksadk/knowledge_base/adk_tool.py +1 -1
- ksadk/knowledge_base/client.py +38 -33
- ksadk/managed_a2a_card.py +160 -0
- ksadk/managed_runtime.py +195 -0
- ksadk/markdown.py +5 -2
- ksadk/mcp_runtime/__init__.py +9 -6
- ksadk/memory/__init__.py +1 -1
- ksadk/memory/adk/__init__.py +2 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
- ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
- ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
- ksadk/memory/adk/long_term_memory.py +34 -37
- ksadk/memory/adk/resilient_session_service.py +4 -5
- ksadk/memory/adk/short_term_memory.py +12 -21
- ksadk/memory/adk_tool.py +3 -2
- ksadk/memory/backends/base.py +19 -19
- ksadk/memory/backends/memory.py +24 -25
- ksadk/memory/backends/redis.py +31 -30
- ksadk/memory/langchain_tool.py +2 -1
- ksadk/memory/manager.py +52 -47
- ksadk/memory/service.py +16 -6
- ksadk/memory/tool.py +4 -0
- ksadk/model_policy.py +15 -7
- ksadk/model_proxy/__init__.py +51 -0
- ksadk/model_proxy/bootstrap.py +80 -0
- ksadk/model_proxy/cache.py +165 -0
- ksadk/model_proxy/config.py +66 -0
- ksadk/model_proxy/demo_webui.py +115 -0
- ksadk/model_proxy/detect.py +145 -0
- ksadk/model_proxy/gate.py +68 -0
- ksadk/model_proxy/namespace.py +201 -0
- ksadk/model_proxy/protocol_proxy.py +22 -0
- ksadk/model_proxy/server.py +443 -0
- ksadk/model_proxy/transform.py +735 -0
- ksadk/openclaw_gateway.py +29 -14
- ksadk/runners/adk_runner.py +354 -146
- ksadk/runners/base_runner.py +71 -29
- ksadk/runners/deepagents_runner.py +0 -1
- ksadk/runners/factory.py +18 -5
- ksadk/runners/langchain_runner.py +29 -742
- ksadk/runners/langgraph_runner.py +417 -97
- ksadk/runners/patch_langchain.py +16 -16
- ksadk/runners/remote_runner.py +134 -33
- ksadk/runners/usage_accumulator.py +1 -0
- ksadk/runners/utils/__init__.py +0 -10
- ksadk/runners/utils/loader.py +23 -7
- ksadk/runtime/__init__.py +67 -0
- ksadk/runtime/adapter.py +412 -0
- ksadk/runtime/conversation_execution.py +553 -0
- ksadk/runtime/executor.py +251 -0
- ksadk/runtime/factory.py +156 -0
- ksadk/runtime/framework_adapters.py +118 -0
- ksadk/runtime/launch.py +48 -0
- ksadk/runtime/preprocessing.py +131 -0
- ksadk/runtime/runner_adapter.py +1032 -0
- ksadk/runtime/runner_loading.py +36 -0
- ksadk/runtime_context.py +18 -3
- ksadk/runtime_state.py +0 -1
- ksadk/sandbox/__init__.py +4 -1
- ksadk/sandbox/backends/__init__.py +4 -1
- ksadk/sandbox/backends/e2b.py +13 -5
- ksadk/sandbox/backends/local_process.py +11 -3
- ksadk/sandbox/base.py +10 -15
- ksadk/sandbox/factory.py +14 -4
- ksadk/sandbox/registry.py +57 -6
- ksadk/server/__init__.py +39 -4
- ksadk/server/api_models.py +15 -5
- ksadk/server/app.py +24 -3928
- ksadk/server/composition.py +47 -0
- ksadk/server/factory.py +622 -0
- ksadk/server/routes/__init__.py +1 -0
- ksadk/server/routes/checkpoint_resolution.py +116 -0
- ksadk/server/routes/common.py +682 -0
- ksadk/server/routes/control.py +331 -0
- ksadk/server/routes/dependencies.py +98 -0
- ksadk/server/routes/misc.py +425 -0
- ksadk/server/routes/models.py +451 -0
- ksadk/server/routes/openai_compat.py +229 -0
- ksadk/server/routes/projection.py +848 -0
- ksadk/server/routes/routers.py +52 -0
- ksadk/server/routes/run.py +519 -0
- ksadk/server/routes/sessions.py +644 -0
- ksadk/server/routes/streaming.py +265 -0
- ksadk/server/routes/workspace.py +414 -0
- ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
- ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
- ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
- ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
- ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
- ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
- ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
- ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
- ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
- ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
- ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
- ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
- ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
- ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
- ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
- ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
- ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
- ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
- ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
- ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
- ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
- ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
- ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
- ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
- ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
- ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
- ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
- ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
- ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
- ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
- ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
- ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
- ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
- ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
- ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
- ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
- ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
- ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
- ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
- ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
- ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
- ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
- ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
- ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
- ksadk/server/static/assets/index-R52pJJvg.js +177 -0
- ksadk/server/static/assets/index-jJr3_955.css +2 -0
- ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
- ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
- ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
- ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
- ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
- ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
- ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
- ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
- ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
- ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
- ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +111 -58
- ksadk/sessions/__init__.py +69 -19
- ksadk/sessions/base.py +31 -11
- ksadk/sessions/continuity.py +2 -3
- ksadk/sessions/in_memory.py +46 -2
- ksadk/sessions/local_service.py +148 -17
- ksadk/sessions/postgres_service.py +143 -25
- ksadk/sessions/resilient.py +36 -8
- ksadk/skills/models.py +17 -5
- ksadk/skills/package_store.py +5 -2
- ksadk/skills/runtime/agent.py +20 -5
- ksadk/skills/runtime/artifacts.py +1 -5
- ksadk/skills/runtime/backends/e2b.py +10 -4
- ksadk/skills/runtime/backends/local.py +15 -3
- ksadk/skills/runtime/base.py +1 -2
- ksadk/skills/runtime/executor.py +10 -3
- ksadk/skills/runtime/factory.py +4 -2
- ksadk/skills/runtime/loader.py +1 -2
- ksadk/skills/runtime/registry.py +15 -10
- ksadk/skills/runtime/request.py +3 -1
- ksadk/skills/service_client.py +47 -16
- ksadk/skills/tool_defs.py +15 -10
- 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 +1046 -0
- ksadk/studio/api_catalog_routes.py +324 -0
- ksadk/studio/api_contracts.py +177 -0
- ksadk/studio/api_helpers.py +132 -0
- ksadk/studio/authoring.py +524 -0
- ksadk/studio/authoring_coordinator.py +285 -0
- ksadk/studio/builder.py +320 -0
- ksadk/studio/capabilities.py +351 -0
- ksadk/studio/cloud.py +278 -0
- ksadk/studio/codex_agent_service.py +583 -0
- ksadk/studio/codex_builder.py +324 -0
- ksadk/studio/codex_manifest.py +278 -0
- ksadk/studio/codex_run.py +352 -0
- ksadk/studio/compiler.py +189 -0
- ksadk/studio/contracts.py +644 -0
- ksadk/studio/errors.py +47 -0
- ksadk/studio/evaluation.py +192 -0
- ksadk/studio/event_store.py +284 -0
- ksadk/studio/framework_run.py +114 -0
- ksadk/studio/identifiers.py +33 -0
- ksadk/studio/mcp_runtime.py +229 -0
- ksadk/studio/model_client.py +543 -0
- ksadk/studio/model_profile_service.py +214 -0
- ksadk/studio/operations.py +243 -0
- ksadk/studio/otel_trace.py +754 -0
- ksadk/studio/pagination.py +182 -0
- ksadk/studio/python_tool_inspection.py +183 -0
- ksadk/studio/repository.py +306 -0
- ksadk/studio/resource_catalog.py +1217 -0
- ksadk/studio/run_service.py +707 -0
- ksadk/studio/runtime_catalog.py +74 -0
- ksadk/studio/runtime_source.py +339 -0
- ksadk/studio/service.py +1141 -0
- ksadk/studio/shared_web.py +994 -0
- ksadk/studio/skill_discovery.py +628 -0
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
- ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
- ksadk/studio/static/assets/index-DI2eY_NH.js +252 -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 +630 -0
- ksadk/studio/validator.py +246 -0
- ksadk/studio/workspace.py +137 -0
- ksadk/terminal_exec_policy.py +3 -4
- ksadk/tools/gateway.py +101 -15
- ksadk/tools/result_budget.py +12 -4
- ksadk/toolsets/__init__.py +161 -37
- ksadk/toolsets/a2a.py +426 -0
- ksadk/toolsets/platform.py +21 -5
- ksadk/toolsets/sandbox.py +82 -16
- ksadk/toolsets/skills.py +200 -39
- ksadk/toolsets/web.py +123 -26
- ksadk/toolsets/workspace.py +212 -101
- ksadk/tracing/__init__.py +19 -21
- ksadk/tracing/exporters/inmemory_exporter.py +62 -51
- ksadk/tracing/setup.py +135 -506
- ksadk/tracing/span_utils.py +0 -41
- ksadk/tui/loop.py +78 -30
- ksadk/tui/stream_render.py +1 -0
- ksadk/ui_config.py +5 -3
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/registry.py +56 -56
- ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
- ksadk_runtime_common/workspace_files/router.py +8 -2
- agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
- ksadk/a2a/card_builder.py +0 -64
- ksadk/a2a/client.py +0 -309
- ksadk/runners/utils/langfuse.py +0 -230
- ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
- ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
- ksadk/server/static/assets/channel-CTuydARX.js +0 -1
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
- ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
- ksadk/server/static/assets/index-DAURbCsP.css +0 -1
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
- ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
- ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
- ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
- ksadk/tracing/exporters/langfuse_exporter.py +0 -445
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
ksadk/conversations/__init__.py
CHANGED
|
@@ -1,95 +1,88 @@
|
|
|
1
|
+
"""Side-effect-free public exports for conversation preparation and persistence."""
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
5
|
+
from importlib import import_module
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _exports(module: str, *names: str) -> dict[str, tuple[str, str]]:
|
|
10
|
+
return {name: (module, name) for name in names}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
_EXPORTS = {
|
|
14
|
+
**_exports(
|
|
15
|
+
"ksadk.conversations.attachments",
|
|
16
|
+
"decode_inline_data",
|
|
17
|
+
"resolve_attachment_storage_path",
|
|
18
|
+
"resolve_uploads_dir",
|
|
19
|
+
),
|
|
20
|
+
**_exports(
|
|
21
|
+
"ksadk.conversations.context",
|
|
22
|
+
"CANONICAL_EVENT_TYPES",
|
|
23
|
+
"build_history_from_events",
|
|
24
|
+
"build_request_history",
|
|
25
|
+
"canonical_event_type",
|
|
26
|
+
"compacted_until_seq_id",
|
|
27
|
+
"extract_event_text",
|
|
28
|
+
"extract_text_from_event_parts",
|
|
29
|
+
"group_events_by_api_round",
|
|
30
|
+
"project_model_messages",
|
|
31
|
+
"summarize_event_groups",
|
|
32
|
+
),
|
|
33
|
+
**_exports(
|
|
34
|
+
"ksadk.conversations.normalize",
|
|
35
|
+
"attachment_from_part",
|
|
36
|
+
"attachment_prompt_text",
|
|
37
|
+
"compact_attachment_for_session",
|
|
38
|
+
"display_content_from_parts",
|
|
39
|
+
"extract_user_input_from_parts",
|
|
40
|
+
"normalize_kop_message_content",
|
|
41
|
+
"normalize_kop_messages",
|
|
42
|
+
"normalize_parts_content",
|
|
43
|
+
"normalize_responses_input",
|
|
44
|
+
),
|
|
45
|
+
**_exports(
|
|
46
|
+
"ksadk.conversations.runtime",
|
|
47
|
+
"CompactionPlan",
|
|
48
|
+
"PreparedConversationTurn",
|
|
49
|
+
"append_context_checkpoint_event",
|
|
50
|
+
"append_conversation_event",
|
|
51
|
+
"append_reasoning_event",
|
|
52
|
+
"append_run_checkpoint_event",
|
|
53
|
+
"append_run_resume_event",
|
|
54
|
+
"append_run_status_event",
|
|
55
|
+
"build_chat_completions_payload",
|
|
56
|
+
"build_compaction_sse_event",
|
|
57
|
+
"build_responses_payload",
|
|
58
|
+
"build_run_input",
|
|
59
|
+
"compact_conversation_history",
|
|
60
|
+
"ensure_conversation_session",
|
|
61
|
+
"extract_responses_resume_input",
|
|
62
|
+
"invoke_conversation_once",
|
|
63
|
+
"preview_auto_compaction",
|
|
64
|
+
"prime_session_metadata_for_user_turn",
|
|
65
|
+
"stream_conversation_turn",
|
|
66
|
+
"stream_responses_conversation_turn",
|
|
67
|
+
),
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
__all__ = list(_EXPORTS)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def __getattr__(name: str) -> Any:
|
|
74
|
+
if name == "runtime":
|
|
75
|
+
value = import_module("ksadk.conversations.runtime")
|
|
76
|
+
globals()[name] = value
|
|
77
|
+
return value
|
|
78
|
+
try:
|
|
79
|
+
module_name, attribute = _EXPORTS[name]
|
|
80
|
+
except KeyError:
|
|
81
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}") from None
|
|
82
|
+
value = getattr(import_module(module_name), attribute)
|
|
83
|
+
globals()[name] = value
|
|
84
|
+
return value
|
|
85
|
+
|
|
51
86
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"CompactionPlan",
|
|
55
|
-
"PreparedConversationTurn",
|
|
56
|
-
"append_conversation_event",
|
|
57
|
-
"append_context_checkpoint_event",
|
|
58
|
-
"append_reasoning_event",
|
|
59
|
-
"append_run_checkpoint_event",
|
|
60
|
-
"append_run_resume_event",
|
|
61
|
-
"append_run_status_event",
|
|
62
|
-
"attachment_from_part",
|
|
63
|
-
"attachment_prompt_text",
|
|
64
|
-
"build_chat_completions_payload",
|
|
65
|
-
"build_compaction_sse_event",
|
|
66
|
-
"build_history_from_events",
|
|
67
|
-
"build_request_history",
|
|
68
|
-
"build_responses_payload",
|
|
69
|
-
"build_run_input",
|
|
70
|
-
"canonical_event_type",
|
|
71
|
-
"compact_conversation_history",
|
|
72
|
-
"compact_attachment_for_session",
|
|
73
|
-
"compacted_until_seq_id",
|
|
74
|
-
"decode_inline_data",
|
|
75
|
-
"display_content_from_parts",
|
|
76
|
-
"ensure_conversation_session",
|
|
77
|
-
"extract_event_text",
|
|
78
|
-
"extract_text_from_event_parts",
|
|
79
|
-
"extract_user_input_from_parts",
|
|
80
|
-
"extract_responses_resume_input",
|
|
81
|
-
"group_events_by_api_round",
|
|
82
|
-
"invoke_conversation_once",
|
|
83
|
-
"prime_session_metadata_for_user_turn",
|
|
84
|
-
"normalize_kop_message_content",
|
|
85
|
-
"normalize_kop_messages",
|
|
86
|
-
"normalize_parts_content",
|
|
87
|
-
"normalize_responses_input",
|
|
88
|
-
"preview_auto_compaction",
|
|
89
|
-
"project_model_messages",
|
|
90
|
-
"resolve_attachment_storage_path",
|
|
91
|
-
"resolve_uploads_dir",
|
|
92
|
-
"stream_conversation_turn",
|
|
93
|
-
"stream_responses_conversation_turn",
|
|
94
|
-
"summarize_event_groups",
|
|
95
|
-
]
|
|
87
|
+
def __dir__() -> list[str]:
|
|
88
|
+
return sorted({*globals(), *__all__})
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import importlib
|
|
4
5
|
import json
|
|
5
6
|
import logging
|
|
6
7
|
import mimetypes
|
|
@@ -81,8 +82,7 @@ def _download_hosted_attachment(file_uri: str) -> AttachmentBytes | None:
|
|
|
81
82
|
data=content.data,
|
|
82
83
|
display_name=display_name,
|
|
83
84
|
mime_type=(
|
|
84
|
-
_content_type_without_params(content.content_type)
|
|
85
|
-
or guess_mime_type(display_name)
|
|
85
|
+
_content_type_without_params(content.content_type) or guess_mime_type(display_name)
|
|
86
86
|
),
|
|
87
87
|
)
|
|
88
88
|
|
|
@@ -222,7 +222,9 @@ class AttachmentStorageService:
|
|
|
222
222
|
return AttachmentBytes(
|
|
223
223
|
data=raw,
|
|
224
224
|
display_name=str(metadata.get("display_name") or local_path.name),
|
|
225
|
-
mime_type=str(
|
|
225
|
+
mime_type=str(
|
|
226
|
+
metadata.get("mime_type") or guess_mime_type(local_path.name)
|
|
227
|
+
),
|
|
226
228
|
local_path=local_path,
|
|
227
229
|
)
|
|
228
230
|
|
|
@@ -272,16 +274,17 @@ class AttachmentStorageService:
|
|
|
272
274
|
async def _read_ks3_object(self, *, bucket: str, object_key: str) -> bytes:
|
|
273
275
|
return await asyncio.to_thread(self._read_ks3_object_sync, bucket, object_key)
|
|
274
276
|
|
|
275
|
-
def _put_ks3_object_sync(
|
|
277
|
+
def _put_ks3_object_sync(
|
|
278
|
+
self, bucket: str, object_key: str, data: bytes, mime_type: str
|
|
279
|
+
) -> None:
|
|
276
280
|
if not bucket:
|
|
277
281
|
raise ValueError("KS3 bucket is not available")
|
|
278
|
-
from ks3.connection import Connection
|
|
279
|
-
|
|
280
282
|
ak = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
|
|
281
283
|
sk = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
|
|
282
284
|
if not ak or not sk:
|
|
283
285
|
raise ValueError("KS3 credentials are not configured")
|
|
284
|
-
|
|
286
|
+
connection_class = importlib.import_module("ks3.connection").Connection
|
|
287
|
+
conn = connection_class(ak, sk, host=self._endpoint())
|
|
285
288
|
ks3_bucket = self._ensure_bucket(conn, bucket)
|
|
286
289
|
key = ks3_bucket.new_key(object_key)
|
|
287
290
|
key.set_contents_from_string(
|
|
@@ -292,17 +295,19 @@ class AttachmentStorageService:
|
|
|
292
295
|
def _read_ks3_object_sync(self, bucket: str, object_key: str) -> bytes:
|
|
293
296
|
if not bucket or not object_key:
|
|
294
297
|
raise FileNotFoundError(object_key)
|
|
295
|
-
from ks3.connection import Connection
|
|
296
|
-
|
|
297
298
|
ak = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
|
|
298
299
|
sk = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
|
|
299
300
|
if not ak or not sk:
|
|
300
301
|
raise ValueError("KS3 credentials are not configured")
|
|
301
|
-
|
|
302
|
+
connection_class = importlib.import_module("ks3.connection").Connection
|
|
303
|
+
conn = connection_class(ak, sk, host=self._endpoint())
|
|
302
304
|
key = conn.get_bucket(bucket).get_key(object_key)
|
|
303
305
|
if key is None:
|
|
304
306
|
raise FileNotFoundError(object_key)
|
|
305
|
-
|
|
307
|
+
content = key.get_contents_as_string()
|
|
308
|
+
if not isinstance(content, bytes):
|
|
309
|
+
raise TypeError("KS3 object content must be bytes")
|
|
310
|
+
return content
|
|
306
311
|
|
|
307
312
|
@staticmethod
|
|
308
313
|
def _ensure_bucket(conn: Any, bucket_name: str):
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
|
+
import importlib
|
|
4
5
|
import io
|
|
5
|
-
import json
|
|
6
6
|
import mimetypes
|
|
7
7
|
import zipfile
|
|
8
8
|
from pathlib import Path, PurePosixPath
|
|
@@ -168,7 +168,9 @@ def resolve_attachment_storage_path(file_uri: str) -> Optional[Path]:
|
|
|
168
168
|
return None
|
|
169
169
|
|
|
170
170
|
|
|
171
|
-
def read_attachment_bytes(
|
|
171
|
+
def read_attachment_bytes(
|
|
172
|
+
storage_path: Optional[Path], *, size_limit: Optional[int] = None
|
|
173
|
+
) -> Optional[bytes]:
|
|
172
174
|
if storage_path is None or not storage_path.is_file():
|
|
173
175
|
return None
|
|
174
176
|
|
|
@@ -272,12 +274,7 @@ def build_attachment_prompt_text(result: Mapping[str, Any]) -> str:
|
|
|
272
274
|
|
|
273
275
|
size_bytes = result.get("size_bytes")
|
|
274
276
|
if size_bytes is not None:
|
|
275
|
-
return
|
|
276
|
-
"[上传文件: "
|
|
277
|
-
f"{display_name}, "
|
|
278
|
-
f"mime={mime_type}, "
|
|
279
|
-
f"bytes={size_bytes}]"
|
|
280
|
-
)
|
|
277
|
+
return "[上传文件: " f"{display_name}, " f"mime={mime_type}, " f"bytes={size_bytes}]"
|
|
281
278
|
|
|
282
279
|
return f"[上传文件引用: {display_name}, mime={mime_type}]"
|
|
283
280
|
|
|
@@ -353,9 +350,11 @@ def _build_attachment_result_from_raw(
|
|
|
353
350
|
if raw is None:
|
|
354
351
|
result["status"] = "partial" if size_bytes else "failed"
|
|
355
352
|
result["warnings"] = [
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
353
|
+
(
|
|
354
|
+
"附件原始内容不可用,当前仅保留元数据摘要。"
|
|
355
|
+
if size_bytes
|
|
356
|
+
else "附件内容无法读取,请重新上传或检查文件句柄是否仍可访问。"
|
|
357
|
+
)
|
|
359
358
|
]
|
|
360
359
|
return result
|
|
361
360
|
|
|
@@ -420,7 +419,9 @@ def _extract_document_attachment(result: dict[str, Any], raw: bytes) -> dict[str
|
|
|
420
419
|
if text:
|
|
421
420
|
return _with_text(result, text=text, extraction_method=extractor[1])
|
|
422
421
|
result["status"] = "failed"
|
|
423
|
-
result["warnings"] = [
|
|
422
|
+
result["warnings"] = [
|
|
423
|
+
f"{suffix.lstrip('.').upper()} 文档抽取失败,请检查文件是否损坏或重新导出后重试。"
|
|
424
|
+
]
|
|
424
425
|
result["extraction_method"] = extractor[1]
|
|
425
426
|
return result
|
|
426
427
|
|
|
@@ -435,7 +436,9 @@ def _extract_document_attachment(result: dict[str, Any], raw: bytes) -> dict[str
|
|
|
435
436
|
|
|
436
437
|
|
|
437
438
|
def _extract_image_attachment(result: dict[str, Any], raw: bytes) -> dict[str, Any]:
|
|
438
|
-
ocr = perform_ocr(
|
|
439
|
+
ocr = perform_ocr(
|
|
440
|
+
raw, str(result.get("mime_type") or ""), str(result.get("display_name") or "")
|
|
441
|
+
)
|
|
439
442
|
result["image"] = {"ocr_engine": ocr.get("engine") or ""}
|
|
440
443
|
if ocr.get("text"):
|
|
441
444
|
return _with_text(result, text=ocr["text"], extraction_method="image_ocr")
|
|
@@ -524,9 +527,7 @@ def _extract_archive_attachment(result: dict[str, Any], raw: bytes) -> dict[str,
|
|
|
524
527
|
}
|
|
525
528
|
)
|
|
526
529
|
if child_result.get("text"):
|
|
527
|
-
extracted_chunks.append(
|
|
528
|
-
f"[{normalized_path}]\n{child_result['text']}"
|
|
529
|
-
)
|
|
530
|
+
extracted_chunks.append(f"[{normalized_path}]\n{child_result['text']}")
|
|
530
531
|
|
|
531
532
|
result["archive"] = {
|
|
532
533
|
"entries": entries,
|
|
@@ -578,9 +579,11 @@ def _load_attachment_bytes(attachment: Mapping[str, Any]) -> Optional[bytes]:
|
|
|
578
579
|
return None
|
|
579
580
|
return raw if len(raw) <= _MAX_PROCESS_BYTES else None
|
|
580
581
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
582
|
+
stored_raw = read_attachment_uri_bytes(
|
|
583
|
+
attachment.get("file_uri"), size_limit=_MAX_PROCESS_BYTES
|
|
584
|
+
)
|
|
585
|
+
if stored_raw is not None:
|
|
586
|
+
return stored_raw
|
|
584
587
|
return None
|
|
585
588
|
|
|
586
589
|
|
|
@@ -621,7 +624,11 @@ def _extract_xlsx_text(raw: bytes) -> str:
|
|
|
621
624
|
shared_strings = []
|
|
622
625
|
|
|
623
626
|
rows: list[str] = []
|
|
624
|
-
for name in sorted(
|
|
627
|
+
for name in sorted(
|
|
628
|
+
item
|
|
629
|
+
for item in archive.namelist()
|
|
630
|
+
if item.startswith("xl/worksheets/") and item.endswith(".xml")
|
|
631
|
+
):
|
|
625
632
|
try:
|
|
626
633
|
root = ET.fromstring(archive.read(name))
|
|
627
634
|
except Exception:
|
|
@@ -648,7 +655,9 @@ def _extract_xlsx_text(raw: bytes) -> str:
|
|
|
648
655
|
if isinstance(child.tag, str) and child.tag.endswith("}t")
|
|
649
656
|
)
|
|
650
657
|
else:
|
|
651
|
-
value_text = next(
|
|
658
|
+
value_text = next(
|
|
659
|
+
(child.text or "" for child in cell if child.tag.endswith("}v")), ""
|
|
660
|
+
)
|
|
652
661
|
if value_text.strip():
|
|
653
662
|
values.append(value_text.strip())
|
|
654
663
|
if values:
|
|
@@ -679,17 +688,19 @@ def _extract_xml_text_from_zip(raw: bytes, *, prefixes: tuple[str, ...]) -> str:
|
|
|
679
688
|
texts: list[str] = []
|
|
680
689
|
with archive:
|
|
681
690
|
for name in sorted(
|
|
682
|
-
item
|
|
691
|
+
item
|
|
692
|
+
for item in archive.namelist()
|
|
693
|
+
if item.endswith(".xml") and item.startswith(prefixes)
|
|
683
694
|
):
|
|
684
695
|
try:
|
|
685
696
|
root = ET.fromstring(archive.read(name))
|
|
686
697
|
except Exception:
|
|
687
698
|
continue
|
|
688
|
-
fragment = [
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
if isinstance(node.tag, str) and node.tag.endswith("}t") and
|
|
692
|
-
|
|
699
|
+
fragment = []
|
|
700
|
+
for node in root.iter():
|
|
701
|
+
text = node.text or ""
|
|
702
|
+
if isinstance(node.tag, str) and node.tag.endswith("}t") and text.strip():
|
|
703
|
+
fragment.append(text.strip())
|
|
693
704
|
if fragment:
|
|
694
705
|
texts.append("\n".join(fragment))
|
|
695
706
|
return "\n\n".join(texts)
|
|
@@ -710,22 +721,18 @@ def _pdf_text_quality_is_poor(text: str) -> bool:
|
|
|
710
721
|
normalized = "".join(ch for ch in text if not ch.isspace())
|
|
711
722
|
if len(normalized) < 20:
|
|
712
723
|
return True
|
|
713
|
-
readable = sum(
|
|
714
|
-
1
|
|
715
|
-
for ch in normalized
|
|
716
|
-
if ch.isalnum() or ("\u4e00" <= ch <= "\u9fff")
|
|
717
|
-
)
|
|
724
|
+
readable = sum(1 for ch in normalized if ch.isalnum() or ("\u4e00" <= ch <= "\u9fff"))
|
|
718
725
|
return readable / max(len(normalized), 1) < 0.5
|
|
719
726
|
|
|
720
727
|
|
|
721
728
|
def _perform_rapidocr(raw: bytes) -> str:
|
|
722
729
|
try:
|
|
723
|
-
|
|
730
|
+
rapidocr_module = importlib.import_module("rapidocr_onnxruntime")
|
|
724
731
|
except Exception:
|
|
725
732
|
return ""
|
|
726
733
|
|
|
727
734
|
try:
|
|
728
|
-
engine = RapidOCR()
|
|
735
|
+
engine = rapidocr_module.RapidOCR()
|
|
729
736
|
result, _ = engine(raw)
|
|
730
737
|
except Exception:
|
|
731
738
|
return ""
|
|
@@ -741,7 +748,8 @@ def _perform_rapidocr(raw: bytes) -> str:
|
|
|
741
748
|
def _perform_tesseract_ocr(raw: bytes) -> str:
|
|
742
749
|
try:
|
|
743
750
|
from PIL import Image
|
|
744
|
-
|
|
751
|
+
|
|
752
|
+
pytesseract = importlib.import_module("pytesseract")
|
|
745
753
|
except Exception:
|
|
746
754
|
return ""
|
|
747
755
|
|
|
@@ -755,7 +763,7 @@ def _perform_tesseract_ocr(raw: bytes) -> str:
|
|
|
755
763
|
text = pytesseract.image_to_string(image, lang=lang)
|
|
756
764
|
except Exception:
|
|
757
765
|
continue
|
|
758
|
-
if text and text.strip():
|
|
766
|
+
if isinstance(text, str) and text.strip():
|
|
759
767
|
return text.strip()
|
|
760
768
|
return ""
|
|
761
769
|
|
|
@@ -87,9 +87,7 @@ def _bool_env(name: str, default: bool) -> bool:
|
|
|
87
87
|
def candidate_tokens(groups: Sequence[Sequence[SessionEvent]]) -> int:
|
|
88
88
|
"""估算 candidate groups 的总 token(用于 pipeline 渐进停止判断)。"""
|
|
89
89
|
return sum(
|
|
90
|
-
estimate_text_tokens(extract_event_text(event))
|
|
91
|
-
for group in groups
|
|
92
|
-
for event in group
|
|
90
|
+
estimate_text_tokens(extract_event_text(event)) for group in groups for event in group
|
|
93
91
|
)
|
|
94
92
|
|
|
95
93
|
|
|
@@ -108,12 +106,7 @@ def _tool_signature(event: SessionEvent) -> str | None:
|
|
|
108
106
|
return None
|
|
109
107
|
content = event.content or {}
|
|
110
108
|
metadata = event.metadata or {}
|
|
111
|
-
name = str(
|
|
112
|
-
metadata.get("tool_name")
|
|
113
|
-
or content.get("name")
|
|
114
|
-
or content.get("tool_name")
|
|
115
|
-
or ""
|
|
116
|
-
)
|
|
109
|
+
name = str(metadata.get("tool_name") or content.get("name") or content.get("tool_name") or "")
|
|
117
110
|
# 参数优先取 metadata.tool_args(真实 runtime),回退 content.arguments(合成/历史)。
|
|
118
111
|
arguments = (
|
|
119
112
|
metadata.get("tool_args")
|
|
@@ -264,8 +257,14 @@ def microcompact_cold_groups(
|
|
|
264
257
|
|
|
265
258
|
# 尾部 N 组保留(它们可能还被模型需要),更早的组视为冷组。
|
|
266
259
|
cold_rounds = _microcompact_cold_rounds()
|
|
267
|
-
cold_groups =
|
|
268
|
-
|
|
260
|
+
cold_groups = (
|
|
261
|
+
[list(group) for group in groups[:-cold_rounds]] if cold_rounds < len(groups) else []
|
|
262
|
+
)
|
|
263
|
+
tail_groups = (
|
|
264
|
+
[list(group) for group in groups[-cold_rounds:]]
|
|
265
|
+
if cold_rounds < len(groups)
|
|
266
|
+
else [list(group) for group in groups]
|
|
267
|
+
)
|
|
269
268
|
|
|
270
269
|
if not cold_groups:
|
|
271
270
|
return MicrocompactResult(
|
|
@@ -323,7 +322,8 @@ def build_working_set_metadata(
|
|
|
323
322
|
) -> dict[str, Any]:
|
|
324
323
|
"""L5 working set 恢复(保守版):只记 metadata,不读文件内容。
|
|
325
324
|
|
|
326
|
-
recent_files: 调用方从 workspace_state 取最近 N 个文件的
|
|
325
|
+
recent_files: 调用方从 workspace_state 取最近 N 个文件的
|
|
326
|
+
{path, mtime_ns, size_bytes, read_range}。
|
|
327
327
|
active_tools: 调用方从 describe_agentengine_tools 取 enabled 工具名。
|
|
328
328
|
下一轮 prompt 注入时只提示"这些文件最近读过",不注入内容(避免 token 膨胀)。
|
|
329
329
|
"""
|
|
@@ -92,10 +92,12 @@ def build_compaction_prompt_messages(
|
|
|
92
92
|
不把 prompt 字符串散落到 runtime 编排里。
|
|
93
93
|
"""
|
|
94
94
|
|
|
95
|
-
groups_text =
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
groups_text = (
|
|
96
|
+
"\n\n".join(
|
|
97
|
+
_format_group(group, index=index + 1) for index, group in enumerate(groups_to_compact)
|
|
98
|
+
).strip()
|
|
99
|
+
or "无可压缩内容"
|
|
100
|
+
)
|
|
99
101
|
user_prompt = _SUMMARY_USER_PROMPT.format(
|
|
100
102
|
model_metadata=json.dumps(dict(model_metadata or {}), ensure_ascii=False, indent=2),
|
|
101
103
|
previous_summary=previous_summary.strip() or "无",
|
|
@@ -115,7 +117,9 @@ def extract_summary_text(response_text: str) -> str:
|
|
|
115
117
|
if not raw:
|
|
116
118
|
return ""
|
|
117
119
|
|
|
118
|
-
summary_match = re.search(
|
|
120
|
+
summary_match = re.search(
|
|
121
|
+
r"<summary>\s*(.*?)\s*</summary>", raw, flags=re.DOTALL | re.IGNORECASE
|
|
122
|
+
)
|
|
119
123
|
if summary_match:
|
|
120
124
|
return summary_match.group(1).strip()
|
|
121
125
|
|