agenta 0.34.7__tar.gz → 0.35.0__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.
Potentially problematic release.
This version of agenta might be problematic. Click here for more details.
- {agenta-0.34.7 → agenta-0.35.0}/PKG-INFO +4 -4
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/agenta_init.py +0 -8
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/context/tracing.py +2 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/decorators/routing.py +22 -3
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/decorators/tracing.py +47 -14
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/litellm/mocks/__init__.py +13 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/auth.py +2 -6
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/config.py +24 -19
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/inline.py +0 -2
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/mock.py +0 -1
- agenta-0.35.0/agenta/sdk/middleware/otel.py +25 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/vault.py +3 -3
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/exporters.py +36 -16
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/inline.py +1 -1
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/processors.py +62 -29
- agenta-0.35.0/agenta/sdk/tracing/propagation.py +100 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/tracing.py +40 -27
- agenta-0.35.0/agenta/sdk/utils/cache.py +53 -0
- {agenta-0.34.7 → agenta-0.35.0}/pyproject.toml +5 -7
- agenta-0.34.7/agenta/sdk/middleware/cache.py +0 -47
- agenta-0.34.7/agenta/sdk/middleware/otel.py +0 -40
- {agenta-0.34.7 → agenta-0.35.0}/README.md +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/cli/helper.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/cli/main.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/cli/telemetry.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/cli/variant_commands.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/cli/variant_configs.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/Readme.md +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/api.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/api_models.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/access_control/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/access_control/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/admin/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/admin/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/apps/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/apps/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/bases/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/bases/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/configs/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/configs/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/containers/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/containers/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/containers/types/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/containers/types/container_templates_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/api_error.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/client_wrapper.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/datetime_utils.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/file.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/http_client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/jsonable_encoder.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/pydantic_utilities.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/query_encoder.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/remove_none_from_dict.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/request_options.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/core/serialization.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/environments/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/environments/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/errors/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/errors/unprocessable_entity_error.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/evaluations/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/evaluations/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/evaluators/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/evaluators/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/human_evaluations/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/human_evaluations/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/observability/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/observability/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/observability/types/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/observability/types/format.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/observability/types/query_analytics_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/observability/types/query_traces_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/scopes/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/scopes/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/testsets/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/testsets/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/account_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_node_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_node_dto_nodes_value.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_nodes_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_root_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_roots_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_tree_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/agenta_trees_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/aggregated_result.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/aggregated_result_evaluator_config.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/analytics_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/app.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/app_variant_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/app_variant_revision.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/base_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/body_import_testset.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/bucket_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/collect_status_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/config_db.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/config_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/config_response_model.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/correct_answer.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/create_app_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/delete_evaluation.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/docker_env_vars.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/environment_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/environment_output_extended.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/environment_revision.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/error.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation_scenario.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation_scenario_input.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation_scenario_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation_scenario_result.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation_status_enum.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluation_type.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluator.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluator_config.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluator_mapping_output_interface.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/evaluator_output_interface.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/exception_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/get_config_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/header_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/http_validation_error.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/human_evaluation.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/human_evaluation_scenario.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/human_evaluation_scenario_input.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/human_evaluation_scenario_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/image.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/invite_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/legacy_analytics_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/legacy_data_point.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/legacy_scope_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/legacy_scopes_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/legacy_user_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/legacy_user_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/lifecycle_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/link_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/list_api_keys_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/llm_run_rate_limit.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/metrics_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/new_testset.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/node_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/node_type.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_context_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_event_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_extra_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_link_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_span_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_span_kind.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_spans_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/o_tel_status_code.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/organization.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/organization_membership_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/organization_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/organization_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/parent_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/permission.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/project_membership_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/project_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/project_scope.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/projects_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/provider_key_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/provider_kind.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/reference.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/reference_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/reference_request_model.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/result.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/role.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/root_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/scopes_response_model.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/score.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/secret_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/secret_kind.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/secret_response_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/simple_evaluation_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/span_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/span_dto_nodes_value.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/status_code.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/status_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/template.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/template_image_info.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/test_set_output_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/test_set_simple_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/time_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/tree_dto.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/tree_type.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/update_app_output.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/uri.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/user_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/validation_error.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/validation_error_loc_item.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/variant_action.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/variant_action_enum.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_member_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_membership_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_permission.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_request.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_role.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/types/workspace_role_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/variants/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/variants/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/variants/types/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/variants/types/add_variant_from_base_and_config_response.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/vault/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/backend/vault/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/client/exceptions.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/config.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/config.toml +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/Dockerfile.cloud.template +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/Dockerfile.oss.template +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/Dockerfile.template +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/README.md +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/entrypoint.sh +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/lambda_function.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker-assets/main.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/docker/docker_utils.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/assets.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/client.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/context/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/context/exporting.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/context/routing.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/decorators/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/litellm/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/litellm/litellm.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/litellm/mockllm.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/apps.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/config.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/deployment.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/secrets.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/shared.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/variant.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/managers/vault.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/middleware/cors.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/router.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/attributes.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/conventions.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/tracing/spans.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/types.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/__init__.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/constants.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/costs.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/exceptions.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/globals.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/helpers.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/logging.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/preinit.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/singleton.py +0 -0
- {agenta-0.34.7 → agenta-0.35.0}/agenta/sdk/utils/timing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: agenta
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.35.0
|
|
4
4
|
Summary: The SDK for agenta is an open-source LLMOps platform.
|
|
5
5
|
Keywords: LLMOps,LLM,evaluation,prompt engineering
|
|
6
6
|
Author: Mahmoud Mabrouk
|
|
@@ -22,9 +22,9 @@ Requires-Dist: fastapi (>=0.100.0)
|
|
|
22
22
|
Requires-Dist: httpx (>=0.24,<0.28)
|
|
23
23
|
Requires-Dist: importlib-metadata (>=8.0.0,<9.0)
|
|
24
24
|
Requires-Dist: litellm (>=1.48.0,<2.0.0)
|
|
25
|
-
Requires-Dist: opentelemetry-api (
|
|
26
|
-
Requires-Dist: opentelemetry-exporter-otlp (
|
|
27
|
-
Requires-Dist: opentelemetry-sdk (
|
|
25
|
+
Requires-Dist: opentelemetry-api (==1.27.0)
|
|
26
|
+
Requires-Dist: opentelemetry-exporter-otlp (==1.27.0)
|
|
27
|
+
Requires-Dist: opentelemetry-sdk (==1.27.0)
|
|
28
28
|
Requires-Dist: posthog (>=3.1.0,<4.0.0)
|
|
29
29
|
Requires-Dist: pydantic (>=2)
|
|
30
30
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
|
@@ -89,11 +89,6 @@ class AgentaSingleton:
|
|
|
89
89
|
|
|
90
90
|
self.base_id = getenv("AGENTA_BASE_ID")
|
|
91
91
|
|
|
92
|
-
self.service_id = getenv("AGENTA_SERVICE_ID") or self.base_id or None
|
|
93
|
-
|
|
94
|
-
log.info("Agenta - Service ID: %s", self.service_id)
|
|
95
|
-
log.info("Agenta - Application ID: %s", self.app_id)
|
|
96
|
-
|
|
97
92
|
self.tracing = Tracing(
|
|
98
93
|
url=f"{self.host}/api/observability/v1/otlp/traces", # type: ignore
|
|
99
94
|
redact=redact,
|
|
@@ -102,9 +97,6 @@ class AgentaSingleton:
|
|
|
102
97
|
|
|
103
98
|
self.tracing.configure(
|
|
104
99
|
api_key=self.api_key,
|
|
105
|
-
service_id=self.service_id,
|
|
106
|
-
# DEPRECATING
|
|
107
|
-
app_id=self.app_id,
|
|
108
100
|
)
|
|
109
101
|
|
|
110
102
|
self.api = AgentaApi(
|
|
@@ -7,6 +7,8 @@ from pydantic import BaseModel
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class TracingContext(BaseModel):
|
|
10
|
+
traceparent: Optional[Dict[str, Any]] = None
|
|
11
|
+
baggage: Optional[Dict[str, Any]] = None
|
|
10
12
|
credentials: Optional[str] = None
|
|
11
13
|
parameters: Optional[Dict[str, Any]] = None
|
|
12
14
|
references: Optional[Dict[str, Any]] = None
|
|
@@ -330,6 +330,8 @@ class entrypoint:
|
|
|
330
330
|
raise HTTPException(status_code=500, detail="Missing 'request'.")
|
|
331
331
|
|
|
332
332
|
state = request.state
|
|
333
|
+
traceparent = state.otel.get("traceparent")
|
|
334
|
+
baggage = state.otel.get("baggage")
|
|
333
335
|
credentials = state.auth.get("credentials")
|
|
334
336
|
parameters = state.config.get("parameters")
|
|
335
337
|
references = state.config.get("references")
|
|
@@ -346,6 +348,8 @@ class entrypoint:
|
|
|
346
348
|
):
|
|
347
349
|
with tracing_context_manager(
|
|
348
350
|
context=TracingContext(
|
|
351
|
+
traceparent=traceparent,
|
|
352
|
+
baggage=baggage,
|
|
349
353
|
credentials=credentials,
|
|
350
354
|
parameters=parameters,
|
|
351
355
|
references=references,
|
|
@@ -378,14 +382,13 @@ class entrypoint:
|
|
|
378
382
|
content_type = "application/json"
|
|
379
383
|
data = self.patch_result(result)
|
|
380
384
|
|
|
381
|
-
|
|
382
|
-
tree, tree_id = await self.fetch_inline_trace(inline)
|
|
385
|
+
tree, tree_id = await self.fetch_inline_trace(inline)
|
|
383
386
|
|
|
384
387
|
try:
|
|
385
388
|
return BaseResponse(
|
|
386
389
|
data=data, tree=tree, content_type=content_type, tree_id=tree_id
|
|
387
390
|
)
|
|
388
|
-
except:
|
|
391
|
+
except: # pylint: disable=bare-except
|
|
389
392
|
return BaseResponse(data=data, content_type=content_type)
|
|
390
393
|
|
|
391
394
|
def handle_failure(
|
|
@@ -397,6 +400,9 @@ class entrypoint:
|
|
|
397
400
|
status_code = (
|
|
398
401
|
getattr(error, "status_code") if hasattr(error, "status_code") else 500
|
|
399
402
|
)
|
|
403
|
+
if status_code in [401, 403]: # Reserved HTTP codes for auth middleware
|
|
404
|
+
status_code = 424 # Proxy Authentication Required
|
|
405
|
+
|
|
400
406
|
stacktrace = format_exception(error, value=error, tb=error.__traceback__) # type: ignore
|
|
401
407
|
|
|
402
408
|
raise HTTPException(
|
|
@@ -444,6 +450,18 @@ class entrypoint:
|
|
|
444
450
|
|
|
445
451
|
return data
|
|
446
452
|
|
|
453
|
+
async def fetch_inline_trace_id(
|
|
454
|
+
self,
|
|
455
|
+
):
|
|
456
|
+
context = tracing_context.get()
|
|
457
|
+
|
|
458
|
+
link = context.link
|
|
459
|
+
|
|
460
|
+
_tree_id = link.get("tree_id") if link else None # in int format
|
|
461
|
+
tree_id = str(UUID(int=_tree_id)) if _tree_id else None # in uuid_as_str format
|
|
462
|
+
|
|
463
|
+
return tree_id
|
|
464
|
+
|
|
447
465
|
async def fetch_inline_trace(
|
|
448
466
|
self,
|
|
449
467
|
inline: bool,
|
|
@@ -472,6 +490,7 @@ class entrypoint:
|
|
|
472
490
|
remaining_steps -= 1
|
|
473
491
|
|
|
474
492
|
tree = ag.tracing.get_inline_trace(_tree_id)
|
|
493
|
+
|
|
475
494
|
return tree, tree_id
|
|
476
495
|
|
|
477
496
|
# --- OpenAPI --- #
|
|
@@ -4,8 +4,9 @@ from functools import wraps
|
|
|
4
4
|
from itertools import chain
|
|
5
5
|
from inspect import iscoroutinefunction, getfullargspec
|
|
6
6
|
|
|
7
|
-
from opentelemetry import baggage
|
|
8
|
-
from opentelemetry.context import attach, detach
|
|
7
|
+
from opentelemetry import baggage
|
|
8
|
+
from opentelemetry.context import attach, detach, get_current
|
|
9
|
+
from opentelemetry.baggage import set_baggage, get_all
|
|
9
10
|
|
|
10
11
|
from agenta.sdk.utils.exceptions import suppress
|
|
11
12
|
from agenta.sdk.context.tracing import tracing_context
|
|
@@ -49,7 +50,15 @@ class instrument: # pylint: disable=invalid-name
|
|
|
49
50
|
|
|
50
51
|
token = self._attach_baggage()
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
ctx = self._get_traceparent()
|
|
54
|
+
|
|
55
|
+
with ag.tracer.start_as_current_span(
|
|
56
|
+
name=func.__name__,
|
|
57
|
+
kind=self.kind,
|
|
58
|
+
context=ctx,
|
|
59
|
+
):
|
|
60
|
+
self._set_link()
|
|
61
|
+
|
|
53
62
|
self._pre_instrument(func, *args, **kwargs)
|
|
54
63
|
|
|
55
64
|
result = await func(*args, **kwargs)
|
|
@@ -69,7 +78,15 @@ class instrument: # pylint: disable=invalid-name
|
|
|
69
78
|
|
|
70
79
|
token = self._attach_baggage()
|
|
71
80
|
|
|
72
|
-
|
|
81
|
+
ctx = self._get_traceparent()
|
|
82
|
+
|
|
83
|
+
with ag.tracer.start_as_current_span(
|
|
84
|
+
name=func.__name__,
|
|
85
|
+
kind=self.kind,
|
|
86
|
+
context=ctx,
|
|
87
|
+
):
|
|
88
|
+
self._set_link()
|
|
89
|
+
|
|
73
90
|
self._pre_instrument(func, *args, **kwargs)
|
|
74
91
|
|
|
75
92
|
result = func(*args, **kwargs)
|
|
@@ -90,6 +107,30 @@ class instrument: # pylint: disable=invalid-name
|
|
|
90
107
|
|
|
91
108
|
self.kind = parse_span_kind(self.type)
|
|
92
109
|
|
|
110
|
+
def _get_traceparent(self):
|
|
111
|
+
context = tracing_context.get()
|
|
112
|
+
|
|
113
|
+
traceparent = context.traceparent
|
|
114
|
+
|
|
115
|
+
if not context.link:
|
|
116
|
+
for key, value in get_all(get_current()).items():
|
|
117
|
+
traceparent = set_baggage(name=key, value=value, context=traceparent)
|
|
118
|
+
|
|
119
|
+
return traceparent
|
|
120
|
+
|
|
121
|
+
def _set_link(self):
|
|
122
|
+
span = ag.tracing.get_current_span()
|
|
123
|
+
|
|
124
|
+
context = tracing_context.get()
|
|
125
|
+
|
|
126
|
+
if not context.link:
|
|
127
|
+
context.link = {
|
|
128
|
+
"tree_id": span.get_span_context().trace_id,
|
|
129
|
+
"node_id": span.get_span_context().span_id,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
tracing_context.set(context)
|
|
133
|
+
|
|
93
134
|
def _attach_baggage(self):
|
|
94
135
|
context = tracing_context.get()
|
|
95
136
|
|
|
@@ -122,7 +163,7 @@ class instrument: # pylint: disable=invalid-name
|
|
|
122
163
|
with suppress():
|
|
123
164
|
trace_id = span.context.trace_id
|
|
124
165
|
|
|
125
|
-
ag.tracing.credentials
|
|
166
|
+
ag.tracing.credentials.put(trace_id, context.credentials)
|
|
126
167
|
|
|
127
168
|
span.set_attributes(
|
|
128
169
|
attributes={"node": self.type},
|
|
@@ -153,6 +194,7 @@ class instrument: # pylint: disable=invalid-name
|
|
|
153
194
|
result,
|
|
154
195
|
):
|
|
155
196
|
span = ag.tracing.get_current_span()
|
|
197
|
+
|
|
156
198
|
with suppress():
|
|
157
199
|
cost = None
|
|
158
200
|
usage = {}
|
|
@@ -206,15 +248,6 @@ class instrument: # pylint: disable=invalid-name
|
|
|
206
248
|
|
|
207
249
|
span.set_status("OK")
|
|
208
250
|
|
|
209
|
-
with suppress():
|
|
210
|
-
if hasattr(span, "parent") and span.parent is None:
|
|
211
|
-
context = tracing_context.get()
|
|
212
|
-
context.link = {
|
|
213
|
-
"tree_id": span.get_span_context().trace_id,
|
|
214
|
-
"node_id": span.get_span_context().span_id,
|
|
215
|
-
}
|
|
216
|
-
tracing_context.set(context)
|
|
217
|
-
|
|
218
251
|
def _parse(
|
|
219
252
|
self,
|
|
220
253
|
func,
|
|
@@ -26,7 +26,20 @@ def hello_mock_response(*args, **kwargs) -> MockResponseModel:
|
|
|
26
26
|
],
|
|
27
27
|
)
|
|
28
28
|
|
|
29
|
+
def chat_mock_response(*args, **kwargs) -> MockResponseModel:
|
|
30
|
+
return MockResponseModel(
|
|
31
|
+
choices=[
|
|
32
|
+
MockChoiceModel(
|
|
33
|
+
message=MockMessageModel(
|
|
34
|
+
content="world",
|
|
35
|
+
role="assistant"
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
],
|
|
39
|
+
)
|
|
40
|
+
|
|
29
41
|
|
|
30
42
|
MOCKS: dict[str, Callable[..., MockResponseModel]] = {
|
|
31
43
|
"hello": hello_mock_response,
|
|
44
|
+
"chat": chat_mock_response
|
|
32
45
|
}
|
|
@@ -8,7 +8,7 @@ from starlette.middleware.base import BaseHTTPMiddleware
|
|
|
8
8
|
from fastapi import FastAPI, Request
|
|
9
9
|
from fastapi.responses import JSONResponse
|
|
10
10
|
|
|
11
|
-
from agenta.sdk.
|
|
11
|
+
from agenta.sdk.utils.cache import TTLLRUCache
|
|
12
12
|
from agenta.sdk.utils.constants import TRUTHY
|
|
13
13
|
from agenta.sdk.utils.exceptions import display_exception
|
|
14
14
|
from agenta.sdk.utils.logging import log
|
|
@@ -22,7 +22,7 @@ _CACHE_ENABLED = getenv("AGENTA_MIDDLEWARE_CACHE_ENABLED", "false").lower() in T
|
|
|
22
22
|
|
|
23
23
|
_ALWAYS_ALLOW_LIST = [f"{AGENTA_RUNTIME_PREFIX}/health"]
|
|
24
24
|
|
|
25
|
-
_cache = TTLLRUCache(
|
|
25
|
+
_cache = TTLLRUCache()
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class DenyResponse(JSONResponse):
|
|
@@ -54,7 +54,6 @@ class AuthMiddleware(BaseHTTPMiddleware):
|
|
|
54
54
|
super().__init__(app)
|
|
55
55
|
|
|
56
56
|
self.host = ag.DEFAULT_AGENTA_SINGLETON_INSTANCE.host
|
|
57
|
-
self.resource_id = ag.DEFAULT_AGENTA_SINGLETON_INSTANCE.service_id
|
|
58
57
|
|
|
59
58
|
async def dispatch(self, request: Request, call_next: Callable):
|
|
60
59
|
try:
|
|
@@ -111,9 +110,6 @@ class AuthMiddleware(BaseHTTPMiddleware):
|
|
|
111
110
|
|
|
112
111
|
params = {"action": "run_service", "resource_type": "service"}
|
|
113
112
|
|
|
114
|
-
if self.resource_id:
|
|
115
|
-
params["resource_id"] = self.resource_id
|
|
116
|
-
|
|
117
113
|
if project_id:
|
|
118
114
|
params["project_id"] = project_id
|
|
119
115
|
|
|
@@ -10,7 +10,7 @@ from fastapi import Request, FastAPI
|
|
|
10
10
|
|
|
11
11
|
import httpx
|
|
12
12
|
|
|
13
|
-
from agenta.sdk.
|
|
13
|
+
from agenta.sdk.utils.cache import TTLLRUCache
|
|
14
14
|
from agenta.sdk.utils.constants import TRUTHY
|
|
15
15
|
from agenta.sdk.utils.exceptions import suppress
|
|
16
16
|
|
|
@@ -19,7 +19,7 @@ import agenta as ag
|
|
|
19
19
|
|
|
20
20
|
_CACHE_ENABLED = getenv("AGENTA_MIDDLEWARE_CACHE_ENABLED", "false").lower() in TRUTHY
|
|
21
21
|
|
|
22
|
-
_cache = TTLLRUCache(
|
|
22
|
+
_cache = TTLLRUCache()
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class Reference(BaseModel):
|
|
@@ -147,37 +147,32 @@ class ConfigMiddleware(BaseHTTPMiddleware):
|
|
|
147
147
|
|
|
148
148
|
application_id = (
|
|
149
149
|
# CLEANEST
|
|
150
|
-
baggage.get("
|
|
150
|
+
baggage.get("ag.refs.application.id")
|
|
151
151
|
# ALTERNATIVE
|
|
152
152
|
or request.query_params.get("application_id")
|
|
153
153
|
# LEGACY
|
|
154
|
+
or baggage.get("application_id")
|
|
154
155
|
or request.query_params.get("app_id")
|
|
155
156
|
or self.application_id
|
|
156
157
|
)
|
|
157
158
|
application_slug = (
|
|
158
159
|
# CLEANEST
|
|
159
|
-
baggage.get("
|
|
160
|
+
baggage.get("ag.refs.application.slug")
|
|
160
161
|
# ALTERNATIVE
|
|
161
162
|
or request.query_params.get("application_slug")
|
|
162
163
|
# LEGACY
|
|
164
|
+
or baggage.get("application_slug")
|
|
163
165
|
or request.query_params.get("app_slug")
|
|
164
166
|
or body.get("app")
|
|
165
167
|
)
|
|
166
168
|
|
|
167
|
-
|
|
168
|
-
# CLEANEST
|
|
169
|
-
baggage.get("application_version")
|
|
170
|
-
# ALTERNATIVE
|
|
171
|
-
or request.query_params.get("application_version")
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
if not any([application_id, application_slug, application_version]):
|
|
169
|
+
if not any([application_id, application_slug, None]):
|
|
175
170
|
return None
|
|
176
171
|
|
|
177
172
|
return Reference(
|
|
178
173
|
id=application_id,
|
|
179
174
|
slug=application_slug,
|
|
180
|
-
version=
|
|
175
|
+
version=None,
|
|
181
176
|
)
|
|
182
177
|
|
|
183
178
|
async def _parse_variant_ref(
|
|
@@ -194,24 +189,29 @@ class ConfigMiddleware(BaseHTTPMiddleware):
|
|
|
194
189
|
|
|
195
190
|
variant_id = (
|
|
196
191
|
# CLEANEST
|
|
197
|
-
baggage.get("
|
|
192
|
+
baggage.get("ag.refs.variant.id")
|
|
198
193
|
# ALTERNATIVE
|
|
199
194
|
or request.query_params.get("variant_id")
|
|
195
|
+
# LEGACY
|
|
196
|
+
or baggage.get("variant_id")
|
|
200
197
|
)
|
|
201
198
|
variant_slug = (
|
|
202
199
|
# CLEANEST
|
|
203
|
-
baggage.get("
|
|
200
|
+
baggage.get("ag.refs.variant.slug")
|
|
204
201
|
# ALTERNATIVE
|
|
205
202
|
or request.query_params.get("variant_slug")
|
|
206
203
|
# LEGACY
|
|
204
|
+
or baggage.get("variant_slug")
|
|
207
205
|
or request.query_params.get("config")
|
|
208
206
|
or body.get("config")
|
|
209
207
|
)
|
|
210
208
|
variant_version = (
|
|
211
209
|
# CLEANEST
|
|
212
|
-
baggage.get("
|
|
210
|
+
baggage.get("ag.refs.variant.version")
|
|
213
211
|
# ALTERNATIVE
|
|
214
212
|
or request.query_params.get("variant_version")
|
|
213
|
+
# LEGACY
|
|
214
|
+
or baggage.get("variant_version")
|
|
215
215
|
)
|
|
216
216
|
|
|
217
217
|
if not any([variant_id, variant_slug, variant_version]):
|
|
@@ -237,24 +237,29 @@ class ConfigMiddleware(BaseHTTPMiddleware):
|
|
|
237
237
|
|
|
238
238
|
environment_id = (
|
|
239
239
|
# CLEANEST
|
|
240
|
-
baggage.get("
|
|
240
|
+
baggage.get("ag.refs.environment.id")
|
|
241
241
|
# ALTERNATIVE
|
|
242
242
|
or request.query_params.get("environment_id")
|
|
243
|
+
# LEGACY
|
|
244
|
+
or baggage.get("environment_id")
|
|
243
245
|
)
|
|
244
246
|
environment_slug = (
|
|
245
247
|
# CLEANEST
|
|
246
|
-
baggage.get("
|
|
248
|
+
baggage.get("ag.refs.environment.slug")
|
|
247
249
|
# ALTERNATIVE
|
|
248
250
|
or request.query_params.get("environment_slug")
|
|
249
251
|
# LEGACY
|
|
252
|
+
or baggage.get("environment_slug")
|
|
250
253
|
or request.query_params.get("environment")
|
|
251
254
|
or body.get("environment")
|
|
252
255
|
)
|
|
253
256
|
environment_version = (
|
|
254
257
|
# CLEANEST
|
|
255
|
-
baggage.get("
|
|
258
|
+
baggage.get("ag.refs.environment.version")
|
|
256
259
|
# ALTERNATIVE
|
|
257
260
|
or request.query_params.get("environment_version")
|
|
261
|
+
# LEGACY
|
|
262
|
+
or baggage.get("environment_version")
|
|
258
263
|
)
|
|
259
264
|
|
|
260
265
|
if not any([environment_id, environment_slug, environment_version]):
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from typing import Callable
|
|
2
|
+
|
|
3
|
+
from starlette.middleware.base import BaseHTTPMiddleware
|
|
4
|
+
from fastapi import Request, FastAPI
|
|
5
|
+
|
|
6
|
+
from opentelemetry.baggage.propagation import W3CBaggagePropagator
|
|
7
|
+
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
|
|
8
|
+
|
|
9
|
+
from agenta.sdk.utils.exceptions import suppress
|
|
10
|
+
from agenta.sdk.tracing.propagation import extract
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class OTelMiddleware(BaseHTTPMiddleware):
|
|
14
|
+
def __init__(self, app: FastAPI):
|
|
15
|
+
super().__init__(app)
|
|
16
|
+
|
|
17
|
+
async def dispatch(self, request: Request, call_next: Callable):
|
|
18
|
+
request.state.otel = {"baggage": {}, "traceparent": None}
|
|
19
|
+
|
|
20
|
+
with suppress():
|
|
21
|
+
_, traceparent, baggage = extract(request.headers)
|
|
22
|
+
|
|
23
|
+
request.state.otel = {"baggage": baggage, "traceparent": traceparent}
|
|
24
|
+
|
|
25
|
+
return await call_next(request)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from os import getenv
|
|
2
2
|
from json import dumps
|
|
3
|
-
from typing import Callable, Dict, Optional, List, Any
|
|
3
|
+
from typing import Callable, Dict, Optional, List, Any
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
6
|
from fastapi import FastAPI, Request
|
|
@@ -13,7 +13,7 @@ from agenta.client.backend.types.secret_dto import SecretDto as SecretDTO
|
|
|
13
13
|
from agenta.client.backend.types.provider_key_dto import (
|
|
14
14
|
ProviderKeyDto as ProviderKeyDTO,
|
|
15
15
|
)
|
|
16
|
-
from agenta.sdk.
|
|
16
|
+
from agenta.sdk.utils.cache import TTLLRUCache
|
|
17
17
|
|
|
18
18
|
import agenta as ag
|
|
19
19
|
|
|
@@ -26,7 +26,7 @@ for arg in ProviderKind.__args__: # type: ignore
|
|
|
26
26
|
|
|
27
27
|
_CACHE_ENABLED = getenv("AGENTA_MIDDLEWARE_CACHE_ENABLED", "false").lower() in TRUTHY
|
|
28
28
|
|
|
29
|
-
_cache = TTLLRUCache(
|
|
29
|
+
_cache = TTLLRUCache()
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class VaultMiddleware(BaseHTTPMiddleware):
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Sequence, Dict, List
|
|
1
|
+
from typing import Sequence, Dict, List, Optional
|
|
2
2
|
|
|
3
3
|
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
|
4
4
|
from opentelemetry.sdk.trace.export import (
|
|
@@ -14,10 +14,14 @@ from agenta.sdk.context.exporting import (
|
|
|
14
14
|
exporting_context,
|
|
15
15
|
ExportingContext,
|
|
16
16
|
)
|
|
17
|
+
from agenta.sdk.utils.cache import TTLLRUCache
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
class InlineTraceExporter(SpanExporter):
|
|
20
|
-
def __init__(
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
registry: Dict[str, List[ReadableSpan]],
|
|
24
|
+
):
|
|
21
25
|
self._shutdown = False
|
|
22
26
|
self._registry = registry
|
|
23
27
|
|
|
@@ -65,29 +69,45 @@ class InlineTraceExporter(SpanExporter):
|
|
|
65
69
|
class OTLPExporter(OTLPSpanExporter):
|
|
66
70
|
_MAX_RETRY_TIMEOUT = 2
|
|
67
71
|
|
|
68
|
-
def __init__(
|
|
72
|
+
def __init__(
|
|
73
|
+
self,
|
|
74
|
+
*args,
|
|
75
|
+
credentials: Optional[TTLLRUCache] = None,
|
|
76
|
+
**kwargs,
|
|
77
|
+
):
|
|
69
78
|
super().__init__(*args, **kwargs)
|
|
70
79
|
|
|
71
80
|
self.credentials = credentials
|
|
72
81
|
|
|
73
82
|
def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult:
|
|
74
|
-
|
|
83
|
+
grouped_spans: Dict[str, List[str]] = {}
|
|
84
|
+
|
|
85
|
+
for span in spans:
|
|
86
|
+
trace_id = span.get_span_context().trace_id
|
|
87
|
+
|
|
88
|
+
credentials = None
|
|
89
|
+
if self.credentials:
|
|
90
|
+
credentials = self.credentials.get(trace_id)
|
|
91
|
+
|
|
92
|
+
if credentials not in grouped_spans:
|
|
93
|
+
grouped_spans[credentials] = []
|
|
75
94
|
|
|
76
|
-
|
|
77
|
-
trace_ids = set(span.get_span_context().trace_id for span in spans)
|
|
95
|
+
grouped_spans[credentials].append(span)
|
|
78
96
|
|
|
79
|
-
|
|
80
|
-
trace_id = trace_ids.pop()
|
|
97
|
+
serialized_spans = []
|
|
81
98
|
|
|
82
|
-
|
|
83
|
-
|
|
99
|
+
for credentials, _spans in grouped_spans.items():
|
|
100
|
+
with exporting_context_manager(
|
|
101
|
+
context=ExportingContext(
|
|
102
|
+
credentials=credentials,
|
|
103
|
+
)
|
|
104
|
+
):
|
|
105
|
+
serialized_spans.append(super().export(_spans))
|
|
84
106
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
):
|
|
90
|
-
return super().export(spans)
|
|
107
|
+
if all(serialized_spans):
|
|
108
|
+
return SpanExportResult.SUCCESS
|
|
109
|
+
else:
|
|
110
|
+
return SpanExportResult.FAILURE
|
|
91
111
|
|
|
92
112
|
def _export(self, serialized_data: bytes):
|
|
93
113
|
credentials = exporting_context.get().credentials
|
|
@@ -1061,7 +1061,7 @@ def _parse_readable_spans(
|
|
|
1061
1061
|
trace_id=_int_to_hex(span.parent.trace_id, 128),
|
|
1062
1062
|
span_id=_int_to_hex(span.parent.span_id, 64),
|
|
1063
1063
|
)
|
|
1064
|
-
if span.parent
|
|
1064
|
+
if span.parent and not span.parent.is_remote
|
|
1065
1065
|
else None
|
|
1066
1066
|
),
|
|
1067
1067
|
links=otel_links if len(otel_links) > 0 else None,
|