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
|
@@ -1,460 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Langfuse Exporter for KsADK Tracing
|
|
3
|
-
|
|
4
|
-
Converts OpenTelemetry spans to Langfuse traces using low-level SDK API.
|
|
5
|
-
Compatible with Langfuse SDK v3.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import json
|
|
9
|
-
import logging
|
|
10
|
-
import os
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class LangfuseExporterConfig:
|
|
18
|
-
"""Configuration for Langfuse exporter"""
|
|
19
|
-
|
|
20
|
-
public_key: str
|
|
21
|
-
secret_key: str
|
|
22
|
-
host: str = "http://localhost:3000"
|
|
23
|
-
enabled: bool = True
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
# Alias for backward compatibility
|
|
27
|
-
LangfuseConfig = LangfuseExporterConfig
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class _LangfuseSpanExporter:
|
|
31
|
-
"""Internal span exporter that sends spans to Langfuse.
|
|
32
|
-
|
|
33
|
-
Uses Langfuse low-level SDK API (v3 compatible).
|
|
34
|
-
Agent metadata is loaded from ksadk.configs.settings.
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
def __init__(self, config: LangfuseExporterConfig):
|
|
38
|
-
self.config = config
|
|
39
|
-
self._langfuse = None
|
|
40
|
-
self._agent_config = None # Lazy load
|
|
41
|
-
self._init_langfuse()
|
|
42
|
-
|
|
43
|
-
def _get_agent_config(self):
|
|
44
|
-
"""Lazy load agent config from unified settings"""
|
|
45
|
-
if self._agent_config is None:
|
|
46
|
-
try:
|
|
47
|
-
from ksadk.configs import settings
|
|
48
|
-
|
|
49
|
-
self._agent_config = settings.agent
|
|
50
|
-
|
|
51
|
-
# Log loaded metadata
|
|
52
|
-
if self._agent_config.agent_id:
|
|
53
|
-
logger.info(f"Agent metadata loaded: agent_id={self._agent_config.agent_id}")
|
|
54
|
-
if self._agent_config.tenant_id:
|
|
55
|
-
logger.debug(f"Tenant ID: {self._agent_config.tenant_id}")
|
|
56
|
-
except ImportError:
|
|
57
|
-
logger.warning("ksadk.configs not available, agent metadata disabled")
|
|
58
|
-
self._agent_config = None
|
|
59
|
-
return self._agent_config
|
|
60
|
-
|
|
61
|
-
def _init_langfuse(self):
|
|
62
|
-
"""Initialize Langfuse client using low-level API"""
|
|
63
|
-
try:
|
|
64
|
-
# Set environment variables for Langfuse
|
|
65
|
-
os.environ["LANGFUSE_PUBLIC_KEY"] = self.config.public_key
|
|
66
|
-
os.environ["LANGFUSE_SECRET_KEY"] = self.config.secret_key
|
|
67
|
-
os.environ["LANGFUSE_HOST"] = self.config.host
|
|
68
|
-
|
|
69
|
-
# Use Langfuse low-level client
|
|
70
|
-
from langfuse import Langfuse
|
|
71
|
-
|
|
72
|
-
self._langfuse = Langfuse(
|
|
73
|
-
public_key=self.config.public_key,
|
|
74
|
-
secret_key=self.config.secret_key,
|
|
75
|
-
host=self.config.host,
|
|
76
|
-
)
|
|
77
|
-
logger.info(f"Langfuse client initialized: {self.config.host}")
|
|
78
|
-
except ImportError:
|
|
79
|
-
logger.warning("Langfuse package not installed. Run: pip install langfuse")
|
|
80
|
-
self._langfuse = None
|
|
81
|
-
except Exception as e:
|
|
82
|
-
logger.error(f"Failed to initialize Langfuse: {e}")
|
|
83
|
-
self._langfuse = None
|
|
84
|
-
|
|
85
|
-
def export(self, spans) -> int:
|
|
86
|
-
"""Export spans to Langfuse using low-level API"""
|
|
87
|
-
if not self._langfuse:
|
|
88
|
-
return 0
|
|
89
|
-
|
|
90
|
-
from opentelemetry.sdk.trace.export import SpanExportResult
|
|
91
|
-
|
|
92
|
-
try:
|
|
93
|
-
# Group spans by trace_id
|
|
94
|
-
traces = {}
|
|
95
|
-
for span in spans:
|
|
96
|
-
trace_id = format(span.context.trace_id, "032x")
|
|
97
|
-
if trace_id not in traces:
|
|
98
|
-
traces[trace_id] = []
|
|
99
|
-
traces[trace_id].append(span)
|
|
100
|
-
|
|
101
|
-
# Process each trace group
|
|
102
|
-
for trace_id, trace_spans in traces.items():
|
|
103
|
-
self._export_trace(trace_id, trace_spans)
|
|
104
|
-
|
|
105
|
-
self._langfuse.flush()
|
|
106
|
-
return SpanExportResult.SUCCESS
|
|
107
|
-
|
|
108
|
-
except Exception as e:
|
|
109
|
-
logger.error(f"Failed to export to Langfuse: {e}")
|
|
110
|
-
import traceback
|
|
111
|
-
|
|
112
|
-
traceback.print_exc()
|
|
113
|
-
return SpanExportResult.FAILURE
|
|
114
|
-
|
|
115
|
-
def _export_trace(self, trace_id: str, spans):
|
|
116
|
-
"""Export spans using Langfuse ingestion API"""
|
|
117
|
-
langfuse = self._langfuse
|
|
118
|
-
if langfuse is None:
|
|
119
|
-
return
|
|
120
|
-
|
|
121
|
-
# Find root span and categorize
|
|
122
|
-
root_span = None
|
|
123
|
-
llm_spans = []
|
|
124
|
-
tool_spans = []
|
|
125
|
-
|
|
126
|
-
for span in spans:
|
|
127
|
-
# Robust Root Span Detection:
|
|
128
|
-
# 1. Check if parent is None (standard OTEL way)
|
|
129
|
-
# 2. Check for known prefixes (fallback)
|
|
130
|
-
is_root = False
|
|
131
|
-
if hasattr(span, "parent") and span.parent:
|
|
132
|
-
# Local parent exists
|
|
133
|
-
is_root = False
|
|
134
|
-
elif (
|
|
135
|
-
hasattr(span, "context")
|
|
136
|
-
and hasattr(span.context, "is_remote")
|
|
137
|
-
and span.context.is_remote
|
|
138
|
-
):
|
|
139
|
-
# Remote parent (distributed tracing) - treat as root for this service context?
|
|
140
|
-
# For now, we treat standard root spans (no parent) as root.
|
|
141
|
-
pass
|
|
142
|
-
elif not span.parent:
|
|
143
|
-
is_root = True
|
|
144
|
-
|
|
145
|
-
# Fallback for SDKs that might not expose parent property easily or if it's None
|
|
146
|
-
if not is_root:
|
|
147
|
-
name = span.name
|
|
148
|
-
if (
|
|
149
|
-
name.startswith("langgraph.")
|
|
150
|
-
or name.startswith("langchain.")
|
|
151
|
-
or name.startswith("adk.")
|
|
152
|
-
):
|
|
153
|
-
is_root = True
|
|
154
|
-
|
|
155
|
-
if is_root:
|
|
156
|
-
root_span = span
|
|
157
|
-
elif name == "call_llm":
|
|
158
|
-
llm_spans.append(span)
|
|
159
|
-
elif name.startswith("tool."):
|
|
160
|
-
tool_spans.append(span)
|
|
161
|
-
|
|
162
|
-
if not root_span:
|
|
163
|
-
# If batch doesn't contain a clear root, use the first span to carry context if needed
|
|
164
|
-
# But be careful not to treat random child spans as root for attributes
|
|
165
|
-
root_span = spans[0] if spans else None
|
|
166
|
-
|
|
167
|
-
if not root_span:
|
|
168
|
-
return
|
|
169
|
-
|
|
170
|
-
# Extract attributes
|
|
171
|
-
attrs = dict(root_span.attributes) if root_span.attributes else {}
|
|
172
|
-
# Preserve the OTEL trace ID across manual and auto-instrumented spans.
|
|
173
|
-
invocation_id = trace_id
|
|
174
|
-
user_input = attrs.get("user.input", "")
|
|
175
|
-
agent_output = attrs.get("agent.output", "")
|
|
176
|
-
|
|
177
|
-
# Extract Langfuse-specific attributes from span
|
|
178
|
-
span_session_id = (
|
|
179
|
-
attrs.get("langfuse.session.id")
|
|
180
|
-
or attrs.get("langfuse.session_id")
|
|
181
|
-
or attrs.get("session.id")
|
|
182
|
-
)
|
|
183
|
-
span_tags = attrs.get("langfuse.tags", "")
|
|
184
|
-
span_user_id = (
|
|
185
|
-
attrs.get("langfuse.user.id") or attrs.get("langfuse.user_id") or attrs.get("user.id")
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
# Create trace using ingestion endpoint
|
|
189
|
-
try:
|
|
190
|
-
# Build base metadata
|
|
191
|
-
base_metadata = {
|
|
192
|
-
"trace_id": trace_id,
|
|
193
|
-
"framework": "ksadk",
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
# Get agent config from unified settings
|
|
197
|
-
agent_config = self._get_agent_config()
|
|
198
|
-
|
|
199
|
-
# Merge with agent metadata if available
|
|
200
|
-
langfuse_params = {}
|
|
201
|
-
trace_name = root_span.name
|
|
202
|
-
|
|
203
|
-
if agent_config:
|
|
204
|
-
agent_metadata = agent_config.to_langfuse_metadata()
|
|
205
|
-
base_metadata.update(agent_metadata)
|
|
206
|
-
|
|
207
|
-
langfuse_params = agent_config.to_langfuse_params()
|
|
208
|
-
|
|
209
|
-
# Use agent_name if available (only if root span)
|
|
210
|
-
if (
|
|
211
|
-
agent_config.agent_name and root_span == spans[0]
|
|
212
|
-
): # Rough check if it's main Span
|
|
213
|
-
trace_name = agent_config.agent_name
|
|
214
|
-
|
|
215
|
-
# 优先使用 span attributes 中的值 (从 runner 传递)
|
|
216
|
-
if span_session_id:
|
|
217
|
-
langfuse_params["session_id"] = span_session_id
|
|
218
|
-
|
|
219
|
-
if span_user_id:
|
|
220
|
-
langfuse_params["user_id"] = span_user_id
|
|
221
|
-
|
|
222
|
-
# 处理 tags
|
|
223
|
-
existing_tags = langfuse_params.get("tags", []) or []
|
|
224
|
-
if span_tags:
|
|
225
|
-
span_tags_list = [t.strip() for t in span_tags.split(",") if t.strip()]
|
|
226
|
-
for tag in span_tags_list:
|
|
227
|
-
if tag not in existing_tags:
|
|
228
|
-
existing_tags.append(tag)
|
|
229
|
-
|
|
230
|
-
if agent_config:
|
|
231
|
-
if agent_config.agent_name and agent_config.agent_name not in existing_tags:
|
|
232
|
-
existing_tags.append(agent_config.agent_name)
|
|
233
|
-
if agent_config.environment and agent_config.environment not in existing_tags:
|
|
234
|
-
existing_tags.append(agent_config.environment)
|
|
235
|
-
|
|
236
|
-
if existing_tags:
|
|
237
|
-
langfuse_params["tags"] = existing_tags
|
|
238
|
-
|
|
239
|
-
# Prepare kwargs for trace() to avoid passing None and overwriting existing values
|
|
240
|
-
trace_kwargs = {
|
|
241
|
-
"id": invocation_id,
|
|
242
|
-
"name": trace_name,
|
|
243
|
-
"metadata": base_metadata,
|
|
244
|
-
**langfuse_params,
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if user_input:
|
|
248
|
-
trace_kwargs["input"] = {"text": user_input}
|
|
249
|
-
if agent_output:
|
|
250
|
-
trace_kwargs["output"] = {"text": agent_output}
|
|
251
|
-
|
|
252
|
-
# Use create_trace method (available in v3)
|
|
253
|
-
trace = langfuse.trace(**trace_kwargs)
|
|
254
|
-
|
|
255
|
-
# Add LLM generations
|
|
256
|
-
for llm_span in llm_spans:
|
|
257
|
-
self._add_generation(trace, llm_span)
|
|
258
|
-
|
|
259
|
-
# Add tool spans
|
|
260
|
-
for tool_span in tool_spans:
|
|
261
|
-
self._add_tool_span(trace, tool_span)
|
|
262
|
-
|
|
263
|
-
self._add_score_events(trace_id, spans)
|
|
264
|
-
|
|
265
|
-
except AttributeError:
|
|
266
|
-
# Fallback: use score/event API if trace() not available
|
|
267
|
-
self._export_via_events(invocation_id, root_span, llm_spans, tool_spans)
|
|
268
|
-
|
|
269
|
-
def _add_generation(self, trace, span):
|
|
270
|
-
"""Add LLM generation to trace"""
|
|
271
|
-
attrs = dict(span.attributes) if span.attributes else {}
|
|
272
|
-
|
|
273
|
-
llm_request_str = attrs.get("gcp.vertex.agent.llm_request", "{}")
|
|
274
|
-
llm_response_str = attrs.get("gcp.vertex.agent.llm_response", "{}")
|
|
275
|
-
|
|
276
|
-
try:
|
|
277
|
-
llm_request = json.loads(llm_request_str)
|
|
278
|
-
llm_response = json.loads(llm_response_str)
|
|
279
|
-
except json.JSONDecodeError:
|
|
280
|
-
llm_request = {"raw": llm_request_str}
|
|
281
|
-
llm_response = {"raw": llm_response_str}
|
|
282
|
-
|
|
283
|
-
# Extract text content
|
|
284
|
-
input_text = ""
|
|
285
|
-
output_text = ""
|
|
286
|
-
|
|
287
|
-
if "contents" in llm_request:
|
|
288
|
-
contents = llm_request.get("contents", [])
|
|
289
|
-
if contents and "parts" in contents[0]:
|
|
290
|
-
parts = contents[0].get("parts", [])
|
|
291
|
-
if parts and "text" in parts[0]:
|
|
292
|
-
input_text = parts[0]["text"]
|
|
293
|
-
|
|
294
|
-
if "candidates" in llm_response:
|
|
295
|
-
candidates = llm_response.get("candidates", [])
|
|
296
|
-
if candidates and "content" in candidates[0]:
|
|
297
|
-
content = candidates[0]["content"]
|
|
298
|
-
if "parts" in content:
|
|
299
|
-
parts = content["parts"]
|
|
300
|
-
if parts and "text" in parts[0]:
|
|
301
|
-
output_text = parts[0]["text"]
|
|
302
|
-
|
|
303
|
-
model = attrs.get("model", attrs.get("gen_ai.request.model", "unknown"))
|
|
304
|
-
|
|
305
|
-
try:
|
|
306
|
-
trace.generation(
|
|
307
|
-
name=span.name,
|
|
308
|
-
model=model,
|
|
309
|
-
input=input_text or llm_request,
|
|
310
|
-
output=output_text or llm_response,
|
|
311
|
-
metadata={
|
|
312
|
-
"span_id": format(span.context.span_id, "016x"),
|
|
313
|
-
},
|
|
314
|
-
)
|
|
315
|
-
except AttributeError:
|
|
316
|
-
# Generation method not available, skip
|
|
317
|
-
pass
|
|
318
|
-
|
|
319
|
-
def _add_tool_span(self, trace, span):
|
|
320
|
-
"""Add tool execution span"""
|
|
321
|
-
attrs = dict(span.attributes) if span.attributes else {}
|
|
322
|
-
|
|
323
|
-
tool_name = attrs.get("tool.name", span.name.replace("tool.", ""))
|
|
324
|
-
tool_input = attrs.get("tool.input", "")
|
|
325
|
-
tool_output = attrs.get("tool.output", "")
|
|
326
|
-
|
|
327
|
-
try:
|
|
328
|
-
trace.span(
|
|
329
|
-
name=f"tool:{tool_name}",
|
|
330
|
-
input={"args": tool_input} if tool_input else None,
|
|
331
|
-
output={"result": tool_output} if tool_output else None,
|
|
332
|
-
metadata={
|
|
333
|
-
"tool_name": tool_name,
|
|
334
|
-
},
|
|
335
|
-
)
|
|
336
|
-
except AttributeError:
|
|
337
|
-
pass
|
|
338
|
-
|
|
339
|
-
def _add_score_events(self, trace_id: str, spans) -> None:
|
|
340
|
-
"""Convert OTel score events into Langfuse scores when the client supports it."""
|
|
341
|
-
for span in spans:
|
|
342
|
-
for event in getattr(span, "events", ()) or ():
|
|
343
|
-
attrs = dict(getattr(event, "attributes", None) or {})
|
|
344
|
-
event_name = str(getattr(event, "name", "") or "")
|
|
345
|
-
if event_name != "langfuse.score" and not attrs.get("score.name"):
|
|
346
|
-
continue
|
|
347
|
-
self._add_score(trace_id, attrs)
|
|
348
|
-
|
|
349
|
-
def _add_score(self, trace_id: str, attrs: dict) -> None:
|
|
350
|
-
if not self._langfuse or not hasattr(self._langfuse, "score"):
|
|
351
|
-
return
|
|
352
|
-
score_name = attrs.get("score.name") or attrs.get("langfuse.score.name")
|
|
353
|
-
if not score_name:
|
|
354
|
-
return
|
|
355
|
-
|
|
356
|
-
known_keys = {
|
|
357
|
-
"score.id",
|
|
358
|
-
"score.name",
|
|
359
|
-
"score.value",
|
|
360
|
-
"score.data_type",
|
|
361
|
-
"score.comment",
|
|
362
|
-
"langfuse.score.id",
|
|
363
|
-
"langfuse.score.name",
|
|
364
|
-
"langfuse.score.value",
|
|
365
|
-
"langfuse.score.data_type",
|
|
366
|
-
"langfuse.score.comment",
|
|
367
|
-
"langfuse.trace_id",
|
|
368
|
-
"trace_id",
|
|
369
|
-
"langfuse.observation_id",
|
|
370
|
-
"observation_id",
|
|
371
|
-
}
|
|
372
|
-
score_kwargs = {
|
|
373
|
-
"trace_id": attrs.get("langfuse.trace_id") or attrs.get("trace_id") or trace_id,
|
|
374
|
-
"name": score_name,
|
|
375
|
-
"value": attrs.get("score.value") or attrs.get("langfuse.score.value"),
|
|
376
|
-
}
|
|
377
|
-
score_id = attrs.get("score.id") or attrs.get("langfuse.score.id")
|
|
378
|
-
if score_id:
|
|
379
|
-
score_kwargs["id"] = score_id
|
|
380
|
-
data_type = attrs.get("score.data_type") or attrs.get("langfuse.score.data_type")
|
|
381
|
-
if data_type:
|
|
382
|
-
score_kwargs["data_type"] = data_type
|
|
383
|
-
comment = attrs.get("score.comment") or attrs.get("langfuse.score.comment")
|
|
384
|
-
if comment:
|
|
385
|
-
score_kwargs["comment"] = comment
|
|
386
|
-
observation_id = attrs.get("langfuse.observation_id") or attrs.get("observation_id")
|
|
387
|
-
if observation_id:
|
|
388
|
-
score_kwargs["observation_id"] = observation_id
|
|
389
|
-
metadata = {key: value for key, value in attrs.items() if key not in known_keys}
|
|
390
|
-
if metadata:
|
|
391
|
-
score_kwargs["metadata"] = metadata
|
|
392
|
-
|
|
393
|
-
try:
|
|
394
|
-
self._langfuse.score(**score_kwargs)
|
|
395
|
-
except TypeError:
|
|
396
|
-
score_kwargs["traceId"] = score_kwargs.pop("trace_id")
|
|
397
|
-
if "observation_id" in score_kwargs:
|
|
398
|
-
score_kwargs["observationId"] = score_kwargs.pop("observation_id")
|
|
399
|
-
if "data_type" in score_kwargs:
|
|
400
|
-
score_kwargs["dataType"] = score_kwargs.pop("data_type")
|
|
401
|
-
self._langfuse.score(**score_kwargs)
|
|
402
|
-
except AttributeError:
|
|
403
|
-
pass
|
|
404
|
-
|
|
405
|
-
def _export_via_events(self, trace_id: str, root_span, llm_spans, tool_spans):
|
|
406
|
-
"""Fallback export using event-based API"""
|
|
407
|
-
# This is a fallback for when trace() method is not available
|
|
408
|
-
logger.debug(f"Exporting trace {trace_id} via fallback method")
|
|
409
|
-
# Just log for now - can be enhanced later
|
|
410
|
-
pass
|
|
411
|
-
|
|
412
|
-
def shutdown(self):
|
|
413
|
-
"""Shutdown the exporter"""
|
|
414
|
-
if self._langfuse:
|
|
415
|
-
try:
|
|
416
|
-
self._langfuse.flush()
|
|
417
|
-
self._langfuse.shutdown()
|
|
418
|
-
except Exception:
|
|
419
|
-
pass
|
|
420
|
-
|
|
421
|
-
def force_flush(self, timeout_millis: int = 30000) -> bool:
|
|
422
|
-
"""Force flush pending spans"""
|
|
423
|
-
if self._langfuse:
|
|
424
|
-
try:
|
|
425
|
-
self._langfuse.flush()
|
|
426
|
-
except Exception:
|
|
427
|
-
pass
|
|
428
|
-
return True
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
class LangfuseExporter:
|
|
432
|
-
"""Langfuse exporter for KsADK tracing system.
|
|
433
|
-
|
|
434
|
-
Compatible with Langfuse SDK v3.
|
|
435
|
-
"""
|
|
436
|
-
|
|
437
|
-
def __init__(self, config: LangfuseExporterConfig):
|
|
438
|
-
self.config = config
|
|
439
|
-
self.name = "langfuse_exporter"
|
|
440
|
-
|
|
441
|
-
self._exporter = _LangfuseSpanExporter(config)
|
|
442
|
-
self.processor = self._create_processor()
|
|
443
|
-
|
|
444
|
-
def _create_processor(self):
|
|
445
|
-
"""Create span processor for this exporter"""
|
|
446
|
-
try:
|
|
447
|
-
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
|
|
448
|
-
|
|
449
|
-
return SimpleSpanProcessor(self._exporter)
|
|
450
|
-
except ImportError:
|
|
451
|
-
logger.error("OpenTelemetry SDK not installed")
|
|
452
|
-
return None
|
|
453
|
-
|
|
454
|
-
@property
|
|
455
|
-
def resource_attributes(self) -> dict:
|
|
456
|
-
"""Return resource attributes for this exporter"""
|
|
457
|
-
return {
|
|
458
|
-
"service.name": "ksadk",
|
|
459
|
-
"langfuse.host": self.config.host,
|
|
460
|
-
}
|
{agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt
RENAMED
|
File without changes
|