eval-protocol 0.2.39__tar.gz → 0.2.41__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 (414) hide show
  1. {eval_protocol-0.2.39/eval_protocol.egg-info → eval_protocol-0.2.41}/PKG-INFO +1 -1
  2. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/__init__.py +6 -0
  3. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/_version.py +3 -3
  4. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/__init__.py +5 -0
  5. eval_protocol-0.2.41/eval_protocol/adapters/fireworks_tracing.py +415 -0
  6. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/langfuse.py +1 -1
  7. {eval_protocol-0.2.39/eval_protocol/logging → eval_protocol-0.2.41/eval_protocol/log_utils}/elasticsearch_client.py +39 -6
  8. {eval_protocol-0.2.39/eval_protocol/logging → eval_protocol-0.2.41/eval_protocol/log_utils}/elasticsearch_direct_http_handler.py +31 -16
  9. eval_protocol-0.2.41/eval_protocol/log_utils/rollout_id_filter.py +28 -0
  10. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/frozen_lake/server.py +7 -2
  11. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_mcp_gym_rollout_processor.py +7 -4
  12. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/elasticsearch_setup.py +2 -2
  13. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/remote_rollout_processor.py +118 -41
  14. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/utils.py +16 -2
  15. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/remote_rollout_processor.py +7 -0
  16. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/logs_server.py +22 -8
  17. {eval_protocol-0.2.39 → eval_protocol-0.2.41/eval_protocol.egg-info}/PKG-INFO +1 -1
  18. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/SOURCES.txt +9 -6
  19. eval_protocol-0.2.41/vendor/tau2/user/__init__.py +0 -0
  20. eval_protocol-0.2.41/vite-app/dist/assets/index-D3tKqxWU.js +136 -0
  21. eval_protocol-0.2.41/vite-app/dist/assets/index-D3tKqxWU.js.map +1 -0
  22. eval_protocol-0.2.41/vite-app/dist/assets/index-DpYZaoAr.css +1 -0
  23. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vite-app/dist/index.html +2 -2
  24. eval_protocol-0.2.39/vite-app/dist/assets/index-C8woq7EO.js +0 -136
  25. eval_protocol-0.2.39/vite-app/dist/assets/index-C8woq7EO.js.map +0 -1
  26. eval_protocol-0.2.39/vite-app/dist/assets/index-CSKGq1w7.css +0 -1
  27. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/LICENSE +0 -0
  28. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/README.md +0 -0
  29. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/__init__.py +0 -0
  30. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/normalize_sandbox_fusion.py +0 -0
  31. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/utils/__init__.py +0 -0
  32. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/utils/generate_api_key.py +0 -0
  33. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/utils/subprocess_manager.py +0 -0
  34. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/__main__.py +0 -0
  35. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/base.py +0 -0
  36. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/bigquery.py +0 -0
  37. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/braintrust.py +0 -0
  38. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/huggingface.py +0 -0
  39. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/langchain.py +0 -0
  40. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/langsmith.py +0 -0
  41. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/openai_responses.py +0 -0
  42. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/trl.py +0 -0
  43. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/utils.py +0 -0
  44. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/__init__.py +0 -0
  45. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/models.py +0 -0
  46. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/orchestrator.py +0 -0
  47. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resource_abc.py +0 -0
  48. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resource_pool.py +0 -0
  49. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/__init__.py +0 -0
  50. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/__init__.py +0 -0
  51. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/gorilla_file_system.py +0 -0
  52. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/math_api.py +0 -0
  53. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/posting_api.py +0 -0
  54. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_sim_api_resource.py +0 -0
  55. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/docker_resource.py +0 -0
  56. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/filesystem_resource.py +0 -0
  57. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/python_state_resource.py +0 -0
  58. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/sql_resource.py +0 -0
  59. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/task_manager.py +0 -0
  60. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/tool_registry.py +0 -0
  61. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/auth.py +0 -0
  62. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/__init__.py +0 -0
  63. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/data/airline_dataset.jsonl +0 -0
  64. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/data/retail_dataset.jsonl +0 -0
  65. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_aime25.py +0 -0
  66. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_frozen_lake.py +0 -0
  67. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_gpqa.py +0 -0
  68. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_livebench_data_analysis.py +0 -0
  69. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_tau_bench_airline.py +0 -0
  70. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_tau_bench_retail.py +0 -0
  71. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli.py +0 -0
  72. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/__init__.py +0 -0
  73. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/agent_eval_cmd.py +0 -0
  74. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/common.py +0 -0
  75. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/deploy.py +0 -0
  76. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/deploy_mcp.py +0 -0
  77. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/logs.py +0 -0
  78. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/preview.py +0 -0
  79. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/run_eval_cmd.py +0 -0
  80. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/upload.py +0 -0
  81. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/common_utils.py +0 -0
  82. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/config.py +0 -0
  83. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/__init__.py +0 -0
  84. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/dynamic_data_loader.py +0 -0
  85. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/factory_data_loader.py +0 -0
  86. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/inline_data_loader.py +0 -0
  87. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/models.py +0 -0
  88. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/__init__.py +0 -0
  89. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/dataset_logger.py +0 -0
  90. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py +0 -0
  91. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/sqlite_dataset_logger_adapter.py +0 -0
  92. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/sqlite_evaluation_row_store.py +0 -0
  93. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/datasets/__init__.py +0 -0
  94. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/datasets/loader.py +0 -0
  95. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/directory_utils.py +0 -0
  96. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/evaluation.py +0 -0
  97. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/__init__.py +0 -0
  98. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/event_bus.py +0 -0
  99. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/logger.py +0 -0
  100. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/sqlite_event_bus.py +0 -0
  101. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/sqlite_event_bus_database.py +0 -0
  102. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/execution/__init__.py +0 -0
  103. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/execution/pipeline.py +0 -0
  104. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/gcp_tools.py +0 -0
  105. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generation/cache.py +0 -0
  106. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generation/clients/base.py +0 -0
  107. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generation/clients.py +0 -0
  108. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generic_server.py +0 -0
  109. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/get_pep440_version.py +0 -0
  110. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/human_id/__init__.py +0 -0
  111. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/human_id/dictionary.py +0 -0
  112. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/__init__.py +0 -0
  113. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/deepeval.py +0 -0
  114. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/openeval.py +0 -0
  115. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/trl.py +0 -0
  116. {eval_protocol-0.2.39/eval_protocol/mcp_servers → eval_protocol-0.2.41/eval_protocol/log_utils}/__init__.py +0 -0
  117. {eval_protocol-0.2.39/eval_protocol/logging → eval_protocol-0.2.41/eval_protocol/log_utils}/elasticsearch_index_manager.py +0 -0
  118. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/logging_utils.py +0 -0
  119. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/__init__.py +0 -0
  120. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/adapter.py +0 -0
  121. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/client/__init__.py +0 -0
  122. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/client/connection.py +0 -0
  123. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/clients.py +0 -0
  124. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/__init__.py +0 -0
  125. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/base_policy.py +0 -0
  126. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/manager.py +0 -0
  127. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/policy.py +0 -0
  128. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/grid_renderer.py +0 -0
  129. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/mcp_multi_client.py +0 -0
  130. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/mcpgym.py +0 -0
  131. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/process_manager.py +0 -0
  132. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/session/__init__.py +0 -0
  133. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/session/manager.py +0 -0
  134. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/simple_process_manager.py +0 -0
  135. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/simulation_server.py +0 -0
  136. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/__init__.py +0 -0
  137. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/config.py +0 -0
  138. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/main.py +0 -0
  139. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/__init__.py +0 -0
  140. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/base_client.py +0 -0
  141. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/local_docker_client.py +0 -0
  142. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/stdio_mcp_client_helper.py +0 -0
  143. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_env.py +0 -0
  144. {eval_protocol-0.2.39/vendor/tau2/agent → eval_protocol-0.2.41/eval_protocol/mcp_servers}/__init__.py +0 -0
  145. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/frozen_lake/frozen_lake_adapter.py +0 -0
  146. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/frozen_lake/frozen_lake_mcp.py +0 -0
  147. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/README.md +0 -0
  148. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/__init__.py +0 -0
  149. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/airplane_environment/airline_environment.py +0 -0
  150. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/mock_environment/mock_environment.py +0 -0
  151. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/retail_environment/retail_environment.py +0 -0
  152. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/server.py +0 -0
  153. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tau2_mcp.py +0 -0
  154. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tests/system_prompts/airline_agent_system_prompt.md +0 -0
  155. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tests/system_prompts/mock_agent_system_prompt.md +0 -0
  156. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tests/system_prompts/retail_agent_system_prompt.md +0 -0
  157. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tests/test_tau2_e2e.py +0 -0
  158. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/models.py +0 -0
  159. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/packaging.py +0 -0
  160. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/platform_api.py +0 -0
  161. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/playback_policy.py +0 -0
  162. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/__init__.py +0 -0
  163. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_agent_rollout_processor.py +0 -0
  164. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_dataset_adapter.py +0 -0
  165. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_langchain_rollout_processor.py +0 -0
  166. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_no_op_rollout_processor.py +0 -0
  167. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py +0 -0
  168. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_single_turn_rollout_process.py +0 -0
  169. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/dual_mode_wrapper.py +0 -0
  170. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/evaluation_test.py +0 -0
  171. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/evaluation_test_postprocess.py +0 -0
  172. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/exception_config.py +0 -0
  173. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/execution.py +0 -0
  174. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/generate_parameter_combinations.py +0 -0
  175. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/handle_persist_flow.py +0 -0
  176. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/parameterize.py +0 -0
  177. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/plugin.py +0 -0
  178. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/rollout_processor.py +0 -0
  179. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/store_experiment_link.py +0 -0
  180. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/store_results_url.py +0 -0
  181. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/types.py +0 -0
  182. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/validate_signature.py +0 -0
  183. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/__init__.py +0 -0
  184. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge.py +0 -0
  185. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_braintrust.py +0 -0
  186. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_langfuse.py +0 -0
  187. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_langsmith.py +0 -0
  188. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_openai_responses.py +0 -0
  189. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/utils.py +0 -0
  190. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/resources.py +0 -0
  191. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/reward_function.py +0 -0
  192. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/__init__.py +0 -0
  193. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/accuracy.py +0 -0
  194. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/accuracy_length.py +0 -0
  195. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/apps_coding_reward.py +0 -0
  196. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/apps_execution_utils.py +0 -0
  197. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/apps_testing_util.py +0 -0
  198. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/bfcl_reward.py +0 -0
  199. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/code_execution.py +0 -0
  200. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/code_execution_utils.py +0 -0
  201. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/cpp_code.py +0 -0
  202. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/deepcoder_reward.py +0 -0
  203. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/format.py +0 -0
  204. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/function_calling.py +0 -0
  205. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/json_schema.py +0 -0
  206. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/language_consistency.py +0 -0
  207. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/lean_prover.py +0 -0
  208. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/length.py +0 -0
  209. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/list_comparison_math_reward.py +0 -0
  210. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/math.py +0 -0
  211. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/multiple_choice_math_reward.py +0 -0
  212. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/reasoning_steps.py +0 -0
  213. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/repetition.py +0 -0
  214. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/tag_count.py +0 -0
  215. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rl_processing.py +0 -0
  216. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/server.py +0 -0
  217. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/stats/__init__.py +0 -0
  218. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/stats/confidence_intervals.py +0 -0
  219. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/typed_interface.py +0 -0
  220. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/__init__.py +0 -0
  221. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/errors.py +0 -0
  222. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/types.py +0 -0
  223. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/__init__.py +0 -0
  224. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/batch_evaluation.py +0 -0
  225. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/batch_transformation.py +0 -0
  226. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/check_server_status.py +0 -0
  227. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/dataset_helpers.py +0 -0
  228. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/logs_models.py +0 -0
  229. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/module_loader.py +0 -0
  230. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/packaging_utils.py +0 -0
  231. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/show_results_url.py +0 -0
  232. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/static_policy.py +0 -0
  233. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/subprocess_utils.py +0 -0
  234. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/vite_server.py +0 -0
  235. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/dependency_links.txt +0 -0
  236. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/entry_points.txt +0 -0
  237. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/requires.txt +0 -0
  238. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/top_level.txt +0 -0
  239. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/pyproject.toml +0 -0
  240. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/setup.cfg +0 -0
  241. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/setup.py +0 -0
  242. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_accuracy.py +0 -0
  243. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_accuracy_length.py +0 -0
  244. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_adapters_e2e.py +0 -0
  245. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_agent_orchestrator.py +0 -0
  246. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_agent_resources.py +0 -0
  247. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_auth.py +0 -0
  248. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_batch_evaluation.py +0 -0
  249. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cli.py +0 -0
  250. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cli_agent.py +0 -0
  251. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cli_args.py +0 -0
  252. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_code_execution.py +0 -0
  253. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_config.py +0 -0
  254. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_control_plane_separation.py +0 -0
  255. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cpp_code.py +0 -0
  256. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_data_driven_task_manager.py +0 -0
  257. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_deepcoder_reward.py +0 -0
  258. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_deepeval_integration.py +0 -0
  259. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_deploy_integration.py +0 -0
  260. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_e2b_integration.py +0 -0
  261. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_e2b_js_integration.py +0 -0
  262. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_edge_cases.py +0 -0
  263. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_eval_protocol_import.py +0 -0
  264. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation.py +0 -0
  265. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation_integration.py +0 -0
  266. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation_postprocess.py +0 -0
  267. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation_preview_integration.py +0 -0
  268. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_event_bus.py +0 -0
  269. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_examples_end_to_end.py +0 -0
  270. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_fireworks_api.py +0 -0
  271. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_format.py +0 -0
  272. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_fractional_code.py +0 -0
  273. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_function_calling.py +0 -0
  274. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_gcp_tools.py +0 -0
  275. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_generic_server.py +0 -0
  276. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_human_id.py +0 -0
  277. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_integration.py +0 -0
  278. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_json_schema.py +0 -0
  279. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_kwargs_validation.py +0 -0
  280. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_language_consistency.py +0 -0
  281. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_lean_prover.py +0 -0
  282. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_lean_prover_runner.py +0 -0
  283. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_length.py +0 -0
  284. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_list_comparison_math_reward.py +0 -0
  285. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_logs_server.py +0 -0
  286. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_logs_server_simple.py +0 -0
  287. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_math.py +0 -0
  288. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_minimal.py +0 -0
  289. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_models.py +0 -0
  290. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_models_rl.py +0 -0
  291. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_multiple_choice_math_reward.py +0 -0
  292. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_n_variant_batch_integration.py +0 -0
  293. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_n_variant_integration.py +0 -0
  294. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_openai_compatibility.py +0 -0
  295. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_openeval_integration.py +0 -0
  296. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_packaging.py +0 -0
  297. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_parallel_rollouts.py +0 -0
  298. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_platform_api.py +0 -0
  299. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_quickstart_utils.py +0 -0
  300. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_readiness.py +0 -0
  301. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_reasoning_steps.py +0 -0
  302. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_repetition.py +0 -0
  303. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_repetition_debug.py +0 -0
  304. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_retry_mechanism.py +0 -0
  305. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_reward_function.py +0 -0
  306. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_reward_protocol_import.py +0 -0
  307. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_rl_processing.py +0 -0
  308. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_rollout_control_plane_integration.py +0 -0
  309. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_server.py +0 -0
  310. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_show_results_url.py +0 -0
  311. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_status_migration_changes.py +0 -0
  312. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_status_migration_integration.py +0 -0
  313. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_status_model.py +0 -0
  314. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_tag_count.py +0 -0
  315. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_tau_bench_airline_smoke.py +0 -0
  316. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_typed_interface.py +0 -0
  317. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_typed_interface_rl.py +0 -0
  318. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_url_handling.py +0 -0
  319. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_vite_server.py +0 -0
  320. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/__init__.py +0 -0
  321. {eval_protocol-0.2.39/vendor/tau2/data_model → eval_protocol-0.2.41/vendor/tau2/agent}/__init__.py +0 -0
  322. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/agent/base.py +0 -0
  323. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/agent/llm_agent.py +0 -0
  324. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/__init__.py +0 -0
  325. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/api_config.py +0 -0
  326. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/data_model.py +0 -0
  327. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/simulation_service.py +0 -0
  328. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/cli.py +0 -0
  329. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/config.py +0 -0
  330. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/airline/policy.md +0 -0
  331. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/mock/policy.md +0 -0
  332. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/mock/policy_solo.md +0 -0
  333. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/retail/policy.md +0 -0
  334. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/main_policy.md +0 -0
  335. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/main_policy_solo.md +0 -0
  336. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/tech_support_manual.md +0 -0
  337. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/tech_support_workflow.md +0 -0
  338. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/tech_support_workflow_solo.md +0 -0
  339. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/user_simulator/simulation_guidelines.md +0 -0
  340. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/user_simulator/simulation_guidelines_tools.md +0 -0
  341. {eval_protocol-0.2.39/vendor/tau2/domains → eval_protocol-0.2.41/vendor/tau2/data_model}/__init__.py +0 -0
  342. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data_model/message.py +0 -0
  343. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data_model/simulation.py +0 -0
  344. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data_model/tasks.py +0 -0
  345. {eval_protocol-0.2.39/vendor/tau2/domains/telecom/tasks → eval_protocol-0.2.41/vendor/tau2/domains}/__init__.py +0 -0
  346. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/__init__.py +0 -0
  347. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/data_model.py +0 -0
  348. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/environment.py +0 -0
  349. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/tools.py +0 -0
  350. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/utils.py +0 -0
  351. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/__init__.py +0 -0
  352. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/data_model.py +0 -0
  353. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/environment.py +0 -0
  354. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/tools.py +0 -0
  355. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/utils.py +0 -0
  356. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/__init__.py +0 -0
  357. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/data_model.py +0 -0
  358. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/environment.py +0 -0
  359. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/tools.py +0 -0
  360. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/utils.py +0 -0
  361. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/__init__.py +0 -0
  362. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/data_model.py +0 -0
  363. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/environment.py +0 -0
  364. {eval_protocol-0.2.39/vendor/tau2/environment → eval_protocol-0.2.41/vendor/tau2/domains/telecom/tasks}/__init__.py +0 -0
  365. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/const.py +0 -0
  366. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/create_tasks.py +0 -0
  367. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/manager.py +0 -0
  368. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/mms_issues.py +0 -0
  369. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/mobile_data_issues.py +0 -0
  370. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/service_issues.py +0 -0
  371. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/utils.py +0 -0
  372. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tools.py +0 -0
  373. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/user_data_model.py +0 -0
  374. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/user_tools.py +0 -0
  375. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/utils.py +0 -0
  376. {eval_protocol-0.2.39/vendor/tau2/evaluator → eval_protocol-0.2.41/vendor/tau2/environment}/__init__.py +0 -0
  377. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/db.py +0 -0
  378. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/environment.py +0 -0
  379. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/server.py +0 -0
  380. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/tool.py +0 -0
  381. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/toolkit.py +0 -0
  382. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/utils/interface_agent.py +0 -0
  383. {eval_protocol-0.2.39/vendor/tau2/metrics → eval_protocol-0.2.41/vendor/tau2/evaluator}/__init__.py +0 -0
  384. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator.py +0 -0
  385. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_action.py +0 -0
  386. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_base.py +0 -0
  387. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_communicate.py +0 -0
  388. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_env.py +0 -0
  389. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_nl_assertions.py +0 -0
  390. {eval_protocol-0.2.39/vendor/tau2/orchestrator → eval_protocol-0.2.41/vendor/tau2/metrics}/__init__.py +0 -0
  391. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/metrics/agent_metrics.py +0 -0
  392. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/metrics/break_down_metrics.py +0 -0
  393. {eval_protocol-0.2.39/vendor/tau2/scripts → eval_protocol-0.2.41/vendor/tau2/orchestrator}/__init__.py +0 -0
  394. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/orchestrator/environment_manager.py +0 -0
  395. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/orchestrator/orchestrator.py +0 -0
  396. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/orchestrator/utils.py +0 -0
  397. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/registry.py +0 -0
  398. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/run.py +0 -0
  399. {eval_protocol-0.2.39/vendor/tau2/user → eval_protocol-0.2.41/vendor/tau2/scripts}/__init__.py +0 -0
  400. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/check_data.py +0 -0
  401. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/show_domain_doc.py +0 -0
  402. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/start_servers.py +0 -0
  403. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/view_simulations.py +0 -0
  404. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/user/base.py +0 -0
  405. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/user/user_simulator.py +0 -0
  406. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/__init__.py +0 -0
  407. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/display.py +0 -0
  408. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/io_utils.py +0 -0
  409. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/llm_utils.py +0 -0
  410. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/pydantic_utils.py +0 -0
  411. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/utils.py +0 -0
  412. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/versioneer.py +0 -0
  413. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vite-app/dist/assets/favicon-BkAAWQga.png +0 -0
  414. {eval_protocol-0.2.39 → eval_protocol-0.2.41}/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.39
3
+ Version: 0.2.41
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
@@ -32,12 +32,15 @@ from .typed_interface import reward_function
32
32
  from .quickstart import aha_judge, multi_turn_assistant_to_ground_truth, assistant_to_ground_truth
33
33
  from .pytest import evaluation_test, SingleTurnRolloutProcessor, RemoteRolloutProcessor
34
34
  from .pytest.parameterize import DefaultParameterIdGenerator
35
+ from .log_utils.elasticsearch_direct_http_handler import ElasticsearchDirectHttpHandler
36
+ from .log_utils.rollout_id_filter import RolloutIdFilter
35
37
 
36
38
  from .types.remote_rollout_processor import (
37
39
  InitRequest,
38
40
  RolloutMetadata,
39
41
  StatusResponse,
40
42
  create_langfuse_config_tags,
43
+ DataLoaderConfig,
41
44
  )
42
45
 
43
46
  try:
@@ -63,6 +66,9 @@ except ImportError:
63
66
  warnings.filterwarnings("default", category=DeprecationWarning, module="eval_protocol")
64
67
 
65
68
  __all__ = [
69
+ "ElasticsearchDirectHttpHandler",
70
+ "RolloutIdFilter",
71
+ "DataLoaderConfig",
66
72
  "Status",
67
73
  "RemoteRolloutProcessor",
68
74
  "InputMetadata",
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-10-03T13:05:13-0700",
11
+ "date": "2025-10-07T15:43:37-0700",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "d88e1553ce310279cab0261df1035f27713e2e5f",
15
- "version": "0.2.39"
14
+ "full-revisionid": "289abc56fc56935b45b11da011712fe48d956af1",
15
+ "version": "0.2.41"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -6,6 +6,7 @@ and converting them to EvaluationRow format for use in evaluation pipelines.
6
6
  Available adapters:
7
7
  - BaseAdapter: Abstract base class for all adapters
8
8
  - LangfuseAdapter: Pull data from Langfuse deployments
9
+ - FireworksTracingAdapter: Pull data from Langfuse via Fireworks tracing proxy
9
10
  - HuggingFaceAdapter: Load datasets from HuggingFace Hub
10
11
  - BigQueryAdapter: Query data from Google BigQuery
11
12
  - TRL integration (legacy)
@@ -24,6 +25,10 @@ try:
24
25
  except ImportError:
25
26
  pass
26
27
 
28
+ from .fireworks_tracing import FireworksTracingAdapter
29
+
30
+ __all__.extend(["FireworksTracingAdapter"])
31
+
27
32
  try:
28
33
  from .huggingface import (
29
34
  HuggingFaceAdapter,
@@ -0,0 +1,415 @@
1
+ """Fireworks Tracing adapter for Eval Protocol.
2
+
3
+ This adapter uses the Fireworks tracing proxy at tracing.fireworks.ai
4
+ to pull data from Langfuse deployments with simplified retry logic handling.
5
+ """
6
+
7
+ from __future__ import annotations
8
+ import logging
9
+ import requests
10
+ import time
11
+ from datetime import datetime
12
+ from typing import Any, Dict, List, Optional, Protocol
13
+
14
+ from eval_protocol.models import EvaluationRow, InputMetadata, ExecutionMetadata, Message
15
+ from .base import BaseAdapter
16
+ from .utils import extract_messages_from_data
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class TraceDictConverter(Protocol):
22
+ """Protocol for custom trace dictionary-to-EvaluationRow converter functions.
23
+
24
+ A converter function should take a trace dictionary along with processing
25
+ options and return an EvaluationRow or None to skip the trace.
26
+ """
27
+
28
+ def __call__(
29
+ self,
30
+ trace: Dict[str, Any],
31
+ include_tool_calls: bool,
32
+ span_name: Optional[str],
33
+ ) -> Optional[EvaluationRow]:
34
+ """Convert a trace dictionary to an EvaluationRow.
35
+
36
+ Args:
37
+ trace: The trace dictionary to convert
38
+ include_tool_calls: Whether to include tool calling information
39
+ span_name: Optional span name to extract messages from
40
+
41
+ Returns:
42
+ EvaluationRow or None if the trace should be skipped
43
+ """
44
+ ...
45
+
46
+
47
+ def convert_trace_dict_to_evaluation_row(
48
+ trace: Dict[str, Any], include_tool_calls: bool = True, span_name: Optional[str] = None
49
+ ) -> Optional[EvaluationRow]:
50
+ """Convert a trace dictionary (from proxy API) to EvaluationRow format.
51
+
52
+ Args:
53
+ trace: Trace dictionary from Fireworks proxy API
54
+ include_tool_calls: Whether to include tool calling information
55
+ span_name: If provided, extract messages from generations within this named span
56
+
57
+ Returns:
58
+ EvaluationRow or None if conversion fails
59
+ """
60
+ try:
61
+ # Extract messages from trace input and output
62
+ messages = extract_messages_from_trace_dict(trace, include_tool_calls, span_name)
63
+
64
+ # Extract tools if available
65
+ tools = None
66
+ if include_tool_calls and isinstance(trace.get("input"), dict) and "tools" in trace["input"]:
67
+ tools = trace["input"]["tools"]
68
+
69
+ if not messages:
70
+ return None
71
+
72
+ execution_metadata = ExecutionMetadata()
73
+ row_id = None
74
+
75
+ # Extract metadata from tags
76
+ tags = trace.get("tags", [])
77
+ if tags:
78
+ for tag in tags:
79
+ if tag.startswith("invocation_id:"):
80
+ execution_metadata.invocation_id = tag.split(":", 1)[1]
81
+ elif tag.startswith("experiment_id:"):
82
+ execution_metadata.experiment_id = tag.split(":", 1)[1]
83
+ elif tag.startswith("rollout_id:"):
84
+ execution_metadata.rollout_id = tag.split(":", 1)[1]
85
+ elif tag.startswith("run_id:"):
86
+ execution_metadata.run_id = tag.split(":", 1)[1]
87
+ elif tag.startswith("row_id:"):
88
+ row_id = tag.split(":", 1)[1]
89
+
90
+ if (
91
+ execution_metadata.invocation_id
92
+ and execution_metadata.experiment_id
93
+ and execution_metadata.rollout_id
94
+ and execution_metadata.run_id
95
+ and row_id
96
+ ):
97
+ break # Break early if we've found all the metadata we need
98
+
99
+ return EvaluationRow(
100
+ messages=messages,
101
+ tools=tools,
102
+ input_metadata=InputMetadata(
103
+ row_id=row_id,
104
+ session_data={
105
+ "langfuse_trace_id": trace.get("id"), # Store the trace ID here
106
+ },
107
+ ),
108
+ execution_metadata=execution_metadata,
109
+ )
110
+
111
+ except (AttributeError, ValueError, KeyError) as e:
112
+ logger.error("Error converting trace %s: %s", trace.get("id"), e)
113
+ return None
114
+
115
+
116
+ def extract_messages_from_trace_dict(
117
+ trace: Dict[str, Any], include_tool_calls: bool = True, span_name: Optional[str] = None
118
+ ) -> List[Message]:
119
+ """Extract messages from trace dictionary.
120
+
121
+ Args:
122
+ trace: Trace dictionary from proxy API
123
+ include_tool_calls: Whether to include tool calling information
124
+ span_name: If provided, extract messages from generations within this named span
125
+
126
+ Returns:
127
+ List of Message objects
128
+ """
129
+ messages = []
130
+
131
+ if span_name: # Look for a generation tied to a span name
132
+ try:
133
+ # Find the final generation in the named span
134
+ gen = get_final_generation_in_span_dict(trace, span_name)
135
+ if not gen:
136
+ return messages
137
+
138
+ # Extract messages from generation input and output
139
+ if gen.get("input"):
140
+ messages.extend(extract_messages_from_data(gen["input"], include_tool_calls))
141
+ if gen.get("output"):
142
+ messages.extend(extract_messages_from_data(gen["output"], include_tool_calls))
143
+
144
+ return messages
145
+
146
+ except Exception as e:
147
+ logger.error("Failed to extract messages from span '%s' in trace %s: %s", span_name, trace.get("id"), e)
148
+ return messages
149
+
150
+ else:
151
+ try:
152
+ # Extract messages from trace input and output
153
+ if trace.get("input"):
154
+ messages.extend(extract_messages_from_data(trace["input"], include_tool_calls))
155
+ if trace.get("output"):
156
+ messages.extend(extract_messages_from_data(trace["output"], include_tool_calls))
157
+ except (AttributeError, ValueError, KeyError) as e:
158
+ logger.warning("Error processing trace %s: %s", trace.get("id"), e)
159
+
160
+ # Fallback: use the last GENERATION observation which typically contains full chat history
161
+ if not messages:
162
+ try:
163
+ all_observations = trace.get("observations", [])
164
+ gens = [obs for obs in all_observations if obs.get("type") == "GENERATION"]
165
+ if gens:
166
+ gens.sort(key=lambda x: x.get("start_time", ""))
167
+ last_gen = gens[-1]
168
+ if last_gen.get("input"):
169
+ messages.extend(extract_messages_from_data(last_gen["input"], include_tool_calls))
170
+ if last_gen.get("output"):
171
+ messages.extend(extract_messages_from_data(last_gen["output"], include_tool_calls))
172
+ except Exception as e:
173
+ logger.warning("Failed to extract from last generation for trace %s: %s", trace.get("id"), e)
174
+
175
+ return messages
176
+
177
+
178
+ def get_final_generation_in_span_dict(trace: Dict[str, Any], span_name: str) -> Optional[Dict[str, Any]]:
179
+ """Get the final generation within a named span from trace dictionary.
180
+
181
+ Args:
182
+ trace: Trace dictionary
183
+ span_name: Name of the span to search for
184
+
185
+ Returns:
186
+ The final generation dictionary, or None if not found
187
+ """
188
+ # Get all observations from the trace
189
+ all_observations = trace.get("observations", [])
190
+
191
+ # Find a span with the given name that has generation children
192
+ parent_span = None
193
+ for obs in all_observations:
194
+ if obs.get("name") == span_name and obs.get("type") == "SPAN":
195
+ # Check if this span has generation children
196
+ has_generations = any(
197
+ child.get("type") == "GENERATION" and child.get("parent_observation_id") == obs.get("id")
198
+ for child in all_observations
199
+ )
200
+ if has_generations:
201
+ parent_span = obs
202
+ break
203
+
204
+ if not parent_span:
205
+ logger.warning("No span named '%s' found in trace %s", span_name, trace.get("id"))
206
+ return None
207
+
208
+ # Find all generations within this span
209
+ generations = []
210
+ for obs in all_observations:
211
+ if obs.get("type") == "GENERATION" and obs.get("parent_observation_id") == parent_span.get("id"):
212
+ generations.append(obs)
213
+
214
+ if not generations:
215
+ logger.warning("No generations found in span '%s' in trace %s", span_name, trace.get("id"))
216
+ return None
217
+
218
+ # Sort generations by start time for chronological order
219
+ generations.sort(key=lambda x: x.get("start_time", ""))
220
+
221
+ # Return the final generation (contains full message history)
222
+ return generations[-1]
223
+
224
+
225
+ class FireworksTracingAdapter(BaseAdapter):
226
+ """Adapter to pull data from Langfuse via Fireworks tracing proxy.
227
+
228
+ This adapter uses the Fireworks tracing proxy API which handles retry logic
229
+ and rate limiting internally, simplifying the client-side implementation.
230
+
231
+ Examples:
232
+ Basic usage (default project):
233
+ >>> adapter = FireworksTracingAdapter()
234
+ >>> rows = list(adapter.get_evaluation_rows(tags=["rollout_id:xyz"], limit=10))
235
+
236
+ With explicit project ID:
237
+ >>> adapter = FireworksTracingAdapter(
238
+ ... project_id="your_project_id",
239
+ ... base_url="https://tracing.fireworks.ai"
240
+ ... )
241
+ >>> rows = list(adapter.get_evaluation_rows(tags=["production"], limit=10))
242
+
243
+ Filter by specific criteria:
244
+ >>> rows = list(adapter.get_evaluation_rows(
245
+ ... tags=["production"],
246
+ ... limit=50,
247
+ ... hours_back=24
248
+ ... ))
249
+ """
250
+
251
+ def __init__(
252
+ self,
253
+ project_id: Optional[str] = None,
254
+ base_url: str = "https://tracing.fireworks.ai",
255
+ timeout: int = 300,
256
+ ):
257
+ """Initialize the Fireworks Tracing adapter.
258
+
259
+ Args:
260
+ project_id: Optional project ID. If not provided, uses the default project configured on the server.
261
+ base_url: The base URL of the tracing proxy (default: https://tracing.fireworks.ai)
262
+ timeout: Request timeout in seconds (default: 300)
263
+ """
264
+ self.project_id = project_id
265
+ self.base_url = base_url.rstrip("/")
266
+ self.timeout = timeout
267
+
268
+ def get_evaluation_rows(
269
+ self,
270
+ tags: List[str],
271
+ limit: int = 100,
272
+ sample_size: Optional[int] = None,
273
+ user_id: Optional[str] = None,
274
+ session_id: Optional[str] = None,
275
+ name: Optional[str] = None,
276
+ environment: Optional[str] = None,
277
+ version: Optional[str] = None,
278
+ release: Optional[str] = None,
279
+ fields: Optional[str] = None,
280
+ hours_back: Optional[int] = None,
281
+ from_timestamp: Optional[datetime] = None,
282
+ to_timestamp: Optional[datetime] = None,
283
+ include_tool_calls: bool = True,
284
+ backend_sleep_between_gets: float = 0.1,
285
+ backend_max_retries: int = 3,
286
+ proxy_max_retries: int = 3,
287
+ span_name: Optional[str] = None,
288
+ converter: Optional[TraceDictConverter] = None,
289
+ ) -> List[EvaluationRow]:
290
+ """Pull traces from Langfuse via proxy and convert to EvaluationRow format.
291
+
292
+ Args:
293
+ tags: REQUIRED - Filter by specific tags (prevents fetching all traces).
294
+ Must provide at least one tag (e.g., ['rollout_id:xyz'], ['production'])
295
+ limit: Max number of trace summaries to collect via pagination
296
+ sample_size: Optional number of traces to randomly sample (if None, process all)
297
+ user_id: Filter by user ID
298
+ session_id: Filter by session ID
299
+ name: Filter by trace name
300
+ environment: Filter by environment (e.g., production, staging, development)
301
+ version: Filter by trace version
302
+ release: Filter by trace release
303
+ fields: Comma-separated list of fields to include
304
+ hours_back: Filter traces from this many hours ago
305
+ from_timestamp: Explicit start time (ISO format)
306
+ to_timestamp: Explicit end time (ISO format)
307
+ include_tool_calls: Whether to include tool calling traces
308
+ backend_sleep_between_gets: Sleep time between backend trace fetches (passed to proxy)
309
+ backend_max_retries: Maximum retries for backend operations (passed to proxy)
310
+ proxy_max_retries: Maximum retries when proxy returns 404 (client-side retries with exponential backoff)
311
+ span_name: If provided, extract messages from generations within this named span
312
+ converter: Optional custom converter implementing TraceDictConverter protocol.
313
+ If provided, this will be used instead of the default conversion logic.
314
+
315
+ Returns:
316
+ List[EvaluationRow]: Converted evaluation rows
317
+
318
+ Raises:
319
+ ValueError: If tags list is empty
320
+ """
321
+ # Validate that tags are provided (security requirement)
322
+ if not tags or len(tags) == 0:
323
+ raise ValueError("At least one tag is required to fetch traces (security: prevents fetching all traces)")
324
+
325
+ eval_rows = []
326
+
327
+ # Build query parameters for GET request
328
+ params = {
329
+ "limit": limit,
330
+ "sample_size": sample_size,
331
+ "tags": tags,
332
+ "user_id": user_id,
333
+ "session_id": session_id,
334
+ "name": name,
335
+ "environment": environment,
336
+ "version": version,
337
+ "release": release,
338
+ "fields": fields,
339
+ "hours_back": hours_back,
340
+ "from_timestamp": from_timestamp.isoformat() if from_timestamp else None,
341
+ "to_timestamp": to_timestamp.isoformat() if to_timestamp else None,
342
+ "sleep_between_gets": backend_sleep_between_gets,
343
+ "max_retries": backend_max_retries,
344
+ }
345
+
346
+ # Remove None values
347
+ params = {k: v for k, v in params.items() if v is not None}
348
+
349
+ # Make request to proxy with retry logic
350
+ if self.project_id:
351
+ url = f"{self.base_url}/v1/project_id/{self.project_id}/traces"
352
+ else:
353
+ url = f"{self.base_url}/v1/traces"
354
+
355
+ # Retry loop for handling backend indexing delays (proxy returns 404)
356
+ result = None
357
+ for attempt in range(proxy_max_retries):
358
+ try:
359
+ response = requests.get(url, params=params, timeout=self.timeout)
360
+ response.raise_for_status()
361
+ result = response.json()
362
+ break # Success, exit retry loop
363
+ except requests.exceptions.HTTPError as e:
364
+ error_msg = str(e)
365
+ should_retry = False
366
+
367
+ # Try to extract detail message from response
368
+ if e.response is not None:
369
+ try:
370
+ error_detail = e.response.json().get("detail", "")
371
+ error_msg = error_detail or e.response.text
372
+
373
+ # Retry on 404 if it's due to incomplete/missing traces (backend still indexing)
374
+ if e.response.status_code == 404 and (
375
+ "Incomplete traces" in error_detail or "No traces found" in error_detail
376
+ ):
377
+ should_retry = True
378
+ except Exception:
379
+ error_msg = e.response.text
380
+
381
+ if should_retry and attempt < proxy_max_retries - 1:
382
+ sleep_time = 2 ** (attempt + 1)
383
+ logger.warning(error_msg)
384
+ time.sleep(sleep_time)
385
+ else:
386
+ # Final retry or non-retryable error
387
+ logger.error("Failed to fetch traces from proxy: %s", error_msg)
388
+ return eval_rows
389
+ except requests.exceptions.RequestException as e:
390
+ # Non-HTTP errors (network issues, timeouts, etc.)
391
+ logger.error("Failed to fetch traces from proxy: %s", str(e))
392
+ return eval_rows
393
+
394
+ if result is None:
395
+ logger.error("Failed to fetch traces after %d retries", proxy_max_retries)
396
+ return eval_rows
397
+
398
+ # Extract traces from response
399
+ traces = result.get("traces", [])
400
+
401
+ # Convert each trace to EvaluationRow
402
+ for trace in traces:
403
+ try:
404
+ if converter:
405
+ eval_row = converter(trace, include_tool_calls, span_name)
406
+ else:
407
+ eval_row = convert_trace_dict_to_evaluation_row(trace, include_tool_calls, span_name)
408
+ if eval_row:
409
+ eval_rows.append(eval_row)
410
+ except (AttributeError, ValueError, KeyError) as e:
411
+ logger.warning("Failed to convert trace %s: %s", trace.get("id"), e)
412
+ continue
413
+
414
+ logger.info("Successfully converted %d traces to evaluation rows", len(eval_rows))
415
+ return eval_rows
@@ -355,7 +355,7 @@ class LangfuseAdapter(BaseAdapter):
355
355
 
356
356
  # If no results, possible due to indexing delay--remote rollout processor just finished pushing rows to Langfuse
357
357
  if traces and traces.meta and traces.meta.total_items == 0 and page == 1:
358
- raise Exception("Empty results - indexing delay")
358
+ raise Exception("Empty results")
359
359
 
360
360
  break
361
361
  except Exception as e:
@@ -6,10 +6,9 @@ used throughout the codebase, including index management, document operations,
6
6
  and search functionality.
7
7
  """
8
8
 
9
- import json
10
9
  import requests
11
10
  from typing import Any, Dict, List, Optional, Union
12
- from urllib.parse import urlparse
11
+ from eval_protocol.models import Status
13
12
  from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig
14
13
 
15
14
 
@@ -203,33 +202,39 @@ class ElasticsearchClient:
203
202
  except Exception:
204
203
  return None
205
204
 
206
- def search_by_term(self, field: str, value: Any, size: int = 10) -> Optional[Dict[str, Any]]:
205
+ def search_by_term(
206
+ self, field: str, value: Any, size: int = 10, sort: Optional[List[Dict[str, Any]]] = None
207
+ ) -> Optional[Dict[str, Any]]:
207
208
  """Search documents by exact term match.
208
209
 
209
210
  Args:
210
211
  field: Field name to search
211
212
  value: Value to match
212
213
  size: Number of results to return
214
+ sort: Sort specification
213
215
 
214
216
  Returns:
215
217
  Dict containing search results, or None if failed
216
218
  """
217
219
  query = {"term": {field: value}}
218
- return self.search(query, size=size)
220
+ return self.search(query, size=size, sort=sort)
219
221
 
220
- def search_by_match(self, field: str, value: str, size: int = 10) -> Optional[Dict[str, Any]]:
222
+ def search_by_match(
223
+ self, field: str, value: str, size: int = 10, sort: Optional[List[Dict[str, Any]]] = None
224
+ ) -> Optional[Dict[str, Any]]:
221
225
  """Search documents by text match.
222
226
 
223
227
  Args:
224
228
  field: Field name to search
225
229
  value: Text to match
226
230
  size: Number of results to return
231
+ sort: Sort specification (e.g., [{"@timestamp": {"order": "desc"}}])
227
232
 
228
233
  Returns:
229
234
  Dict containing search results, or None if failed
230
235
  """
231
236
  query = {"match": {field: value}}
232
- return self.search(query, size=size)
237
+ return self.search(query, size=size, sort=sort)
233
238
 
234
239
  def search_by_match_phrase_prefix(self, field: str, value: str, size: int = 10) -> Optional[Dict[str, Any]]:
235
240
  """Search documents by phrase prefix match.
@@ -257,6 +262,34 @@ class ElasticsearchClient:
257
262
  query = {"match_all": {}}
258
263
  return self.search(query, size=size)
259
264
 
265
+ def search_by_status_code_not_in(
266
+ self,
267
+ rollout_id: str,
268
+ excluded_codes: list[Status.Code],
269
+ size: int = 10,
270
+ ) -> Optional[Dict[str, Any]]:
271
+ """
272
+ Search documents where status_code does NOT match any of the provided status codes.
273
+
274
+ Args:
275
+ excluded_codes: List of status codes to exclude (i.e., find logs NOT having these codes)
276
+ size: Number of results to return
277
+ rollout_id: Optional rollout ID to filter by
278
+
279
+ Returns:
280
+ Dict containing search results, or None if failed
281
+ """
282
+ # Build the query with must_not for status code exclusion
283
+ bool_query: dict[str, list[dict[str, Any]]] = {
284
+ "must_not": [{"terms": {"status_code": [code.value for code in excluded_codes]}}]
285
+ }
286
+
287
+ # Add rollout_id filter and ensure status_code exists
288
+ bool_query["must"] = [{"term": {"rollout_id": rollout_id}}, {"exists": {"field": "status_code"}}]
289
+
290
+ query = {"bool": bool_query}
291
+ return self.search(query, size=size)
292
+
260
293
  # Health and Status Operations
261
294
 
262
295
  def health_check(self) -> bool:
@@ -1,28 +1,38 @@
1
- import json
2
1
  import logging
3
- import asyncio
4
2
  import os
5
- import threading
6
3
  from concurrent.futures import ThreadPoolExecutor
7
- from typing import Optional, Tuple, Any, Dict
4
+ from typing import Optional, Any, Dict
8
5
  from datetime import datetime
9
6
 
10
7
  from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig
11
8
  from .elasticsearch_client import ElasticsearchClient
12
9
 
10
+ import logging
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ # do not inherit root logger since we are a handler ourselves
15
+ logger.propagate = False
16
+
17
+ logger.addHandler(logging.StreamHandler())
18
+
19
+ if os.environ.get("EP_DEBUG") == "true":
20
+ logger.setLevel(logging.DEBUG)
21
+ logger.debug("EP_DEBUG=true detected, set log level to DEBUG")
22
+
13
23
 
14
24
  class ElasticsearchDirectHttpHandler(logging.Handler):
15
- def __init__(self, elasticsearch_config: ElasticsearchConfig) -> None:
25
+ def __init__(self, elasticsearch_config: ElasticsearchConfig | None = None) -> None:
16
26
  super().__init__()
17
- self.config = ElasticsearchConfig(
18
- url=elasticsearch_config.url,
19
- api_key=elasticsearch_config.api_key,
20
- index_name=elasticsearch_config.index_name,
21
- )
22
- self.client = ElasticsearchClient(self.config)
27
+ self.config = elasticsearch_config
28
+ self.client = ElasticsearchClient(self.config) if self.config else None
23
29
  self.formatter: logging.Formatter = logging.Formatter()
24
30
  self._executor = None
25
31
 
32
+ def configure(self, elasticsearch_config: ElasticsearchConfig) -> None:
33
+ self.config = elasticsearch_config
34
+ self.client = ElasticsearchClient(self.config)
35
+
26
36
  def emit(self, record: logging.LogRecord) -> None:
27
37
  """Emit a log record by scheduling it for async transmission."""
28
38
  try:
@@ -30,6 +40,12 @@ class ElasticsearchDirectHttpHandler(logging.Handler):
30
40
  timestamp = datetime.fromtimestamp(record.created).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
31
41
 
32
42
  rollout_id = self._get_rollout_id(record)
43
+ logger.debug(f"Emitting log record: {record.getMessage()} with rollout_id: {rollout_id}")
44
+ if not rollout_id:
45
+ logger.debug(
46
+ "No rollout_id provided in extra data for ElasticsearchDirectHttpHandler through EP_ROLLOUT_ID environment variable or rollout_id extra data. Skipping log record."
47
+ )
48
+ return
33
49
  status_info = self._get_status_info(record)
34
50
 
35
51
  data: Dict[str, Any] = {
@@ -50,7 +66,7 @@ class ElasticsearchDirectHttpHandler(logging.Handler):
50
66
  self.handleError(record)
51
67
  print(f"Error preparing log for Elasticsearch: {e}")
52
68
 
53
- def _get_rollout_id(self, record: logging.LogRecord) -> str:
69
+ def _get_rollout_id(self, record: logging.LogRecord) -> str | None:
54
70
  """Get the rollout ID from record extra data or environment variables."""
55
71
  # Check if rollout_id is provided in the extra data first
56
72
  if hasattr(record, "rollout_id") and record.rollout_id is not None: # type: ignore
@@ -58,10 +74,6 @@ class ElasticsearchDirectHttpHandler(logging.Handler):
58
74
 
59
75
  # Fall back to environment variable
60
76
  rollout_id = os.getenv("EP_ROLLOUT_ID")
61
- if rollout_id is None:
62
- raise ValueError(
63
- "EP_ROLLOUT_ID environment variable is not set and no rollout_id provided in extra data for ElasticsearchDirectHttpHandler"
64
- )
65
77
  return rollout_id
66
78
 
67
79
  def _get_status_info(self, record: logging.LogRecord) -> Optional[Dict[str, Any]]:
@@ -105,6 +117,9 @@ class ElasticsearchDirectHttpHandler(logging.Handler):
105
117
 
106
118
  def _send_to_elasticsearch(self, data: Dict[str, Any], record: logging.LogRecord) -> None:
107
119
  """Send data to Elasticsearch (runs in thread pool)."""
120
+ if not self.client:
121
+ logger.warning("No Elasticsearch client configured, skipping log record")
122
+ return
108
123
  try:
109
124
  success = self.client.index_document(data)
110
125
  if not success: