agenta 0.34.7__tar.gz → 0.35.1__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.

Files changed (256) hide show
  1. {agenta-0.34.7 → agenta-0.35.1}/PKG-INFO +4 -4
  2. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/agenta_init.py +0 -8
  3. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/context/tracing.py +2 -0
  4. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/decorators/routing.py +22 -3
  5. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/decorators/tracing.py +47 -14
  6. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/litellm/mocks/__init__.py +13 -0
  7. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/auth.py +2 -6
  8. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/config.py +24 -19
  9. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/inline.py +0 -2
  10. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/mock.py +0 -1
  11. agenta-0.35.1/agenta/sdk/middleware/otel.py +25 -0
  12. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/vault.py +3 -3
  13. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/exporters.py +36 -16
  14. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/inline.py +1 -1
  15. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/processors.py +62 -29
  16. agenta-0.35.1/agenta/sdk/tracing/propagation.py +100 -0
  17. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/tracing.py +40 -27
  18. agenta-0.35.1/agenta/sdk/utils/cache.py +53 -0
  19. {agenta-0.34.7 → agenta-0.35.1}/pyproject.toml +5 -7
  20. agenta-0.34.7/agenta/sdk/middleware/cache.py +0 -47
  21. agenta-0.34.7/agenta/sdk/middleware/otel.py +0 -40
  22. {agenta-0.34.7 → agenta-0.35.1}/README.md +0 -0
  23. {agenta-0.34.7 → agenta-0.35.1}/agenta/__init__.py +0 -0
  24. {agenta-0.34.7 → agenta-0.35.1}/agenta/cli/helper.py +0 -0
  25. {agenta-0.34.7 → agenta-0.35.1}/agenta/cli/main.py +0 -0
  26. {agenta-0.34.7 → agenta-0.35.1}/agenta/cli/telemetry.py +0 -0
  27. {agenta-0.34.7 → agenta-0.35.1}/agenta/cli/variant_commands.py +0 -0
  28. {agenta-0.34.7 → agenta-0.35.1}/agenta/cli/variant_configs.py +0 -0
  29. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/Readme.md +0 -0
  30. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/__init__.py +0 -0
  31. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/api.py +0 -0
  32. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/api_models.py +0 -0
  33. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/__init__.py +0 -0
  34. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/access_control/__init__.py +0 -0
  35. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/access_control/client.py +0 -0
  36. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/admin/__init__.py +0 -0
  37. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/admin/client.py +0 -0
  38. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/apps/__init__.py +0 -0
  39. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/apps/client.py +0 -0
  40. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/bases/__init__.py +0 -0
  41. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/bases/client.py +0 -0
  42. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/client.py +0 -0
  43. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/configs/__init__.py +0 -0
  44. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/configs/client.py +0 -0
  45. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/containers/__init__.py +0 -0
  46. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/containers/client.py +0 -0
  47. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/containers/types/__init__.py +0 -0
  48. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/containers/types/container_templates_response.py +0 -0
  49. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/__init__.py +0 -0
  50. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/api_error.py +0 -0
  51. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/client_wrapper.py +0 -0
  52. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/datetime_utils.py +0 -0
  53. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/file.py +0 -0
  54. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/http_client.py +0 -0
  55. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/jsonable_encoder.py +0 -0
  56. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/pydantic_utilities.py +0 -0
  57. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/query_encoder.py +0 -0
  58. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/remove_none_from_dict.py +0 -0
  59. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/request_options.py +0 -0
  60. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/core/serialization.py +0 -0
  61. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/environments/__init__.py +0 -0
  62. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/environments/client.py +0 -0
  63. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/errors/__init__.py +0 -0
  64. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/errors/unprocessable_entity_error.py +0 -0
  65. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/evaluations/__init__.py +0 -0
  66. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/evaluations/client.py +0 -0
  67. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/evaluators/__init__.py +0 -0
  68. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/evaluators/client.py +0 -0
  69. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/human_evaluations/__init__.py +0 -0
  70. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/human_evaluations/client.py +0 -0
  71. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/observability/__init__.py +0 -0
  72. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/observability/client.py +0 -0
  73. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/observability/types/__init__.py +0 -0
  74. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/observability/types/format.py +0 -0
  75. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/observability/types/query_analytics_response.py +0 -0
  76. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/observability/types/query_traces_response.py +0 -0
  77. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/scopes/__init__.py +0 -0
  78. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/scopes/client.py +0 -0
  79. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/testsets/__init__.py +0 -0
  80. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/testsets/client.py +0 -0
  81. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/__init__.py +0 -0
  82. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/account_response.py +0 -0
  83. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_node_dto.py +0 -0
  84. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_node_dto_nodes_value.py +0 -0
  85. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_nodes_response.py +0 -0
  86. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_root_dto.py +0 -0
  87. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_roots_response.py +0 -0
  88. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_tree_dto.py +0 -0
  89. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/agenta_trees_response.py +0 -0
  90. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/aggregated_result.py +0 -0
  91. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/aggregated_result_evaluator_config.py +0 -0
  92. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/analytics_response.py +0 -0
  93. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/app.py +0 -0
  94. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/app_variant_response.py +0 -0
  95. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/app_variant_revision.py +0 -0
  96. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/base_output.py +0 -0
  97. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/body_import_testset.py +0 -0
  98. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/bucket_dto.py +0 -0
  99. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/collect_status_response.py +0 -0
  100. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/config_db.py +0 -0
  101. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/config_dto.py +0 -0
  102. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/config_response_model.py +0 -0
  103. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/correct_answer.py +0 -0
  104. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/create_app_output.py +0 -0
  105. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/delete_evaluation.py +0 -0
  106. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/docker_env_vars.py +0 -0
  107. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/environment_output.py +0 -0
  108. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/environment_output_extended.py +0 -0
  109. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/environment_revision.py +0 -0
  110. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/error.py +0 -0
  111. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation.py +0 -0
  112. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation_scenario.py +0 -0
  113. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation_scenario_input.py +0 -0
  114. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation_scenario_output.py +0 -0
  115. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation_scenario_result.py +0 -0
  116. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation_status_enum.py +0 -0
  117. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluation_type.py +0 -0
  118. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluator.py +0 -0
  119. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluator_config.py +0 -0
  120. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluator_mapping_output_interface.py +0 -0
  121. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/evaluator_output_interface.py +0 -0
  122. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/exception_dto.py +0 -0
  123. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/get_config_response.py +0 -0
  124. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/header_dto.py +0 -0
  125. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/http_validation_error.py +0 -0
  126. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/human_evaluation.py +0 -0
  127. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/human_evaluation_scenario.py +0 -0
  128. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/human_evaluation_scenario_input.py +0 -0
  129. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/human_evaluation_scenario_output.py +0 -0
  130. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/image.py +0 -0
  131. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/invite_request.py +0 -0
  132. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/legacy_analytics_response.py +0 -0
  133. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/legacy_data_point.py +0 -0
  134. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/legacy_scope_request.py +0 -0
  135. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/legacy_scopes_response.py +0 -0
  136. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/legacy_user_request.py +0 -0
  137. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/legacy_user_response.py +0 -0
  138. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/lifecycle_dto.py +0 -0
  139. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/link_dto.py +0 -0
  140. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/list_api_keys_response.py +0 -0
  141. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/llm_run_rate_limit.py +0 -0
  142. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/metrics_dto.py +0 -0
  143. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/new_testset.py +0 -0
  144. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/node_dto.py +0 -0
  145. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/node_type.py +0 -0
  146. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_context_dto.py +0 -0
  147. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_event_dto.py +0 -0
  148. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_extra_dto.py +0 -0
  149. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_link_dto.py +0 -0
  150. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_span_dto.py +0 -0
  151. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_span_kind.py +0 -0
  152. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_spans_response.py +0 -0
  153. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/o_tel_status_code.py +0 -0
  154. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/organization.py +0 -0
  155. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/organization_membership_request.py +0 -0
  156. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/organization_output.py +0 -0
  157. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/organization_request.py +0 -0
  158. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/parent_dto.py +0 -0
  159. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/permission.py +0 -0
  160. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/project_membership_request.py +0 -0
  161. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/project_request.py +0 -0
  162. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/project_scope.py +0 -0
  163. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/projects_response.py +0 -0
  164. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/provider_key_dto.py +0 -0
  165. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/provider_kind.py +0 -0
  166. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/reference.py +0 -0
  167. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/reference_dto.py +0 -0
  168. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/reference_request_model.py +0 -0
  169. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/result.py +0 -0
  170. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/role.py +0 -0
  171. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/root_dto.py +0 -0
  172. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/scopes_response_model.py +0 -0
  173. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/score.py +0 -0
  174. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/secret_dto.py +0 -0
  175. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/secret_kind.py +0 -0
  176. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/secret_response_dto.py +0 -0
  177. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/simple_evaluation_output.py +0 -0
  178. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/span_dto.py +0 -0
  179. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/span_dto_nodes_value.py +0 -0
  180. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/status_code.py +0 -0
  181. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/status_dto.py +0 -0
  182. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/template.py +0 -0
  183. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/template_image_info.py +0 -0
  184. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/test_set_output_response.py +0 -0
  185. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/test_set_simple_response.py +0 -0
  186. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/time_dto.py +0 -0
  187. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/tree_dto.py +0 -0
  188. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/tree_type.py +0 -0
  189. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/update_app_output.py +0 -0
  190. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/uri.py +0 -0
  191. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/user_request.py +0 -0
  192. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/validation_error.py +0 -0
  193. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/validation_error_loc_item.py +0 -0
  194. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/variant_action.py +0 -0
  195. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/variant_action_enum.py +0 -0
  196. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_member_response.py +0 -0
  197. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_membership_request.py +0 -0
  198. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_permission.py +0 -0
  199. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_request.py +0 -0
  200. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_response.py +0 -0
  201. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_role.py +0 -0
  202. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/types/workspace_role_response.py +0 -0
  203. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/variants/__init__.py +0 -0
  204. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/variants/client.py +0 -0
  205. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/variants/types/__init__.py +0 -0
  206. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/variants/types/add_variant_from_base_and_config_response.py +0 -0
  207. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/vault/__init__.py +0 -0
  208. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/backend/vault/client.py +0 -0
  209. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/client.py +0 -0
  210. {agenta-0.34.7 → agenta-0.35.1}/agenta/client/exceptions.py +0 -0
  211. {agenta-0.34.7 → agenta-0.35.1}/agenta/config.py +0 -0
  212. {agenta-0.34.7 → agenta-0.35.1}/agenta/config.toml +0 -0
  213. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/Dockerfile.cloud.template +0 -0
  214. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/Dockerfile.oss.template +0 -0
  215. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/Dockerfile.template +0 -0
  216. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/README.md +0 -0
  217. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/entrypoint.sh +0 -0
  218. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/lambda_function.py +0 -0
  219. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker-assets/main.py +0 -0
  220. {agenta-0.34.7 → agenta-0.35.1}/agenta/docker/docker_utils.py +0 -0
  221. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/__init__.py +0 -0
  222. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/assets.py +0 -0
  223. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/client.py +0 -0
  224. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/context/__init__.py +0 -0
  225. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/context/exporting.py +0 -0
  226. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/context/routing.py +0 -0
  227. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/decorators/__init__.py +0 -0
  228. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/litellm/__init__.py +0 -0
  229. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/litellm/litellm.py +0 -0
  230. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/litellm/mockllm.py +0 -0
  231. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/__init__.py +0 -0
  232. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/apps.py +0 -0
  233. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/config.py +0 -0
  234. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/deployment.py +0 -0
  235. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/secrets.py +0 -0
  236. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/shared.py +0 -0
  237. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/variant.py +0 -0
  238. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/managers/vault.py +0 -0
  239. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/__init__.py +0 -0
  240. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/middleware/cors.py +0 -0
  241. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/router.py +0 -0
  242. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/__init__.py +0 -0
  243. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/attributes.py +0 -0
  244. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/conventions.py +0 -0
  245. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/tracing/spans.py +0 -0
  246. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/types.py +0 -0
  247. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/__init__.py +0 -0
  248. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/constants.py +0 -0
  249. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/costs.py +0 -0
  250. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/exceptions.py +0 -0
  251. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/globals.py +0 -0
  252. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/helpers.py +0 -0
  253. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/logging.py +0 -0
  254. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/preinit.py +0 -0
  255. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/singleton.py +0 -0
  256. {agenta-0.34.7 → agenta-0.35.1}/agenta/sdk/utils/timing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: agenta
3
- Version: 0.34.7
3
+ Version: 0.35.1
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 (>=1.27.0,<2.0.0)
26
- Requires-Dist: opentelemetry-exporter-otlp (>=1.27.0,<2.0.0)
27
- Requires-Dist: opentelemetry-sdk (>=1.27.0,<2.0.0)
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
- if inline:
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 as 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
- with ag.tracer.start_as_current_span(func.__name__, kind=self.kind):
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
- with ag.tracer.start_as_current_span(func.__name__, kind=self.kind):
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[trace_id] = context.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.middleware.cache import TTLLRUCache, CACHE_CAPACITY, CACHE_TTL
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(capacity=CACHE_CAPACITY, ttl=CACHE_TTL)
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.middleware.cache import TTLLRUCache, CACHE_CAPACITY, CACHE_TTL
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(capacity=CACHE_CAPACITY, ttl=CACHE_TTL)
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("application_id")
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("application_slug")
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
- application_version = (
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=application_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("variant_id")
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("variant_slug")
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("variant_version")
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("environment_id")
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("environment_slug")
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("environment_version")
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]):
@@ -3,9 +3,7 @@ from typing import Callable
3
3
  from starlette.middleware.base import BaseHTTPMiddleware
4
4
  from fastapi import Request, FastAPI
5
5
 
6
-
7
6
  from agenta.sdk.utils.exceptions import suppress
8
-
9
7
  from agenta.sdk.utils.constants import TRUTHY
10
8
 
11
9
 
@@ -3,7 +3,6 @@ from typing import Callable
3
3
  from starlette.middleware.base import BaseHTTPMiddleware
4
4
  from fastapi import Request, FastAPI
5
5
 
6
-
7
6
  from agenta.sdk.utils.exceptions import suppress
8
7
 
9
8
 
@@ -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, get_args
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.middleware.cache import TTLLRUCache, CACHE_CAPACITY, CACHE_TTL
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(capacity=CACHE_CAPACITY, ttl=CACHE_TTL)
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__(self, registry: Dict[str, List[ReadableSpan]]):
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__(self, *args, credentials: Dict[int, str] = None, **kwargs):
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
- credentials = None
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
- if self.credentials:
77
- trace_ids = set(span.get_span_context().trace_id for span in spans)
95
+ grouped_spans[credentials].append(span)
78
96
 
79
- if len(trace_ids) == 1:
80
- trace_id = trace_ids.pop()
97
+ serialized_spans = []
81
98
 
82
- if trace_id in self.credentials:
83
- credentials = self.credentials.pop(trace_id)
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
- with exporting_context_manager(
86
- context=ExportingContext(
87
- credentials=credentials,
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,