agenta 0.17.6a0__tar.gz → 0.18.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.

Files changed (164) hide show
  1. {agenta-0.17.6a0 → agenta-0.18.0}/PKG-INFO +1 -1
  2. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/decorators/llm_entrypoint.py +2 -0
  3. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/decorators/tracing.py +26 -15
  4. {agenta-0.17.6a0 → agenta-0.18.0}/pyproject.toml +2 -2
  5. {agenta-0.17.6a0 → agenta-0.18.0}/README.md +0 -0
  6. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/__init__.py +0 -0
  7. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/cli/evaluation_commands.py +0 -0
  8. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/cli/helper.py +0 -0
  9. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/cli/main.py +0 -0
  10. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/cli/telemetry.py +0 -0
  11. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/cli/variant_commands.py +0 -0
  12. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/cli/variant_configs.py +0 -0
  13. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/Readme.md +0 -0
  14. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/__init__.py +0 -0
  15. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/api.py +0 -0
  16. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/api_models.py +0 -0
  17. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/__init__.py +0 -0
  18. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/client.py +0 -0
  19. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/core/__init__.py +0 -0
  20. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/core/api_error.py +0 -0
  21. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/core/client_wrapper.py +0 -0
  22. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/core/datetime_utils.py +0 -0
  23. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/core/jsonable_encoder.py +0 -0
  24. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/core/remove_none_from_dict.py +0 -0
  25. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/errors/__init__.py +0 -0
  26. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/errors/unprocessable_entity_error.py +0 -0
  27. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/__init__.py +0 -0
  28. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/apps/__init__.py +0 -0
  29. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/apps/client.py +0 -0
  30. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/bases/__init__.py +0 -0
  31. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/bases/client.py +0 -0
  32. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/configs/__init__.py +0 -0
  33. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/configs/client.py +0 -0
  34. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/containers/__init__.py +0 -0
  35. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/containers/client.py +0 -0
  36. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/containers/types/__init__.py +0 -0
  37. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/containers/types/container_templates_response.py +0 -0
  38. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/environments/__init__.py +0 -0
  39. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/environments/client.py +0 -0
  40. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/evaluations/__init__.py +0 -0
  41. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/evaluations/client.py +0 -0
  42. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/evaluators/__init__.py +0 -0
  43. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/evaluators/client.py +0 -0
  44. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/observability/__init__.py +0 -0
  45. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/observability/client.py +0 -0
  46. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/testsets/__init__.py +0 -0
  47. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/testsets/client.py +0 -0
  48. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/variants/__init__.py +0 -0
  49. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/variants/client.py +0 -0
  50. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/variants/types/__init__.py +0 -0
  51. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/resources/variants/types/add_variant_from_base_and_config_response.py +0 -0
  52. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/__init__.py +0 -0
  53. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/aggregated_result.py +0 -0
  54. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/aggregated_result_evaluator_config.py +0 -0
  55. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/app.py +0 -0
  56. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/app_variant_response.py +0 -0
  57. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/app_variant_revision.py +0 -0
  58. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/base_output.py +0 -0
  59. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/body_import_testset.py +0 -0
  60. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/config_db.py +0 -0
  61. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/create_app_output.py +0 -0
  62. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/create_span.py +0 -0
  63. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/create_trace_response.py +0 -0
  64. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/docker_env_vars.py +0 -0
  65. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/environment_output.py +0 -0
  66. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/environment_output_extended.py +0 -0
  67. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/environment_revision.py +0 -0
  68. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/error.py +0 -0
  69. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation.py +0 -0
  70. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_scenario.py +0 -0
  71. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_scenario_input.py +0 -0
  72. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_scenario_output.py +0 -0
  73. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_scenario_result.py +0 -0
  74. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_scenario_score_update.py +0 -0
  75. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_status_enum.py +0 -0
  76. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_type.py +0 -0
  77. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluation_webhook.py +0 -0
  78. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluator.py +0 -0
  79. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/evaluator_config.py +0 -0
  80. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/feedback.py +0 -0
  81. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/get_config_response.py +0 -0
  82. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/http_validation_error.py +0 -0
  83. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/human_evaluation.py +0 -0
  84. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/human_evaluation_scenario.py +0 -0
  85. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/human_evaluation_scenario_input.py +0 -0
  86. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/human_evaluation_scenario_output.py +0 -0
  87. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/human_evaluation_scenario_update.py +0 -0
  88. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/human_evaluation_update.py +0 -0
  89. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/image.py +0 -0
  90. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/invite_request.py +0 -0
  91. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/list_api_keys_response.py +0 -0
  92. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/llm_run_rate_limit.py +0 -0
  93. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/llm_tokens.py +0 -0
  94. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/new_human_evaluation.py +0 -0
  95. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/new_testset.py +0 -0
  96. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/organization.py +0 -0
  97. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/organization_output.py +0 -0
  98. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/permission.py +0 -0
  99. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/result.py +0 -0
  100. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/score.py +0 -0
  101. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/simple_evaluation_output.py +0 -0
  102. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/span.py +0 -0
  103. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/span_detail.py +0 -0
  104. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/span_kind.py +0 -0
  105. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/span_status_code.py +0 -0
  106. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/span_variant.py +0 -0
  107. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/template.py +0 -0
  108. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/template_image_info.py +0 -0
  109. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/test_set_output_response.py +0 -0
  110. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/test_set_simple_response.py +0 -0
  111. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/trace_detail.py +0 -0
  112. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/uri.py +0 -0
  113. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/validation_error.py +0 -0
  114. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/validation_error_loc_item.py +0 -0
  115. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/variant_action.py +0 -0
  116. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/variant_action_enum.py +0 -0
  117. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/with_pagination.py +0 -0
  118. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/workspace_member_response.py +0 -0
  119. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/workspace_permission.py +0 -0
  120. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/workspace_response.py +0 -0
  121. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/workspace_role.py +0 -0
  122. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/backend/types/workspace_role_response.py +0 -0
  123. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/client.py +0 -0
  124. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/client/exceptions.py +0 -0
  125. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/config.py +0 -0
  126. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/config.toml +0 -0
  127. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker-assets/Dockerfile.cloud.template +0 -0
  128. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker-assets/Dockerfile.template +0 -0
  129. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker-assets/README.md +0 -0
  130. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker-assets/entrypoint.sh +0 -0
  131. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker-assets/lambda_function.py +0 -0
  132. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker-assets/main.py +0 -0
  133. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/docker/docker_utils.py +0 -0
  134. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/__init__.py +0 -0
  135. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/agenta_init.py +0 -0
  136. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/client.py +0 -0
  137. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/context.py +0 -0
  138. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/decorators/base.py +0 -0
  139. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/router.py +0 -0
  140. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/tracing/__init__.py +0 -0
  141. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/tracing/callbacks.py +0 -0
  142. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/tracing/context_manager.py +0 -0
  143. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/tracing/llm_tracing.py +0 -0
  144. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/tracing/logger.py +0 -0
  145. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/tracing/tasks_manager.py +0 -0
  146. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/types.py +0 -0
  147. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/utils/globals.py +0 -0
  148. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/utils/helper/openai_cost.py +0 -0
  149. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/sdk/utils/preinit.py +0 -0
  150. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/compose_email/README.md +0 -0
  151. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/compose_email/app.py +0 -0
  152. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/compose_email/env.example +0 -0
  153. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/compose_email/requirements.txt +0 -0
  154. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/compose_email/template.toml +0 -0
  155. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/extract_data_to_json/README.md +0 -0
  156. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/extract_data_to_json/app.py +0 -0
  157. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/extract_data_to_json/env.example +0 -0
  158. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/extract_data_to_json/requirements.txt +0 -0
  159. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/extract_data_to_json/template.toml +0 -0
  160. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/simple_prompt/README.md +0 -0
  161. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/simple_prompt/app.py +0 -0
  162. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/simple_prompt/env.example +0 -0
  163. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/simple_prompt/requirements.txt +0 -0
  164. {agenta-0.17.6a0 → agenta-0.18.0}/agenta/templates/simple_prompt/template.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: agenta
3
- Version: 0.17.6a0
3
+ Version: 0.18.0
4
4
  Summary: The SDK for agenta is an open-source LLMOps platform.
5
5
  Home-page: https://agenta.ai
6
6
  Keywords: LLMOps,LLM,evaluation,prompt engineering
@@ -83,9 +83,11 @@ class entrypoint(BaseDecorator):
83
83
  {"config": config_params, "environment": "playground"}
84
84
  )
85
85
 
86
+ # Exceptions are all handled inside self.execute_function()
86
87
  llm_result = await self.execute_function(
87
88
  func, *args, params=func_params, config_params=config_params
88
89
  )
90
+
89
91
  return llm_result
90
92
 
91
93
  @functools.wraps(func)
@@ -58,19 +58,24 @@ class instrument(BaseDecorator):
58
58
  try:
59
59
  result = await func(*args, **kwargs)
60
60
  self.tracing.update_span_status(span=span, value="OK")
61
- except Exception as e:
62
- result = str(e)
63
- self.tracing.set_span_attribute(
64
- {"traceback_exception": traceback.format_exc()}
65
- )
66
- self.tracing.update_span_status(span=span, value="ERROR")
67
- finally:
68
61
  self.tracing.end_span(
69
62
  outputs=(
70
63
  {"message": result} if not isinstance(result, dict) else result
71
64
  )
72
65
  )
73
- return result
66
+ return result
67
+
68
+ except Exception as e:
69
+ result = {
70
+ "message": str(e),
71
+ "stacktrace": traceback.format_exc(),
72
+ }
73
+ self.tracing.set_span_attribute(
74
+ {"traceback_exception": traceback.format_exc()}
75
+ )
76
+ self.tracing.update_span_status(span=span, value="ERROR")
77
+ self.tracing.end_span(outputs=result)
78
+ raise e
74
79
 
75
80
  @wraps(func)
76
81
  def sync_wrapper(*args, **kwargs):
@@ -89,17 +94,23 @@ class instrument(BaseDecorator):
89
94
  try:
90
95
  result = func(*args, **kwargs)
91
96
  self.tracing.update_span_status(span=span, value="OK")
92
- except Exception as e:
93
- result = str(e)
94
- self.tracing.set_span_attribute(
95
- {"traceback_exception": traceback.format_exc()}
96
- )
97
- self.tracing.update_span_status(span=span, value="ERROR")
98
- finally:
99
97
  self.tracing.end_span(
100
98
  outputs=(
101
99
  {"message": result} if not isinstance(result, dict) else result
102
100
  )
103
101
  )
102
+ return result
103
+
104
+ except Exception as e:
105
+ result = {
106
+ "message": str(e),
107
+ "stacktrace": traceback.format_exc(),
108
+ }
109
+ self.tracing.set_span_attribute(
110
+ {"traceback_exception": traceback.format_exc()}
111
+ )
112
+ self.tracing.update_span_status(span=span, value="ERROR")
113
+ self.tracing.end_span(outputs=result)
114
+ raise e
104
115
 
105
116
  return async_wrapper if is_coroutine_function else sync_wrapper
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "agenta"
3
- version = "0.17.6a0"
3
+ version = "0.18.0"
4
4
  description = "The SDK for agenta is an open-source LLMOps platform."
5
5
  readme = "README.md"
6
6
  authors = ["Mahmoud Mabrouk <mahmoud@agenta.ai>"]
@@ -34,7 +34,7 @@ cachetools = "^5.3.3"
34
34
 
35
35
  [tool.poetry.dev-dependencies]
36
36
  pytest = "^8.2"
37
- setuptools = "^70.1.0"
37
+ setuptools = "^70.2.0"
38
38
 
39
39
  [build-system]
40
40
  requires = ["poetry-core"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes