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.
- {eval_protocol-0.2.39/eval_protocol.egg-info → eval_protocol-0.2.41}/PKG-INFO +1 -1
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/__init__.py +6 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/_version.py +3 -3
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/__init__.py +5 -0
- eval_protocol-0.2.41/eval_protocol/adapters/fireworks_tracing.py +415 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/langfuse.py +1 -1
- {eval_protocol-0.2.39/eval_protocol/logging → eval_protocol-0.2.41/eval_protocol/log_utils}/elasticsearch_client.py +39 -6
- {eval_protocol-0.2.39/eval_protocol/logging → eval_protocol-0.2.41/eval_protocol/log_utils}/elasticsearch_direct_http_handler.py +31 -16
- eval_protocol-0.2.41/eval_protocol/log_utils/rollout_id_filter.py +28 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/frozen_lake/server.py +7 -2
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_mcp_gym_rollout_processor.py +7 -4
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/elasticsearch_setup.py +2 -2
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/remote_rollout_processor.py +118 -41
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/utils.py +16 -2
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/remote_rollout_processor.py +7 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/logs_server.py +22 -8
- {eval_protocol-0.2.39 → eval_protocol-0.2.41/eval_protocol.egg-info}/PKG-INFO +1 -1
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/SOURCES.txt +9 -6
- eval_protocol-0.2.41/vendor/tau2/user/__init__.py +0 -0
- eval_protocol-0.2.41/vite-app/dist/assets/index-D3tKqxWU.js +136 -0
- eval_protocol-0.2.41/vite-app/dist/assets/index-D3tKqxWU.js.map +1 -0
- eval_protocol-0.2.41/vite-app/dist/assets/index-DpYZaoAr.css +1 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vite-app/dist/index.html +2 -2
- eval_protocol-0.2.39/vite-app/dist/assets/index-C8woq7EO.js +0 -136
- eval_protocol-0.2.39/vite-app/dist/assets/index-C8woq7EO.js.map +0 -1
- eval_protocol-0.2.39/vite-app/dist/assets/index-CSKGq1w7.css +0 -1
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/LICENSE +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/README.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/normalize_sandbox_fusion.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/utils/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/utils/generate_api_key.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/development/utils/subprocess_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/__main__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/base.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/bigquery.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/braintrust.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/huggingface.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/langchain.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/langsmith.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/openai_responses.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/trl.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/adapters/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/models.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/orchestrator.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resource_abc.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resource_pool.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/gorilla_file_system.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/math_api.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_envs/posting_api.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/bfcl_sim_api_resource.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/docker_resource.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/filesystem_resource.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/python_state_resource.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/resources/sql_resource.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/task_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/agent/tool_registry.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/auth.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/data/airline_dataset.jsonl +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/data/retail_dataset.jsonl +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_aime25.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_frozen_lake.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_gpqa.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_livebench_data_analysis.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_tau_bench_airline.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/benchmarks/test_tau_bench_retail.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/agent_eval_cmd.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/common.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/deploy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/deploy_mcp.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/logs.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/preview.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/run_eval_cmd.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/cli_commands/upload.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/common_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/config.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/dynamic_data_loader.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/factory_data_loader.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/inline_data_loader.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/data_loader/models.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/dataset_logger.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/sqlite_dataset_logger_adapter.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/dataset_logger/sqlite_evaluation_row_store.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/datasets/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/datasets/loader.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/directory_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/evaluation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/event_bus.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/logger.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/sqlite_event_bus.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/event_bus/sqlite_event_bus_database.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/execution/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/execution/pipeline.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/gcp_tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generation/cache.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generation/clients/base.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generation/clients.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/generic_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/get_pep440_version.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/human_id/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/human_id/dictionary.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/deepeval.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/openeval.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/integrations/trl.py +0 -0
- {eval_protocol-0.2.39/eval_protocol/mcp_servers → eval_protocol-0.2.41/eval_protocol/log_utils}/__init__.py +0 -0
- {eval_protocol-0.2.39/eval_protocol/logging → eval_protocol-0.2.41/eval_protocol/log_utils}/elasticsearch_index_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/logging_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/adapter.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/client/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/client/connection.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/clients.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/base_policy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/execution/policy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/grid_renderer.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/mcp_multi_client.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/mcpgym.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/process_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/session/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/session/manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/simple_process_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp/simulation_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/config.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/main.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/base_client.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/local_docker_client.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_agent/orchestration/stdio_mcp_client_helper.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_env.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/agent → eval_protocol-0.2.41/eval_protocol/mcp_servers}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/frozen_lake/frozen_lake_adapter.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/frozen_lake/frozen_lake_mcp.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/README.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/airplane_environment/airline_environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/mock_environment/mock_environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/retail_environment/retail_environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tau2_mcp.py +0 -0
- {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
- {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
- {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
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/mcp_servers/tau2/tests/test_tau2_e2e.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/models.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/packaging.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/platform_api.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/playback_policy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_agent_rollout_processor.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_dataset_adapter.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_langchain_rollout_processor.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_no_op_rollout_processor.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/default_single_turn_rollout_process.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/dual_mode_wrapper.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/evaluation_test.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/evaluation_test_postprocess.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/exception_config.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/execution.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/generate_parameter_combinations.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/handle_persist_flow.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/parameterize.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/plugin.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/rollout_processor.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/store_experiment_link.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/store_results_url.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/types.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/pytest/validate_signature.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_braintrust.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_langfuse.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_langsmith.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/llm_judge_openai_responses.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/quickstart/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/resources.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/reward_function.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/accuracy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/accuracy_length.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/apps_coding_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/apps_execution_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/apps_testing_util.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/bfcl_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/code_execution.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/code_execution_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/cpp_code.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/deepcoder_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/format.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/function_calling.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/json_schema.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/language_consistency.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/lean_prover.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/length.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/list_comparison_math_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/math.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/multiple_choice_math_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/reasoning_steps.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/repetition.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rewards/tag_count.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/rl_processing.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/stats/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/stats/confidence_intervals.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/typed_interface.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/errors.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/types/types.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/batch_evaluation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/batch_transformation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/check_server_status.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/dataset_helpers.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/logs_models.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/module_loader.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/packaging_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/show_results_url.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/static_policy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/subprocess_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol/utils/vite_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/dependency_links.txt +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/entry_points.txt +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/requires.txt +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/eval_protocol.egg-info/top_level.txt +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/pyproject.toml +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/setup.cfg +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/setup.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_accuracy.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_accuracy_length.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_adapters_e2e.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_agent_orchestrator.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_agent_resources.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_auth.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_batch_evaluation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cli.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cli_agent.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cli_args.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_code_execution.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_config.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_control_plane_separation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_cpp_code.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_data_driven_task_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_deepcoder_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_deepeval_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_deploy_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_e2b_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_e2b_js_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_edge_cases.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_eval_protocol_import.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation_postprocess.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_evaluation_preview_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_event_bus.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_examples_end_to_end.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_fireworks_api.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_format.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_fractional_code.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_function_calling.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_gcp_tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_generic_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_human_id.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_json_schema.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_kwargs_validation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_language_consistency.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_lean_prover.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_lean_prover_runner.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_length.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_list_comparison_math_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_logs_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_logs_server_simple.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_math.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_minimal.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_models.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_models_rl.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_multiple_choice_math_reward.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_n_variant_batch_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_n_variant_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_openai_compatibility.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_openeval_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_packaging.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_parallel_rollouts.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_platform_api.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_quickstart_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_readiness.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_reasoning_steps.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_repetition.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_repetition_debug.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_retry_mechanism.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_reward_function.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_reward_protocol_import.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_rl_processing.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_rollout_control_plane_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_show_results_url.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_status_migration_changes.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_status_migration_integration.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_status_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_tag_count.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_tau_bench_airline_smoke.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_typed_interface.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_typed_interface_rl.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_url_handling.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/tests/test_vite_server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/__init__.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/data_model → eval_protocol-0.2.41/vendor/tau2/agent}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/agent/base.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/agent/llm_agent.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/api_config.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/data_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/api_service/simulation_service.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/cli.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/config.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/airline/policy.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/mock/policy.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/mock/policy_solo.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/retail/policy.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/main_policy.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/main_policy_solo.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/tech_support_manual.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/tech_support_workflow.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/domains/telecom/tech_support_workflow_solo.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/user_simulator/simulation_guidelines.md +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data/user_simulator/simulation_guidelines_tools.md +0 -0
- {eval_protocol-0.2.39/vendor/tau2/domains → eval_protocol-0.2.41/vendor/tau2/data_model}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data_model/message.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data_model/simulation.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/data_model/tasks.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/domains/telecom/tasks → eval_protocol-0.2.41/vendor/tau2/domains}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/data_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/airline/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/data_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/mock/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/data_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/retail/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/data_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/environment.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/environment → eval_protocol-0.2.41/vendor/tau2/domains/telecom/tasks}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/const.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/create_tasks.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/mms_issues.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/mobile_data_issues.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/service_issues.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tasks/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/user_data_model.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/user_tools.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/domains/telecom/utils.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/evaluator → eval_protocol-0.2.41/vendor/tau2/environment}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/db.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/environment.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/server.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/tool.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/toolkit.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/environment/utils/interface_agent.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/metrics → eval_protocol-0.2.41/vendor/tau2/evaluator}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_action.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_base.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_communicate.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_env.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/evaluator/evaluator_nl_assertions.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/orchestrator → eval_protocol-0.2.41/vendor/tau2/metrics}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/metrics/agent_metrics.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/metrics/break_down_metrics.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/scripts → eval_protocol-0.2.41/vendor/tau2/orchestrator}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/orchestrator/environment_manager.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/orchestrator/orchestrator.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/orchestrator/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/registry.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/run.py +0 -0
- {eval_protocol-0.2.39/vendor/tau2/user → eval_protocol-0.2.41/vendor/tau2/scripts}/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/check_data.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/show_domain_doc.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/start_servers.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/scripts/view_simulations.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/user/base.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/user/user_simulator.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/__init__.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/display.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/io_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/llm_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/pydantic_utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vendor/tau2/utils/utils.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/versioneer.py +0 -0
- {eval_protocol-0.2.39 → eval_protocol-0.2.41}/vite-app/dist/assets/favicon-BkAAWQga.png +0 -0
- {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.
|
|
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-
|
|
11
|
+
"date": "2025-10-07T15:43:37-0700",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "0.2.
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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,
|
|
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 =
|
|
18
|
-
|
|
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:
|