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.
Files changed (294) hide show
  1. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/workflows/ci.yml +4 -1
  2. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/Dockerfile +6 -0
  3. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/PKG-INFO +15 -5
  4. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/pyproject.toml +16 -3
  5. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/incremental_processor.py +9 -5
  6. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/trace_attrs.py +3 -0
  7. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/log_enrichment.py +20 -15
  8. agentevals_cli-0.9.8/tests/test_incremental_processor.py +26 -0
  9. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_log_enrichment.py +21 -4
  10. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_mcp_server.py +2 -0
  11. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/uv.lock +299 -226
  12. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/eval/SKILL.md +0 -0
  13. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/eval/evals/evals.json +0 -0
  14. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/inspect/SKILL.md +0 -0
  15. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.claude/skills/inspect/evals/evals.json +0 -0
  16. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.dockerignore +0 -0
  17. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  18. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  20. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/workflows/publish-evaluator-sdk.yml +0 -0
  21. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.github/workflows/release.yml +0 -0
  22. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.gitignore +0 -0
  23. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/.mcp.json +0 -0
  24. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/CONTRIBUTING.md +0 -0
  25. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/DEVELOPMENT.md +0 -0
  26. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/LICENSE +0 -0
  27. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/Makefile +0 -0
  28. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/README.md +0 -0
  29. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/Chart.yaml +0 -0
  30. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/NOTES.txt +0 -0
  31. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/_helpers.tpl +0 -0
  32. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/deployment.yaml +0 -0
  33. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/postgresql-secret.yaml +0 -0
  34. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/postgresql.yaml +0 -0
  35. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/rbac.yaml +0 -0
  36. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/service.yaml +0 -0
  37. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/templates/serviceaccount.yaml +0 -0
  38. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/charts/agentevals/values.yaml +0 -0
  39. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/assets/logo-color-on-transparent.svg +0 -0
  40. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/assets/logo-color.png +0 -0
  41. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/assets/logo-dark-on-transparent.svg +0 -0
  42. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/custom-evaluators.md +0 -0
  43. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/eval-set-format.md +0 -0
  44. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/otel-compatibility.md +0 -0
  45. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/run-history.md +0 -0
  46. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/docs/streaming.md +0 -0
  47. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/README.md +0 -0
  48. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/eval_config.yaml +0 -0
  49. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/eval_config_openai_eval.yaml +0 -0
  50. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/response_quality.py +0 -0
  51. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_evaluators/tool_call_checker.py +0 -0
  52. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/README.md +0 -0
  53. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/agentevals_example_custom_sink/__init__.py +0 -0
  54. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/agentevals_example_custom_sink/sink.py +0 -0
  55. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/custom_sink/pyproject.toml +0 -0
  56. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/README.md +0 -0
  57. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/agent.py +0 -0
  58. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/eval_set.json +0 -0
  59. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/main.py +0 -0
  60. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/dice_agent/test_streaming.py +0 -0
  61. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/kubernetes/README.md +0 -0
  62. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/README.md +0 -0
  63. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/agent.py +0 -0
  64. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/eval_set.json +0 -0
  65. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/main.py +0 -0
  66. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/requirements.txt +0 -0
  67. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/langchain_agent/test_streaming.py +0 -0
  68. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/async_example.py +0 -0
  69. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/context_manager_example.py +0 -0
  70. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/decorator_example.py +0 -0
  71. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/sdk_example/requirements.txt +0 -0
  72. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/agent.py +0 -0
  73. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/eval_set.json +0 -0
  74. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/main.py +0 -0
  75. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/strands_agent/requirements.txt +0 -0
  76. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/adk/requirements.txt +0 -0
  77. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/adk/run.py +0 -0
  78. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/langchain/requirements.txt +0 -0
  79. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/langchain/run.py +0 -0
  80. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/ollama/requirements.txt +0 -0
  81. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/ollama/run.py +0 -0
  82. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/openai-agents/requirements.txt +0 -0
  83. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/openai-agents/run.py +0 -0
  84. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/pydantic-ai/requirements.txt +0 -0
  85. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/pydantic-ai/run.py +0 -0
  86. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/strands/requirements.txt +0 -0
  87. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/examples/zero-code-examples/strands/run.py +0 -0
  88. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/flake.lock +0 -0
  89. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/flake.nix +0 -0
  90. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/README.md +0 -0
  91. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/pyproject.toml +0 -0
  92. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/src/agentevals_evaluator_sdk/__init__.py +0 -0
  93. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/src/agentevals_evaluator_sdk/decorator.py +0 -0
  94. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/packages/evaluator-sdk-py/src/agentevals_evaluator_sdk/types.py +0 -0
  95. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/eval_set_helm.json +0 -0
  96. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/evalset_helm_3_2026-02-23.json +0 -0
  97. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/evalset_k8s_2026-02-20.json +0 -0
  98. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/helm.json +0 -0
  99. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/helm_2.json +0 -0
  100. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/helm_3.json +0 -0
  101. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/k8s.json +0 -0
  102. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/samples/tempo_export_with_batches.json +0 -0
  103. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/__init__.py +0 -0
  104. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_protocol.py +0 -0
  105. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/assets/index-4Q_gYF8x.js +0 -0
  106. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/assets/index-BqibLiHO.css +0 -0
  107. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/index.html +0 -0
  108. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/logo.svg +0 -0
  109. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/_static/vite.svg +0 -0
  110. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/__init__.py +0 -0
  111. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/app.py +0 -0
  112. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/debug_routes.py +0 -0
  113. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/dependencies.py +0 -0
  114. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/models.py +0 -0
  115. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_app.py +0 -0
  116. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_grpc.py +0 -0
  117. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_processing.py +0 -0
  118. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/otlp_routes.py +0 -0
  119. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/routes.py +0 -0
  120. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/runs_routes.py +0 -0
  121. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/api/streaming_routes.py +0 -0
  122. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/builtin_metrics.py +0 -0
  123. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/cli.py +0 -0
  124. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/config.py +0 -0
  125. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/converter.py +0 -0
  126. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/custom_evaluators.py +0 -0
  127. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/eval_config_loader.py +0 -0
  128. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/__init__.py +0 -0
  129. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/resolver.py +0 -0
  130. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/sources.py +0 -0
  131. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/templates.py +0 -0
  132. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/evaluator/venv.py +0 -0
  133. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/extraction.py +0 -0
  134. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/genai_converter.py +0 -0
  135. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/__init__.py +0 -0
  136. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/auto.py +0 -0
  137. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/base.py +0 -0
  138. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/jaeger.py +0 -0
  139. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/loader/otlp.py +0 -0
  140. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/mcp_server.py +0 -0
  141. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/openai_eval_backend.py +0 -0
  142. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/output.py +0 -0
  143. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/resolvers/__init__.py +0 -0
  144. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/resolvers/kubernetes.py +0 -0
  145. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/__init__.py +0 -0
  146. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/fetcher.py +0 -0
  147. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/result_builder.py +0 -0
  148. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/service.py +0 -0
  149. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/sinks.py +0 -0
  150. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/run/worker.py +0 -0
  151. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/runner.py +0 -0
  152. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/sdk.py +0 -0
  153. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/__init__.py +0 -0
  154. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/config.py +0 -0
  155. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/models.py +0 -0
  156. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/__init__.py +0 -0
  157. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/migrations/000001_init.down.sql +0 -0
  158. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/migrations/000001_init.up.sql +0 -0
  159. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/migrator.py +0 -0
  160. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/postgres/pool.py +0 -0
  161. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/repos/__init__.py +0 -0
  162. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/repos/memory.py +0 -0
  163. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/storage/repos/postgres.py +0 -0
  164. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/__init__.py +0 -0
  165. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/exports.py +0 -0
  166. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/processor.py +0 -0
  167. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/session.py +0 -0
  168. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/streaming/ws_server.py +0 -0
  169. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/trace_metrics.py +0 -0
  170. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/__init__.py +0 -0
  171. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/genai_messages.py +0 -0
  172. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/src/agentevals/utils/log_buffer.py +0 -0
  173. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/api/__init__.py +0 -0
  174. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/api/test_evaluate_persistence.py +0 -0
  175. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/api/test_runs_routes.py +0 -0
  176. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/__init__.py +0 -0
  177. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/conftest.py +0 -0
  178. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_evaluation_pipeline.py +0 -0
  179. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_live_agents.py +0 -0
  180. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_otlp_grpc_receiver.py +0 -0
  181. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_session_grouping.py +0 -0
  182. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/integration/test_timing_stress.py +0 -0
  183. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/resolvers/__init__.py +0 -0
  184. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/resolvers/test_kubernetes.py +0 -0
  185. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/resolvers/test_registry.py +0 -0
  186. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/__init__.py +0 -0
  187. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_fetcher.py +0 -0
  188. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_result_builder.py +0 -0
  189. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_service.py +0 -0
  190. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/run/test_sinks.py +0 -0
  191. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/__init__.py +0 -0
  192. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_config.py +0 -0
  193. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_memory_repos.py +0 -0
  194. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_migrator.py +0 -0
  195. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/storage/test_models.py +0 -0
  196. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_api.py +0 -0
  197. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_cli.py +0 -0
  198. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_converter.py +0 -0
  199. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_credential_injection.py +0 -0
  200. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_eval_config_loader.py +0 -0
  201. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_extraction.py +0 -0
  202. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_genai_converter.py +0 -0
  203. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_jaeger_loader.py +0 -0
  204. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_loader_auto.py +0 -0
  205. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_openai_eval_backend.py +0 -0
  206. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_otlp_loader.py +0 -0
  207. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_otlp_receiver.py +0 -0
  208. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_output.py +0 -0
  209. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_protocol.py +0 -0
  210. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_runner.py +0 -0
  211. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_sdk.py +0 -0
  212. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/tests/test_trace_metrics.py +0 -0
  213. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/.gitignore +0 -0
  214. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/README.md +0 -0
  215. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/eslint.config.js +0 -0
  216. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/index.html +0 -0
  217. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/package-lock.json +0 -0
  218. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/package.json +0 -0
  219. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/public/logo.svg +0 -0
  220. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/public/vite.svg +0 -0
  221. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/App.css +0 -0
  222. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/App.tsx +0 -0
  223. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/api/client.ts +0 -0
  224. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/assets/react.svg +0 -0
  225. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/annotation-queue/AnnotationDetailPanel.tsx +0 -0
  226. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/annotation-queue/AnnotationQueueView.tsx +0 -0
  227. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/annotation-queue/AnnotationTable.tsx +0 -0
  228. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/bug-report/BugReportModal.tsx +0 -0
  229. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/BuilderHeader.tsx +0 -0
  230. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/BuilderView.tsx +0 -0
  231. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/EvalCaseCard.tsx +0 -0
  232. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/EvalCasesList.tsx +0 -0
  233. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/InvocationEditor.tsx +0 -0
  234. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/JsonPreview.tsx +0 -0
  235. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/MetadataEditor.tsx +0 -0
  236. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/TraceUploadZone.tsx +0 -0
  237. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/builder/index.ts +0 -0
  238. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/DashboardView.tsx +0 -0
  239. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/MetricScoreCard.tsx +0 -0
  240. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/PerformanceCard.tsx +0 -0
  241. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/PerformanceCharts.tsx +0 -0
  242. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/SummaryStats.tsx +0 -0
  243. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/TraceCard.tsx +0 -0
  244. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/dashboard/TraceTable.tsx +0 -0
  245. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/ComparisonPanel.tsx +0 -0
  246. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/DataSection.tsx +0 -0
  247. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InspectorHeader.tsx +0 -0
  248. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InspectorLayout.tsx +0 -0
  249. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InspectorView.tsx +0 -0
  250. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InvocationCard.tsx +0 -0
  251. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/InvocationSummaryPanel.tsx +0 -0
  252. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/MetricResultsSection.tsx +0 -0
  253. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/MetricsComparisonSection.tsx +0 -0
  254. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/PerformanceSection.tsx +0 -0
  255. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/ToolCallList.tsx +0 -0
  256. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/inspector/TrajectoryComparisonDetails.tsx +0 -0
  257. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/PassRateTrendChart.tsx +0 -0
  258. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/PerMetricTrendChart.tsx +0 -0
  259. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/RunDetailView.tsx +0 -0
  260. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/RunsHistoryTable.tsx +0 -0
  261. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/RunsView.tsx +0 -0
  262. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/runs/runHistory.ts +0 -0
  263. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/sidebar/Sidebar.tsx +0 -0
  264. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/LiveConversationPanel.tsx +0 -0
  265. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/LiveMessage.tsx +0 -0
  266. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/LiveStreamingView.tsx +0 -0
  267. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/SessionCard.tsx +0 -0
  268. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/streaming/SessionMetadata.tsx +0 -0
  269. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/EvalSetEditorDrawer.tsx +0 -0
  270. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/FileDropZone.tsx +0 -0
  271. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/MetricSelector.tsx +0 -0
  272. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/RawJsonPreview.tsx +0 -0
  273. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/TraceEditorDrawer.tsx +0 -0
  274. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/upload/UploadView.tsx +0 -0
  275. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/components/welcome/WelcomeView.tsx +0 -0
  276. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/config.ts +0 -0
  277. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/context/TraceContext.tsx +0 -0
  278. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/context/TraceProvider.tsx +0 -0
  279. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/index.css +0 -0
  280. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/console-capture.ts +0 -0
  281. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/eval-config.ts +0 -0
  282. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/evalset-builder.ts +0 -0
  283. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/network-capture.ts +0 -0
  284. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-helpers.ts +0 -0
  285. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-loader.ts +0 -0
  286. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-metadata.ts +0 -0
  287. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/trace-patcher.ts +0 -0
  288. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/types.ts +0 -0
  289. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/lib/utils.ts +0 -0
  290. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/src/main.tsx +0 -0
  291. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/tsconfig.app.json +0 -0
  292. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/tsconfig.json +0 -0
  293. {agentevals_cli-0.9.7 → agentevals_cli-0.9.8}/ui/tsconfig.node.json +0 -0
  294. {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.4
1
+ Metadata-Version: 2.5
2
2
  Name: agentevals-cli
3
- Version: 0.9.7
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: python-dotenv>=1.0.0
13
- Requires-Dist: python-multipart>=0.0.12
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>=1.26.0; extra == 'live'
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.12",
18
- "python-dotenv>=1.0.0",
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.26.0",
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",
@@ -36,14 +36,18 @@ logger = logging.getLogger(__name__)
36
36
 
37
37
 
38
38
  def _normalize_ts(raw_ts) -> float:
39
- """Normalize a nanosecond timestamp (string or int) to seconds."""
39
+ """Normalize a contemporary Unix timestamp by inferring its unit from magnitude."""
40
40
  try:
41
- ns = int(raw_ts)
41
+ timestamp = int(raw_ts)
42
42
  except (TypeError, ValueError):
43
43
  return 0.0
44
- if ns > 1e15:
45
- return ns / 1e9
46
- return float(ns)
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
- OTEL_GENAI_AGENT_NAME,
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 agent.name attribute
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
- if session_id:
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.append(
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
- agent_name = _get_injected_attr(result[0], "gen_ai.agent.name", parse_json=False)
88
- assert agent_name == "my-session"
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], "gen_ai.agent.name", parse_json=False) == "test"
160
- assert _get_injected_attr(result[1], "gen_ai.agent.name", parse_json=False) == "test"
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")]
@@ -400,5 +400,7 @@ async def test_evaluate_sessions_posts_builtin_evaluator_overrides(monkeypatch):
400
400
  "threshold": 0.9,
401
401
  "judgeModel": "gemini-2.5-flash",
402
402
  "trajectoryMatchType": "IN_ORDER",
403
+ "credentialRef": None,
404
+ "judgeBaseUrl": None,
403
405
  }
404
406
  ]