agenta 0.16.0__tar.gz → 0.17.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 (162) hide show
  1. {agenta-0.16.0 → agenta-0.17.1}/PKG-INFO +3 -3
  2. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker-assets/Dockerfile.cloud.template +1 -1
  3. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/decorators/llm_entrypoint.py +113 -28
  4. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/types.py +65 -83
  5. {agenta-0.16.0 → agenta-0.17.1}/pyproject.toml +3 -3
  6. {agenta-0.16.0 → agenta-0.17.1}/README.md +0 -0
  7. {agenta-0.16.0 → agenta-0.17.1}/agenta/__init__.py +0 -0
  8. {agenta-0.16.0 → agenta-0.17.1}/agenta/cli/evaluation_commands.py +0 -0
  9. {agenta-0.16.0 → agenta-0.17.1}/agenta/cli/helper.py +0 -0
  10. {agenta-0.16.0 → agenta-0.17.1}/agenta/cli/main.py +0 -0
  11. {agenta-0.16.0 → agenta-0.17.1}/agenta/cli/telemetry.py +0 -0
  12. {agenta-0.16.0 → agenta-0.17.1}/agenta/cli/variant_commands.py +0 -0
  13. {agenta-0.16.0 → agenta-0.17.1}/agenta/cli/variant_configs.py +0 -0
  14. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/Readme.md +0 -0
  15. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/__init__.py +0 -0
  16. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/api.py +0 -0
  17. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/api_models.py +0 -0
  18. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/__init__.py +0 -0
  19. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/client.py +0 -0
  20. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/core/__init__.py +0 -0
  21. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/core/api_error.py +0 -0
  22. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/core/client_wrapper.py +0 -0
  23. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/core/datetime_utils.py +0 -0
  24. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/core/jsonable_encoder.py +0 -0
  25. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/core/remove_none_from_dict.py +0 -0
  26. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/errors/__init__.py +0 -0
  27. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/errors/unprocessable_entity_error.py +0 -0
  28. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/__init__.py +0 -0
  29. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/apps/__init__.py +0 -0
  30. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/apps/client.py +0 -0
  31. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/bases/__init__.py +0 -0
  32. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/bases/client.py +0 -0
  33. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/configs/__init__.py +0 -0
  34. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/configs/client.py +0 -0
  35. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/containers/__init__.py +0 -0
  36. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/containers/client.py +0 -0
  37. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/containers/types/__init__.py +0 -0
  38. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/containers/types/container_templates_response.py +0 -0
  39. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/environments/__init__.py +0 -0
  40. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/environments/client.py +0 -0
  41. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/evaluations/__init__.py +0 -0
  42. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/evaluations/client.py +0 -0
  43. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/evaluators/__init__.py +0 -0
  44. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/evaluators/client.py +0 -0
  45. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/observability/__init__.py +0 -0
  46. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/observability/client.py +0 -0
  47. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/testsets/__init__.py +0 -0
  48. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/testsets/client.py +0 -0
  49. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/variants/__init__.py +0 -0
  50. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/variants/client.py +0 -0
  51. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/variants/types/__init__.py +0 -0
  52. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/resources/variants/types/add_variant_from_base_and_config_response.py +0 -0
  53. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/__init__.py +0 -0
  54. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/aggregated_result.py +0 -0
  55. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/aggregated_result_evaluator_config.py +0 -0
  56. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/app.py +0 -0
  57. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/app_variant_response.py +0 -0
  58. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/app_variant_revision.py +0 -0
  59. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/base_output.py +0 -0
  60. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/body_import_testset.py +0 -0
  61. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/config_db.py +0 -0
  62. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/create_app_output.py +0 -0
  63. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/create_span.py +0 -0
  64. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/create_trace_response.py +0 -0
  65. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/docker_env_vars.py +0 -0
  66. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/environment_output.py +0 -0
  67. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/environment_output_extended.py +0 -0
  68. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/environment_revision.py +0 -0
  69. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/error.py +0 -0
  70. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation.py +0 -0
  71. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_scenario.py +0 -0
  72. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_scenario_input.py +0 -0
  73. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_scenario_output.py +0 -0
  74. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_scenario_result.py +0 -0
  75. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_scenario_score_update.py +0 -0
  76. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_status_enum.py +0 -0
  77. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_type.py +0 -0
  78. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluation_webhook.py +0 -0
  79. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluator.py +0 -0
  80. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/evaluator_config.py +0 -0
  81. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/feedback.py +0 -0
  82. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/get_config_response.py +0 -0
  83. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/http_validation_error.py +0 -0
  84. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/human_evaluation.py +0 -0
  85. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/human_evaluation_scenario.py +0 -0
  86. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/human_evaluation_scenario_input.py +0 -0
  87. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/human_evaluation_scenario_output.py +0 -0
  88. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/human_evaluation_scenario_update.py +0 -0
  89. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/human_evaluation_update.py +0 -0
  90. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/image.py +0 -0
  91. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/invite_request.py +0 -0
  92. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/list_api_keys_response.py +0 -0
  93. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/llm_run_rate_limit.py +0 -0
  94. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/llm_tokens.py +0 -0
  95. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/new_human_evaluation.py +0 -0
  96. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/new_testset.py +0 -0
  97. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/organization.py +0 -0
  98. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/organization_output.py +0 -0
  99. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/permission.py +0 -0
  100. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/result.py +0 -0
  101. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/score.py +0 -0
  102. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/simple_evaluation_output.py +0 -0
  103. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/span.py +0 -0
  104. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/span_detail.py +0 -0
  105. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/span_kind.py +0 -0
  106. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/span_status_code.py +0 -0
  107. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/span_variant.py +0 -0
  108. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/template.py +0 -0
  109. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/template_image_info.py +0 -0
  110. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/test_set_output_response.py +0 -0
  111. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/test_set_simple_response.py +0 -0
  112. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/trace_detail.py +0 -0
  113. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/uri.py +0 -0
  114. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/validation_error.py +0 -0
  115. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/validation_error_loc_item.py +0 -0
  116. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/variant_action.py +0 -0
  117. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/variant_action_enum.py +0 -0
  118. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/with_pagination.py +0 -0
  119. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/workspace_member_response.py +0 -0
  120. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/workspace_permission.py +0 -0
  121. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/workspace_response.py +0 -0
  122. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/workspace_role.py +0 -0
  123. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/backend/types/workspace_role_response.py +0 -0
  124. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/client.py +0 -0
  125. {agenta-0.16.0 → agenta-0.17.1}/agenta/client/exceptions.py +0 -0
  126. {agenta-0.16.0 → agenta-0.17.1}/agenta/config.py +0 -0
  127. {agenta-0.16.0 → agenta-0.17.1}/agenta/config.toml +0 -0
  128. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker-assets/Dockerfile.template +0 -0
  129. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker-assets/README.md +0 -0
  130. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker-assets/entrypoint.sh +0 -0
  131. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker-assets/lambda_function.py +0 -0
  132. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker-assets/main.py +0 -0
  133. {agenta-0.16.0 → agenta-0.17.1}/agenta/docker/docker_utils.py +0 -0
  134. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/__init__.py +0 -0
  135. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/agenta_init.py +0 -0
  136. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/client.py +0 -0
  137. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/context.py +0 -0
  138. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/decorators/base.py +0 -0
  139. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/decorators/tracing.py +0 -0
  140. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/router.py +0 -0
  141. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/tracing/context_manager.py +0 -0
  142. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/tracing/llm_tracing.py +0 -0
  143. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/tracing/logger.py +0 -0
  144. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/tracing/tasks_manager.py +0 -0
  145. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/utils/globals.py +0 -0
  146. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/utils/helper/openai_cost.py +0 -0
  147. {agenta-0.16.0 → agenta-0.17.1}/agenta/sdk/utils/preinit.py +0 -0
  148. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/compose_email/README.md +0 -0
  149. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/compose_email/app.py +0 -0
  150. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/compose_email/env.example +0 -0
  151. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/compose_email/requirements.txt +0 -0
  152. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/compose_email/template.toml +0 -0
  153. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/extract_data_to_json/README.md +0 -0
  154. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/extract_data_to_json/app.py +0 -0
  155. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/extract_data_to_json/env.example +0 -0
  156. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/extract_data_to_json/requirements.txt +0 -0
  157. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/extract_data_to_json/template.toml +0 -0
  158. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/simple_prompt/README.md +0 -0
  159. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/simple_prompt/app.py +0 -0
  160. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/simple_prompt/env.example +0 -0
  161. {agenta-0.16.0 → agenta-0.17.1}/agenta/templates/simple_prompt/requirements.txt +0 -0
  162. {agenta-0.16.0 → agenta-0.17.1}/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.16.0
3
+ Version: 0.17.1
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
@@ -18,12 +18,12 @@ Classifier: Topic :: Software Development :: Libraries
18
18
  Requires-Dist: cachetools (>=5.3.3,<6.0.0)
19
19
  Requires-Dist: click (>=8.1.3,<9.0.0)
20
20
  Requires-Dist: docker (>=6.1.1,<8.0.0)
21
- Requires-Dist: fastapi (>=0.96.1)
21
+ Requires-Dist: fastapi (>=0.100.0)
22
22
  Requires-Dist: httpx (>=0.24,<0.28)
23
23
  Requires-Dist: importlib-metadata (>=6.7,<8.0)
24
24
  Requires-Dist: ipdb (>=0.13)
25
25
  Requires-Dist: posthog (>=3.1.0,<4.0.0)
26
- Requires-Dist: pydantic (==1.10.13)
26
+ Requires-Dist: pydantic (>=2)
27
27
  Requires-Dist: pymongo (>=4.6.3,<5.0.0)
28
28
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
29
29
  Requires-Dist: python-multipart (>=0.0.6,<0.0.10)
@@ -2,7 +2,7 @@ FROM public.ecr.aws/s2t9a1r1/agentaai/lambda_templates_public:main
2
2
 
3
3
  COPY requirements.txt ${LAMBDA_TASK_ROOT}
4
4
  RUN pip install --no-cache-dir --disable-pip-version-check -U agenta
5
- RUN pip install --no-cache-dir --disable-pip-version-check -U -r requirements.txt
5
+ RUN pip install --no-cache-dir --disable-pip-version-check -r requirements.txt
6
6
  RUN pip install --no-cache-dir --disable-pip-version-check mangum
7
7
  COPY . ${LAMBDA_TASK_ROOT}
8
8
 
@@ -201,17 +201,26 @@ class entrypoint(BaseDecorator):
201
201
  if isinstance(result, Dict):
202
202
  return FuncResponse(**result, latency=round(latency, 4))
203
203
  if isinstance(result, str):
204
- return FuncResponse(message=result, latency=round(latency, 4)) # type: ignore
204
+ return FuncResponse(
205
+ message=result, usage=None, cost=None, latency=round(latency, 4)
206
+ )
205
207
  if isinstance(result, int) or isinstance(result, float):
206
- return FuncResponse(message=str(result), latency=round(latency, 4))
208
+ return FuncResponse(
209
+ message=str(result),
210
+ usage=None,
211
+ cost=None,
212
+ latency=round(latency, 4),
213
+ )
207
214
  if result is None:
208
215
  return FuncResponse(
209
216
  message="Function executed successfully, but did return None. \n Are you sure you did not forget to return a value?",
217
+ usage=None,
218
+ cost=None,
210
219
  latency=round(latency, 4),
211
220
  )
212
221
  except Exception as e:
213
222
  self.handle_exception(e)
214
- return FuncResponse(message="Unexpected error occurred when calling the @entrypoing decorated function", latency=0) # type: ignore
223
+ return FuncResponse(message="Unexpected error occurred when calling the @entrypoint decorated function", latency=0) # type: ignore
215
224
 
216
225
  def handle_exception(self, e: Exception):
217
226
  """Handle exceptions."""
@@ -237,7 +246,7 @@ class entrypoint(BaseDecorator):
237
246
 
238
247
  wrapper_signature = inspect.signature(wrapper)
239
248
  wrapper_signature = wrapper_signature.replace(parameters=updated_params)
240
- wrapper.__signature__ = wrapper_signature
249
+ wrapper.__signature__ = wrapper_signature # type: ignore
241
250
 
242
251
  def update_function_signature(
243
252
  self,
@@ -248,7 +257,7 @@ class entrypoint(BaseDecorator):
248
257
  ) -> None:
249
258
  """Update the function signature to include new parameters."""
250
259
 
251
- updated_params = []
260
+ updated_params: List[inspect.Parameter] = []
252
261
  self.add_config_params_to_parser(updated_params, config_params)
253
262
  self.add_func_params_to_parser(updated_params, func_signature, ingestible_files)
254
263
  self.update_wrapper_signature(wrapper, updated_params)
@@ -260,7 +269,8 @@ class entrypoint(BaseDecorator):
260
269
  ingestible_files: Dict[str, inspect.Parameter],
261
270
  ) -> None:
262
271
  """Update the function signature to include new parameters."""
263
- updated_params = []
272
+
273
+ updated_params: List[inspect.Parameter] = []
264
274
  self.add_func_params_to_parser(updated_params, func_signature, ingestible_files)
265
275
  for param in [
266
276
  "config",
@@ -281,12 +291,19 @@ class entrypoint(BaseDecorator):
281
291
  ) -> None:
282
292
  """Add configuration parameters to function signature."""
283
293
  for name, param in config_params.items():
294
+ assert (
295
+ len(param.__class__.__bases__) == 1
296
+ ), f"Inherited standard type of {param.__class__} needs to be one."
284
297
  updated_params.append(
285
298
  inspect.Parameter(
286
299
  name,
287
300
  inspect.Parameter.KEYWORD_ONLY,
288
301
  default=Body(param),
289
- annotation=Optional[type(param)],
302
+ annotation=param.__class__.__bases__[
303
+ 0
304
+ ], # determines and get the base (parent/inheritance) type of the sdk-type at run-time. \
305
+ # E.g __class__ is ag.MessagesInput() and accessing it parent type will return (<class 'list'>,), \
306
+ # thus, why we are accessing the first item.
290
307
  )
291
308
  )
292
309
 
@@ -303,12 +320,19 @@ class entrypoint(BaseDecorator):
303
320
  inspect.Parameter(name, param.kind, annotation=UploadFile)
304
321
  )
305
322
  else:
323
+ assert (
324
+ len(param.default.__class__.__bases__) == 1
325
+ ), f"Inherited standard type of {param.default.__class__} needs to be one."
306
326
  updated_params.append(
307
327
  inspect.Parameter(
308
328
  name,
309
329
  inspect.Parameter.KEYWORD_ONLY,
310
330
  default=Body(..., embed=True),
311
- annotation=param.annotation,
331
+ annotation=param.default.__class__.__bases__[
332
+ 0
333
+ ], # determines and get the base (parent/inheritance) type of the sdk-type at run-time. \
334
+ # E.g __class__ is ag.MessagesInput() and accessing it parent type will return (<class 'list'>,), \
335
+ # thus, why we are accessing the first item.
312
336
  )
313
337
  )
314
338
 
@@ -358,7 +382,7 @@ class entrypoint(BaseDecorator):
358
382
  f"--{name}",
359
383
  type=str,
360
384
  default=param.default,
361
- choices=param.choices,
385
+ choices=param.choices, # type: ignore
362
386
  )
363
387
  else:
364
388
  parser.add_argument(
@@ -420,7 +444,9 @@ class entrypoint(BaseDecorator):
420
444
  params (dict(param_name, param_val)): The dictionary of the parameters for the function
421
445
  """
422
446
 
423
- def find_in_schema(schema: dict, param_name: str, xparam: str):
447
+ def find_in_schema(
448
+ schema_type_properties: dict, schema: dict, param_name: str, xparam: str
449
+ ):
424
450
  """Finds a parameter in the schema based on its name and x-parameter value"""
425
451
  for _, value in schema.items():
426
452
  value_title_lower = str(value.get("title")).lower()
@@ -432,9 +458,17 @@ class entrypoint(BaseDecorator):
432
458
 
433
459
  if (
434
460
  isinstance(value, dict)
435
- and value.get("x-parameter") == xparam
461
+ and schema_type_properties.get("x-parameter") == xparam
436
462
  and value_title == param_name
437
463
  ):
464
+ # this will update the default type schema with the properties gotten
465
+ # from the schema type (param_val) __schema_properties__ classmethod
466
+ for type_key, type_value in schema_type_properties.items():
467
+ # BEFORE:
468
+ # value = {'temperature': {'title': 'Temperature'}}
469
+ value[type_key] = type_value
470
+ # AFTER:
471
+ # value = {'temperature': { "type": "number", "title": "Temperature", "x-parameter": "float" }}
438
472
  return value
439
473
 
440
474
  schema_to_override = openapi_schema["components"]["schemas"][
@@ -443,17 +477,26 @@ class entrypoint(BaseDecorator):
443
477
  for param_name, param_val in params.items():
444
478
  if isinstance(param_val, GroupedMultipleChoiceParam):
445
479
  subschema = find_in_schema(
446
- schema_to_override, param_name, "grouped_choice"
480
+ param_val.__schema_type_properties__(),
481
+ schema_to_override,
482
+ param_name,
483
+ "grouped_choice",
447
484
  )
448
485
  assert (
449
486
  subschema
450
487
  ), f"GroupedMultipleChoiceParam '{param_name}' is in the parameters but could not be found in the openapi.json"
451
- subschema["choices"] = param_val.choices
452
- subschema["default"] = param_val.default
488
+ subschema["choices"] = param_val.choices # type: ignore
489
+ subschema["default"] = param_val.default # type: ignore
490
+
453
491
  if isinstance(param_val, MultipleChoiceParam):
454
- subschema = find_in_schema(schema_to_override, param_name, "choice")
492
+ subschema = find_in_schema(
493
+ param_val.__schema_type_properties__(),
494
+ schema_to_override,
495
+ param_name,
496
+ "choice",
497
+ )
455
498
  default = str(param_val)
456
- param_choices = param_val.choices
499
+ param_choices = param_val.choices # type: ignore
457
500
  choices = (
458
501
  [default] + param_choices
459
502
  if param_val not in param_choices
@@ -463,37 +506,79 @@ class entrypoint(BaseDecorator):
463
506
  subschema["default"] = (
464
507
  default if default in param_choices else choices[0]
465
508
  )
509
+
466
510
  if isinstance(param_val, FloatParam):
467
- subschema = find_in_schema(schema_to_override, param_name, "float")
468
- subschema["minimum"] = param_val.minval
469
- subschema["maximum"] = param_val.maxval
511
+ subschema = find_in_schema(
512
+ param_val.__schema_type_properties__(),
513
+ schema_to_override,
514
+ param_name,
515
+ "float",
516
+ )
517
+ subschema["minimum"] = param_val.minval # type: ignore
518
+ subschema["maximum"] = param_val.maxval # type: ignore
470
519
  subschema["default"] = param_val
520
+
471
521
  if isinstance(param_val, IntParam):
472
- subschema = find_in_schema(schema_to_override, param_name, "int")
473
- subschema["minimum"] = param_val.minval
474
- subschema["maximum"] = param_val.maxval
522
+ subschema = find_in_schema(
523
+ param_val.__schema_type_properties__(),
524
+ schema_to_override,
525
+ param_name,
526
+ "int",
527
+ )
528
+ subschema["minimum"] = param_val.minval # type: ignore
529
+ subschema["maximum"] = param_val.maxval # type: ignore
475
530
  subschema["default"] = param_val
531
+
476
532
  if (
477
533
  isinstance(param_val, inspect.Parameter)
478
534
  and param_val.annotation is DictInput
479
535
  ):
480
- subschema = find_in_schema(schema_to_override, param_name, "dict")
536
+ subschema = find_in_schema(
537
+ param_val.annotation.__schema_type_properties__(),
538
+ schema_to_override,
539
+ param_name,
540
+ "dict",
541
+ )
481
542
  subschema["default"] = param_val.default["default_keys"]
543
+
482
544
  if isinstance(param_val, TextParam):
483
- subschema = find_in_schema(schema_to_override, param_name, "text")
545
+ subschema = find_in_schema(
546
+ param_val.__schema_type_properties__(),
547
+ schema_to_override,
548
+ param_name,
549
+ "text",
550
+ )
484
551
  subschema["default"] = param_val
552
+
485
553
  if (
486
554
  isinstance(param_val, inspect.Parameter)
487
555
  and param_val.annotation is MessagesInput
488
556
  ):
489
- subschema = find_in_schema(schema_to_override, param_name, "messages")
557
+ subschema = find_in_schema(
558
+ param_val.annotation.__schema_type_properties__(),
559
+ schema_to_override,
560
+ param_name,
561
+ "messages",
562
+ )
490
563
  subschema["default"] = param_val.default
564
+
491
565
  if (
492
566
  isinstance(param_val, inspect.Parameter)
493
567
  and param_val.annotation is FileInputURL
494
568
  ):
495
- subschema = find_in_schema(schema_to_override, param_name, "file_url")
569
+ subschema = find_in_schema(
570
+ param_val.annotation.__schema_type_properties__(),
571
+ schema_to_override,
572
+ param_name,
573
+ "file_url",
574
+ )
496
575
  subschema["default"] = "https://example.com"
576
+
497
577
  if isinstance(param_val, BinaryParam):
498
- subschema = find_in_schema(schema_to_override, param_name, "bool")
499
- subschema["default"] = param_val.default
578
+ subschema = find_in_schema(
579
+ param_val.__schema_type_properties__(),
580
+ schema_to_override,
581
+ param_name,
582
+ "bool",
583
+ )
584
+ subschema["default"] = param_val.default # type: ignore
@@ -1,7 +1,7 @@
1
1
  import json
2
- from typing import Any, Dict, List, Optional
2
+ from typing import Dict, List, Optional
3
3
 
4
- from pydantic import BaseModel, Extra, HttpUrl, Field
4
+ from pydantic import ConfigDict, BaseModel, HttpUrl
5
5
 
6
6
 
7
7
  class InFile:
@@ -24,87 +24,75 @@ class FuncResponse(BaseModel):
24
24
 
25
25
 
26
26
  class DictInput(dict):
27
- def __new__(cls, default_keys=None):
27
+ def __new__(cls, default_keys: Optional[List[str]] = None):
28
28
  instance = super().__new__(cls, default_keys)
29
29
  if default_keys is None:
30
30
  default_keys = []
31
- instance.data = [key for key in default_keys]
31
+ instance.data = [key for key in default_keys] # type: ignore
32
32
  return instance
33
33
 
34
34
  @classmethod
35
- def __modify_schema__(cls, field_schema):
36
- field_schema.update({"x-parameter": "dict"})
35
+ def __schema_type_properties__(cls) -> dict:
36
+ return {"x-parameter": "dict"}
37
37
 
38
38
 
39
39
  class TextParam(str):
40
40
  @classmethod
41
- def __modify_schema__(cls, field_schema):
42
- field_schema.update({"x-parameter": "text"})
41
+ def __schema_type_properties__(cls) -> dict:
42
+ return {"x-parameter": "text", "type": "string"}
43
43
 
44
44
 
45
45
  class BinaryParam(int):
46
46
  def __new__(cls, value: bool = False):
47
47
  instance = super().__new__(cls, int(value))
48
- instance.default = value
48
+ instance.default = value # type: ignore
49
49
  return instance
50
50
 
51
51
  @classmethod
52
- def __modify_schema__(cls, field_schema):
53
- field_schema.update(
54
- {
55
- "x-parameter": "bool",
56
- "type": "boolean",
57
- }
58
- )
52
+ def __schema_type_properties__(cls) -> dict:
53
+ return {
54
+ "x-parameter": "bool",
55
+ "type": "boolean",
56
+ }
59
57
 
60
58
 
61
59
  class IntParam(int):
62
60
  def __new__(cls, default: int = 6, minval: float = 1, maxval: float = 10):
63
61
  instance = super().__new__(cls, default)
64
- instance.minval = minval
65
- instance.maxval = maxval
62
+ instance.minval = minval # type: ignore
63
+ instance.maxval = maxval # type: ignore
66
64
  return instance
67
65
 
68
66
  @classmethod
69
- def __modify_schema__(cls, field_schema):
70
- field_schema.update(
71
- {
72
- "x-parameter": "int",
73
- "type": "integer",
74
- "minimum": 1,
75
- "maximum": 10,
76
- }
77
- )
67
+ def __schema_type_properties__(cls) -> dict:
68
+ return {"x-parameter": "int", "type": "integer"}
78
69
 
79
70
 
80
71
  class FloatParam(float):
81
72
  def __new__(cls, default: float = 0.5, minval: float = 0.0, maxval: float = 1.0):
82
73
  instance = super().__new__(cls, default)
83
- instance.minval = minval
84
- instance.maxval = maxval
74
+ instance.default = default # type: ignore
75
+ instance.minval = minval # type: ignore
76
+ instance.maxval = maxval # type: ignore
85
77
  return instance
86
78
 
87
79
  @classmethod
88
- def __modify_schema__(cls, field_schema):
89
- field_schema.update(
90
- {
91
- "x-parameter": "float",
92
- "type": "number",
93
- "minimum": 0.0,
94
- "maximum": 1.0,
95
- }
96
- )
80
+ def __schema_type_properties__(cls) -> dict:
81
+ return {"x-parameter": "float", "type": "number"}
97
82
 
98
83
 
99
84
  class MultipleChoiceParam(str):
100
- def __new__(cls, default: str = None, choices: List[str] = None):
101
- if type(default) is list:
85
+ def __new__(
86
+ cls, default: Optional[str] = None, choices: Optional[List[str]] = None
87
+ ):
88
+ if default is not None and type(default) is list:
102
89
  raise ValueError(
103
90
  "The order of the parameters for MultipleChoiceParam is wrong! It's MultipleChoiceParam(default, choices) and not the opposite"
104
91
  )
105
- if default is None and choices:
92
+
93
+ if not default and choices is not None:
106
94
  # if a default value is not provided,
107
- # uset the first value in the choices list
95
+ # set the first value in the choices list
108
96
  default = choices[0]
109
97
 
110
98
  if default is None and not choices:
@@ -112,23 +100,21 @@ class MultipleChoiceParam(str):
112
100
  raise ValueError("You must provide either a default value or choices")
113
101
 
114
102
  instance = super().__new__(cls, default)
115
- instance.choices = choices
116
- instance.default = default
103
+ instance.choices = choices # type: ignore
104
+ instance.default = default # type: ignore
117
105
  return instance
118
106
 
119
107
  @classmethod
120
- def __modify_schema__(cls, field_schema: dict[str, Any]):
121
- field_schema.update(
122
- {
123
- "x-parameter": "choice",
124
- "type": "string",
125
- "enum": [],
126
- }
127
- )
108
+ def __schema_type_properties__(cls) -> dict:
109
+ return {"x-parameter": "choice", "type": "string", "enum": []}
128
110
 
129
111
 
130
112
  class GroupedMultipleChoiceParam(str):
131
- def __new__(cls, default: str = None, choices: Dict[str, List[str]] = None):
113
+ def __new__(
114
+ cls,
115
+ default: Optional[str] = None,
116
+ choices: Optional[Dict[str, List[str]]] = None,
117
+ ):
132
118
  if choices is None:
133
119
  choices = {}
134
120
  if default and not any(
@@ -144,31 +130,23 @@ class GroupedMultipleChoiceParam(str):
144
130
  )
145
131
 
146
132
  if not default:
147
- for choices in choices.values():
148
- if choices:
149
- default = choices[0]
150
- break
133
+ default_selected_choice = next(
134
+ (choices for choices in choices.values()), None
135
+ )
136
+ if default_selected_choice:
137
+ default = default_selected_choice[0]
151
138
 
152
139
  instance = super().__new__(cls, default)
153
- instance.choices = choices
154
- instance.default = default
140
+ instance.choices = choices # type: ignore
141
+ instance.default = default # type: ignore
155
142
  return instance
156
143
 
157
144
  @classmethod
158
- def __modify_schema__(cls, field_schema: dict[str, Any], **kwargs):
159
- choices = kwargs.get("choices", {})
160
- field_schema.update(
161
- {
162
- "x-parameter": "grouped_choice",
163
- "type": "string",
164
- "choices": choices,
165
- }
166
- )
167
-
168
-
169
- class Message(BaseModel):
170
- role: str
171
- content: str
145
+ def __schema_type_properties__(cls) -> dict:
146
+ return {
147
+ "x-parameter": "grouped_choice",
148
+ "type": "string",
149
+ }
172
150
 
173
151
 
174
152
  class MessagesInput(list):
@@ -183,28 +161,32 @@ class MessagesInput(list):
183
161
 
184
162
  """
185
163
 
186
- def __new__(cls, messages: List[Dict[str, str]] = None):
187
- instance = super().__new__(cls, messages)
188
- instance.default = messages
164
+ def __new__(cls, messages: List[Dict[str, str]] = []):
165
+ instance = super().__new__(cls)
166
+ instance.default = messages # type: ignore
189
167
  return instance
190
168
 
191
169
  @classmethod
192
- def __modify_schema__(cls, field_schema: dict[str, Any]):
193
- field_schema.update({"x-parameter": "messages", "type": "array"})
170
+ def __schema_type_properties__(cls) -> dict:
171
+ return {"x-parameter": "messages", "type": "array"}
194
172
 
195
173
 
196
174
  class FileInputURL(HttpUrl):
175
+ def __new__(cls, url: str):
176
+ instance = super().__new__(cls, url)
177
+ instance.default = url # type: ignore
178
+ return instance
179
+
197
180
  @classmethod
198
- def __modify_schema__(cls, field_schema: Dict[str, Any]) -> None:
199
- field_schema.update({"x-parameter": "file_url", "type": "string"})
181
+ def __schema_type_properties__(cls) -> dict:
182
+ return {"x-parameter": "file_url", "type": "string"}
200
183
 
201
184
 
202
185
  class Context(BaseModel):
203
- class Config:
204
- extra = Extra.allow
186
+ model_config = ConfigDict(extra="allow")
205
187
 
206
188
  def to_json(self):
207
- return self.json()
189
+ return self.model_dump()
208
190
 
209
191
  @classmethod
210
192
  def from_json(cls, json_str: str):
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "agenta"
3
- version = "0.16.0"
3
+ version = "0.17.1"
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>"]
@@ -19,7 +19,7 @@ keywords = ["LLMOps", "LLM", "evaluation", "prompt engineering"]
19
19
  python = "^3.9"
20
20
  docker = ">=6.1.1,<8.0.0"
21
21
  click = "^8.1.3"
22
- fastapi = ">=0.96.1"
22
+ fastapi = ">=0.100.0"
23
23
  toml = "^0.10.2"
24
24
  questionary = ">=1.10,<3.0"
25
25
  ipdb = ">=0.13"
@@ -27,7 +27,7 @@ python-dotenv = "^1.0.0"
27
27
  python-multipart = ">=0.0.6,<0.0.10"
28
28
  importlib-metadata = ">=6.7,<8.0"
29
29
  posthog = "^3.1.0"
30
- pydantic = "1.10.13"
30
+ pydantic = ">=2"
31
31
  httpx = ">=0.24, <0.28"
32
32
  pymongo = "^4.6.3"
33
33
  cachetools = "^5.3.3"
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
File without changes
File without changes
File without changes