agenta 0.52.6__py3-none-any.whl → 0.63.2__py3-none-any.whl

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.
Files changed (271) hide show
  1. agenta/__init__.py +12 -3
  2. agenta/client/__init__.py +4 -4
  3. agenta/client/backend/__init__.py +4 -4
  4. agenta/client/backend/api_keys/client.py +2 -2
  5. agenta/client/backend/billing/client.py +2 -2
  6. agenta/client/backend/billing/raw_client.py +2 -2
  7. agenta/client/backend/client.py +56 -48
  8. agenta/client/backend/core/client_wrapper.py +2 -2
  9. agenta/client/backend/core/file.py +3 -1
  10. agenta/client/backend/core/http_client.py +3 -3
  11. agenta/client/backend/core/pydantic_utilities.py +13 -3
  12. agenta/client/backend/human_evaluations/client.py +2 -2
  13. agenta/client/backend/human_evaluations/raw_client.py +2 -2
  14. agenta/client/backend/organization/client.py +46 -34
  15. agenta/client/backend/organization/raw_client.py +32 -26
  16. agenta/client/backend/raw_client.py +26 -26
  17. agenta/client/backend/testsets/client.py +18 -18
  18. agenta/client/backend/testsets/raw_client.py +30 -30
  19. agenta/client/backend/types/__init__.py +4 -4
  20. agenta/client/backend/types/account_request.py +3 -1
  21. agenta/client/backend/types/account_response.py +3 -1
  22. agenta/client/backend/types/agenta_node_dto.py +3 -1
  23. agenta/client/backend/types/agenta_nodes_response.py +3 -1
  24. agenta/client/backend/types/agenta_root_dto.py +3 -1
  25. agenta/client/backend/types/agenta_roots_response.py +3 -1
  26. agenta/client/backend/types/agenta_tree_dto.py +3 -1
  27. agenta/client/backend/types/agenta_trees_response.py +3 -1
  28. agenta/client/backend/types/aggregated_result.py +3 -1
  29. agenta/client/backend/types/analytics_response.py +3 -1
  30. agenta/client/backend/types/annotation.py +6 -4
  31. agenta/client/backend/types/annotation_create.py +3 -1
  32. agenta/client/backend/types/annotation_edit.py +3 -1
  33. agenta/client/backend/types/annotation_link.py +3 -1
  34. agenta/client/backend/types/annotation_link_response.py +3 -1
  35. agenta/client/backend/types/annotation_query.py +3 -1
  36. agenta/client/backend/types/annotation_query_request.py +3 -1
  37. agenta/client/backend/types/annotation_reference.py +3 -1
  38. agenta/client/backend/types/annotation_references.py +3 -1
  39. agenta/client/backend/types/annotation_response.py +3 -1
  40. agenta/client/backend/types/annotations_response.py +3 -1
  41. agenta/client/backend/types/app.py +3 -1
  42. agenta/client/backend/types/app_variant_response.py +3 -1
  43. agenta/client/backend/types/app_variant_revision.py +3 -1
  44. agenta/client/backend/types/artifact.py +6 -4
  45. agenta/client/backend/types/base_output.py +3 -1
  46. agenta/client/backend/types/body_fetch_workflow_revision.py +3 -1
  47. agenta/client/backend/types/body_import_testset.py +3 -1
  48. agenta/client/backend/types/bucket_dto.py +3 -1
  49. agenta/client/backend/types/collect_status_response.py +3 -1
  50. agenta/client/backend/types/config_db.py +3 -1
  51. agenta/client/backend/types/config_dto.py +3 -1
  52. agenta/client/backend/types/config_response_model.py +3 -1
  53. agenta/client/backend/types/correct_answer.py +3 -1
  54. agenta/client/backend/types/create_app_output.py +3 -1
  55. agenta/client/backend/types/custom_model_settings_dto.py +3 -1
  56. agenta/client/backend/types/custom_provider_dto.py +3 -1
  57. agenta/client/backend/types/custom_provider_kind.py +1 -1
  58. agenta/client/backend/types/custom_provider_settings_dto.py +3 -1
  59. agenta/client/backend/types/delete_evaluation.py +3 -1
  60. agenta/client/backend/types/environment_output.py +3 -1
  61. agenta/client/backend/types/environment_output_extended.py +3 -1
  62. agenta/client/backend/types/environment_revision.py +3 -1
  63. agenta/client/backend/types/error.py +3 -1
  64. agenta/client/backend/types/evaluation.py +3 -1
  65. agenta/client/backend/types/evaluation_scenario.py +3 -1
  66. agenta/client/backend/types/evaluation_scenario_input.py +3 -1
  67. agenta/client/backend/types/evaluation_scenario_output.py +3 -1
  68. agenta/client/backend/types/evaluation_scenario_result.py +3 -1
  69. agenta/client/backend/types/evaluator.py +6 -4
  70. agenta/client/backend/types/evaluator_config.py +6 -4
  71. agenta/client/backend/types/evaluator_flags.py +3 -1
  72. agenta/client/backend/types/evaluator_mapping_output_interface.py +3 -1
  73. agenta/client/backend/types/evaluator_output_interface.py +3 -1
  74. agenta/client/backend/types/evaluator_query.py +3 -1
  75. agenta/client/backend/types/evaluator_query_request.py +3 -1
  76. agenta/client/backend/types/evaluator_request.py +3 -1
  77. agenta/client/backend/types/evaluator_response.py +3 -1
  78. agenta/client/backend/types/evaluators_response.py +3 -1
  79. agenta/client/backend/types/exception_dto.py +3 -1
  80. agenta/client/backend/types/extended_o_tel_tracing_response.py +3 -1
  81. agenta/client/backend/types/get_config_response.py +3 -1
  82. agenta/client/backend/types/header.py +3 -1
  83. agenta/client/backend/types/http_validation_error.py +3 -1
  84. agenta/client/backend/types/human_evaluation.py +3 -1
  85. agenta/client/backend/types/human_evaluation_scenario.py +3 -1
  86. agenta/client/backend/types/human_evaluation_scenario_input.py +3 -1
  87. agenta/client/backend/types/human_evaluation_scenario_output.py +3 -1
  88. agenta/client/backend/types/invite_request.py +3 -1
  89. agenta/client/backend/types/legacy_analytics_response.py +3 -1
  90. agenta/client/backend/types/legacy_data_point.py +3 -1
  91. agenta/client/backend/types/legacy_evaluator.py +3 -1
  92. agenta/client/backend/types/legacy_scope_request.py +3 -1
  93. agenta/client/backend/types/legacy_scopes_response.py +3 -1
  94. agenta/client/backend/types/legacy_subscription_request.py +3 -1
  95. agenta/client/backend/types/legacy_user_request.py +3 -1
  96. agenta/client/backend/types/legacy_user_response.py +3 -1
  97. agenta/client/backend/types/lifecycle_dto.py +3 -1
  98. agenta/client/backend/types/link_dto.py +3 -1
  99. agenta/client/backend/types/list_api_keys_response.py +3 -1
  100. agenta/client/backend/types/llm_run_rate_limit.py +3 -1
  101. agenta/client/backend/types/meta_request.py +3 -1
  102. agenta/client/backend/types/metrics_dto.py +3 -1
  103. agenta/client/backend/types/new_testset.py +3 -1
  104. agenta/client/backend/types/node_dto.py +3 -1
  105. agenta/client/backend/types/o_tel_context_dto.py +3 -1
  106. agenta/client/backend/types/o_tel_event.py +6 -4
  107. agenta/client/backend/types/o_tel_event_dto.py +3 -1
  108. agenta/client/backend/types/o_tel_extra_dto.py +3 -1
  109. agenta/client/backend/types/o_tel_flat_span.py +6 -4
  110. agenta/client/backend/types/o_tel_link.py +6 -4
  111. agenta/client/backend/types/o_tel_link_dto.py +3 -1
  112. agenta/client/backend/types/o_tel_links_response.py +3 -1
  113. agenta/client/backend/types/o_tel_span.py +1 -1
  114. agenta/client/backend/types/o_tel_span_dto.py +3 -1
  115. agenta/client/backend/types/o_tel_spans_tree.py +3 -1
  116. agenta/client/backend/types/o_tel_tracing_data_response.py +3 -1
  117. agenta/client/backend/types/o_tel_tracing_request.py +3 -1
  118. agenta/client/backend/types/o_tel_tracing_response.py +3 -1
  119. agenta/client/backend/types/organization.py +3 -1
  120. agenta/client/backend/types/organization_details.py +3 -1
  121. agenta/client/backend/types/organization_membership_request.py +3 -1
  122. agenta/client/backend/types/organization_output.py +3 -1
  123. agenta/client/backend/types/organization_request.py +3 -1
  124. agenta/client/backend/types/parent_dto.py +3 -1
  125. agenta/client/backend/types/project_membership_request.py +3 -1
  126. agenta/client/backend/types/project_request.py +3 -1
  127. agenta/client/backend/types/project_scope.py +3 -1
  128. agenta/client/backend/types/projects_response.py +3 -1
  129. agenta/client/backend/types/reference.py +6 -4
  130. agenta/client/backend/types/reference_dto.py +3 -1
  131. agenta/client/backend/types/reference_request_model.py +3 -1
  132. agenta/client/backend/types/result.py +3 -1
  133. agenta/client/backend/types/root_dto.py +3 -1
  134. agenta/client/backend/types/scopes_response_model.py +3 -1
  135. agenta/client/backend/types/secret_dto.py +3 -1
  136. agenta/client/backend/types/secret_response_dto.py +3 -1
  137. agenta/client/backend/types/simple_evaluation_output.py +3 -1
  138. agenta/client/backend/types/span_dto.py +6 -4
  139. agenta/client/backend/types/standard_provider_dto.py +3 -1
  140. agenta/client/backend/types/standard_provider_settings_dto.py +3 -1
  141. agenta/client/backend/types/status_dto.py +3 -1
  142. agenta/client/backend/types/tags_request.py +3 -1
  143. agenta/client/backend/types/testcase_response.py +6 -4
  144. agenta/client/backend/types/testset.py +6 -4
  145. agenta/client/backend/types/{test_set_output_response.py → testset_output_response.py} +4 -2
  146. agenta/client/backend/types/testset_request.py +3 -1
  147. agenta/client/backend/types/testset_response.py +3 -1
  148. agenta/client/backend/types/{test_set_simple_response.py → testset_simple_response.py} +4 -2
  149. agenta/client/backend/types/testsets_response.py +3 -1
  150. agenta/client/backend/types/time_dto.py +3 -1
  151. agenta/client/backend/types/tree_dto.py +3 -1
  152. agenta/client/backend/types/update_app_output.py +3 -1
  153. agenta/client/backend/types/user_request.py +3 -1
  154. agenta/client/backend/types/validation_error.py +3 -1
  155. agenta/client/backend/types/workflow_artifact.py +6 -4
  156. agenta/client/backend/types/workflow_data.py +3 -1
  157. agenta/client/backend/types/workflow_flags.py +3 -1
  158. agenta/client/backend/types/workflow_request.py +3 -1
  159. agenta/client/backend/types/workflow_response.py +3 -1
  160. agenta/client/backend/types/workflow_revision.py +6 -4
  161. agenta/client/backend/types/workflow_revision_request.py +3 -1
  162. agenta/client/backend/types/workflow_revision_response.py +3 -1
  163. agenta/client/backend/types/workflow_revisions_response.py +3 -1
  164. agenta/client/backend/types/workflow_variant.py +6 -4
  165. agenta/client/backend/types/workflow_variant_request.py +3 -1
  166. agenta/client/backend/types/workflow_variant_response.py +3 -1
  167. agenta/client/backend/types/workflow_variants_response.py +3 -1
  168. agenta/client/backend/types/workflows_response.py +3 -1
  169. agenta/client/backend/types/workspace.py +3 -1
  170. agenta/client/backend/types/workspace_member_response.py +3 -1
  171. agenta/client/backend/types/workspace_membership_request.py +3 -1
  172. agenta/client/backend/types/workspace_permission.py +3 -1
  173. agenta/client/backend/types/workspace_request.py +3 -1
  174. agenta/client/backend/types/workspace_response.py +3 -1
  175. agenta/client/backend/vault/raw_client.py +4 -4
  176. agenta/client/backend/workspace/client.py +2 -2
  177. agenta/client/client.py +102 -88
  178. agenta/sdk/__init__.py +52 -3
  179. agenta/sdk/agenta_init.py +43 -16
  180. agenta/sdk/assets.py +23 -15
  181. agenta/sdk/context/serving.py +20 -8
  182. agenta/sdk/context/tracing.py +40 -22
  183. agenta/sdk/contexts/__init__.py +0 -0
  184. agenta/sdk/contexts/routing.py +38 -0
  185. agenta/sdk/contexts/running.py +57 -0
  186. agenta/sdk/contexts/tracing.py +86 -0
  187. agenta/sdk/decorators/__init__.py +1 -0
  188. agenta/sdk/decorators/routing.py +284 -0
  189. agenta/sdk/decorators/running.py +692 -98
  190. agenta/sdk/decorators/serving.py +20 -21
  191. agenta/sdk/decorators/tracing.py +176 -131
  192. agenta/sdk/engines/__init__.py +0 -0
  193. agenta/sdk/engines/running/__init__.py +0 -0
  194. agenta/sdk/engines/running/utils.py +17 -0
  195. agenta/sdk/engines/tracing/__init__.py +1 -0
  196. agenta/sdk/engines/tracing/attributes.py +185 -0
  197. agenta/sdk/engines/tracing/conventions.py +49 -0
  198. agenta/sdk/engines/tracing/exporters.py +130 -0
  199. agenta/sdk/engines/tracing/inline.py +1154 -0
  200. agenta/sdk/engines/tracing/processors.py +190 -0
  201. agenta/sdk/engines/tracing/propagation.py +102 -0
  202. agenta/sdk/engines/tracing/spans.py +136 -0
  203. agenta/sdk/engines/tracing/tracing.py +324 -0
  204. agenta/sdk/evaluations/__init__.py +2 -0
  205. agenta/sdk/evaluations/metrics.py +37 -0
  206. agenta/sdk/evaluations/preview/__init__.py +0 -0
  207. agenta/sdk/evaluations/preview/evaluate.py +765 -0
  208. agenta/sdk/evaluations/preview/utils.py +861 -0
  209. agenta/sdk/evaluations/results.py +66 -0
  210. agenta/sdk/evaluations/runs.py +153 -0
  211. agenta/sdk/evaluations/scenarios.py +48 -0
  212. agenta/sdk/litellm/litellm.py +12 -0
  213. agenta/sdk/litellm/mockllm.py +6 -8
  214. agenta/sdk/litellm/mocks/__init__.py +5 -5
  215. agenta/sdk/managers/applications.py +304 -0
  216. agenta/sdk/managers/config.py +2 -2
  217. agenta/sdk/managers/evaluations.py +0 -0
  218. agenta/sdk/managers/evaluators.py +303 -0
  219. agenta/sdk/managers/secrets.py +161 -24
  220. agenta/sdk/managers/shared.py +3 -1
  221. agenta/sdk/managers/testsets.py +441 -0
  222. agenta/sdk/managers/vault.py +3 -3
  223. agenta/sdk/middleware/auth.py +0 -176
  224. agenta/sdk/middleware/config.py +27 -9
  225. agenta/sdk/middleware/vault.py +204 -9
  226. agenta/sdk/middlewares/__init__.py +0 -0
  227. agenta/sdk/middlewares/routing/__init__.py +0 -0
  228. agenta/sdk/middlewares/routing/auth.py +263 -0
  229. agenta/sdk/middlewares/routing/cors.py +30 -0
  230. agenta/sdk/middlewares/routing/otel.py +29 -0
  231. agenta/sdk/middlewares/running/__init__.py +0 -0
  232. agenta/sdk/middlewares/running/normalizer.py +321 -0
  233. agenta/sdk/middlewares/running/resolver.py +161 -0
  234. agenta/sdk/middlewares/running/vault.py +140 -0
  235. agenta/sdk/models/__init__.py +0 -0
  236. agenta/sdk/models/blobs.py +33 -0
  237. agenta/sdk/models/evaluations.py +119 -0
  238. agenta/sdk/models/git.py +126 -0
  239. agenta/sdk/models/shared.py +167 -0
  240. agenta/sdk/models/testsets.py +163 -0
  241. agenta/sdk/models/tracing.py +202 -0
  242. agenta/sdk/models/workflows.py +753 -0
  243. agenta/sdk/tracing/attributes.py +4 -4
  244. agenta/sdk/tracing/exporters.py +67 -17
  245. agenta/sdk/tracing/inline.py +37 -45
  246. agenta/sdk/tracing/processors.py +97 -0
  247. agenta/sdk/tracing/propagation.py +3 -1
  248. agenta/sdk/tracing/spans.py +4 -0
  249. agenta/sdk/tracing/tracing.py +13 -15
  250. agenta/sdk/types.py +222 -22
  251. agenta/sdk/utils/cache.py +1 -1
  252. agenta/sdk/utils/client.py +38 -0
  253. agenta/sdk/utils/helpers.py +13 -12
  254. agenta/sdk/utils/logging.py +18 -78
  255. agenta/sdk/utils/references.py +23 -0
  256. agenta/sdk/workflows/builtin.py +600 -0
  257. agenta/sdk/workflows/configurations.py +22 -0
  258. agenta/sdk/workflows/errors.py +292 -0
  259. agenta/sdk/workflows/handlers.py +1791 -0
  260. agenta/sdk/workflows/interfaces.py +948 -0
  261. agenta/sdk/workflows/sandbox.py +118 -0
  262. agenta/sdk/workflows/utils.py +303 -6
  263. {agenta-0.52.6.dist-info → agenta-0.63.2.dist-info}/METADATA +37 -33
  264. agenta-0.63.2.dist-info/RECORD +421 -0
  265. {agenta-0.52.6.dist-info → agenta-0.63.2.dist-info}/WHEEL +1 -1
  266. agenta/sdk/middleware/adapt.py +0 -253
  267. agenta/sdk/middleware/base.py +0 -40
  268. agenta/sdk/middleware/flags.py +0 -40
  269. agenta/sdk/workflows/types.py +0 -472
  270. agenta-0.52.6.dist-info/RECORD +0 -371
  271. /agenta/sdk/{workflows → engines/running}/registry.py +0 -0
@@ -0,0 +1,118 @@
1
+ from typing import Union, Text, Dict, Any
2
+
3
+ from RestrictedPython import safe_builtins, compile_restricted, utility_builtins
4
+ from RestrictedPython.Eval import (
5
+ default_guarded_getiter,
6
+ default_guarded_getitem,
7
+ )
8
+ from RestrictedPython.Guards import (
9
+ guarded_iter_unpack_sequence,
10
+ full_write_guard,
11
+ )
12
+
13
+
14
+ def is_import_safe(python_code: Text) -> bool:
15
+ """Checks if the imports in the python code contains a system-level import.
16
+
17
+ Args:
18
+ python_code (str): The Python code to be executed
19
+
20
+ Returns:
21
+ bool - module is secured or not
22
+ """
23
+
24
+ disallowed_imports = ["os", "subprocess", "threading", "multiprocessing"]
25
+ for import_ in disallowed_imports:
26
+ if import_ in python_code:
27
+ return False
28
+ return True
29
+
30
+
31
+ def execute_code_safely(
32
+ app_params: Dict[str, Any],
33
+ inputs: Dict[str, Any],
34
+ output: Union[dict, str],
35
+ correct_answer: Any, # for backward compatibility reasons
36
+ code: Text,
37
+ ) -> Union[float, None]:
38
+ """
39
+ Execute the provided Python code safely using RestrictedPython.
40
+
41
+ Args:
42
+ - app_params (Dict[str, str]): The parameters of the app variant.
43
+ - inputs (dict): Inputs to be used during code execution.
44
+ - output (str): The output of the app variant after being called.
45
+ - correct_answer (str): The correct answer (or target) of the app variant.
46
+ - code (Text): The Python code to be executed.
47
+ - datapoint (Dict[str, str]): The test datapoint.
48
+
49
+ Returns:
50
+ - (float): Result of the execution if successful. Should be between 0 and 1.
51
+ - None if execution fails or result is not a float between 0 and 1.
52
+ """
53
+ # Define the available built-ins
54
+ local_builtins = safe_builtins.copy()
55
+
56
+ # Add the __import__ built-in function to the local builtins
57
+ local_builtins["__import__"] = __import__
58
+
59
+ # Define supported packages
60
+ allowed_imports = [
61
+ "math",
62
+ "random",
63
+ "datetime",
64
+ "json",
65
+ "requests",
66
+ "typing",
67
+ ]
68
+
69
+ # Create a dictionary to simulate allowed imports
70
+ allowed_modules = {}
71
+ for package_name in allowed_imports:
72
+ allowed_modules[package_name] = __import__(package_name)
73
+
74
+ # Add the allowed modules to the local built-ins
75
+ local_builtins.update(allowed_modules)
76
+ local_builtins.update(utility_builtins)
77
+
78
+ # Define the environment for the code execution
79
+ environment = {
80
+ "_getiter_": default_guarded_getiter,
81
+ "_getitem_": default_guarded_getitem,
82
+ "_iter_unpack_sequence_": guarded_iter_unpack_sequence,
83
+ "_write_": full_write_guard,
84
+ "__builtins__": local_builtins,
85
+ }
86
+
87
+ # Compile the code in a restricted environment
88
+ byte_code = compile_restricted(code, filename="<inline>", mode="exec")
89
+
90
+ # Call the evaluation function, extract the result if it exists
91
+ # and is a float between 0 and 1
92
+ try:
93
+ # Execute the code
94
+ exec(byte_code, environment)
95
+
96
+ # Call the evaluation function, extract the result
97
+ result = environment["evaluate"](app_params, inputs, output, correct_answer)
98
+
99
+ # Attempt to convert result to float
100
+ if isinstance(result, (float, int, str)):
101
+ try:
102
+ result = float(result)
103
+ except ValueError as e:
104
+ raise ValueError(f"Result cannot be converted to float: {e}")
105
+
106
+ if not isinstance(result, float):
107
+ raise TypeError(f"Result is not a float after conversion: {type(result)}")
108
+
109
+ return result
110
+
111
+ except KeyError as e:
112
+ raise KeyError(f"Missing expected key in environment: {e}")
113
+
114
+ except SyntaxError as e:
115
+ raise SyntaxError(f"Syntax error in provided code: {e}")
116
+
117
+ except Exception as e:
118
+ raise RuntimeError(f"Error during code execution: {e}")
@@ -1,17 +1,314 @@
1
- from typing import Optional, Tuple
1
+ # /agenta/sdk/workflows/utils.py
2
2
 
3
+ from typing import Optional, Tuple, Callable
3
4
 
4
- async def parse_service_uri(
5
+ from agenta.sdk.models.workflows import WorkflowServiceInterface
6
+
7
+ from agenta.sdk.workflows.handlers import (
8
+ echo_v0,
9
+ auto_exact_match_v0,
10
+ auto_regex_test_v0,
11
+ field_match_test_v0,
12
+ auto_webhook_test_v0,
13
+ auto_custom_code_run_v0,
14
+ auto_ai_critique_v0,
15
+ auto_starts_with_v0,
16
+ auto_ends_with_v0,
17
+ auto_contains_v0,
18
+ auto_contains_any_v0,
19
+ auto_contains_all_v0,
20
+ auto_contains_json_v0,
21
+ auto_json_diff_v0,
22
+ auto_levenshtein_distance_v0,
23
+ auto_similarity_match_v0,
24
+ auto_semantic_similarity_v0,
25
+ completion_v0,
26
+ chat_v0,
27
+ )
28
+
29
+ from agenta.sdk.workflows.interfaces import (
30
+ echo_v0_interface,
31
+ auto_exact_match_v0_interface,
32
+ auto_regex_test_v0_interface,
33
+ field_match_test_v0_interface,
34
+ auto_webhook_test_v0_interface,
35
+ auto_custom_code_run_v0_interface,
36
+ auto_ai_critique_v0_interface,
37
+ auto_starts_with_v0_interface,
38
+ auto_ends_with_v0_interface,
39
+ auto_contains_v0_interface,
40
+ auto_contains_any_v0_interface,
41
+ auto_contains_all_v0_interface,
42
+ auto_contains_json_v0_interface,
43
+ auto_json_diff_v0_interface,
44
+ auto_levenshtein_distance_v0_interface,
45
+ auto_similarity_match_v0_interface,
46
+ auto_semantic_similarity_v0_interface,
47
+ completion_v0_interface,
48
+ chat_v0_interface,
49
+ )
50
+
51
+
52
+ from agenta.sdk.workflows.configurations import (
53
+ echo_v0_configuration,
54
+ auto_exact_match_v0_configuration,
55
+ auto_regex_test_v0_configuration,
56
+ field_match_test_v0_configuration,
57
+ auto_webhook_test_v0_configuration,
58
+ auto_custom_code_run_v0_configuration,
59
+ auto_ai_critique_v0_configuration,
60
+ auto_starts_with_v0_configuration,
61
+ auto_ends_with_v0_configuration,
62
+ auto_contains_v0_configuration,
63
+ auto_contains_any_v0_configuration,
64
+ auto_contains_all_v0_configuration,
65
+ auto_contains_json_v0_configuration,
66
+ auto_json_diff_v0_configuration,
67
+ auto_levenshtein_distance_v0_configuration,
68
+ auto_similarity_match_v0_configuration,
69
+ auto_semantic_similarity_v0_configuration,
70
+ completion_v0_configuration,
71
+ chat_v0_configuration,
72
+ )
73
+
74
+ INTERFACE_REGISTRY: dict = dict(
75
+ agenta={
76
+ "built-in": dict(
77
+ echo=dict(v0=echo_v0_interface),
78
+ auto_exact_match=dict(v0=auto_exact_match_v0_interface),
79
+ auto_regex_test=dict(v0=auto_regex_test_v0_interface),
80
+ field_match_test=dict(v0=field_match_test_v0_interface),
81
+ auto_webhook_test=dict(v0=auto_webhook_test_v0_interface),
82
+ auto_custom_code_run=dict(v0=auto_custom_code_run_v0_interface),
83
+ auto_ai_critique=dict(v0=auto_ai_critique_v0_interface),
84
+ auto_starts_with=dict(v0=auto_starts_with_v0_interface),
85
+ auto_ends_with=dict(v0=auto_ends_with_v0_interface),
86
+ auto_contains=dict(v0=auto_contains_v0_interface),
87
+ auto_contains_any=dict(v0=auto_contains_any_v0_interface),
88
+ auto_contains_all=dict(v0=auto_contains_all_v0_interface),
89
+ auto_contains_json=dict(v0=auto_contains_json_v0_interface),
90
+ auto_json_diff=dict(v0=auto_json_diff_v0_interface),
91
+ auto_levenshtein_distance=dict(v0=auto_levenshtein_distance_v0_interface),
92
+ auto_similarity_match=dict(v0=auto_similarity_match_v0_interface),
93
+ auto_semantic_similarity=dict(v0=auto_semantic_similarity_v0_interface),
94
+ completion=dict(v0=completion_v0_interface),
95
+ chat=dict(v0=chat_v0_interface),
96
+ ),
97
+ },
98
+ )
99
+
100
+ CONFIGURATION_REGISTRY: dict = dict(
101
+ agenta={
102
+ "built-in": dict(
103
+ echo=dict(v0=echo_v0_configuration),
104
+ auto_exact_match=dict(v0=auto_exact_match_v0_configuration),
105
+ auto_regex_test=dict(v0=auto_regex_test_v0_configuration),
106
+ field_match_test=dict(v0=field_match_test_v0_configuration),
107
+ auto_webhook_test=dict(v0=auto_webhook_test_v0_configuration),
108
+ auto_custom_code_run=dict(v0=auto_custom_code_run_v0_configuration),
109
+ auto_ai_critique=dict(v0=auto_ai_critique_v0_configuration),
110
+ auto_starts_with=dict(v0=auto_starts_with_v0_configuration),
111
+ auto_ends_with=dict(v0=auto_ends_with_v0_configuration),
112
+ auto_contains=dict(v0=auto_contains_v0_configuration),
113
+ auto_contains_any=dict(v0=auto_contains_any_v0_configuration),
114
+ auto_contains_all=dict(v0=auto_contains_all_v0_configuration),
115
+ auto_contains_json=dict(v0=auto_contains_json_v0_configuration),
116
+ auto_json_diff=dict(v0=auto_json_diff_v0_configuration),
117
+ auto_levenshtein_distance=dict(
118
+ v0=auto_levenshtein_distance_v0_configuration
119
+ ),
120
+ auto_similarity_match=dict(v0=auto_similarity_match_v0_configuration),
121
+ auto_semantic_similarity=dict(v0=auto_semantic_similarity_v0_configuration),
122
+ completion=dict(v0=completion_v0_configuration),
123
+ chat=dict(v0=chat_v0_configuration),
124
+ ),
125
+ },
126
+ )
127
+
128
+ # Global registry for workflow handlers organized by URI structure.
129
+ #
130
+ # URI Format: provider:kind:key:version
131
+ #
132
+ # Structure:
133
+ # HANDLER_REGISTRY[provider][kind][key][version] = handler_callable
134
+ #
135
+ # Components:
136
+ # - provider: The source/namespace of the handler (e.g., "agenta", "user")
137
+ # - kind: The category/type of handler (e.g., "built-in", "custom")
138
+ # - key: The unique identifier for the handler (e.g., "echo", "auto_exact_match", "module.function_name")
139
+ # - version: The version identifier (e.g., "v0", "v1", "latest")
140
+ #
141
+ # Examples:
142
+ # - URI: "agenta:built-in:echo:v0"
143
+ # Access: HANDLER_REGISTRY["agenta"]["built-in"]["echo"]["v0"]
144
+ #
145
+ # - URI: "user:custom:mymodule.my_workflow:latest"
146
+ # Access: HANDLER_REGISTRY["user"]["custom"]["mymodule.my_workflow"]["latest"]
147
+ #
148
+ # Usage:
149
+ # - register_handler(fn, uri) - Registers a new handler with the given URI
150
+ # - retrieve_handler(uri) - Retrieves a handler by its URI
151
+ # - retrieve_interface(uri) - Retrieves the interface configuration for a handler
152
+ # - retrieve_configuration(uri) - Retrieves default parameters for a handler
153
+ #
154
+ # The registry supports automatic URI generation for user-defined workflows:
155
+ # If no URI is provided, register_handler() generates: "user:custom:{module}.{name}:latest"
156
+ HANDLER_REGISTRY: dict = dict(
157
+ agenta={
158
+ "built-in": dict(
159
+ echo=dict(v0=echo_v0),
160
+ auto_exact_match=dict(v0=auto_exact_match_v0),
161
+ auto_regex_test=dict(v0=auto_regex_test_v0),
162
+ field_match_test=dict(v0=field_match_test_v0),
163
+ auto_webhook_test=dict(v0=auto_webhook_test_v0),
164
+ auto_custom_code_run=dict(v0=auto_custom_code_run_v0),
165
+ auto_ai_critique=dict(v0=auto_ai_critique_v0),
166
+ auto_starts_with=dict(v0=auto_starts_with_v0),
167
+ auto_ends_with=dict(v0=auto_ends_with_v0),
168
+ auto_contains=dict(v0=auto_contains_v0),
169
+ auto_contains_any=dict(v0=auto_contains_any_v0),
170
+ auto_contains_all=dict(v0=auto_contains_all_v0),
171
+ auto_contains_json=dict(v0=auto_contains_json_v0),
172
+ auto_json_diff=dict(v0=auto_json_diff_v0),
173
+ auto_levenshtein_distance=dict(v0=auto_levenshtein_distance_v0),
174
+ auto_similarity_match=dict(v0=auto_similarity_match_v0),
175
+ auto_semantic_similarity=dict(v0=auto_semantic_similarity_v0),
176
+ completion=dict(v0=completion_v0),
177
+ chat=dict(v0=chat_v0),
178
+ ),
179
+ },
180
+ )
181
+
182
+
183
+ def parse_uri(
5
184
  uri: str,
6
185
  ) -> Tuple[Optional[str], Optional[str], Optional[str], Optional[str]]:
7
186
  if not uri or not uri.strip():
8
187
  return None, None, None, None
9
188
 
10
- # uri ~ [<provider>|empty]:<kind>:<key>:[<version>|'latest'|empty]
11
-
12
189
  parts = uri.split(":")
13
190
 
14
- if len(parts) != 4:
191
+ # 1 key
192
+ # 2 → kind:key
193
+ # 3 → provider:kind:key
194
+ # 4 → provider:kind:key:version
195
+ if len(parts) == 1:
196
+ provider, kind, key, version = "agenta", "built-in", parts[0], "latest"
197
+ elif len(parts) == 2:
198
+ provider, kind, key, version = "agenta", parts[0], parts[1], "latest"
199
+ elif len(parts) == 3:
200
+ provider, kind, key, version = parts[0], parts[1], parts[2], "latest"
201
+ elif len(parts) == 4:
202
+ provider, kind, key, version = parts[0], parts[1], parts[2], parts[3]
203
+ else:
15
204
  return None, None, None, None
16
205
 
17
- return tuple(parts)
206
+ return provider, kind, key, version
207
+
208
+
209
+ def register_handler(fn: Callable, uri: Optional[str] = None) -> str:
210
+ """Register a handler function in the global handler registry.
211
+
212
+ Stores a callable in the HANDLER_REGISTRY with a hierarchical URI structure
213
+ of provider:kind:key:version. If no URI is provided, generates one automatically
214
+ using the function's module and name (user:custom:module.name:latest).
215
+
216
+ The URI is parsed into components and used to create nested dictionary entries
217
+ in the registry for later retrieval by retrieve_handler().
218
+
219
+ Args:
220
+ fn: The callable function to register
221
+ uri: Optional URI string in format "provider:kind:key:version".
222
+ If None, auto-generates "user:custom:{module}.{name}:latest"
223
+
224
+ Returns:
225
+ The URI string used for registration
226
+
227
+ Raises:
228
+ ValueError: If the URI is invalid or missing required components
229
+
230
+ Example:
231
+ >>> def my_workflow(): pass
232
+ >>> uri = register_handler(my_workflow, "user:custom:my_workflow:v1")
233
+ >>> uri
234
+ 'user:custom:my_workflow:v1'
235
+ """
236
+ if not uri:
237
+ key = f"{fn.__module__}.{fn.__name__}"
238
+ uri = f"user:custom:{key}:latest"
239
+
240
+ provider, kind, key, version = parse_uri(uri) # type: ignore
241
+
242
+ if not provider or not kind or not key or not version:
243
+ raise ValueError(f"Invalid URI: {uri}")
244
+
245
+ HANDLER_REGISTRY.setdefault(provider, {}).setdefault(kind, {}).setdefault(
246
+ key, {}
247
+ ).setdefault(version, fn)
248
+
249
+ return uri
250
+
251
+
252
+ def _get_with_latest(
253
+ registry: dict,
254
+ provider: Optional[str] = None,
255
+ kind: Optional[str] = None,
256
+ key: Optional[str] = None,
257
+ version: Optional[str] = None,
258
+ ):
259
+ kind_dict = registry.get(provider, {}).get(kind, {}).get(key, {})
260
+
261
+ if not isinstance(kind_dict, dict) or not kind_dict:
262
+ return None
263
+
264
+ if version == "latest":
265
+ # if "latest" explicitly exists, prefer it
266
+ if "latest" in kind_dict:
267
+ return kind_dict.get("latest")
268
+
269
+ # collect keys of the form vN
270
+ candidates = [
271
+ (int(v[1:]), v)
272
+ for v in kind_dict.keys()
273
+ if isinstance(v, str) and v.startswith("v") and v[1:].isdigit()
274
+ ]
275
+ if not candidates:
276
+ return None
277
+ # get the highest int N
278
+ _, best_key = max(candidates, key=lambda x: x[0])
279
+ return kind_dict.get(best_key)
280
+
281
+ return kind_dict.get(version)
282
+
283
+
284
+ def retrieve_handler(uri: Optional[str] = None) -> Optional[Callable]:
285
+ if not uri:
286
+ return None
287
+ provider, kind, key, version = parse_uri(uri)
288
+
289
+ return _get_with_latest(HANDLER_REGISTRY, provider, kind, key, version)
290
+
291
+
292
+ def retrieve_interface(uri: Optional[str] = None) -> Optional[WorkflowServiceInterface]:
293
+ if not uri:
294
+ return None
295
+ provider, kind, key, version = parse_uri(uri)
296
+
297
+ return _get_with_latest(INTERFACE_REGISTRY, provider, kind, key, version)
298
+
299
+
300
+ def retrieve_configuration(uri: Optional[str] = None) -> Optional[dict]:
301
+ if not uri:
302
+ return None
303
+ provider, kind, key, version = parse_uri(uri)
304
+
305
+ return _get_with_latest(CONFIGURATION_REGISTRY, provider, kind, key, version)
306
+
307
+
308
+ def is_custom_uri(uri: Optional[str] = None) -> bool:
309
+ if not uri:
310
+ return True
311
+
312
+ provider, kind, key, version = parse_uri(uri)
313
+
314
+ return provider == "user" and kind == "custom"
@@ -1,41 +1,44 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agenta
3
- Version: 0.52.6
3
+ Version: 0.63.2
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
7
7
  Author-email: mahmoud@agenta.ai
8
- Requires-Python: >=3.9,<4.0
8
+ Requires-Python: >=3.11,<4.0
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.9
13
- Classifier: Programming Language :: Python :: 3.10
14
12
  Classifier: Programming Language :: Python :: 3.11
15
13
  Classifier: Programming Language :: Python :: 3.12
16
14
  Classifier: Programming Language :: Python :: 3.13
17
15
  Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Programming Language :: Python :: 3.9
18
17
  Classifier: Topic :: Software Development :: Libraries
19
18
  Requires-Dist: decorator (>=5.2.1,<6.0.0)
20
19
  Requires-Dist: fastapi (>=0.116.0,<0.117.0)
21
- Requires-Dist: h11 (>=0.16.0)
22
- Requires-Dist: httpx (>=0.28.0)
20
+ Requires-Dist: google-auth (>=2.23,<3)
21
+ Requires-Dist: h11 (>=0.16.0,<0.17.0)
22
+ Requires-Dist: httpx (>=0.28.0,<0.29.0)
23
23
  Requires-Dist: huggingface-hub (<0.31.0)
24
24
  Requires-Dist: importlib-metadata (>=8.0.0,<9.0)
25
25
  Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
26
- Requires-Dist: litellm (==1.76.0)
27
- Requires-Dist: openai (>=1.100.0)
26
+ Requires-Dist: litellm (==1.78.7)
27
+ Requires-Dist: openai (>=1.106.0)
28
28
  Requires-Dist: opentelemetry-api (>=1.27.0,<2.0.0)
29
29
  Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.27.0,<2.0.0)
30
30
  Requires-Dist: opentelemetry-instrumentation (>=0.56b0)
31
31
  Requires-Dist: opentelemetry-sdk (>=1.27.0,<2.0.0)
32
- Requires-Dist: pydantic (>=2)
32
+ Requires-Dist: pydantic (>=2,<3)
33
33
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
34
+ Requires-Dist: python-jsonpath (>=2.0.0,<3.0.0)
34
35
  Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
36
+ Requires-Dist: restrictedpython (>=8.0,<9.0) ; python_version >= "3.11" and python_version < "3.14"
35
37
  Requires-Dist: starlette (>=0.47.0,<0.48.0)
36
38
  Requires-Dist: structlog (>=25.2.0,<26.0.0)
39
+ Requires-Dist: tiktoken (==0.11.0)
37
40
  Requires-Dist: toml (>=0.10.2,<0.11.0)
38
- Project-URL: Documentation, https://docs.agenta.ai
41
+ Project-URL: Documentation, https://agenta.ai/docs/
39
42
  Project-URL: Homepage, https://agenta.ai
40
43
  Project-URL: Repository, https://github.com/agenta-ai/agenta
41
44
  Description-Content-Type: text/markdown
@@ -44,11 +47,12 @@ Description-Content-Type: text/markdown
44
47
  <p align="center">
45
48
  <a href="https://agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
46
49
  <picture >
47
- <source width="275" media="(prefers-color-scheme: dark)" srcset="https://github.com/Agenta-AI/agenta/assets/4510758/cdddf5ad-2352-4920-b1d9-ae7f8d9d7735" >
48
- <source width="275" media="(prefers-color-scheme: light)" srcset="https://github.com/Agenta-AI/agenta/assets/4510758/ab75cbac-b807-496f-aab3-57463a33f726" >
49
- <img alt="Shows the logo of agenta" src="https://github.com/Agenta-AI/agenta/assets/4510758/68e055d4-d7b8-4943-992f-761558c64253" >
50
+ <source width="275" media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/97e31bfc-b1fc-4d19-b443-5aedf6029017" >
51
+ <source width="275" media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/fdc5f23f-2095-4cfc-9511-14c6851c1262" >
52
+ <img alt="Shows the logo of agenta" src="https://github.com/user-attachments/assets/fdc5f23f-2095-4cfc-9511-14c6851c1262" >
50
53
  </picture>
51
54
  </a>
55
+
52
56
  <div align="center">
53
57
  <strong> <h1> The Open-source LLMOps Platform </h1></strong>
54
58
  Build reliable LLM applications faster with integrated prompt management, evaluation, and observability.
@@ -57,9 +61,9 @@ Description-Content-Type: text/markdown
57
61
  <div align="center" >
58
62
  <a href="https://cloud.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
59
63
  <picture >
60
- <source media="(prefers-color-scheme: dark)" srcset="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/9a4fde42-c96c-4ec2-b8d1-c8c0e3851a00/large" >
61
- <source media="(prefers-color-scheme: light)" srcset="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/98140352-14c0-4db1-bafb-a1e8d271d500/large" >
62
- <img alt="Shows the logo of agenta" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/98140352-14c0-4db1-bafb-a1e8d271d500/large" >
64
+ <source media="(prefers-color-scheme: dark)" srcset="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/6fa19a9d-9785-4acf-5d08-e81b1e38b100/large" >
65
+ <source media="(prefers-color-scheme: light)" srcset="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/6fa19a9d-9785-4acf-5d08-e81b1e38b100/large" >
66
+ <img alt="Shows the logo of agenta" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/6fa19a9d-9785-4acf-5d08-e81b1e38b100/large" >
63
67
  </picture>
64
68
  </a>
65
69
  </div>
@@ -68,7 +72,7 @@ Description-Content-Type: text/markdown
68
72
  ---
69
73
 
70
74
  <h3 align="center">
71
- <a href="https://docs.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Documentation</b></a> &bull;
75
+ <a href="https://agenta.ai/docs/?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Documentation</b></a> &bull;
72
76
  <a href="https://agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Website</b></a> &bull;
73
77
  <a href="https://cloud.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Agenta Cloud</b></a>
74
78
  </h3>
@@ -77,7 +81,7 @@ Description-Content-Type: text/markdown
77
81
 
78
82
  <p align="center">
79
83
  <img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT license." />
80
- <a href="https://docs.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
84
+ <a href="https://agenta.ai/docs/?utm_source=github&utm_medium=referral&utm_campaign=readme">
81
85
  <img src="https://img.shields.io/badge/Doc-online-green" alt="Doc">
82
86
  </a>
83
87
  <a href="https://github.com/Agenta-AI/agenta/blob/main/CONTRIBUTING.md">
@@ -125,20 +129,20 @@ Agenta is a platform for building production-grade LLM applications. It helps **
125
129
  Collaborate with Subject Matter Experts (SMEs) on prompt engineering and make sure nothing breaks in production.
126
130
 
127
131
  - **Interactive Playground**: Compare prompts side by side against your test cases
128
- - **Multi-Model Support**: Experiment with 50+ LLM models or [bring-your-own models](https://docs.agenta.ai/prompt-engineering/playground/adding-custom-providers?utm_source=github&utm_medium=referral&utm_campaign=readme)
132
+ - **Multi-Model Support**: Experiment with 50+ LLM models or [bring-your-own models](https://agenta.ai/docs/prompt-engineering/playground/custom-providers?utm_source=github&utm_medium=referral&utm_campaign=readme)
129
133
  - **Version Control**: Version prompts and configurations with branching and environments
130
- - **Complex Configurations**: Enable SMEs to collaborate on [complex configuration schemas](https://docs.agenta.ai/custom-workflows/overview?utm_source=github&utm_medium=referral&utm_campaign=readme) beyond simple prompts
134
+ - **Complex Configurations**: Enable SMEs to collaborate on [complex configuration schemas](https://agenta.ai/docs/custom-workflows/overview?utm_source=github&utm_medium=referral&utm_campaign=readme) beyond simple prompts
131
135
 
132
- [Explore prompt management →](https://docs.agenta.ai/prompt-engineering/overview?utm_source=github&utm_medium=referral&utm_campaign=readme)
136
+ [Explore prompt management →](https://agenta.ai/docs/prompt-engineering/concepts?utm_source=github&utm_medium=referral&utm_campaign=readme)
133
137
 
134
138
  ### 📊 Evaluation & Testing
135
139
  Evaluate your LLM applications systematically with both human and automated feedback.
136
- - **Flexible Test Sets**: Create test cases from production data, playground experiments, or upload CSVs
140
+ - **Flexible Testsets**: Create testcases from production data, playground experiments, or upload CSVs
137
141
  - **Pre-built and Custom Evaluators**: Use LLM-as-judge, one of our 20+ pre-built evaluators, or you custom evaluators
138
142
  - **UI and API Access**: Run evaluations via UI (for SMEs) or programmatically (for engineers)
139
143
  - **Human Feedback Integration**: Collect and incorporate expert annotations
140
144
 
141
- [Explore evaluation frameworks →](https://docs.agenta.ai/evaluation/overview?utm_source=github&utm_medium=referral&utm_campaign=readme)
145
+ [Explore evaluation frameworks →](https://agenta.ai/docs/evaluation/overview?utm_source=github&utm_medium=referral&utm_campaign=readme)
142
146
 
143
147
  ### 📡 Observability & Monitoring
144
148
  Get visibility into your LLM applications in production.
@@ -147,14 +151,14 @@ Get visibility into your LLM applications in production.
147
151
  - **Open Standards**: OpenTelemetry native tracing compatible with OpenLLMetry, and OpenInference
148
152
  - **Integrations**: Comes with pre-built integrations for most models and frameworks
149
153
 
150
- [Learn about observability →](https://docs.agenta.ai/observability/overview?utm_source=github&utm_medium=referral&utm_campaign=readme)
154
+ [Learn about observability →](https://agenta.ai/docs/observability/overview?utm_source=github&utm_medium=referral&utm_campaign=readme)
151
155
 
152
156
  ## 📸 Screenshots
153
157
 
154
- <img alt="Playground" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/e7d16967-d564-4148-3615-03bfe2a29d00/large" />
155
- <img alt="Prompt Management" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/b4210a13-b41e-4dfd-d383-4286fb011e00/large" />
156
- <img alt="Evaluation" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/4b1c62b9-ff6e-4bd1-4c8d-de59b8485e00/large" />
157
- <img alt="Observability" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/5c764759-e525-499e-544a-1077c45e9600/large" />
158
+ <img alt="Playground" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/a4f67ac4-1acc-40c6-7a1a-5616eee7bb00/large" />
159
+ <img alt="Prompt Management" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/65f697d0-3221-4e3c-7232-f350b1976a00/large" />
160
+ <img alt="Evaluation" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/19b5b77e-6945-4419-15b9-cfea197e1300/large" />
161
+ <img alt="Observability" src="https://imagedelivery.net/UNvjPBCIZFONpkVPQTxVuA/efc8a24c-2a2a-427c-f285-7d8b41200700/large" />
158
162
 
159
163
  ## 🚀 Getting Started
160
164
 
@@ -187,7 +191,7 @@ docker compose -f hosting/docker-compose/oss/docker-compose.gh.yml --env-file ho
187
191
 
188
192
  3. Access Agenta at `http://localhost`.
189
193
 
190
- For deploying on a remote host, or using different ports refers to our [self-hosting](https://docs.agenta.ai/self-host/quick-start?utm_source=github&utm_medium=referral&utm_campaign=readme) and [remote deployment documentation](https://docs.agenta.ai/self-host/guides/deploy-remotely?utm_source=github&utm_medium=referral&utm_campaign=readme).
194
+ For deploying on a remote host, or using different ports refers to our [self-hosting](https://agenta.ai/docs/self-host/quick-start?utm_source=github&utm_medium=referral&utm_campaign=readme) and [remote deployment documentation](https://agenta.ai/docs/self-host/guides/deploy-remotely?utm_source=github&utm_medium=referral&utm_campaign=readme).
191
195
 
192
196
  ## 💬 Community
193
197
 
@@ -195,8 +199,8 @@ Find help, explore resources, or get involved:
195
199
 
196
200
  ### 🧰 Support
197
201
 
198
- - **📚 [Documentation](https://docs.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme)** – Full guides and API reference
199
- - **📋 [Changelog](https://docs.agenta.ai/changelog/main?utm_source=github&utm_medium=referral&utm_campaign=readme)** – Track recent updates
202
+ - **📚 [Documentation](https://agenta.ai/docs/?utm_source=github&utm_medium=referral&utm_campaign=readme)** – Full guides and API reference
203
+ - **📋 [Changelog](https://agenta.ai/docs/changelog/main?utm_source=github&utm_medium=referral&utm_campaign=readme)** – Track recent updates
200
204
  - **💬 [Slack Community](https://join.slack.com/t/agenta-hq/shared_invite/zt-37pnbp5s6-mbBrPL863d_oLB61GSNFjw)** – Ask questions and get support
201
205
 
202
206
  ### 🤝 Contribute
@@ -205,7 +209,7 @@ We welcome contributions of all kinds — from filing issues and sharing ideas t
205
209
 
206
210
  - **🐛 [Report bugs](https://github.com/Agenta-AI/agenta/issues)** – Help us by reporting problems you encounter
207
211
  - **💡 [Share ideas and feedback](https://github.com/Agenta-AI/agenta/discussions)** – Suggest features or vote on ideas
208
- - **🔧 [Contribute to the codebase](https://docs.agenta.ai/misc/contributing/getting-started?utm_source=github&utm_medium=referral&utm_campaign=readme)** – Read the guide and open a pull request
212
+ - **🔧 [Contribute to the codebase](https://agenta.ai/docs/misc/contributing/getting-started?utm_source=github&utm_medium=referral&utm_campaign=readme)** – Read the guide and open a pull request
209
213
 
210
214
  ## ⭐ Star Agenta
211
215
 
@@ -223,7 +227,7 @@ We welcome contributions of all kinds — from filing issues and sharing ideas t
223
227
  ## Contributors ✨
224
228
 
225
229
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
226
- [![All Contributors](https://img.shields.io/badge/all_contributors-49-orange.svg?style=flat-square)](#contributors-)
230
+ [![All Contributors](https://img.shields.io/badge/all_contributors-50-orange.svg?style=flat-square)](#contributors-)
227
231
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
228
232
 
229
233
  Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):