eval-protocol 0.2.46.dev2__tar.gz → 0.2.47__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.46.dev2/eval_protocol.egg-info → eval_protocol-0.2.47}/PKG-INFO +1 -1
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/__init__.py +3 -10
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/_version.py +3 -3
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/fireworks_tracing.py +2 -4
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/openai_responses.py +29 -1
- eval_protocol-0.2.47/eval_protocol/log_utils/fireworks_tracing_http_handler.py +63 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/evaluation_test.py +22 -1
- eval_protocol-0.2.47/eval_protocol/utils/browser_utils.py +114 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/logs_server.py +9 -1
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47/eval_protocol.egg-info}/PKG-INFO +1 -1
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol.egg-info/SOURCES.txt +5 -12
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_show_results_url.py +141 -0
- eval_protocol-0.2.47/vite-app/dist/assets/index-34WaHH5W.css +1 -0
- eval_protocol-0.2.46.dev2/vite-app/dist/assets/index-C81y9r9l.js → eval_protocol-0.2.47/vite-app/dist/assets/index-DOPsfOMT.js +4 -4
- eval_protocol-0.2.46.dev2/vite-app/dist/assets/index-C81y9r9l.js.map → eval_protocol-0.2.47/vite-app/dist/assets/index-DOPsfOMT.js.map +1 -1
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vite-app/dist/index.html +2 -2
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/__init__.py +0 -17
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/__init__.py +0 -12
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/app.py +0 -284
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/auth.py +0 -18
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/langfuse.py +0 -368
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/litellm.py +0 -171
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/main.py +0 -10
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/models.py +0 -92
- eval_protocol-0.2.46.dev2/eval_protocol/proxy/proxy_core/redis_utils.py +0 -48
- eval_protocol-0.2.46.dev2/vite-app/dist/assets/index-DpYZaoAr.css +0 -1
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/LICENSE +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/README.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/development/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/development/normalize_sandbox_fusion.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/development/utils/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/development/utils/generate_api_key.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/development/utils/subprocess_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/__main__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/base.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/bigquery.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/braintrust.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/huggingface.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/langchain.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/langfuse.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/langsmith.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/trl.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/weave.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/models.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/orchestrator.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resource_abc.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resource_pool.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/bfcl_envs/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/bfcl_envs/gorilla_file_system.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/bfcl_envs/math_api.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/bfcl_envs/posting_api.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/bfcl_sim_api_resource.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/docker_resource.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/filesystem_resource.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/python_state_resource.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/resources/sql_resource.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/task_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/agent/tool_registry.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/auth.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/data/airline_dataset.jsonl +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/data/retail_dataset.jsonl +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/test_aime25.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/test_frozen_lake.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/test_gpqa.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/test_livebench_data_analysis.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/test_tau_bench_airline.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/benchmarks/test_tau_bench_retail.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/agent_eval_cmd.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/common.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/deploy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/deploy_mcp.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/logs.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/preview.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/run_eval_cmd.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/cli_commands/upload.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/common_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/config.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/data_loader/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/data_loader/dynamic_data_loader.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/data_loader/factory_data_loader.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/data_loader/inline_data_loader.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/data_loader/models.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/dataset_logger/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/dataset_logger/dataset_logger.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/dataset_logger/local_fs_dataset_logger_adapter.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/dataset_logger/sqlite_dataset_logger_adapter.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/dataset_logger/sqlite_evaluation_row_store.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/datasets/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/datasets/loader.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/directory_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/evaluation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/event_bus/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/event_bus/event_bus.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/event_bus/logger.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/event_bus/sqlite_event_bus.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/event_bus/sqlite_event_bus_database.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/execution/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/execution/pipeline.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/gcp_tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/generation/cache.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/generation/clients/base.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/generation/clients.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/generic_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/get_pep440_version.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/human_id/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/human_id/dictionary.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/integrations/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/integrations/deepeval.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/integrations/openeval.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/integrations/trl.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/log_utils/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/log_utils/elasticsearch_client.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/log_utils/elasticsearch_direct_http_handler.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/log_utils/elasticsearch_index_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/log_utils/rollout_id_filter.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/log_utils/util.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/logging_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/adapter.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/client/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/client/connection.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/clients.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/execution/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/execution/base_policy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/execution/manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/execution/policy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/grid_renderer.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/mcp_multi_client.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/mcpgym.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/process_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/session/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/session/manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/simple_process_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp/simulation_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/config.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/main.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/orchestration/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/orchestration/base_client.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/orchestration/local_docker_client.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_agent/orchestration/stdio_mcp_client_helper.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_env.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/frozen_lake/frozen_lake_adapter.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/frozen_lake/frozen_lake_mcp.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/frozen_lake/server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/README.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/airplane_environment/airline_environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/mock_environment/mock_environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/retail_environment/retail_environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/tau2_mcp.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/tests/system_prompts/airline_agent_system_prompt.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/tests/system_prompts/mock_agent_system_prompt.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/tests/system_prompts/retail_agent_system_prompt.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/mcp_servers/tau2/tests/test_tau2_e2e.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/models.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/packaging.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/platform_api.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/playback_policy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_agent_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_dataset_adapter.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_langchain_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_mcp_gym_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_no_op_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_pydantic_ai_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/default_single_turn_rollout_process.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/dual_mode_wrapper.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/elasticsearch_setup.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/evaluation_test_postprocess.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/exception_config.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/execution.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/generate_parameter_combinations.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/handle_persist_flow.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/parameterize.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/plugin.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/remote_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/store_experiment_link.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/store_results_url.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/types.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/pytest/validate_signature.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/llm_judge.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/llm_judge_braintrust.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/llm_judge_langfuse.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/llm_judge_langsmith.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/llm_judge_openai_responses.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/quickstart/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/resources.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/reward_function.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/accuracy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/accuracy_length.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/apps_coding_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/apps_execution_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/apps_testing_util.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/bfcl_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/code_execution.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/code_execution_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/cpp_code.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/deepcoder_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/format.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/function_calling.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/json_schema.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/language_consistency.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/lean_prover.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/length.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/list_comparison_math_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/math.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/multiple_choice_math_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/reasoning_steps.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/repetition.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rewards/tag_count.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/rl_processing.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/stats/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/stats/confidence_intervals.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/typed_interface.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/types/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/types/errors.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/types/remote_rollout_processor.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/types/types.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/batch_evaluation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/batch_transformation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/check_server_status.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/dataset_helpers.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/logs_models.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/module_loader.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/packaging_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/show_results_url.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/static_policy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/subprocess_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/utils/vite_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol.egg-info/dependency_links.txt +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol.egg-info/entry_points.txt +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol.egg-info/requires.txt +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol.egg-info/top_level.txt +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/pyproject.toml +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/setup.cfg +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/setup.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_accuracy.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_accuracy_length.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_adapters_e2e.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_agent_orchestrator.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_agent_resources.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_auth.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_batch_evaluation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_cli.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_cli_agent.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_cli_args.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_code_execution.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_config.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_control_plane_separation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_cpp_code.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_data_driven_task_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_deepcoder_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_deepeval_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_deploy_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_directory_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_e2b_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_e2b_js_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_edge_cases.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_eval_protocol_import.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_evaluation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_evaluation_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_evaluation_postprocess.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_evaluation_preview_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_event_bus.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_event_bus_helper.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_examples_end_to_end.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_fireworks_api.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_format.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_fractional_code.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_function_calling.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_gcp_tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_generic_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_human_id.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_json_schema.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_kwargs_validation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_language_consistency.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_lean_prover.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_lean_prover_runner.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_length.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_list_comparison_math_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_logs_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_logs_server_simple.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_math.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_minimal.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_models.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_models_rl.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_multiple_choice_math_reward.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_n_variant_batch_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_n_variant_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_openai_compatibility.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_openeval_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_packaging.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_parallel_rollouts.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_platform_api.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_quickstart_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_readiness.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_reasoning_steps.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_repetition.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_repetition_debug.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_retry_mechanism.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_reward_function.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_reward_protocol_import.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_rl_processing.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_rollout_control_plane_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_status_migration_changes.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_status_migration_integration.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_status_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_tag_count.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_tau_bench_airline_smoke.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_typed_interface.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_typed_interface_rl.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_upload_entrypoint.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_url_handling.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/tests/test_vite_server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/agent/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/agent/base.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/agent/llm_agent.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/api_service/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/api_service/api_config.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/api_service/data_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/api_service/simulation_service.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/cli.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/config.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/airline/policy.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/mock/policy.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/mock/policy_solo.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/retail/policy.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/telecom/main_policy.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/telecom/main_policy_solo.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/telecom/tech_support_manual.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/telecom/tech_support_workflow.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/domains/telecom/tech_support_workflow_solo.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/user_simulator/simulation_guidelines.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data/user_simulator/simulation_guidelines_tools.md +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data_model/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data_model/message.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data_model/simulation.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/data_model/tasks.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/airline/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/airline/data_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/airline/environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/airline/tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/airline/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/mock/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/mock/data_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/mock/environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/mock/tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/mock/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/retail/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/retail/data_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/retail/environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/retail/tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/retail/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/data_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/const.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/create_tasks.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/mms_issues.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/mobile_data_issues.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/service_issues.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tasks/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/user_data_model.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/user_tools.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/domains/telecom/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/db.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/environment.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/server.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/tool.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/toolkit.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/environment/utils/interface_agent.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/evaluator.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/evaluator_action.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/evaluator_base.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/evaluator_communicate.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/evaluator_env.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/evaluator/evaluator_nl_assertions.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/metrics/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/metrics/agent_metrics.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/metrics/break_down_metrics.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/orchestrator/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/orchestrator/environment_manager.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/orchestrator/orchestrator.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/orchestrator/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/registry.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/run.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/scripts/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/scripts/check_data.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/scripts/show_domain_doc.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/scripts/start_servers.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/scripts/view_simulations.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/user/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/user/base.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/user/user_simulator.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/utils/__init__.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/utils/display.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/utils/io_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/utils/llm_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/utils/pydantic_utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vendor/tau2/utils/utils.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/versioneer.py +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/vite-app/dist/assets/favicon-BkAAWQga.png +0 -0
- {eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/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.47
|
|
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
|
|
@@ -35,6 +35,8 @@ from .pytest.parameterize import DefaultParameterIdGenerator
|
|
|
35
35
|
from .log_utils.elasticsearch_direct_http_handler import ElasticsearchDirectHttpHandler
|
|
36
36
|
from .log_utils.rollout_id_filter import RolloutIdFilter
|
|
37
37
|
from .log_utils.util import setup_rollout_logging_for_elasticsearch_handler
|
|
38
|
+
from .log_utils.fireworks_tracing_http_handler import FireworksTracingHttpHandler
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
from .types.remote_rollout_processor import (
|
|
40
42
|
InitRequest,
|
|
@@ -70,13 +72,6 @@ try:
|
|
|
70
72
|
except ImportError:
|
|
71
73
|
WeaveAdapter = None
|
|
72
74
|
|
|
73
|
-
try:
|
|
74
|
-
from .proxy import create_app, AuthProvider
|
|
75
|
-
except ImportError:
|
|
76
|
-
create_app = None
|
|
77
|
-
AuthProvider = None
|
|
78
|
-
|
|
79
|
-
|
|
80
75
|
warnings.filterwarnings("default", category=DeprecationWarning, module="eval_protocol")
|
|
81
76
|
|
|
82
77
|
__all__ = [
|
|
@@ -102,6 +97,7 @@ __all__ = [
|
|
|
102
97
|
"BraintrustAdapter",
|
|
103
98
|
"create_braintrust_adapter",
|
|
104
99
|
"LangSmithAdapter",
|
|
100
|
+
"FireworksTracingHttpHandler",
|
|
105
101
|
# Core interfaces
|
|
106
102
|
"Message",
|
|
107
103
|
"MetricResult",
|
|
@@ -137,9 +133,6 @@ __all__ = [
|
|
|
137
133
|
"RolloutMetadata",
|
|
138
134
|
"StatusResponse",
|
|
139
135
|
"create_langfuse_config_tags",
|
|
140
|
-
# Proxy
|
|
141
|
-
"create_app",
|
|
142
|
-
"AuthProvider",
|
|
143
136
|
]
|
|
144
137
|
|
|
145
138
|
from . import _version
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-10-
|
|
11
|
+
"date": "2025-10-10T09:10:53-0700",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "0.2.
|
|
14
|
+
"full-revisionid": "747a88a812acd7ee7f3a2b4067d0a60ccb26ad03",
|
|
15
|
+
"version": "0.2.47"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
{eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/fireworks_tracing.py
RENAMED
|
@@ -7,9 +7,9 @@ to pull data from Langfuse deployments with simplified retry logic handling.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
import logging
|
|
9
9
|
import requests
|
|
10
|
+
import time
|
|
10
11
|
from datetime import datetime
|
|
11
12
|
from typing import Any, Dict, List, Optional, Protocol
|
|
12
|
-
import os
|
|
13
13
|
|
|
14
14
|
from eval_protocol.models import EvaluationRow, InputMetadata, ExecutionMetadata, Message
|
|
15
15
|
from .base import BaseAdapter
|
|
@@ -349,11 +349,9 @@ class FireworksTracingAdapter(BaseAdapter):
|
|
|
349
349
|
else:
|
|
350
350
|
url = f"{self.base_url}/v1/traces"
|
|
351
351
|
|
|
352
|
-
headers = {"Authorization": f"Bearer {os.environ.get('FIREWORKS_API_KEY')}"}
|
|
353
|
-
|
|
354
352
|
result = None
|
|
355
353
|
try:
|
|
356
|
-
response = requests.get(url, params=params, timeout=self.timeout
|
|
354
|
+
response = requests.get(url, params=params, timeout=self.timeout)
|
|
357
355
|
response.raise_for_status()
|
|
358
356
|
result = response.json()
|
|
359
357
|
except requests.exceptions.HTTPError as e:
|
{eval_protocol-0.2.46.dev2 → eval_protocol-0.2.47}/eval_protocol/adapters/openai_responses.py
RENAMED
|
@@ -169,7 +169,9 @@ class OpenAIResponsesAdapter(BaseAdapter):
|
|
|
169
169
|
raise NotImplementedError(f"Unsupported content type: {content_item.type}")
|
|
170
170
|
elif item.type == "function_call_output":
|
|
171
171
|
# Collect tool call outputs to add before assistant message
|
|
172
|
-
tool_call_outputs.append(
|
|
172
|
+
tool_call_outputs.append(
|
|
173
|
+
Message(role="tool", content=self._coerce_tool_output(item.output), tool_call_id=item.call_id)
|
|
174
|
+
)
|
|
173
175
|
elif item.type == "function_call":
|
|
174
176
|
tool_call = ChatCompletionMessageToolCall(
|
|
175
177
|
id=item.call_id, type="function", function=Function(name=item.name, arguments=item.arguments)
|
|
@@ -186,3 +188,29 @@ class OpenAIResponsesAdapter(BaseAdapter):
|
|
|
186
188
|
messages.append(Message(role="assistant", tool_calls=current_tool_calls))
|
|
187
189
|
|
|
188
190
|
return reversed(messages)
|
|
191
|
+
|
|
192
|
+
def _coerce_tool_output(self, output: Any) -> str:
|
|
193
|
+
"""Coerce OpenAI Responses tool output into a string for Message.content.
|
|
194
|
+
|
|
195
|
+
The Responses API may return structured content lists. For our purposes,
|
|
196
|
+
we stringify non-string outputs to satisfy the Message.content type.
|
|
197
|
+
"""
|
|
198
|
+
if isinstance(output, str):
|
|
199
|
+
return output
|
|
200
|
+
try:
|
|
201
|
+
# Attempt to join list of objects with any 'text' fields
|
|
202
|
+
if isinstance(output, list):
|
|
203
|
+
parts: list[str] = []
|
|
204
|
+
for part in output:
|
|
205
|
+
text = None
|
|
206
|
+
if isinstance(part, dict):
|
|
207
|
+
text = part.get("text")
|
|
208
|
+
if text:
|
|
209
|
+
parts.append(str(text))
|
|
210
|
+
else:
|
|
211
|
+
parts.append(str(part))
|
|
212
|
+
return "\n".join(parts)
|
|
213
|
+
# Fallback to string conversion
|
|
214
|
+
return str(output)
|
|
215
|
+
except Exception:
|
|
216
|
+
return str(output)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import threading
|
|
4
|
+
from datetime import datetime, timezone
|
|
5
|
+
from typing import Optional, Any, Dict, List, cast
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FireworksTracingHttpHandler(logging.Handler):
|
|
11
|
+
"""Logging handler that posts structured logs to tracing.fireworks gateway /logs endpoint."""
|
|
12
|
+
|
|
13
|
+
def __init__(self, gateway_base_url: Optional[str] = None, rollout_id_env: str = "EP_ROLLOUT_ID") -> None:
|
|
14
|
+
super().__init__()
|
|
15
|
+
self.gateway_base_url = gateway_base_url or os.getenv("FW_TRACING_GATEWAY_BASE_URL")
|
|
16
|
+
self.rollout_id_env = rollout_id_env
|
|
17
|
+
self._session = requests.Session()
|
|
18
|
+
self._lock = threading.Lock()
|
|
19
|
+
|
|
20
|
+
def emit(self, record: logging.LogRecord) -> None:
|
|
21
|
+
try:
|
|
22
|
+
if not self.gateway_base_url:
|
|
23
|
+
return
|
|
24
|
+
rollout_id = self._get_rollout_id(record)
|
|
25
|
+
if not rollout_id:
|
|
26
|
+
return
|
|
27
|
+
payload = self._build_payload(record, rollout_id)
|
|
28
|
+
url = f"{self.gateway_base_url.rstrip('/')}/logs"
|
|
29
|
+
with self._lock:
|
|
30
|
+
self._session.post(url, json=payload, timeout=5)
|
|
31
|
+
except Exception:
|
|
32
|
+
# Avoid raising exceptions from logging
|
|
33
|
+
self.handleError(record)
|
|
34
|
+
|
|
35
|
+
def _get_rollout_id(self, record: logging.LogRecord) -> Optional[str]:
|
|
36
|
+
if hasattr(record, "rollout_id") and cast(Any, getattr(record, "rollout_id")) is not None:
|
|
37
|
+
return str(cast(Any, getattr(record, "rollout_id")))
|
|
38
|
+
return os.getenv(self.rollout_id_env)
|
|
39
|
+
|
|
40
|
+
def _build_payload(self, record: logging.LogRecord, rollout_id: str) -> Dict[str, Any]:
|
|
41
|
+
timestamp = datetime.fromtimestamp(record.created, tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
|
|
42
|
+
message = record.getMessage()
|
|
43
|
+
tags: List[str] = [f"rollout_id:{rollout_id}"]
|
|
44
|
+
# Optional additional tags
|
|
45
|
+
if hasattr(record, "experiment_id") and cast(Any, getattr(record, "experiment_id")):
|
|
46
|
+
tags.append(f"experiment_id:{cast(Any, getattr(record, 'experiment_id'))}")
|
|
47
|
+
if hasattr(record, "run_id") and cast(Any, getattr(record, "run_id")):
|
|
48
|
+
tags.append(f"run_id:{cast(Any, getattr(record, 'run_id'))}")
|
|
49
|
+
program = cast(Optional[str], getattr(record, "program", None)) or "eval_protocol"
|
|
50
|
+
status_val = cast(Any, getattr(record, "status", None))
|
|
51
|
+
status = status_val if isinstance(status_val, str) else None
|
|
52
|
+
return {
|
|
53
|
+
"program": program,
|
|
54
|
+
"status": status,
|
|
55
|
+
"message": message,
|
|
56
|
+
"tags": tags,
|
|
57
|
+
"metadata": cast(Any, getattr(record, "metadata", None)),
|
|
58
|
+
"extras": {
|
|
59
|
+
"logger_name": record.name,
|
|
60
|
+
"level": record.levelname,
|
|
61
|
+
"timestamp": timestamp,
|
|
62
|
+
},
|
|
63
|
+
}
|
|
@@ -62,7 +62,8 @@ from eval_protocol.pytest.utils import (
|
|
|
62
62
|
run_tasks_with_eval_progress,
|
|
63
63
|
run_tasks_with_run_progress,
|
|
64
64
|
)
|
|
65
|
-
from eval_protocol.utils.show_results_url import store_local_ui_results_url
|
|
65
|
+
from eval_protocol.utils.show_results_url import store_local_ui_results_url, generate_invocation_filter_url
|
|
66
|
+
from eval_protocol.utils.browser_utils import is_logs_server_running, open_browser_tab
|
|
66
67
|
|
|
67
68
|
from ..common_utils import load_jsonl
|
|
68
69
|
|
|
@@ -80,6 +81,7 @@ def evaluation_test(
|
|
|
80
81
|
rollout_processor_kwargs: RolloutProcessorInputParam | None = None,
|
|
81
82
|
aggregation_method: AggregationMethod = "mean",
|
|
82
83
|
passed_threshold: EvaluationThreshold | float | EvaluationThresholdDict | None = None,
|
|
84
|
+
disable_browser_open: bool = False,
|
|
83
85
|
num_runs: int = 1,
|
|
84
86
|
filtered_row_ids: Sequence[str] | None = None,
|
|
85
87
|
max_dataset_rows: int | None = None,
|
|
@@ -246,10 +248,29 @@ def evaluation_test(
|
|
|
246
248
|
else:
|
|
247
249
|
invocation_id = generate_id()
|
|
248
250
|
|
|
251
|
+
# Track whether we've opened browser for this invocation
|
|
252
|
+
browser_opened_for_invocation = False
|
|
253
|
+
|
|
249
254
|
async def wrapper_body(**kwargs: Unpack[ParameterizedTestKwargs]) -> None:
|
|
255
|
+
nonlocal browser_opened_for_invocation
|
|
256
|
+
|
|
250
257
|
# Store URL for viewing results (after all postprocessing is complete)
|
|
251
258
|
store_local_ui_results_url(invocation_id)
|
|
252
259
|
|
|
260
|
+
# Auto-open browser if server is running and not disabled (only once per invocation)
|
|
261
|
+
if (
|
|
262
|
+
not browser_opened_for_invocation
|
|
263
|
+
and not disable_browser_open
|
|
264
|
+
and os.environ.get("EP_DISABLE_AUTO_BROWSER") is None
|
|
265
|
+
):
|
|
266
|
+
is_running, port = is_logs_server_running()
|
|
267
|
+
if is_running:
|
|
268
|
+
# Generate URL for table view with invocation filter
|
|
269
|
+
base_url = f"http://localhost:{port}" if port else "http://localhost:8000"
|
|
270
|
+
table_url = generate_invocation_filter_url(invocation_id, f"{base_url}/table")
|
|
271
|
+
open_browser_tab(table_url)
|
|
272
|
+
browser_opened_for_invocation = True
|
|
273
|
+
|
|
253
274
|
eval_metadata = None
|
|
254
275
|
|
|
255
276
|
all_results: list[list[EvaluationRow]] = [[] for _ in range(num_runs)]
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Browser utilities for auto-opening evaluation results in the local UI.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
import threading
|
|
8
|
+
import time
|
|
9
|
+
import webbrowser
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Tuple, Optional
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import psutil
|
|
15
|
+
|
|
16
|
+
PSUTIL_AVAILABLE = True
|
|
17
|
+
except ImportError:
|
|
18
|
+
PSUTIL_AVAILABLE = False
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _get_pid_file_path() -> Path:
|
|
22
|
+
"""Get the path to the logs server PID file."""
|
|
23
|
+
from eval_protocol.directory_utils import find_eval_protocol_dir
|
|
24
|
+
|
|
25
|
+
return Path(find_eval_protocol_dir()) / "logs_server.pid"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def write_pid_file(pid: int, port: int) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Write the server PID and port to a file for external processes to check.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
pid: The process ID of the logs server
|
|
34
|
+
port: The port the server is running on
|
|
35
|
+
"""
|
|
36
|
+
try:
|
|
37
|
+
pid_file = _get_pid_file_path()
|
|
38
|
+
|
|
39
|
+
data = {"pid": pid, "port": port}
|
|
40
|
+
|
|
41
|
+
with open(pid_file, "w") as f:
|
|
42
|
+
json.dump(data, f)
|
|
43
|
+
|
|
44
|
+
# Use print instead of logger to avoid circular imports
|
|
45
|
+
print(f"Wrote PID file: {pid_file} with PID {pid} and port {port}")
|
|
46
|
+
except Exception as e:
|
|
47
|
+
print(f"Warning: Failed to write PID file: {e}")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def is_logs_server_running() -> Tuple[bool, Optional[int]]:
|
|
51
|
+
"""
|
|
52
|
+
Check if the logs server is running by reading the PID file and verifying the process.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Tuple of (is_running, port) where:
|
|
56
|
+
- is_running: True if server is running, False otherwise
|
|
57
|
+
- port: The port the server is running on, or None if not running
|
|
58
|
+
"""
|
|
59
|
+
if not PSUTIL_AVAILABLE:
|
|
60
|
+
return False, None
|
|
61
|
+
|
|
62
|
+
pid_file = _get_pid_file_path()
|
|
63
|
+
if not pid_file.exists():
|
|
64
|
+
return False, None
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
with open(pid_file, "r") as f:
|
|
68
|
+
data = json.load(f)
|
|
69
|
+
pid = data.get("pid")
|
|
70
|
+
port = data.get("port")
|
|
71
|
+
except (json.JSONDecodeError, KeyError, FileNotFoundError):
|
|
72
|
+
return False, None
|
|
73
|
+
|
|
74
|
+
if pid is None:
|
|
75
|
+
return False, None
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
# Check if the process is still running
|
|
79
|
+
process = psutil.Process(pid)
|
|
80
|
+
if not process.is_running():
|
|
81
|
+
return False, None
|
|
82
|
+
|
|
83
|
+
# Optionally verify it's listening on the expected port
|
|
84
|
+
if port is not None:
|
|
85
|
+
try:
|
|
86
|
+
connections = process.net_connections()
|
|
87
|
+
for conn in connections:
|
|
88
|
+
if conn.laddr.port == port and conn.status == "LISTEN":
|
|
89
|
+
return True, port
|
|
90
|
+
except (psutil.AccessDenied, psutil.NoSuchProcess):
|
|
91
|
+
# If we can't check connections, assume it's running if process exists
|
|
92
|
+
pass
|
|
93
|
+
|
|
94
|
+
return True, port
|
|
95
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
96
|
+
return False, None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def open_browser_tab(url: str, delay: float = 0.5) -> None:
|
|
100
|
+
"""
|
|
101
|
+
Open a URL in a new browser tab with an optional delay.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
url: The URL to open
|
|
105
|
+
delay: Delay in seconds before opening browser (default: 0.5)
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
def _open():
|
|
109
|
+
time.sleep(delay) # Give the server time to start
|
|
110
|
+
webbrowser.open_new_tab(url)
|
|
111
|
+
|
|
112
|
+
thread = threading.Thread(target=_open)
|
|
113
|
+
thread.daemon = True
|
|
114
|
+
thread.start()
|
|
@@ -6,6 +6,7 @@ import threading
|
|
|
6
6
|
import time
|
|
7
7
|
from datetime import datetime
|
|
8
8
|
from contextlib import asynccontextmanager
|
|
9
|
+
from pathlib import Path
|
|
9
10
|
from queue import Queue
|
|
10
11
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
|
11
12
|
|
|
@@ -23,6 +24,7 @@ from eval_protocol.utils.vite_server import ViteServer
|
|
|
23
24
|
from eval_protocol.log_utils.elasticsearch_client import ElasticsearchClient
|
|
24
25
|
from eval_protocol.types.remote_rollout_processor import ElasticsearchConfig
|
|
25
26
|
from eval_protocol.utils.logs_models import LogEntry, LogsResponse
|
|
27
|
+
from eval_protocol.utils.browser_utils import write_pid_file
|
|
26
28
|
|
|
27
29
|
if TYPE_CHECKING:
|
|
28
30
|
from eval_protocol.models import EvaluationRow
|
|
@@ -378,7 +380,7 @@ class LogsServer(ViteServer):
|
|
|
378
380
|
event_bus.subscribe(self._handle_event)
|
|
379
381
|
logger.debug("[LOGS_SERVER_INIT] Successfully subscribed to event bus")
|
|
380
382
|
|
|
381
|
-
logger.info(f"[LOGS_SERVER_INIT] LogsServer initialized on {host}:{port}")
|
|
383
|
+
logger.info(f"[LOGS_SERVER_INIT] LogsServer initialized on {self.host}:{self.port}")
|
|
382
384
|
|
|
383
385
|
def _setup_websocket_routes(self):
|
|
384
386
|
"""Set up WebSocket routes for real-time communication."""
|
|
@@ -541,6 +543,12 @@ class LogsServer(ViteServer):
|
|
|
541
543
|
)
|
|
542
544
|
|
|
543
545
|
server = uvicorn.Server(config)
|
|
546
|
+
|
|
547
|
+
# Write PID file after server is configured but before serving
|
|
548
|
+
logger.debug(f"[LOGS_SERVER_RUN_ASYNC] Writing PID file for port {self.port}")
|
|
549
|
+
write_pid_file(os.getpid(), self.port)
|
|
550
|
+
logger.debug(f"[LOGS_SERVER_RUN_ASYNC] Successfully wrote PID file for port {self.port}")
|
|
551
|
+
|
|
544
552
|
await server.serve()
|
|
545
553
|
|
|
546
554
|
except KeyboardInterrupt:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eval-protocol
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.47
|
|
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
|
|
@@ -40,9 +40,9 @@ eval_protocol.egg-info/requires.txt
|
|
|
40
40
|
eval_protocol.egg-info/top_level.txt
|
|
41
41
|
eval_protocol/../vite-app/dist/index.html
|
|
42
42
|
eval_protocol/../vite-app/dist/assets/favicon-BkAAWQga.png
|
|
43
|
-
eval_protocol/../vite-app/dist/assets/index-
|
|
44
|
-
eval_protocol/../vite-app/dist/assets/index-
|
|
45
|
-
eval_protocol/../vite-app/dist/assets/index-
|
|
43
|
+
eval_protocol/../vite-app/dist/assets/index-34WaHH5W.css
|
|
44
|
+
eval_protocol/../vite-app/dist/assets/index-DOPsfOMT.js
|
|
45
|
+
eval_protocol/../vite-app/dist/assets/index-DOPsfOMT.js.map
|
|
46
46
|
eval_protocol/../vite-app/dist/assets/logo-light-BprIBJQW.png
|
|
47
47
|
eval_protocol/adapters/__init__.py
|
|
48
48
|
eval_protocol/adapters/base.py
|
|
@@ -124,6 +124,7 @@ eval_protocol/log_utils/__init__.py
|
|
|
124
124
|
eval_protocol/log_utils/elasticsearch_client.py
|
|
125
125
|
eval_protocol/log_utils/elasticsearch_direct_http_handler.py
|
|
126
126
|
eval_protocol/log_utils/elasticsearch_index_manager.py
|
|
127
|
+
eval_protocol/log_utils/fireworks_tracing_http_handler.py
|
|
127
128
|
eval_protocol/log_utils/rollout_id_filter.py
|
|
128
129
|
eval_protocol/log_utils/util.py
|
|
129
130
|
eval_protocol/mcp/__init__.py
|
|
@@ -165,15 +166,6 @@ eval_protocol/mcp_servers/tau2/tests/test_tau2_e2e.py
|
|
|
165
166
|
eval_protocol/mcp_servers/tau2/tests/system_prompts/airline_agent_system_prompt.md
|
|
166
167
|
eval_protocol/mcp_servers/tau2/tests/system_prompts/mock_agent_system_prompt.md
|
|
167
168
|
eval_protocol/mcp_servers/tau2/tests/system_prompts/retail_agent_system_prompt.md
|
|
168
|
-
eval_protocol/proxy/__init__.py
|
|
169
|
-
eval_protocol/proxy/proxy_core/__init__.py
|
|
170
|
-
eval_protocol/proxy/proxy_core/app.py
|
|
171
|
-
eval_protocol/proxy/proxy_core/auth.py
|
|
172
|
-
eval_protocol/proxy/proxy_core/langfuse.py
|
|
173
|
-
eval_protocol/proxy/proxy_core/litellm.py
|
|
174
|
-
eval_protocol/proxy/proxy_core/main.py
|
|
175
|
-
eval_protocol/proxy/proxy_core/models.py
|
|
176
|
-
eval_protocol/proxy/proxy_core/redis_utils.py
|
|
177
169
|
eval_protocol/pytest/__init__.py
|
|
178
170
|
eval_protocol/pytest/default_agent_rollout_processor.py
|
|
179
171
|
eval_protocol/pytest/default_dataset_adapter.py
|
|
@@ -238,6 +230,7 @@ eval_protocol/types/types.py
|
|
|
238
230
|
eval_protocol/utils/__init__.py
|
|
239
231
|
eval_protocol/utils/batch_evaluation.py
|
|
240
232
|
eval_protocol/utils/batch_transformation.py
|
|
233
|
+
eval_protocol/utils/browser_utils.py
|
|
241
234
|
eval_protocol/utils/check_server_status.py
|
|
242
235
|
eval_protocol/utils/dataset_helpers.py
|
|
243
236
|
eval_protocol/utils/logs_models.py
|
|
@@ -6,6 +6,13 @@ import socket
|
|
|
6
6
|
from unittest.mock import patch, MagicMock
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
|
+
try:
|
|
10
|
+
import psutil
|
|
11
|
+
|
|
12
|
+
PSUTIL_AVAILABLE = True
|
|
13
|
+
except ImportError:
|
|
14
|
+
PSUTIL_AVAILABLE = False
|
|
15
|
+
|
|
9
16
|
from eval_protocol.utils.show_results_url import (
|
|
10
17
|
is_server_running,
|
|
11
18
|
generate_invocation_filter_url,
|
|
@@ -193,3 +200,137 @@ class TestIntegration:
|
|
|
193
200
|
assert "table" in call_args[2]
|
|
194
201
|
assert "integration-test" in call_args[1]
|
|
195
202
|
assert "integration-test" in call_args[2]
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class TestBrowserUtilities:
|
|
206
|
+
"""Test browser utility functions."""
|
|
207
|
+
|
|
208
|
+
def test_get_pid_file_path(self):
|
|
209
|
+
"""Test PID file path generation."""
|
|
210
|
+
from eval_protocol.utils.browser_utils import _get_pid_file_path
|
|
211
|
+
from eval_protocol.directory_utils import find_eval_protocol_dir
|
|
212
|
+
from pathlib import Path
|
|
213
|
+
|
|
214
|
+
pid_file = _get_pid_file_path()
|
|
215
|
+
expected = Path(find_eval_protocol_dir()) / "logs_server.pid"
|
|
216
|
+
assert pid_file == expected
|
|
217
|
+
|
|
218
|
+
def test_is_logs_server_running_no_pid_file(self, tmp_path, monkeypatch):
|
|
219
|
+
"""Test server detection when PID file doesn't exist."""
|
|
220
|
+
from eval_protocol.utils.browser_utils import is_logs_server_running
|
|
221
|
+
|
|
222
|
+
# Mock the PID file path to a non-existent file
|
|
223
|
+
monkeypatch.setattr(
|
|
224
|
+
"eval_protocol.utils.browser_utils._get_pid_file_path", lambda: tmp_path / "nonexistent.pid"
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
is_running, port = is_logs_server_running()
|
|
228
|
+
assert not is_running
|
|
229
|
+
assert port is None
|
|
230
|
+
|
|
231
|
+
def test_is_logs_server_running_invalid_pid_file(self, tmp_path, monkeypatch):
|
|
232
|
+
"""Test server detection with invalid PID file content."""
|
|
233
|
+
from eval_protocol.utils.browser_utils import is_logs_server_running
|
|
234
|
+
|
|
235
|
+
# Create invalid PID file
|
|
236
|
+
pid_file = tmp_path / "invalid.pid"
|
|
237
|
+
pid_file.write_text("invalid json")
|
|
238
|
+
monkeypatch.setattr("eval_protocol.utils.browser_utils._get_pid_file_path", lambda: pid_file)
|
|
239
|
+
|
|
240
|
+
is_running, port = is_logs_server_running()
|
|
241
|
+
assert not is_running
|
|
242
|
+
assert port is None
|
|
243
|
+
|
|
244
|
+
def test_is_logs_server_running_missing_pid_key(self, tmp_path, monkeypatch):
|
|
245
|
+
"""Test server detection with PID file missing required keys."""
|
|
246
|
+
from eval_protocol.utils.browser_utils import is_logs_server_running
|
|
247
|
+
import json
|
|
248
|
+
|
|
249
|
+
# Create PID file with missing pid key
|
|
250
|
+
pid_file = tmp_path / "missing_pid.pid"
|
|
251
|
+
pid_file.write_text(json.dumps({"port": 8000}))
|
|
252
|
+
monkeypatch.setattr("eval_protocol.utils.browser_utils._get_pid_file_path", lambda: pid_file)
|
|
253
|
+
|
|
254
|
+
is_running, port = is_logs_server_running()
|
|
255
|
+
assert not is_running
|
|
256
|
+
assert port is None
|
|
257
|
+
|
|
258
|
+
@pytest.mark.skipif(not PSUTIL_AVAILABLE, reason="psutil not available")
|
|
259
|
+
def test_is_logs_server_running_nonexistent_process(self, tmp_path, monkeypatch):
|
|
260
|
+
"""Test server detection with PID file pointing to non-existent process."""
|
|
261
|
+
from eval_protocol.utils.browser_utils import is_logs_server_running
|
|
262
|
+
import json
|
|
263
|
+
|
|
264
|
+
# Create PID file with non-existent PID
|
|
265
|
+
pid_file = tmp_path / "nonexistent_process.pid"
|
|
266
|
+
pid_file.write_text(json.dumps({"pid": 999999, "port": 8000}))
|
|
267
|
+
monkeypatch.setattr("eval_protocol.utils.browser_utils._get_pid_file_path", lambda: pid_file)
|
|
268
|
+
|
|
269
|
+
is_running, port = is_logs_server_running()
|
|
270
|
+
assert not is_running
|
|
271
|
+
assert port is None
|
|
272
|
+
|
|
273
|
+
@pytest.mark.skipif(not PSUTIL_AVAILABLE, reason="psutil not available")
|
|
274
|
+
def test_is_logs_server_running_current_process(self, tmp_path, monkeypatch):
|
|
275
|
+
"""Test server detection with PID file pointing to current process."""
|
|
276
|
+
from eval_protocol.utils.browser_utils import is_logs_server_running
|
|
277
|
+
import json
|
|
278
|
+
import os
|
|
279
|
+
|
|
280
|
+
# Create PID file with current process PID
|
|
281
|
+
pid_file = tmp_path / "current_process.pid"
|
|
282
|
+
pid_file.write_text(json.dumps({"pid": os.getpid(), "port": 8000}))
|
|
283
|
+
monkeypatch.setattr("eval_protocol.utils.browser_utils._get_pid_file_path", lambda: pid_file)
|
|
284
|
+
|
|
285
|
+
is_running, port = is_logs_server_running()
|
|
286
|
+
assert is_running
|
|
287
|
+
assert port == 8000
|
|
288
|
+
|
|
289
|
+
def test_open_browser_tab(self, monkeypatch):
|
|
290
|
+
"""Test browser tab opening."""
|
|
291
|
+
from eval_protocol.utils.browser_utils import open_browser_tab
|
|
292
|
+
|
|
293
|
+
opened_urls = []
|
|
294
|
+
|
|
295
|
+
def mock_open_new_tab(url):
|
|
296
|
+
opened_urls.append(url)
|
|
297
|
+
|
|
298
|
+
monkeypatch.setattr("webbrowser.open_new_tab", mock_open_new_tab)
|
|
299
|
+
|
|
300
|
+
# Test with delay
|
|
301
|
+
open_browser_tab("http://example.com", delay=0.01)
|
|
302
|
+
|
|
303
|
+
# Wait a bit for the thread to execute
|
|
304
|
+
import time
|
|
305
|
+
|
|
306
|
+
time.sleep(0.02)
|
|
307
|
+
|
|
308
|
+
assert len(opened_urls) == 1
|
|
309
|
+
assert opened_urls[0] == "http://example.com"
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class TestLogsServerPidFile:
|
|
313
|
+
"""Test logs server PID file functionality."""
|
|
314
|
+
|
|
315
|
+
def test_write_pid_file(self, tmp_path, monkeypatch):
|
|
316
|
+
"""Test PID file writing."""
|
|
317
|
+
from eval_protocol.utils.browser_utils import write_pid_file
|
|
318
|
+
import json
|
|
319
|
+
|
|
320
|
+
# Mock the find_eval_protocol_dir function
|
|
321
|
+
monkeypatch.setattr("eval_protocol.directory_utils.find_eval_protocol_dir", lambda: str(tmp_path))
|
|
322
|
+
|
|
323
|
+
# Test writing PID file
|
|
324
|
+
write_pid_file(12345, 8000)
|
|
325
|
+
|
|
326
|
+
# Check that PID file was created
|
|
327
|
+
pid_file = tmp_path / "logs_server.pid"
|
|
328
|
+
assert pid_file.exists()
|
|
329
|
+
|
|
330
|
+
# Check content
|
|
331
|
+
with open(pid_file, "r") as f:
|
|
332
|
+
data = json.load(f)
|
|
333
|
+
assert "pid" in data
|
|
334
|
+
assert "port" in data
|
|
335
|
+
assert data["port"] == 8000
|
|
336
|
+
assert data["pid"] == 12345
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-50{z-index:50}.\!container{width:100%!important}@media (min-width:40rem){.\!container{max-width:40rem!important}}@media (min-width:48rem){.\!container{max-width:48rem!important}}@media (min-width:64rem){.\!container{max-width:64rem!important}}@media (min-width:80rem){.\!container{max-width:80rem!important}}@media (min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-96{height:calc(var(--spacing)*96)}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-\[800px\]{max-height:800px}.min-h-4{min-height:calc(var(--spacing)*4)}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing)*1)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-12{width:calc(var(--spacing)*12)}.w-\[500px\]{width:500px}.w-\[1200px\]{width:1200px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[200px\]{max-width:200px}.max-w-\[1200px\]{max-width:1200px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-36{min-width:calc(var(--spacing)*36)}.min-w-40{min-width:calc(var(--spacing)*40)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-64{min-width:calc(var(--spacing)*64)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-nw-resize{cursor:nw-resize}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.flex-row{flex-direction:row}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-blue-200{border-color:var(--color-blue-200)}.border-current{border-color:currentColor}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-900{border-color:var(--color-gray-900)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-transparent{border-color:#0000}.border-yellow-200{border-color:var(--color-yellow-200)}.border-t-gray-600{border-top-color:var(--color-gray-600)}.border-t-transparent{border-top-color:#0000}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-gray-300{border-left-color:var(--color-gray-300)}.border-l-green-500{border-left-color:var(--color-green-500)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-yellow-900{color:var(--color-yellow-900)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-none{-webkit-user-select:none;user-select:none}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-yellow-100:hover{background-color:var(--color-yellow-100)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}}.focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:64rem){.lg\:max-w-md{max-width:var(--container-md)}}@media (min-width:80rem){.xl\:max-w-lg{max-width:var(--container-lg)}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
|