eval-protocol 0.2.22__tar.gz → 0.2.23__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 (384) hide show
  1. {eval_protocol-0.2.22/eval_protocol.egg-info → eval_protocol-0.2.23}/PKG-INFO +5 -3
  2. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/_version.py +3 -3
  3. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/adapters/bigquery.py +24 -14
  4. eval_protocol-0.2.23/eval_protocol/adapters/langchain.py +143 -0
  5. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/adapters/langfuse.py +154 -27
  6. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/orchestrator.py +47 -46
  7. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/docker_resource.py +10 -13
  8. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/task_manager.py +17 -8
  9. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/test_aime25.py +19 -4
  10. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/test_gpqa.py +38 -10
  11. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/test_livebench_data_analysis.py +28 -11
  12. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/test_tau_bench_airline.py +21 -8
  13. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/test_tau_bench_retail.py +21 -8
  14. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/deploy.py +28 -8
  15. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/datasets/loader.py +3 -5
  16. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/evaluation.py +11 -10
  17. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/execution/pipeline.py +39 -12
  18. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/get_pep440_version.py +9 -1
  19. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/integrations/braintrust.py +10 -7
  20. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/integrations/deepeval.py +11 -2
  21. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/client/connection.py +56 -29
  22. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/clients.py +7 -5
  23. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/execution/manager.py +85 -19
  24. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/execution/policy.py +37 -21
  25. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/mcp_multi_client.py +18 -10
  26. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/mcpgym.py +43 -17
  27. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/simple_process_manager.py +2 -2
  28. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/simulation_server.py +29 -7
  29. eval_protocol-0.2.23/eval_protocol/mcp_agent/main.py +18 -0
  30. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_agent/orchestration/local_docker_client.py +12 -2
  31. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_env.py +25 -10
  32. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/__init__.py +3 -2
  33. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/airplane_environment/airline_environment.py +7 -1
  34. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/mock_environment/mock_environment.py +4 -1
  35. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/retail_environment/retail_environment.py +4 -1
  36. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/tau2_mcp.py +2 -1
  37. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/tests/test_tau2_e2e.py +29 -8
  38. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/models.py +103 -26
  39. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/playback_policy.py +14 -38
  40. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/__init__.py +13 -1
  41. eval_protocol-0.2.23/eval_protocol/pytest/default_agent_rollout_processor.py +276 -0
  42. eval_protocol-0.2.23/eval_protocol/pytest/default_langchain_rollout_processor.py +138 -0
  43. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/default_mcp_gym_rollout_processor.py +11 -6
  44. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py +32 -57
  45. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/default_single_turn_rollout_process.py +42 -15
  46. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/evaluation_test.py +80 -32
  47. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/evaluation_test_postprocess.py +7 -2
  48. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/plugin.py +16 -4
  49. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/types.py +2 -1
  50. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/utils.py +77 -5
  51. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/accuracy.py +18 -3
  52. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/accuracy_length.py +18 -5
  53. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/apps_coding_reward.py +1 -1
  54. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/apps_testing_util.py +7 -2
  55. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/bfcl_reward.py +2 -1
  56. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/code_execution.py +20 -5
  57. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/cpp_code.py +1 -1
  58. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/deepcoder_reward.py +6 -1
  59. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/format.py +5 -2
  60. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/function_calling.py +3 -1
  61. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/json_schema.py +28 -6
  62. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/language_consistency.py +14 -9
  63. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/lean_prover.py +14 -11
  64. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/length.py +6 -4
  65. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/list_comparison_math_reward.py +6 -1
  66. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/math.py +22 -17
  67. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/multiple_choice_math_reward.py +12 -2
  68. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/reasoning_steps.py +2 -2
  69. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/repetition.py +18 -4
  70. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/tag_count.py +16 -3
  71. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/server.py +5 -5
  72. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/typed_interface.py +58 -12
  73. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/batch_transformation.py +1 -1
  74. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/logs_server.py +4 -2
  75. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/static_policy.py +7 -7
  76. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/vite_server.py +2 -2
  77. {eval_protocol-0.2.22 → eval_protocol-0.2.23/eval_protocol.egg-info}/PKG-INFO +5 -3
  78. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol.egg-info/SOURCES.txt +5 -6
  79. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol.egg-info/requires.txt +5 -2
  80. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/pyproject.toml +12 -5
  81. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_models.py +1 -1
  82. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_rollout_control_plane_integration.py +10 -8
  83. eval_protocol-0.2.23/vite-app/dist/assets/index-BkNMjR5E.js +136 -0
  84. eval_protocol-0.2.23/vite-app/dist/assets/index-BkNMjR5E.js.map +1 -0
  85. eval_protocol-0.2.23/vite-app/dist/assets/index-UIwKlxBz.css +1 -0
  86. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vite-app/dist/index.html +2 -2
  87. eval_protocol-0.2.22/eval_protocol/mcp_agent/intermediary_server.py +0 -541
  88. eval_protocol-0.2.22/eval_protocol/mcp_agent/main.py +0 -210
  89. eval_protocol-0.2.22/eval_protocol/mcp_agent/orchestration/remote_http_client.py +0 -304
  90. eval_protocol-0.2.22/eval_protocol/mcp_agent/session.py +0 -81
  91. eval_protocol-0.2.22/eval_protocol/pytest/default_agent_rollout_processor.py +0 -157
  92. eval_protocol-0.2.22/vite-app/dist/assets/index-D04dO2VH.js +0 -136
  93. eval_protocol-0.2.22/vite-app/dist/assets/index-D04dO2VH.js.map +0 -1
  94. eval_protocol-0.2.22/vite-app/dist/assets/index-DLyzGYL0.css +0 -1
  95. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/LICENSE +0 -0
  96. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/README.md +0 -0
  97. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/development/__init__.py +0 -0
  98. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/development/normalize_sandbox_fusion.py +0 -0
  99. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/development/utils/__init__.py +0 -0
  100. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/development/utils/generate_api_key.py +0 -0
  101. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/development/utils/subprocess_manager.py +0 -0
  102. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/__init__.py +0 -0
  103. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/__main__.py +0 -0
  104. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/adapters/__init__.py +0 -0
  105. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/adapters/braintrust.py +0 -0
  106. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/adapters/huggingface.py +0 -0
  107. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/adapters/trl.py +0 -0
  108. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/__init__.py +0 -0
  109. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/models.py +0 -0
  110. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resource_abc.py +0 -0
  111. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resource_pool.py +0 -0
  112. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/__init__.py +0 -0
  113. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/bfcl_envs/__init__.py +0 -0
  114. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/bfcl_envs/gorilla_file_system.py +0 -0
  115. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/bfcl_envs/math_api.py +0 -0
  116. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/bfcl_envs/posting_api.py +0 -0
  117. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/bfcl_sim_api_resource.py +0 -0
  118. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/filesystem_resource.py +0 -0
  119. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/python_state_resource.py +0 -0
  120. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/resources/sql_resource.py +0 -0
  121. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/agent/tool_registry.py +0 -0
  122. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/auth.py +0 -0
  123. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/__init__.py +0 -0
  124. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/data/airline_dataset.jsonl +0 -0
  125. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/benchmarks/data/retail_dataset.jsonl +0 -0
  126. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli.py +0 -0
  127. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/__init__.py +0 -0
  128. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/agent_eval_cmd.py +0 -0
  129. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/common.py +0 -0
  130. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/deploy_mcp.py +0 -0
  131. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/logs.py +0 -0
  132. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/preview.py +0 -0
  133. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/cli_commands/run_eval_cmd.py +0 -0
  134. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/common_utils.py +0 -0
  135. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/config.py +0 -0
  136. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/dataset_logger/__init__.py +0 -0
  137. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/dataset_logger/dataset_logger.py +0 -0
  138. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py +0 -0
  139. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/dataset_logger/sqlite_dataset_logger_adapter.py +0 -0
  140. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/dataset_logger/sqlite_evaluation_row_store.py +0 -0
  141. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/datasets/__init__.py +0 -0
  142. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/directory_utils.py +0 -0
  143. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/event_bus/__init__.py +0 -0
  144. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/event_bus/event_bus.py +0 -0
  145. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/event_bus/logger.py +0 -0
  146. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/event_bus/sqlite_event_bus.py +0 -0
  147. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/event_bus/sqlite_event_bus_database.py +0 -0
  148. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/execution/__init__.py +0 -0
  149. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/gcp_tools.py +0 -0
  150. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/generation/cache.py +0 -0
  151. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/generation/clients/base.py +0 -0
  152. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/generation/clients.py +0 -0
  153. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/generic_server.py +0 -0
  154. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/human_id/__init__.py +0 -0
  155. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/human_id/dictionary.py +0 -0
  156. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/integrations/__init__.py +0 -0
  157. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/integrations/openeval.py +0 -0
  158. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/integrations/trl.py +0 -0
  159. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/logging_utils.py +0 -0
  160. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/__init__.py +0 -0
  161. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/adapter.py +0 -0
  162. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/client/__init__.py +0 -0
  163. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/execution/__init__.py +0 -0
  164. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/execution/base_policy.py +0 -0
  165. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/grid_renderer.py +0 -0
  166. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/process_manager.py +0 -0
  167. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/session/__init__.py +0 -0
  168. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp/session/manager.py +0 -0
  169. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_agent/__init__.py +0 -0
  170. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_agent/config.py +0 -0
  171. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_agent/orchestration/__init__.py +0 -0
  172. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_agent/orchestration/base_client.py +0 -0
  173. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_agent/orchestration/stdio_mcp_client_helper.py +0 -0
  174. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/__init__.py +0 -0
  175. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/README.md +0 -0
  176. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/server.py +0 -0
  177. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/tests/system_prompts/airline_agent_system_prompt.md +0 -0
  178. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/tests/system_prompts/mock_agent_system_prompt.md +0 -0
  179. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/mcp_servers/tau2/tests/system_prompts/retail_agent_system_prompt.md +0 -0
  180. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/packaging.py +0 -0
  181. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/platform_api.py +0 -0
  182. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/default_dataset_adapter.py +0 -0
  183. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/default_no_op_rollout_processor.py +0 -0
  184. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/dual_mode_wrapper.py +0 -0
  185. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/exception_config.py +0 -0
  186. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/execution.py +0 -0
  187. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/generate_parameter_combinations.py +0 -0
  188. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/handle_persist_flow.py +0 -0
  189. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/parameterize.py +0 -0
  190. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/rollout_processor.py +0 -0
  191. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/store_experiment_link.py +0 -0
  192. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/pytest/validate_signature.py +0 -0
  193. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/resources.py +0 -0
  194. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/reward_function.py +0 -0
  195. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/__init__.py +0 -0
  196. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/apps_execution_utils.py +0 -0
  197. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rewards/code_execution_utils.py +0 -0
  198. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/rl_processing.py +0 -0
  199. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/stats/__init__.py +0 -0
  200. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/stats/confidence_intervals.py +0 -0
  201. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/types/__init__.py +0 -0
  202. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/types/errors.py +0 -0
  203. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/types/types.py +0 -0
  204. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/__init__.py +0 -0
  205. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/batch_evaluation.py +0 -0
  206. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/dataset_helpers.py +0 -0
  207. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/module_loader.py +0 -0
  208. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol/utils/packaging_utils.py +0 -0
  209. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol.egg-info/dependency_links.txt +0 -0
  210. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol.egg-info/entry_points.txt +0 -0
  211. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/eval_protocol.egg-info/top_level.txt +0 -0
  212. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/setup.cfg +0 -0
  213. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/setup.py +0 -0
  214. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_accuracy.py +0 -0
  215. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_accuracy_length.py +0 -0
  216. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_adapters_e2e.py +0 -0
  217. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_agent_orchestrator.py +0 -0
  218. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_agent_resources.py +0 -0
  219. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_auth.py +0 -0
  220. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_batch_evaluation.py +0 -0
  221. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_braintrust_adapter.py +0 -0
  222. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_braintrust_example.py +0 -0
  223. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_cli.py +0 -0
  224. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_cli_agent.py +0 -0
  225. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_cli_args.py +0 -0
  226. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_code_execution.py +0 -0
  227. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_config.py +0 -0
  228. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_control_plane_separation.py +0 -0
  229. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_cpp_code.py +0 -0
  230. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_data_driven_task_manager.py +0 -0
  231. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_deepcoder_reward.py +0 -0
  232. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_deepeval_integration.py +0 -0
  233. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_deploy_integration.py +0 -0
  234. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_e2b_integration.py +0 -0
  235. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_e2b_js_integration.py +0 -0
  236. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_edge_cases.py +0 -0
  237. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_eval_protocol_import.py +0 -0
  238. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_evaluation.py +0 -0
  239. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_evaluation_integration.py +0 -0
  240. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_evaluation_preview_integration.py +0 -0
  241. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_event_bus.py +0 -0
  242. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_examples_end_to_end.py +0 -0
  243. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_fireworks_api.py +0 -0
  244. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_format.py +0 -0
  245. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_fractional_code.py +0 -0
  246. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_function_calling.py +0 -0
  247. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_gcp_tools.py +0 -0
  248. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_generic_server.py +0 -0
  249. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_human_id.py +0 -0
  250. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_integration.py +0 -0
  251. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_json_schema.py +0 -0
  252. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_kwargs_validation.py +0 -0
  253. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_language_consistency.py +0 -0
  254. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_lean_prover.py +0 -0
  255. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_lean_prover_runner.py +0 -0
  256. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_length.py +0 -0
  257. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_list_comparison_math_reward.py +0 -0
  258. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_logs_server.py +0 -0
  259. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_logs_server_simple.py +0 -0
  260. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_math.py +0 -0
  261. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_minimal.py +0 -0
  262. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_models_rl.py +0 -0
  263. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_multiple_choice_math_reward.py +0 -0
  264. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_n_variant_batch_integration.py +0 -0
  265. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_n_variant_integration.py +0 -0
  266. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_openai_compatibility.py +0 -0
  267. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_openeval_integration.py +0 -0
  268. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_packaging.py +0 -0
  269. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_parallel_rollouts.py +0 -0
  270. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_platform_api.py +0 -0
  271. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_readiness.py +0 -0
  272. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_reasoning_steps.py +0 -0
  273. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_repetition.py +0 -0
  274. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_repetition_debug.py +0 -0
  275. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_retry_mechanism.py +0 -0
  276. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_reward_function.py +0 -0
  277. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_reward_protocol_import.py +0 -0
  278. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_rl_processing.py +0 -0
  279. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_server.py +0 -0
  280. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_status_migration_changes.py +0 -0
  281. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_status_migration_integration.py +0 -0
  282. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_status_model.py +0 -0
  283. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_tag_count.py +0 -0
  284. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_tau_bench_airline_smoke.py +0 -0
  285. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_typed_interface.py +0 -0
  286. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_typed_interface_rl.py +0 -0
  287. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_url_handling.py +0 -0
  288. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/tests/test_vite_server.py +0 -0
  289. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/__init__.py +0 -0
  290. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/agent/__init__.py +0 -0
  291. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/agent/base.py +0 -0
  292. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/agent/llm_agent.py +0 -0
  293. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/api_service/__init__.py +0 -0
  294. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/api_service/api_config.py +0 -0
  295. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/api_service/data_model.py +0 -0
  296. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/api_service/simulation_service.py +0 -0
  297. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/cli.py +0 -0
  298. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/config.py +0 -0
  299. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/airline/policy.md +0 -0
  300. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/mock/policy.md +0 -0
  301. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/mock/policy_solo.md +0 -0
  302. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/retail/policy.md +0 -0
  303. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/telecom/main_policy.md +0 -0
  304. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/telecom/main_policy_solo.md +0 -0
  305. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/telecom/tech_support_manual.md +0 -0
  306. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/telecom/tech_support_workflow.md +0 -0
  307. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/domains/telecom/tech_support_workflow_solo.md +0 -0
  308. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/user_simulator/simulation_guidelines.md +0 -0
  309. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data/user_simulator/simulation_guidelines_tools.md +0 -0
  310. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data_model/__init__.py +0 -0
  311. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data_model/message.py +0 -0
  312. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data_model/simulation.py +0 -0
  313. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/data_model/tasks.py +0 -0
  314. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/__init__.py +0 -0
  315. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/airline/__init__.py +0 -0
  316. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/airline/data_model.py +0 -0
  317. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/airline/environment.py +0 -0
  318. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/airline/tools.py +0 -0
  319. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/airline/utils.py +0 -0
  320. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/mock/__init__.py +0 -0
  321. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/mock/data_model.py +0 -0
  322. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/mock/environment.py +0 -0
  323. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/mock/tools.py +0 -0
  324. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/mock/utils.py +0 -0
  325. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/retail/__init__.py +0 -0
  326. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/retail/data_model.py +0 -0
  327. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/retail/environment.py +0 -0
  328. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/retail/tools.py +0 -0
  329. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/retail/utils.py +0 -0
  330. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/__init__.py +0 -0
  331. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/data_model.py +0 -0
  332. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/environment.py +0 -0
  333. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/__init__.py +0 -0
  334. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/const.py +0 -0
  335. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/create_tasks.py +0 -0
  336. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/manager.py +0 -0
  337. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/mms_issues.py +0 -0
  338. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/mobile_data_issues.py +0 -0
  339. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/service_issues.py +0 -0
  340. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tasks/utils.py +0 -0
  341. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/tools.py +0 -0
  342. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/user_data_model.py +0 -0
  343. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/user_tools.py +0 -0
  344. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/domains/telecom/utils.py +0 -0
  345. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/__init__.py +0 -0
  346. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/db.py +0 -0
  347. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/environment.py +0 -0
  348. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/server.py +0 -0
  349. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/tool.py +0 -0
  350. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/toolkit.py +0 -0
  351. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/environment/utils/interface_agent.py +0 -0
  352. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/__init__.py +0 -0
  353. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/evaluator.py +0 -0
  354. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/evaluator_action.py +0 -0
  355. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/evaluator_base.py +0 -0
  356. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/evaluator_communicate.py +0 -0
  357. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/evaluator_env.py +0 -0
  358. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/evaluator/evaluator_nl_assertions.py +0 -0
  359. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/metrics/__init__.py +0 -0
  360. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/metrics/agent_metrics.py +0 -0
  361. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/metrics/break_down_metrics.py +0 -0
  362. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/orchestrator/__init__.py +0 -0
  363. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/orchestrator/environment_manager.py +0 -0
  364. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/orchestrator/orchestrator.py +0 -0
  365. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/orchestrator/utils.py +0 -0
  366. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/registry.py +0 -0
  367. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/run.py +0 -0
  368. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/scripts/__init__.py +0 -0
  369. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/scripts/check_data.py +0 -0
  370. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/scripts/show_domain_doc.py +0 -0
  371. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/scripts/start_servers.py +0 -0
  372. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/scripts/view_simulations.py +0 -0
  373. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/user/__init__.py +0 -0
  374. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/user/base.py +0 -0
  375. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/user/user_simulator.py +0 -0
  376. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/utils/__init__.py +0 -0
  377. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/utils/display.py +0 -0
  378. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/utils/io_utils.py +0 -0
  379. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/utils/llm_utils.py +0 -0
  380. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/utils/pydantic_utils.py +0 -0
  381. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vendor/tau2/utils/utils.py +0 -0
  382. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/versioneer.py +0 -0
  383. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vite-app/dist/assets/favicon-BkAAWQga.png +0 -0
  384. {eval_protocol-0.2.22 → eval_protocol-0.2.23}/vite-app/dist/assets/logo-light-BprIBJQW.png +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eval-protocol
3
- Version: 0.2.22
3
+ Version: 0.2.23
4
4
  Summary: The official Python SDK for Eval Protocol (EP.) EP is an open protocol that standardizes how developers author evals for large language model (LLM) applications.
5
5
  Author-email: Fireworks AI <info@fireworks.ai>
6
6
  License-Expression: MIT
@@ -15,7 +15,7 @@ Requires-Dist: pydantic>=2.0.0
15
15
  Requires-Dist: dataclasses-json>=0.5.7
16
16
  Requires-Dist: uvicorn>=0.15.0
17
17
  Requires-Dist: python-dotenv>=0.19.0
18
- Requires-Dist: openai==1.78.1
18
+ Requires-Dist: openai>=1.78.1
19
19
  Requires-Dist: aiosqlite
20
20
  Requires-Dist: aiohttp
21
21
  Requires-Dist: mcp>=1.9.2
@@ -56,7 +56,7 @@ Requires-Dist: types-requests; extra == "dev"
56
56
  Requires-Dist: types-PyYAML; extra == "dev"
57
57
  Requires-Dist: types-docker; extra == "dev"
58
58
  Requires-Dist: versioneer>=0.20; extra == "dev"
59
- Requires-Dist: openai==1.78.1; extra == "dev"
59
+ Requires-Dist: openai>=1.78.1; extra == "dev"
60
60
  Requires-Dist: pre-commit; extra == "dev"
61
61
  Requires-Dist: e2b; extra == "dev"
62
62
  Requires-Dist: pytest-cov; extra == "dev"
@@ -100,6 +100,8 @@ Provides-Extra: supabase
100
100
  Requires-Dist: supabase>=2.18.1; extra == "supabase"
101
101
  Provides-Extra: chinook
102
102
  Requires-Dist: psycopg2-binary>=2.9.10; extra == "chinook"
103
+ Provides-Extra: langchain
104
+ Requires-Dist: langchain-core>=0.3.0; extra == "langchain"
103
105
  Dynamic: license-file
104
106
 
105
107
  # Eval Protocol (EP)
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-08-29T13:54:58-0700",
11
+ "date": "2025-09-08T14:20:50-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "cb42aed7e588948fe7c5fa35e5751355dd206195",
15
- "version": "0.2.22"
14
+ "full-revisionid": "c6e0a5a4482876eb9e41c68d93ea6b7baac1781f",
15
+ "version": "0.2.23"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -7,34 +7,36 @@ to EvaluationRow format for use in evaluation pipelines.
7
7
  from __future__ import annotations
8
8
 
9
9
  import logging
10
- from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Union
10
+ from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Union, cast, TypeAlias
11
11
 
12
12
  from eval_protocol.models import CompletionParams, EvaluationRow, InputMetadata, Message
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
16
16
  try:
17
+ # Import at runtime if available
17
18
  from google.auth.exceptions import DefaultCredentialsError
18
- from google.cloud import bigquery
19
+ from google.cloud import bigquery as _bigquery_runtime # type: ignore
19
20
  from google.cloud.exceptions import Forbidden, NotFound
20
21
  from google.oauth2 import service_account
21
22
 
22
23
  BIGQUERY_AVAILABLE = True
23
24
  except ImportError:
25
+ # Provide fallbacks for type checking/runtime when package is missing
26
+ DefaultCredentialsError = Exception # type: ignore[assignment]
27
+ Forbidden = Exception # type: ignore[assignment]
28
+ NotFound = Exception # type: ignore[assignment]
29
+ service_account: Any
30
+ service_account = None
31
+ _bigquery_runtime = None # type: ignore[assignment]
24
32
  BIGQUERY_AVAILABLE = False
25
33
  # Optional dependency: avoid noisy warnings during import
26
34
  logger.debug("Google Cloud BigQuery not installed. Optional feature disabled.")
27
35
 
28
- # Avoid importing BigQuery types at runtime for annotations when not installed
29
- if TYPE_CHECKING:
30
- from google.cloud import bigquery as _bigquery_type
31
-
32
- QueryParameterType = Union[
33
- _bigquery_type.ScalarQueryParameter,
34
- _bigquery_type.ArrayQueryParameter,
35
- ]
36
- else:
37
- QueryParameterType = Any
36
+ # Simple type aliases to avoid importing optional google types under pyright
37
+ QueryParameterType: TypeAlias = Any
38
+ BigQueryClient: TypeAlias = Any
39
+ QueryJobConfig: TypeAlias = Any
38
40
 
39
41
  # Type alias for transformation function
40
42
  TransformFunction = Callable[[Dict[str, Any]], Dict[str, Any]]
@@ -98,7 +100,13 @@ class BigQueryAdapter:
98
100
  client_args["location"] = location
99
101
 
100
102
  client_args.update(client_kwargs)
101
- self.client = bigquery.Client(**client_args)
103
+ # Use runtime alias to avoid basedpyright import symbol error when lib is missing
104
+ if _bigquery_runtime is None:
105
+ raise ImportError(
106
+ "google-cloud-bigquery is not installed. Install with: pip install 'eval-protocol[bigquery]'"
107
+ )
108
+ # Avoid strict typing on optional dependency
109
+ self.client = _bigquery_runtime.Client(**client_args) # type: ignore[no-untyped-call, assignment]
102
110
 
103
111
  except DefaultCredentialsError as e:
104
112
  logger.error("Failed to authenticate with BigQuery: %s", e)
@@ -139,7 +147,9 @@ class BigQueryAdapter:
139
147
  """
140
148
  try:
141
149
  # Configure query job
142
- job_config = bigquery.QueryJobConfig()
150
+ if _bigquery_runtime is None:
151
+ raise RuntimeError("BigQuery runtime not available")
152
+ job_config = _bigquery_runtime.QueryJobConfig() # type: ignore[no-untyped-call]
143
153
  if query_params:
144
154
  job_config.query_parameters = query_params
145
155
  if self.location:
@@ -0,0 +1,143 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, ToolMessage
7
+
8
+ from eval_protocol.models import Message
9
+
10
+
11
+ def _dbg_enabled() -> bool:
12
+ return os.getenv("EP_DEBUG_SERIALIZATION", "0").strip() == "1"
13
+
14
+
15
+ def _dbg_print(*args):
16
+ if _dbg_enabled():
17
+ try:
18
+ print(*args)
19
+ except Exception:
20
+ pass
21
+
22
+
23
+ def serialize_lc_message_to_ep(msg: BaseMessage) -> Message:
24
+ _dbg_print(
25
+ "[EP-Ser] Input LC msg:",
26
+ type(msg).__name__,
27
+ {
28
+ "has_additional_kwargs": isinstance(getattr(msg, "additional_kwargs", None), dict),
29
+ "content_type": type(getattr(msg, "content", None)).__name__,
30
+ },
31
+ )
32
+
33
+ if isinstance(msg, HumanMessage):
34
+ ep_msg = Message(role="user", content=str(msg.content))
35
+ _dbg_print("[EP-Ser] -> EP Message:", {"role": ep_msg.role, "len": len(ep_msg.content or "")})
36
+ return ep_msg
37
+
38
+ if isinstance(msg, AIMessage):
39
+ content = ""
40
+ if isinstance(msg.content, str):
41
+ content = msg.content
42
+ elif isinstance(msg.content, list):
43
+ parts: List[str] = []
44
+ for item in msg.content:
45
+ if isinstance(item, dict):
46
+ if item.get("type") == "text":
47
+ parts.append(str(item.get("text", "")))
48
+ elif isinstance(item, str):
49
+ parts.append(item)
50
+ content = "\n".join(parts)
51
+
52
+ tool_calls_payload: Optional[List[Dict[str, Any]]] = None
53
+
54
+ def _normalize_tool_calls(tc_list: List[Any]) -> List[Dict[str, Any]]:
55
+ mapped: List[Dict[str, Any]] = []
56
+ for call in tc_list:
57
+ if not isinstance(call, dict):
58
+ continue
59
+ try:
60
+ call_id = call.get("id") or "toolcall_0"
61
+ if isinstance(call.get("function"), dict):
62
+ fn = call["function"]
63
+ fn_name = fn.get("name") or call.get("name") or "tool"
64
+ fn_args = fn.get("arguments")
65
+ else:
66
+ fn_name = call.get("name") or "tool"
67
+ fn_args = call.get("arguments") if call.get("arguments") is not None else call.get("args")
68
+ if not isinstance(fn_args, str):
69
+ import json as _json
70
+
71
+ fn_args = _json.dumps(fn_args or {}, ensure_ascii=False)
72
+ mapped.append(
73
+ {
74
+ "id": call_id,
75
+ "type": "function",
76
+ "function": {"name": fn_name, "arguments": fn_args},
77
+ }
78
+ )
79
+ except Exception:
80
+ continue
81
+ return mapped
82
+
83
+ ak = getattr(msg, "additional_kwargs", None)
84
+ if isinstance(ak, dict):
85
+ tc = ak.get("tool_calls")
86
+ if isinstance(tc, list) and tc:
87
+ mapped = _normalize_tool_calls(tc)
88
+ if mapped:
89
+ tool_calls_payload = mapped
90
+
91
+ if tool_calls_payload is None:
92
+ raw_attr_tc = getattr(msg, "tool_calls", None)
93
+ if isinstance(raw_attr_tc, list) and raw_attr_tc:
94
+ mapped = _normalize_tool_calls(raw_attr_tc)
95
+ if mapped:
96
+ tool_calls_payload = mapped
97
+
98
+ # Extract reasoning/thinking parts into reasoning_content
99
+ reasoning_content = None
100
+ if isinstance(msg.content, list):
101
+ collected = [
102
+ it.get("thinking", "") for it in msg.content if isinstance(it, dict) and it.get("type") == "thinking"
103
+ ]
104
+ if collected:
105
+ reasoning_content = "\n\n".join([s for s in collected if s]) or None
106
+
107
+ # Message.tool_calls expects List[ChatCompletionMessageToolCall] | None.
108
+ # We pass through Dicts at runtime but avoid type error by casting.
109
+ ep_msg = Message(
110
+ role="assistant",
111
+ content=content,
112
+ tool_calls=tool_calls_payload, # type: ignore[arg-type]
113
+ reasoning_content=reasoning_content,
114
+ )
115
+ _dbg_print(
116
+ "[EP-Ser] -> EP Message:",
117
+ {
118
+ "role": ep_msg.role,
119
+ "content_len": len(ep_msg.content or ""),
120
+ "tool_calls": len(ep_msg.tool_calls or []) if isinstance(ep_msg.tool_calls, list) else 0,
121
+ },
122
+ )
123
+ return ep_msg
124
+
125
+ if isinstance(msg, ToolMessage):
126
+ tool_name = msg.name or "tool"
127
+ status = msg.status or "success"
128
+ content = str(msg.content)
129
+ tool_call_id = getattr(msg, "tool_call_id", None)
130
+ ep_msg = Message(
131
+ role="tool",
132
+ name=tool_name,
133
+ tool_call_id=tool_call_id,
134
+ content=f'<{tool_name} status="{status}">\n{content}\n</{tool_name}>',
135
+ )
136
+ _dbg_print(
137
+ "[EP-Ser] -> EP Message:", {"role": ep_msg.role, "name": ep_msg.name, "has_id": bool(ep_msg.tool_call_id)}
138
+ )
139
+ return ep_msg
140
+
141
+ ep_msg = Message(role=getattr(msg, "type", "assistant"), content=str(getattr(msg, "content", "")))
142
+ _dbg_print("[EP-Ser] -> EP Message (fallback):", {"role": ep_msg.role, "len": len(ep_msg.content or "")})
143
+ return ep_msg
@@ -6,14 +6,14 @@ to EvaluationRow format for use in evaluation pipelines.
6
6
 
7
7
  import logging
8
8
  from datetime import datetime
9
- from typing import Any, Dict, Iterator, List, Optional
9
+ from typing import Any, Dict, Iterator, List, Optional, cast
10
10
 
11
11
  from eval_protocol.models import EvaluationRow, InputMetadata, Message
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
15
15
  try:
16
- from langfuse import Langfuse
16
+ from langfuse import Langfuse # pyright: ignore[reportPrivateImportUsage]
17
17
 
18
18
  LANGFUSE_AVAILABLE = True
19
19
  except ImportError:
@@ -63,7 +63,7 @@ class LangfuseAdapter:
63
63
  if not LANGFUSE_AVAILABLE:
64
64
  raise ImportError("Langfuse not installed. Install with: pip install 'eval-protocol[langfuse]'")
65
65
 
66
- self.client = Langfuse(public_key=public_key, secret_key=secret_key, host=host)
66
+ self.client = cast(Any, Langfuse)(public_key=public_key, secret_key=secret_key, host=host)
67
67
  self.project_id = project_id
68
68
 
69
69
  def get_evaluation_rows(
@@ -75,7 +75,7 @@ class LangfuseAdapter:
75
75
  from_timestamp: Optional[datetime] = None,
76
76
  to_timestamp: Optional[datetime] = None,
77
77
  include_tool_calls: bool = True,
78
- ) -> Iterator[EvaluationRow]:
78
+ ) -> List[EvaluationRow]:
79
79
  """Pull traces from Langfuse and convert to EvaluationRow format.
80
80
 
81
81
  Args:
@@ -90,8 +90,9 @@ class LangfuseAdapter:
90
90
  Yields:
91
91
  EvaluationRow: Converted evaluation rows
92
92
  """
93
- # Get traces from Langfuse
94
- traces = self.client.get_traces(
93
+ # Get traces from Langfuse using new API
94
+ eval_rows = []
95
+ traces = self.client.api.trace.list(
95
96
  limit=limit,
96
97
  tags=tags,
97
98
  user_id=user_id,
@@ -104,16 +105,17 @@ class LangfuseAdapter:
104
105
  try:
105
106
  eval_row = self._convert_trace_to_evaluation_row(trace, include_tool_calls)
106
107
  if eval_row:
107
- yield eval_row
108
+ eval_rows.append(eval_row)
108
109
  except (AttributeError, ValueError, KeyError) as e:
109
110
  logger.warning("Failed to convert trace %s: %s", trace.id, e)
110
111
  continue
112
+ return eval_rows
111
113
 
112
114
  def get_evaluation_rows_by_ids(
113
115
  self,
114
116
  trace_ids: List[str],
115
117
  include_tool_calls: bool = True,
116
- ) -> Iterator[EvaluationRow]:
118
+ ) -> List[EvaluationRow]:
117
119
  """Get specific traces by their IDs and convert to EvaluationRow format.
118
120
 
119
121
  Args:
@@ -123,15 +125,17 @@ class LangfuseAdapter:
123
125
  Yields:
124
126
  EvaluationRow: Converted evaluation rows
125
127
  """
128
+ eval_rows = []
126
129
  for trace_id in trace_ids:
127
130
  try:
128
- trace = self.client.get_trace(trace_id)
131
+ trace = self.client.api.trace.get(trace_id)
129
132
  eval_row = self._convert_trace_to_evaluation_row(trace, include_tool_calls)
130
133
  if eval_row:
131
- yield eval_row
134
+ eval_rows.append(eval_row)
132
135
  except (AttributeError, ValueError, KeyError) as e:
133
136
  logger.warning("Failed to fetch/convert trace %s: %s", trace_id, e)
134
137
  continue
138
+ return eval_rows
135
139
 
136
140
  def _convert_trace_to_evaluation_row(self, trace: Any, include_tool_calls: bool = True) -> Optional[EvaluationRow]:
137
141
  """Convert a Langfuse trace to EvaluationRow format.
@@ -145,10 +149,29 @@ class LangfuseAdapter:
145
149
  """
146
150
  try:
147
151
  # Get observations (generations, spans) from the trace
148
- observations = self.client.get_observations(trace_id=trace.id).data
152
+ observations_response = self.client.api.observations.get_many(trace_id=trace.id, limit=100)
153
+ observations = (
154
+ observations_response.data if hasattr(observations_response, "data") else list(observations_response)
155
+ )
149
156
 
150
- # Convert observations to messages
151
- messages = self._extract_messages_from_observations(observations, include_tool_calls)
157
+ # Look for conversation history in trace output or observations
158
+ messages = []
159
+ conversation_found = False
160
+
161
+ # Look for complete conversation in observations
162
+ if not conversation_found:
163
+ for obs in observations:
164
+ # Check each observation's output for complete conversation array
165
+ if hasattr(obs, "output") and obs.output:
166
+ conversation = self._extract_conversation_from_output(obs.output)
167
+ if conversation:
168
+ messages = conversation
169
+ conversation_found = True
170
+ break
171
+
172
+ # Fallback: try extracting from observations using old method
173
+ if not conversation_found:
174
+ messages = self._extract_messages_from_observations(observations, include_tool_calls)
152
175
 
153
176
  if not messages:
154
177
  return None
@@ -266,6 +289,86 @@ class LangfuseAdapter:
266
289
  function_call=function_call,
267
290
  )
268
291
 
292
+ def _extract_conversation_from_output(self, output: Any) -> Optional[List[Message]]:
293
+ """Extract conversation history from PydanticAI agent run output.
294
+
295
+ This looks for the conversation format like:
296
+ [
297
+ {"role": "user", "content": "..."},
298
+ {"role": "assistant", "content": "...", "tool_calls": [...]},
299
+ {"role": "tool", "content": "...", "name": "execute_sql"},
300
+ ...
301
+ ]
302
+
303
+ Args:
304
+ output: The output object to search for conversation history
305
+
306
+ Returns:
307
+ List of Message objects or None if no conversation found
308
+ """
309
+ messages = []
310
+
311
+ try:
312
+ # Handle different output formats
313
+ conversation_data = None
314
+
315
+ if isinstance(output, list):
316
+ # Direct list of messages
317
+ conversation_data = output
318
+ elif isinstance(output, dict):
319
+ # Look for conversation in various nested formats
320
+ if "messages" in output:
321
+ conversation_data = output["messages"]
322
+ elif "conversation" in output:
323
+ conversation_data = output["conversation"]
324
+ elif "history" in output:
325
+ conversation_data = output["history"]
326
+ elif "agent_run" in output: # Handle nested conversation data PydanticAI style
327
+ agent_run = output["agent_run"]
328
+ if isinstance(agent_run, dict) and "messages" in agent_run:
329
+ conversation_data = agent_run["messages"]
330
+ elif len(output.keys()) == 1:
331
+ # Single key, check if its value is a list
332
+ single_key = list(output.keys())[0]
333
+ if isinstance(output[single_key], list):
334
+ conversation_data = output[single_key]
335
+ elif isinstance(output, str):
336
+ # Try to parse JSON string
337
+ import json
338
+
339
+ try:
340
+ parsed = json.loads(output)
341
+ return self._extract_conversation_from_output(parsed)
342
+ except (json.JSONDecodeError, ValueError):
343
+ pass
344
+
345
+ # Parse conversation data into messages
346
+ if conversation_data and isinstance(conversation_data, list):
347
+ for msg_data in conversation_data:
348
+ if isinstance(msg_data, dict) and "role" in msg_data:
349
+ role = msg_data.get("role")
350
+ if role is None:
351
+ continue
352
+ content = msg_data.get("content", "")
353
+
354
+ # Handle tool calls in assistant messages
355
+ tool_calls = None
356
+ if role == "assistant" and "tool_calls" in msg_data:
357
+ tool_calls = msg_data["tool_calls"]
358
+
359
+ # Handle tool responses
360
+ name = None
361
+ if role == "tool":
362
+ name = msg_data.get("name")
363
+
364
+ messages.append(Message(role=role, content=content, name=name, tool_calls=tool_calls))
365
+
366
+ return messages if messages else None
367
+
368
+ except Exception as e:
369
+ logger.debug("Error extracting conversation from output: %s", e)
370
+ return None
371
+
269
372
  def _create_input_metadata(self, trace: Any, observations: List[Any]) -> InputMetadata:
270
373
  """Create InputMetadata from trace and observations.
271
374
 
@@ -276,22 +379,32 @@ class LangfuseAdapter:
276
379
  Returns:
277
380
  InputMetadata object
278
381
  """
279
- # Extract completion parameters from observations
382
+ # Extract completion parameters from trace input first, then observations
280
383
  completion_params = {}
281
384
 
282
- # Look for model parameters in observations
283
- for obs in observations:
284
- if hasattr(obs, "model") and obs.model:
285
- completion_params["model"] = obs.model
286
- if hasattr(obs, "model_parameters") and obs.model_parameters:
287
- params = obs.model_parameters
288
- if "temperature" in params:
289
- completion_params["temperature"] = params["temperature"]
290
- if "max_tokens" in params:
291
- completion_params["max_tokens"] = params["max_tokens"]
292
- if "top_p" in params:
293
- completion_params["top_p"] = params["top_p"]
294
- break
385
+ # First check trace input for evaluation test completion_params
386
+ if hasattr(trace, "input") and trace.input:
387
+ if isinstance(trace.input, dict):
388
+ kwargs = trace.input.get("kwargs", {})
389
+ if "completion_params" in kwargs:
390
+ trace_completion_params = kwargs["completion_params"]
391
+ if trace_completion_params and isinstance(trace_completion_params, dict):
392
+ completion_params.update(trace_completion_params)
393
+
394
+ # Fallback: Look for model parameters in observations if not found in trace input
395
+ if not completion_params:
396
+ for obs in observations:
397
+ if hasattr(obs, "model") and obs.model:
398
+ completion_params["model"] = obs.model
399
+ if hasattr(obs, "model_parameters") and obs.model_parameters:
400
+ params = obs.model_parameters
401
+ if "temperature" in params:
402
+ completion_params["temperature"] = params["temperature"]
403
+ if "max_tokens" in params:
404
+ completion_params["max_tokens"] = params["max_tokens"]
405
+ if "top_p" in params:
406
+ completion_params["top_p"] = params["top_p"]
407
+ break
295
408
 
296
409
  # Create dataset info from trace metadata
297
410
  dataset_info = {
@@ -331,6 +444,20 @@ class LangfuseAdapter:
331
444
  Returns:
332
445
  Ground truth string or None
333
446
  """
447
+ # First check trace input for evaluation test data structure
448
+ if hasattr(trace, "input") and trace.input:
449
+ if isinstance(trace.input, dict):
450
+ # Handle EP test format: kwargs.input_rows[0].ground_truth
451
+ kwargs = trace.input.get("kwargs", {})
452
+ if "input_rows" in kwargs:
453
+ input_rows = kwargs["input_rows"]
454
+ if input_rows and len(input_rows) > 0:
455
+ first_row = input_rows[0]
456
+ if isinstance(first_row, dict) and "ground_truth" in first_row:
457
+ ground_truth = first_row["ground_truth"]
458
+ if ground_truth: # Only return if not None/empty
459
+ return str(ground_truth)
460
+
334
461
  # Check trace metadata for ground truth
335
462
  if hasattr(trace, "metadata") and trace.metadata:
336
463
  if isinstance(trace.metadata, dict):