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