agentevals-cli 0.9.7__tar.gz → 0.9.8__tar.gz
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.
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/workflows/ci.yml +4 -1
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/Dockerfile +6 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/PKG-INFO +15 -5
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/pyproject.toml +16 -3
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/incremental_processor.py +9 -5
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/trace_attrs.py +3 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/log_enrichment.py +20 -15
- agentevals_cli-0.9.8/tests/test_incremental_processor.py +26 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_log_enrichment.py +21 -4
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_mcp_server.py +2 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/uv.lock +299 -226
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/eval/SKILL.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/eval/evals/evals.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/inspect/SKILL.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/inspect/evals/evals.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.dockerignore +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/workflows/publish-evaluator-sdk.yml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/workflows/release.yml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.gitignore +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.mcp.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/CONTRIBUTING.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/DEVELOPMENT.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/LICENSE +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/Makefile +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/Chart.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/NOTES.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/_helpers.tpl +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/deployment.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/postgresql-secret.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/postgresql.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/rbac.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/service.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/serviceaccount.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/values.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/assets/logo-color-on-transparent.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/assets/logo-color.png +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/assets/logo-dark-on-transparent.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/custom-evaluators.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/eval-set-format.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/otel-compatibility.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/run-history.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/streaming.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/eval_config.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/eval_config_openai_eval.yaml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/response_quality.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/tool_call_checker.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/agentevals_example_custom_sink/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/agentevals_example_custom_sink/sink.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/pyproject.toml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/agent.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/eval_set.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/main.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/test_streaming.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/kubernetes/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/agent.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/eval_set.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/main.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/test_streaming.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/async_example.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/context_manager_example.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/decorator_example.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/agent.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/eval_set.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/main.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/adk/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/adk/run.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/langchain/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/langchain/run.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/ollama/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/ollama/run.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/openai-agents/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/openai-agents/run.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/pydantic-ai/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/pydantic-ai/run.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/strands/requirements.txt +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/strands/run.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/flake.lock +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/flake.nix +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/pyproject.toml +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/src/agentevals_evaluator_sdk/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/src/agentevals_evaluator_sdk/decorator.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/src/agentevals_evaluator_sdk/types.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/eval_set_helm.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/evalset_helm_3_2026-02-23.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/evalset_k8s_2026-02-20.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/helm.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/helm_2.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/helm_3.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/k8s.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/tempo_export_with_batches.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_protocol.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/assets/index-4Q_gYF8x.js +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/assets/index-BqibLiHO.css +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/index.html +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/logo.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/vite.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/app.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/debug_routes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/dependencies.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/models.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_app.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_grpc.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_processing.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_routes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/routes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/runs_routes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/streaming_routes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/builtin_metrics.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/cli.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/config.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/converter.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/custom_evaluators.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/eval_config_loader.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/resolver.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/sources.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/templates.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/venv.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/extraction.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/genai_converter.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/auto.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/base.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/jaeger.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/otlp.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/mcp_server.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/openai_eval_backend.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/output.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/resolvers/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/resolvers/kubernetes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/fetcher.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/result_builder.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/service.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/sinks.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/worker.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/runner.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/sdk.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/config.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/models.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/migrations/000001_init.down.sql +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/migrations/000001_init.up.sql +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/migrator.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/pool.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/repos/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/repos/memory.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/repos/postgres.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/exports.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/processor.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/session.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/ws_server.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/trace_metrics.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/genai_messages.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/log_buffer.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/api/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/api/test_evaluate_persistence.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/api/test_runs_routes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/conftest.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_evaluation_pipeline.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_live_agents.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_otlp_grpc_receiver.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_session_grouping.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_timing_stress.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/resolvers/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/resolvers/test_kubernetes.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/resolvers/test_registry.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_fetcher.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_result_builder.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_service.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_sinks.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/__init__.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_config.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_memory_repos.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_migrator.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_models.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_api.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_cli.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_converter.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_credential_injection.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_eval_config_loader.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_extraction.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_genai_converter.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_jaeger_loader.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_loader_auto.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_openai_eval_backend.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_otlp_loader.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_otlp_receiver.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_output.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_protocol.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_runner.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_sdk.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_trace_metrics.py +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/.gitignore +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/README.md +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/eslint.config.js +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/index.html +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/package-lock.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/package.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/public/logo.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/public/vite.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/App.css +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/App.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/api/client.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/assets/react.svg +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/annotation-queue/AnnotationDetailPanel.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/annotation-queue/AnnotationQueueView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/annotation-queue/AnnotationTable.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/bug-report/BugReportModal.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/BuilderHeader.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/BuilderView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/EvalCaseCard.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/EvalCasesList.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/InvocationEditor.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/JsonPreview.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/MetadataEditor.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/TraceUploadZone.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/index.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/DashboardView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/MetricScoreCard.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/PerformanceCard.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/PerformanceCharts.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/SummaryStats.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/TraceCard.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/TraceTable.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/ComparisonPanel.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/DataSection.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InspectorHeader.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InspectorLayout.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InspectorView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InvocationCard.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InvocationSummaryPanel.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/MetricResultsSection.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/MetricsComparisonSection.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/PerformanceSection.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/ToolCallList.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/TrajectoryComparisonDetails.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/PassRateTrendChart.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/PerMetricTrendChart.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/RunDetailView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/RunsHistoryTable.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/RunsView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/runHistory.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/sidebar/Sidebar.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/LiveConversationPanel.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/LiveMessage.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/LiveStreamingView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/SessionCard.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/SessionMetadata.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/EvalSetEditorDrawer.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/FileDropZone.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/MetricSelector.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/RawJsonPreview.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/TraceEditorDrawer.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/UploadView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/welcome/WelcomeView.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/config.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/context/TraceContext.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/context/TraceProvider.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/index.css +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/console-capture.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/eval-config.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/evalset-builder.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/network-capture.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-helpers.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-loader.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-metadata.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-patcher.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/types.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/utils.ts +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/main.tsx +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/tsconfig.app.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/tsconfig.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/tsconfig.node.json +0 -0
- {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/vite.config.ts +0 -0
|
@@ -29,6 +29,9 @@ jobs:
|
|
|
29
29
|
with:
|
|
30
30
|
enable-cache: true
|
|
31
31
|
|
|
32
|
+
- name: Verify uv.lock matches pyproject.toml
|
|
33
|
+
run: uv lock --check
|
|
34
|
+
|
|
32
35
|
- name: Install dependencies
|
|
33
36
|
run: |
|
|
34
37
|
uv venv
|
|
@@ -62,7 +65,7 @@ jobs:
|
|
|
62
65
|
run: |
|
|
63
66
|
uv venv --python ${{ matrix.python-version }}
|
|
64
67
|
uv pip install setuptools
|
|
65
|
-
uv sync --dev --python ${{ matrix.python-version }}
|
|
68
|
+
uv sync --dev --all-extras --frozen --python ${{ matrix.python-version }}
|
|
66
69
|
|
|
67
70
|
- name: Run tests
|
|
68
71
|
run: uv run pytest -m "not integration and not e2e" --tb=short -q
|
|
@@ -32,6 +32,12 @@ ARG VERSION
|
|
|
32
32
|
ENV SETUPTOOLS_SCM_PRETEND_VERSION=${VERSION}
|
|
33
33
|
|
|
34
34
|
RUN uv sync --frozen --no-dev --extra live --extra postgres --extra kubernetes \
|
|
35
|
+
# The runtime only uses the uv-managed venv; drop the base image's bundled
|
|
36
|
+
# pip so its vendored packages (msgpack, pkg_resources) don't ship unused.
|
|
37
|
+
&& rm -rf /usr/local/lib/python*/site-packages/pip \
|
|
38
|
+
/usr/local/lib/python*/site-packages/pip-*.dist-info \
|
|
39
|
+
/usr/local/bin/pip* \
|
|
40
|
+
&& ! /usr/local/bin/python -c "import pip" 2>/dev/null \
|
|
35
41
|
&& groupadd --gid 1000 app \
|
|
36
42
|
&& useradd --uid 1000 --gid app --home-dir /app --no-log-init app \
|
|
37
43
|
&& chown -R app:app /app
|
|
@@ -1,24 +1,34 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: agentevals-cli
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.8
|
|
4
4
|
Summary: Standalone framework to evaluate agent correctness based on portable OpenTelemetry traces
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.11
|
|
7
|
+
Requires-Dist: aiohttp>=3.14.3
|
|
8
|
+
Requires-Dist: authlib>=1.7.2
|
|
7
9
|
Requires-Dist: click>=8.0
|
|
8
10
|
Requires-Dist: fastapi>=0.115.0
|
|
9
11
|
Requires-Dist: google-adk[eval]<2.2,>=2.1.0
|
|
10
12
|
Requires-Dist: httpx>=0.27.0
|
|
13
|
+
Requires-Dist: idna>=3.18
|
|
14
|
+
Requires-Dist: litellm>=1.85.7
|
|
15
|
+
Requires-Dist: nltk>=3.10.2
|
|
11
16
|
Requires-Dist: opentelemetry-proto>=1.36.0
|
|
12
|
-
Requires-Dist:
|
|
13
|
-
Requires-Dist: python-
|
|
17
|
+
Requires-Dist: pyasn1>=0.6.4
|
|
18
|
+
Requires-Dist: python-dotenv>=1.2.2
|
|
19
|
+
Requires-Dist: python-multipart>=0.0.32
|
|
14
20
|
Requires-Dist: pyyaml>=6.0
|
|
21
|
+
Requires-Dist: requests>=2.34.2
|
|
15
22
|
Requires-Dist: tabulate>=0.9.0
|
|
23
|
+
Requires-Dist: urllib3>=2.7.0
|
|
16
24
|
Requires-Dist: uvicorn[standard]>=0.32.0
|
|
17
25
|
Provides-Extra: kubernetes
|
|
18
26
|
Requires-Dist: kubernetes>=36.0.0; extra == 'kubernetes'
|
|
19
27
|
Provides-Extra: live
|
|
20
28
|
Requires-Dist: httpx>=0.27.0; extra == 'live'
|
|
21
|
-
Requires-Dist: mcp
|
|
29
|
+
Requires-Dist: mcp<2,>=1.28.1; extra == 'live'
|
|
30
|
+
Requires-Dist: pydantic-settings>=2.15.0; extra == 'live'
|
|
31
|
+
Requires-Dist: pyjwt>=2.13.0; extra == 'live'
|
|
22
32
|
Provides-Extra: openai
|
|
23
33
|
Requires-Dist: openai>=2.0; extra == 'openai'
|
|
24
34
|
Provides-Extra: postgres
|
|
@@ -14,17 +14,30 @@ dependencies = [
|
|
|
14
14
|
"tabulate>=0.9.0",
|
|
15
15
|
"fastapi>=0.115.0",
|
|
16
16
|
"uvicorn[standard]>=0.32.0",
|
|
17
|
-
"python-multipart>=0.0.
|
|
18
|
-
"python-dotenv>=1.
|
|
17
|
+
"python-multipart>=0.0.32",
|
|
18
|
+
"python-dotenv>=1.2.2",
|
|
19
19
|
"opentelemetry-proto>=1.36.0",
|
|
20
20
|
"pyyaml>=6.0",
|
|
21
21
|
"httpx>=0.27.0",
|
|
22
|
+
# Security floors for CVE-affected transitive dependencies of the default install.
|
|
23
|
+
# None are imported directly, do not "clean up" as unused. pip does not read
|
|
24
|
+
# lockfiles, so installs from PyPI resolve from these floors alone.
|
|
25
|
+
"aiohttp>=3.14.3",
|
|
26
|
+
"authlib>=1.7.2",
|
|
27
|
+
"idna>=3.18",
|
|
28
|
+
"litellm>=1.85.7",
|
|
29
|
+
"nltk>=3.10.2",
|
|
30
|
+
"pyasn1>=0.6.4",
|
|
31
|
+
"requests>=2.34.2",
|
|
32
|
+
"urllib3>=2.7.0",
|
|
22
33
|
]
|
|
23
34
|
|
|
24
35
|
[project.optional-dependencies]
|
|
25
36
|
live = [
|
|
26
|
-
"mcp>=1.
|
|
37
|
+
"mcp>=1.28.1,<2",
|
|
27
38
|
"httpx>=0.27.0",
|
|
39
|
+
"pyjwt>=2.13.0",
|
|
40
|
+
"pydantic-settings>=2.15.0",
|
|
28
41
|
]
|
|
29
42
|
streaming = [
|
|
30
43
|
"opentelemetry-sdk>=1.20.0",
|
{agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/incremental_processor.py
RENAMED
|
@@ -36,14 +36,18 @@ logger = logging.getLogger(__name__)
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
def _normalize_ts(raw_ts) -> float:
|
|
39
|
-
"""Normalize a
|
|
39
|
+
"""Normalize a contemporary Unix timestamp by inferring its unit from magnitude."""
|
|
40
40
|
try:
|
|
41
|
-
|
|
41
|
+
timestamp = int(raw_ts)
|
|
42
42
|
except (TypeError, ValueError):
|
|
43
43
|
return 0.0
|
|
44
|
-
if
|
|
45
|
-
return
|
|
46
|
-
|
|
44
|
+
if timestamp >= 1e17:
|
|
45
|
+
return timestamp / 1e9
|
|
46
|
+
if timestamp >= 1e14:
|
|
47
|
+
return timestamp / 1e6
|
|
48
|
+
if timestamp >= 1e11:
|
|
49
|
+
return timestamp / 1e3
|
|
50
|
+
return float(timestamp)
|
|
47
51
|
|
|
48
52
|
|
|
49
53
|
class IncrementalInvocationExtractor:
|
|
@@ -81,3 +81,6 @@ ADK_INVOCATION_ID = "gcp.vertex.agent.invocation_id"
|
|
|
81
81
|
GENAI_ATTRIBUTE_ALIASES: dict[str, list[str]] = {
|
|
82
82
|
OTEL_GENAI_PROVIDER_NAME: [OTEL_GENAI_SYSTEM],
|
|
83
83
|
}
|
|
84
|
+
|
|
85
|
+
# agentevals custom attributes (repository-specific, outside OTel semconv)
|
|
86
|
+
AGENTEVALS_SESSION_ID = "agentevals.session_id"
|
|
@@ -7,7 +7,7 @@ import logging
|
|
|
7
7
|
from collections import defaultdict
|
|
8
8
|
|
|
9
9
|
from ..trace_attrs import (
|
|
10
|
-
|
|
10
|
+
AGENTEVALS_SESSION_ID,
|
|
11
11
|
OTEL_GENAI_INPUT_MESSAGES,
|
|
12
12
|
OTEL_GENAI_OUTPUT_MESSAGES,
|
|
13
13
|
)
|
|
@@ -28,7 +28,7 @@ def enrich_spans_with_logs(spans: list[dict], logs: list[dict], session_id: str
|
|
|
28
28
|
Args:
|
|
29
29
|
spans: List of OTLP span dictionaries
|
|
30
30
|
logs: List of GenAI log event dictionaries
|
|
31
|
-
session_id: Optional session ID to add as
|
|
31
|
+
session_id: Optional session ID to add as the agentevals.session_id attribute
|
|
32
32
|
|
|
33
33
|
Returns:
|
|
34
34
|
List of enriched span dictionaries with message attributes added
|
|
@@ -88,6 +88,22 @@ def _extract_messages_from_logs(
|
|
|
88
88
|
return input_messages, output_messages
|
|
89
89
|
|
|
90
90
|
|
|
91
|
+
def _append_session_id(attrs: list[dict], session_id: str | None) -> None:
|
|
92
|
+
"""Append the session ID attribute to *attrs* in place, if present.
|
|
93
|
+
|
|
94
|
+
Written to the custom ``agentevals.session_id`` attribute rather than
|
|
95
|
+
``gen_ai.agent.name`` so real agent names (from the SDK or OTLP) are
|
|
96
|
+
never overwritten.
|
|
97
|
+
"""
|
|
98
|
+
if session_id:
|
|
99
|
+
attrs.append(
|
|
100
|
+
{
|
|
101
|
+
"key": AGENTEVALS_SESSION_ID,
|
|
102
|
+
"value": {"stringValue": session_id},
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
91
107
|
def _inject_messages(
|
|
92
108
|
span: dict,
|
|
93
109
|
input_messages: list[dict],
|
|
@@ -113,13 +129,7 @@ def _inject_messages(
|
|
|
113
129
|
"value": {"stringValue": json.dumps(output_messages)},
|
|
114
130
|
}
|
|
115
131
|
)
|
|
116
|
-
|
|
117
|
-
attrs.append(
|
|
118
|
-
{
|
|
119
|
-
"key": OTEL_GENAI_AGENT_NAME,
|
|
120
|
-
"value": {"stringValue": session_id},
|
|
121
|
-
}
|
|
122
|
-
)
|
|
132
|
+
_append_session_id(attrs, session_id)
|
|
123
133
|
|
|
124
134
|
return span_copy
|
|
125
135
|
|
|
@@ -148,12 +158,7 @@ def _enrich_per_span(
|
|
|
148
158
|
span_copy = span.copy()
|
|
149
159
|
if session_id:
|
|
150
160
|
attrs = list(span_copy.get("attributes", []))
|
|
151
|
-
attrs
|
|
152
|
-
{
|
|
153
|
-
"key": OTEL_GENAI_AGENT_NAME,
|
|
154
|
-
"value": {"stringValue": session_id},
|
|
155
|
-
}
|
|
156
|
-
)
|
|
161
|
+
_append_session_id(attrs, session_id)
|
|
157
162
|
span_copy["attributes"] = attrs
|
|
158
163
|
enriched.append(span_copy)
|
|
159
164
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from agentevals.streaming.incremental_processor import _normalize_ts
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.mark.parametrize(
|
|
7
|
+
("raw_ts", "expected"),
|
|
8
|
+
[
|
|
9
|
+
(1770000000, 1770000000.0), # seconds
|
|
10
|
+
(1770000000000, 1770000000.0), # milliseconds
|
|
11
|
+
(1770000000000000, 1770000000.0), # microseconds
|
|
12
|
+
(1770000000000000000, 1770000000.0), # nanoseconds
|
|
13
|
+
],
|
|
14
|
+
)
|
|
15
|
+
def test_normalizes_timestamp_units(raw_ts, expected):
|
|
16
|
+
assert _normalize_ts(raw_ts) == expected
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_normalizes_numeric_string():
|
|
20
|
+
assert _normalize_ts("1770000000000000") == 1770000000.0
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.mark.parametrize("raw_ts", [None, "invalid"])
|
|
24
|
+
def test_invalid_timestamp_returns_zero(raw_ts):
|
|
25
|
+
# Preserve the existing fallback for missing or malformed timestamps.
|
|
26
|
+
assert _normalize_ts(raw_ts) == 0.0
|
|
@@ -84,8 +84,8 @@ class TestBroadcastEnrichment:
|
|
|
84
84
|
logs = [_make_log("gen_ai.user.message", {"content": "hi"})]
|
|
85
85
|
result = enrich_spans_with_logs(spans, logs, session_id="my-session")
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
assert
|
|
87
|
+
session_attr = _get_injected_attr(result[0], "agentevals.session_id", parse_json=False)
|
|
88
|
+
assert session_attr == "my-session"
|
|
89
89
|
|
|
90
90
|
def test_choice_extracts_nested_content(self):
|
|
91
91
|
spans = [_make_span()]
|
|
@@ -139,6 +139,23 @@ class TestPerSpanEnrichment:
|
|
|
139
139
|
msgs_s2 = _get_injected_attr(result[1], "gen_ai.input.messages")
|
|
140
140
|
assert msgs_s2 == [{"role": "user", "content": "question 2"}]
|
|
141
141
|
|
|
142
|
+
def test_agent_name_preserved_with_session_id(self):
|
|
143
|
+
"""Regression: real gen_ai.agent.name attr must survive enrichment,
|
|
144
|
+
session_id lands in its own attr, doesn't clobber it."""
|
|
145
|
+
span = _make_span(
|
|
146
|
+
"s1",
|
|
147
|
+
attrs=[{"key": "gen_ai.agent.name", "value": {"stringValue": "roll_die_agent"}}],
|
|
148
|
+
)
|
|
149
|
+
logs = [_make_log("gen_ai.user.message", {"content": "hi"}, span_id="s1")]
|
|
150
|
+
result = enrich_spans_with_logs([span], logs, session_id="sess-123")
|
|
151
|
+
|
|
152
|
+
agent_name_attrs = [a for a in result[0]["attributes"] if a["key"] == "gen_ai.agent.name"]
|
|
153
|
+
assert len(agent_name_attrs) == 1, f"expected exactly one gen_ai.agent.name attr, found {len(agent_name_attrs)}"
|
|
154
|
+
assert agent_name_attrs[0]["value"]["stringValue"] == "roll_die_agent"
|
|
155
|
+
|
|
156
|
+
session_attr = _get_injected_attr(result[0], "agentevals.session_id", parse_json=False)
|
|
157
|
+
assert session_attr == "sess-123"
|
|
158
|
+
|
|
142
159
|
def test_span_without_logs_not_enriched(self):
|
|
143
160
|
spans = [_make_span("s1"), _make_span("s2")]
|
|
144
161
|
logs = [
|
|
@@ -156,8 +173,8 @@ class TestPerSpanEnrichment:
|
|
|
156
173
|
]
|
|
157
174
|
result = enrich_spans_with_logs(spans, logs, session_id="test")
|
|
158
175
|
|
|
159
|
-
assert _get_injected_attr(result[0], "
|
|
160
|
-
assert _get_injected_attr(result[1], "
|
|
176
|
+
assert _get_injected_attr(result[0], "agentevals.session_id", parse_json=False) == "test"
|
|
177
|
+
assert _get_injected_attr(result[1], "agentevals.session_id", parse_json=False) == "test"
|
|
161
178
|
|
|
162
179
|
def test_tool_calls_in_assistant_message(self):
|
|
163
180
|
spans = [_make_span("s1")]
|