agenta 0.12.2__py3-none-any.whl โ 0.32.0a1__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.
Potentially problematic release.
This version of agenta might be problematic. Click here for more details.
- agenta/__init__.py +64 -7
- agenta/cli/helper.py +7 -3
- agenta/cli/main.py +15 -50
- agenta/cli/variant_commands.py +50 -29
- agenta/client/Readme.md +72 -64
- agenta/client/api.py +2 -2
- agenta/client/backend/__init__.py +193 -22
- agenta/client/backend/access_control/__init__.py +1 -0
- agenta/client/backend/access_control/client.py +167 -0
- agenta/client/backend/apps/__init__.py +1 -0
- agenta/client/backend/apps/client.py +1691 -0
- agenta/client/backend/bases/__init__.py +1 -0
- agenta/client/backend/bases/client.py +190 -0
- agenta/client/backend/client.py +2508 -5712
- agenta/client/backend/configs/__init__.py +1 -0
- agenta/client/backend/configs/client.py +604 -0
- agenta/client/backend/containers/__init__.py +5 -0
- agenta/client/backend/containers/client.py +648 -0
- agenta/client/backend/containers/types/__init__.py +5 -0
- agenta/client/backend/{types โ containers/types}/container_templates_response.py +1 -2
- agenta/client/backend/core/__init__.py +30 -0
- agenta/client/backend/core/client_wrapper.py +42 -9
- agenta/client/backend/core/file.py +70 -0
- agenta/client/backend/core/http_client.py +575 -0
- agenta/client/backend/core/jsonable_encoder.py +33 -39
- agenta/client/backend/core/pydantic_utilities.py +325 -0
- agenta/client/backend/core/query_encoder.py +60 -0
- agenta/client/backend/core/remove_none_from_dict.py +2 -2
- agenta/client/backend/core/request_options.py +35 -0
- agenta/client/backend/core/serialization.py +276 -0
- agenta/client/backend/environments/__init__.py +1 -0
- agenta/client/backend/environments/client.py +196 -0
- agenta/client/backend/evaluations/__init__.py +1 -0
- agenta/client/backend/evaluations/client.py +1469 -0
- agenta/client/backend/evaluators/__init__.py +1 -0
- agenta/client/backend/evaluators/client.py +1283 -0
- agenta/client/backend/observability/__init__.py +1 -0
- agenta/client/backend/observability/client.py +1286 -0
- agenta/client/backend/observability_v_1/__init__.py +5 -0
- agenta/client/backend/observability_v_1/client.py +763 -0
- agenta/client/backend/observability_v_1/types/__init__.py +7 -0
- agenta/client/backend/observability_v_1/types/format.py +5 -0
- agenta/client/backend/observability_v_1/types/query_analytics_response.py +7 -0
- agenta/client/backend/observability_v_1/types/query_traces_response.py +11 -0
- agenta/client/backend/scopes/__init__.py +1 -0
- agenta/client/backend/scopes/client.py +114 -0
- agenta/client/backend/testsets/__init__.py +1 -0
- agenta/client/backend/testsets/client.py +1284 -0
- agenta/client/backend/types/__init__.py +154 -26
- agenta/client/backend/types/agenta_node_dto.py +48 -0
- agenta/client/backend/types/agenta_node_dto_nodes_value.py +6 -0
- agenta/client/backend/types/agenta_nodes_response.py +30 -0
- agenta/client/backend/types/agenta_root_dto.py +30 -0
- agenta/client/backend/types/agenta_roots_response.py +30 -0
- agenta/client/backend/types/agenta_tree_dto.py +30 -0
- agenta/client/backend/types/agenta_trees_response.py +30 -0
- agenta/client/backend/types/aggregated_result.py +16 -31
- agenta/client/backend/types/aggregated_result_evaluator_config.py +8 -0
- agenta/client/backend/types/analytics_response.py +24 -0
- agenta/client/backend/types/app.py +17 -30
- agenta/client/backend/types/app_variant_response.py +36 -0
- agenta/client/backend/types/app_variant_revision.py +17 -32
- agenta/client/backend/types/base_output.py +13 -28
- agenta/client/backend/types/body_import_testset.py +15 -31
- agenta/client/backend/types/bucket_dto.py +26 -0
- agenta/client/backend/types/collect_status_response.py +22 -0
- agenta/client/backend/types/config_db.py +16 -31
- agenta/client/backend/types/config_dto.py +32 -0
- agenta/client/backend/types/config_response_model.py +32 -0
- agenta/client/backend/types/correct_answer.py +22 -0
- agenta/client/backend/types/create_app_output.py +13 -28
- agenta/client/backend/types/create_span.py +45 -0
- agenta/client/backend/types/create_trace_response.py +22 -0
- agenta/client/backend/types/docker_env_vars.py +13 -28
- agenta/client/backend/types/environment_output.py +22 -34
- agenta/client/backend/types/environment_output_extended.py +31 -0
- agenta/client/backend/types/environment_revision.py +26 -0
- agenta/client/backend/types/error.py +22 -0
- agenta/client/backend/types/evaluation.py +22 -33
- agenta/client/backend/types/evaluation_scenario.py +18 -33
- agenta/client/backend/types/evaluation_scenario_input.py +16 -31
- agenta/client/backend/types/evaluation_scenario_output.py +17 -30
- agenta/client/backend/types/evaluation_scenario_result.py +14 -29
- agenta/client/backend/types/evaluation_scenario_score_update.py +21 -0
- agenta/client/backend/types/evaluation_status_enum.py +11 -29
- agenta/client/backend/types/evaluation_type.py +3 -21
- agenta/client/backend/types/evaluator.py +20 -31
- agenta/client/backend/types/evaluator_config.py +21 -33
- agenta/client/backend/types/evaluator_mapping_output_interface.py +21 -0
- agenta/client/backend/types/evaluator_output_interface.py +21 -0
- agenta/client/backend/types/exception_dto.py +26 -0
- agenta/client/backend/types/get_config_response.py +23 -0
- agenta/client/backend/types/header_dto.py +22 -0
- agenta/client/backend/types/http_validation_error.py +14 -29
- agenta/client/backend/types/human_evaluation.py +18 -34
- agenta/client/backend/types/human_evaluation_scenario.py +22 -38
- agenta/client/backend/types/human_evaluation_scenario_input.py +13 -28
- agenta/client/backend/types/human_evaluation_scenario_output.py +13 -28
- agenta/client/backend/types/human_evaluation_scenario_update.py +30 -0
- agenta/client/backend/types/human_evaluation_update.py +22 -0
- agenta/client/backend/types/image.py +18 -32
- agenta/client/backend/types/invite_request.py +16 -30
- agenta/client/backend/types/legacy_analytics_response.py +29 -0
- agenta/client/backend/types/legacy_data_point.py +27 -0
- agenta/client/backend/types/lifecycle_dto.py +24 -0
- agenta/client/backend/types/link_dto.py +24 -0
- agenta/client/backend/types/list_api_keys_response.py +24 -0
- agenta/client/backend/types/llm_run_rate_limit.py +13 -28
- agenta/client/backend/types/llm_tokens.py +23 -0
- agenta/client/backend/types/metrics_dto.py +24 -0
- agenta/client/backend/types/new_human_evaluation.py +27 -0
- agenta/client/backend/types/new_testset.py +16 -31
- agenta/client/backend/types/node_dto.py +24 -0
- agenta/client/backend/types/node_type.py +19 -0
- agenta/client/backend/types/o_tel_context_dto.py +22 -0
- agenta/client/backend/types/o_tel_event_dto.py +23 -0
- agenta/client/backend/types/o_tel_extra_dto.py +26 -0
- agenta/client/backend/types/o_tel_link_dto.py +23 -0
- agenta/client/backend/types/o_tel_span_dto.py +37 -0
- agenta/client/backend/types/o_tel_span_kind.py +15 -0
- agenta/client/backend/types/o_tel_spans_response.py +24 -0
- agenta/client/backend/types/o_tel_status_code.py +8 -0
- agenta/client/backend/types/organization.py +22 -35
- agenta/client/backend/types/organization_output.py +13 -28
- agenta/client/backend/types/outputs.py +5 -0
- agenta/client/backend/types/parent_dto.py +21 -0
- agenta/client/backend/types/permission.py +41 -0
- agenta/client/backend/types/projects_response.py +28 -0
- agenta/client/backend/types/provider_key_dto.py +23 -0
- agenta/client/backend/types/provider_kind.py +21 -0
- agenta/client/backend/types/reference_dto.py +23 -0
- agenta/client/backend/types/reference_request_model.py +23 -0
- agenta/client/backend/types/result.py +18 -31
- agenta/client/backend/types/root_dto.py +21 -0
- agenta/client/backend/types/{human_evaluation_scenario_score.py โ score.py} +1 -1
- agenta/client/backend/types/secret_dto.py +24 -0
- agenta/client/backend/types/{human_evaluation_scenario_update_score.py โ secret_kind.py} +1 -1
- agenta/client/backend/types/secret_response_dto.py +27 -0
- agenta/client/backend/types/simple_evaluation_output.py +13 -28
- agenta/client/backend/types/span.py +39 -49
- agenta/client/backend/types/span_detail.py +44 -0
- agenta/client/backend/types/span_dto.py +54 -0
- agenta/client/backend/types/span_dto_nodes_value.py +9 -0
- agenta/client/backend/types/span_status_code.py +5 -0
- agenta/client/backend/types/span_variant.py +23 -0
- agenta/client/backend/types/status_code.py +5 -0
- agenta/client/backend/types/status_dto.py +23 -0
- agenta/client/backend/types/template.py +14 -29
- agenta/client/backend/types/template_image_info.py +21 -35
- agenta/client/backend/types/test_set_output_response.py +20 -33
- agenta/client/backend/types/test_set_simple_response.py +13 -28
- agenta/client/backend/types/time_dto.py +23 -0
- agenta/client/backend/types/trace_detail.py +44 -0
- agenta/client/backend/types/tree_dto.py +23 -0
- agenta/client/backend/types/tree_type.py +5 -0
- agenta/client/backend/types/update_app_output.py +22 -0
- agenta/client/backend/types/uri.py +13 -28
- agenta/client/backend/types/validation_error.py +13 -28
- agenta/client/backend/types/variant_action.py +14 -29
- agenta/client/backend/types/variant_action_enum.py +1 -19
- agenta/client/backend/types/with_pagination.py +26 -0
- agenta/client/backend/types/workspace_member_response.py +23 -0
- agenta/client/backend/types/workspace_permission.py +25 -0
- agenta/client/backend/types/workspace_response.py +29 -0
- agenta/client/backend/types/workspace_role.py +15 -0
- agenta/client/backend/types/workspace_role_response.py +23 -0
- agenta/client/backend/variants/__init__.py +5 -0
- agenta/client/backend/variants/client.py +2814 -0
- agenta/client/backend/variants/types/__init__.py +7 -0
- agenta/client/backend/variants/types/add_variant_from_base_and_config_response.py +8 -0
- agenta/client/backend/vault/__init__.py +1 -0
- agenta/client/backend/vault/client.py +685 -0
- agenta/client/client.py +1 -1
- agenta/config.py +0 -2
- agenta/config.toml +0 -1
- agenta/docker/docker-assets/Dockerfile.cloud.template +2 -1
- agenta/docker/docker-assets/Dockerfile.template +2 -1
- agenta/docker/docker_utils.py +11 -12
- agenta/sdk/__init__.py +58 -7
- agenta/sdk/agenta_init.py +182 -164
- agenta/sdk/assets.py +95 -0
- agenta/sdk/client.py +56 -0
- agenta/sdk/context/__init__.py +0 -0
- agenta/sdk/context/exporting.py +25 -0
- agenta/sdk/context/routing.py +27 -0
- agenta/sdk/context/tracing.py +28 -0
- agenta/sdk/decorators/__init__.py +0 -0
- agenta/sdk/decorators/routing.py +576 -0
- agenta/sdk/decorators/tracing.py +296 -0
- agenta/sdk/litellm/__init__.py +1 -0
- agenta/sdk/litellm/litellm.py +314 -0
- agenta/sdk/litellm/mockllm.py +27 -0
- agenta/sdk/litellm/mocks/__init__.py +26 -0
- agenta/sdk/managers/__init__.py +6 -0
- agenta/sdk/managers/config.py +208 -0
- agenta/sdk/managers/deployment.py +45 -0
- agenta/sdk/managers/secrets.py +38 -0
- agenta/sdk/managers/shared.py +639 -0
- agenta/sdk/managers/variant.py +182 -0
- agenta/sdk/managers/vault.py +16 -0
- agenta/sdk/middleware/__init__.py +0 -0
- agenta/sdk/middleware/auth.py +180 -0
- agenta/sdk/middleware/cache.py +47 -0
- agenta/sdk/middleware/config.py +255 -0
- agenta/sdk/middleware/cors.py +29 -0
- agenta/sdk/middleware/inline.py +38 -0
- agenta/sdk/middleware/mock.py +33 -0
- agenta/sdk/middleware/otel.py +40 -0
- agenta/sdk/middleware/vault.py +145 -0
- agenta/sdk/router.py +0 -7
- agenta/sdk/tracing/__init__.py +1 -0
- agenta/sdk/tracing/attributes.py +141 -0
- agenta/sdk/tracing/conventions.py +49 -0
- agenta/sdk/tracing/exporters.py +103 -0
- agenta/sdk/tracing/inline.py +1146 -0
- agenta/sdk/tracing/processors.py +121 -0
- agenta/sdk/tracing/spans.py +136 -0
- agenta/sdk/tracing/tracing.py +237 -0
- agenta/sdk/types.py +478 -74
- agenta/sdk/utils/__init__.py +0 -0
- agenta/sdk/utils/constants.py +1 -0
- agenta/sdk/utils/{helper/openai_cost.py โ costs.py} +3 -0
- agenta/sdk/utils/exceptions.py +59 -0
- agenta/sdk/utils/globals.py +6 -10
- agenta/sdk/utils/helpers.py +8 -0
- agenta/sdk/utils/logging.py +21 -0
- agenta/sdk/utils/singleton.py +13 -0
- agenta/sdk/utils/timing.py +58 -0
- {agenta-0.12.2.dist-info โ agenta-0.32.0a1.dist-info}/METADATA +98 -151
- agenta-0.32.0a1.dist-info/RECORD +263 -0
- {agenta-0.12.2.dist-info โ agenta-0.32.0a1.dist-info}/WHEEL +1 -1
- agenta/client/backend/types/add_variant_from_base_and_config_response.py +0 -7
- agenta/client/backend/types/app_variant_output.py +0 -47
- agenta/client/backend/types/app_variant_output_extended.py +0 -50
- agenta/client/backend/types/delete_evaluation.py +0 -36
- agenta/client/backend/types/evaluation_webhook.py +0 -36
- agenta/client/backend/types/feedback.py +0 -40
- agenta/client/backend/types/get_config_reponse.py +0 -39
- agenta/client/backend/types/list_api_keys_output.py +0 -39
- agenta/client/backend/types/trace.py +0 -48
- agenta/sdk/agenta_decorator.py +0 -443
- agenta/sdk/context.py +0 -41
- agenta-0.12.2.dist-info/RECORD +0 -114
- {agenta-0.12.2.dist-info โ agenta-0.32.0a1.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from contextlib import AbstractContextManager
|
|
2
|
+
from traceback import format_exc
|
|
3
|
+
from functools import wraps
|
|
4
|
+
from inspect import iscoroutinefunction
|
|
5
|
+
|
|
6
|
+
from agenta.sdk.utils.logging import log
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def display_exception(message: str):
|
|
10
|
+
_len = len("Agenta - ") + len(message) + len(":")
|
|
11
|
+
_bar = "-" * _len
|
|
12
|
+
|
|
13
|
+
log.warning(_bar)
|
|
14
|
+
log.warning("Agenta - %s:", message)
|
|
15
|
+
log.warning(_bar)
|
|
16
|
+
log.warning(format_exc().strip("\n"))
|
|
17
|
+
log.warning(_bar)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class suppress(AbstractContextManager): # pylint: disable=invalid-name
|
|
21
|
+
def __init__(self):
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
def __enter__(self):
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
def __exit__(self, exc_type, exc_value, exc_tb):
|
|
28
|
+
if exc_type is not None:
|
|
29
|
+
display_exception("Exception (suppressed)")
|
|
30
|
+
|
|
31
|
+
return True
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def handle_exceptions():
|
|
35
|
+
def decorator(func):
|
|
36
|
+
is_coroutine_function = iscoroutinefunction(func)
|
|
37
|
+
|
|
38
|
+
@wraps(func)
|
|
39
|
+
async def async_wrapper(*args, **kwargs):
|
|
40
|
+
try:
|
|
41
|
+
return await func(*args, **kwargs)
|
|
42
|
+
|
|
43
|
+
except Exception as e:
|
|
44
|
+
display_exception("Exception")
|
|
45
|
+
|
|
46
|
+
raise e
|
|
47
|
+
|
|
48
|
+
@wraps(func)
|
|
49
|
+
def sync_wrapper(*args, **kwargs):
|
|
50
|
+
try:
|
|
51
|
+
return func(*args, **kwargs)
|
|
52
|
+
except Exception as e:
|
|
53
|
+
display_exception("Exception")
|
|
54
|
+
|
|
55
|
+
raise e
|
|
56
|
+
|
|
57
|
+
return async_wrapper if is_coroutine_function else sync_wrapper
|
|
58
|
+
|
|
59
|
+
return decorator
|
agenta/sdk/utils/globals.py
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import agenta
|
|
1
|
+
import agenta as ag
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def set_global(
|
|
5
|
-
"""Allows usage of agenta.config and agenta.
|
|
4
|
+
def set_global(config=None, tracing=None):
|
|
5
|
+
"""Allows usage of agenta.config and agenta.tracing in the user's code."""
|
|
6
6
|
|
|
7
|
-
Args:
|
|
8
|
-
setup: _description_. Defaults to None.
|
|
9
|
-
config: _description_. Defaults to None.
|
|
10
|
-
"""
|
|
11
|
-
if setup is not None:
|
|
12
|
-
agenta.setup = setup
|
|
13
7
|
if config is not None:
|
|
14
|
-
|
|
8
|
+
ag.config = config
|
|
9
|
+
if tracing is not None:
|
|
10
|
+
ag.tracing = tracing
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from os import getenv
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Logger:
|
|
6
|
+
def __init__(self, name="agenta.logger", level=logging.WARNING):
|
|
7
|
+
if getenv("AGENTA_DEBUG"):
|
|
8
|
+
level = logging.DEBUG
|
|
9
|
+
|
|
10
|
+
self.logger = logging.getLogger(name)
|
|
11
|
+
self.logger.setLevel(level)
|
|
12
|
+
|
|
13
|
+
console_handler = logging.StreamHandler()
|
|
14
|
+
self.logger.addHandler(console_handler)
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def log(self) -> logging.Logger:
|
|
18
|
+
return self.logger
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
log = Logger().log
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from threading import Lock
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Singleton(type):
|
|
5
|
+
_instances = {}
|
|
6
|
+
|
|
7
|
+
_lock: Lock = Lock()
|
|
8
|
+
|
|
9
|
+
def __call__(cls, *args, **kwargs):
|
|
10
|
+
with cls._lock:
|
|
11
|
+
if cls not in cls._instances:
|
|
12
|
+
cls._instances[cls] = super().__call__(*args, **kwargs)
|
|
13
|
+
return cls._instances[cls]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from functools import wraps
|
|
3
|
+
|
|
4
|
+
from agenta.sdk.utils.logging import log
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def timeit(func):
|
|
8
|
+
@wraps(func)
|
|
9
|
+
def wrapper(*args, **kwargs):
|
|
10
|
+
start_time = time.time()
|
|
11
|
+
result = func(*args, **kwargs)
|
|
12
|
+
end_time = time.time()
|
|
13
|
+
|
|
14
|
+
execution_time = end_time - start_time
|
|
15
|
+
|
|
16
|
+
if execution_time < 1e-3:
|
|
17
|
+
time_value = execution_time * 1e6
|
|
18
|
+
unit = "us"
|
|
19
|
+
elif execution_time < 1:
|
|
20
|
+
time_value = execution_time * 1e3
|
|
21
|
+
unit = "ms"
|
|
22
|
+
else:
|
|
23
|
+
time_value = execution_time
|
|
24
|
+
unit = "s"
|
|
25
|
+
|
|
26
|
+
class_name = args[0].__class__.__name__ if args else None
|
|
27
|
+
|
|
28
|
+
log.info(f"'{class_name}.{func.__name__}' executed in {time_value:.4f} {unit}.")
|
|
29
|
+
return result
|
|
30
|
+
|
|
31
|
+
return wrapper
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def atimeit(func):
|
|
35
|
+
@wraps(func)
|
|
36
|
+
async def wrapper(*args, **kwargs):
|
|
37
|
+
start_time = time.time()
|
|
38
|
+
result = await func(*args, **kwargs)
|
|
39
|
+
end_time = time.time()
|
|
40
|
+
|
|
41
|
+
execution_time = end_time - start_time
|
|
42
|
+
|
|
43
|
+
if execution_time < 1e-3:
|
|
44
|
+
time_value = execution_time * 1e6
|
|
45
|
+
unit = "us"
|
|
46
|
+
elif execution_time < 1:
|
|
47
|
+
time_value = execution_time * 1e3
|
|
48
|
+
unit = "ms"
|
|
49
|
+
else:
|
|
50
|
+
time_value = execution_time
|
|
51
|
+
unit = "s"
|
|
52
|
+
|
|
53
|
+
class_name = args[0].__class__.__name__ if args else None
|
|
54
|
+
|
|
55
|
+
log.info(f"'{class_name}.{func.__name__}' executed in {time_value:.4f} {unit}.")
|
|
56
|
+
return result
|
|
57
|
+
|
|
58
|
+
return wrapper
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: agenta
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.32.0a1
|
|
4
4
|
Summary: The SDK for agenta is an open-source LLMOps platform.
|
|
5
|
-
Home-page: https://agenta.ai
|
|
6
5
|
Keywords: LLMOps,LLM,evaluation,prompt engineering
|
|
7
6
|
Author: Mahmoud Mabrouk
|
|
8
7
|
Author-email: mahmoud@agenta.ai
|
|
@@ -14,46 +13,54 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Classifier: Topic :: Software Development :: Libraries
|
|
18
|
+
Requires-Dist: cachetools (>=5.3.3,<6.0.0)
|
|
18
19
|
Requires-Dist: click (>=8.1.3,<9.0.0)
|
|
19
|
-
Requires-Dist: docker (>=6.1.1,<
|
|
20
|
-
Requires-Dist: fastapi (>=0.
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
20
|
+
Requires-Dist: docker (>=6.1.1,<8.0.0)
|
|
21
|
+
Requires-Dist: fastapi (>=0.100.0)
|
|
22
|
+
Requires-Dist: google-generativeai (>=0.8.3,<0.9.0)
|
|
23
|
+
Requires-Dist: httpx (>=0.24,<0.28)
|
|
24
|
+
Requires-Dist: importlib-metadata (>=8.0.0,<9.0)
|
|
25
|
+
Requires-Dist: litellm (>=1.48.0,<2.0.0)
|
|
26
|
+
Requires-Dist: mangum (>=0.19.0,<0.20.0)
|
|
27
|
+
Requires-Dist: openai (>=1.59.7,<2.0.0)
|
|
28
|
+
Requires-Dist: opentelemetry-api (>=1.27.0,<2.0.0)
|
|
29
|
+
Requires-Dist: opentelemetry-exporter-otlp (>=1.27.0,<2.0.0)
|
|
30
|
+
Requires-Dist: opentelemetry-sdk (>=1.27.0,<2.0.0)
|
|
24
31
|
Requires-Dist: posthog (>=3.1.0,<4.0.0)
|
|
25
|
-
Requires-Dist: pydantic (
|
|
32
|
+
Requires-Dist: pydantic (>=2)
|
|
26
33
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: questionary (>=1.10
|
|
34
|
+
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
35
|
+
Requires-Dist: questionary (>=1.10,<3.0)
|
|
29
36
|
Requires-Dist: toml (>=0.10.2,<0.11.0)
|
|
30
37
|
Project-URL: Documentation, https://docs.agenta.ai
|
|
38
|
+
Project-URL: Homepage, https://agenta.ai
|
|
31
39
|
Project-URL: Repository, https://github.com/agenta-ai/agenta
|
|
32
40
|
Description-Content-Type: text/markdown
|
|
33
41
|
|
|
34
|
-
<
|
|
35
|
-
<a href="https://agenta.ai
|
|
36
|
-
<div align="center" >
|
|
42
|
+
<p align="center">
|
|
43
|
+
<a href="https://agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
|
|
37
44
|
<picture >
|
|
38
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/Agenta-AI/agenta/assets/4510758/
|
|
39
|
-
<source media="(prefers-color-scheme: light)" srcset="https://github.com/Agenta-AI/agenta/assets/4510758/
|
|
45
|
+
<source width="275" media="(prefers-color-scheme: dark)" srcset="https://github.com/Agenta-AI/agenta/assets/4510758/cdddf5ad-2352-4920-b1d9-ae7f8d9d7735" >
|
|
46
|
+
<source width="275" media="(prefers-color-scheme: light)" srcset="https://github.com/Agenta-AI/agenta/assets/4510758/ab75cbac-b807-496f-aab3-57463a33f726" >
|
|
40
47
|
<img alt="Shows the logo of agenta" src="https://github.com/Agenta-AI/agenta/assets/4510758/68e055d4-d7b8-4943-992f-761558c64253" >
|
|
41
48
|
</picture>
|
|
42
|
-
</div>
|
|
43
49
|
</a>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<a href="https://
|
|
47
|
-
<a href="https://
|
|
48
|
-
|
|
50
|
+
</p>
|
|
51
|
+
<p align="center">
|
|
52
|
+
<a href="https://docs.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">Documentation</a> |
|
|
53
|
+
<a href="https://agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">Website</a> |
|
|
54
|
+
<a href="https://join.slack.com/t/agenta-hq/shared_invite/zt-1zsafop5i-Y7~ZySbhRZvKVPV5DO_7IA">Slack</a>
|
|
55
|
+
</p>
|
|
49
56
|
<div align="center">
|
|
50
|
-
<strong>
|
|
51
|
-
|
|
57
|
+
<strong> <h2> The Open source LLMOps Platform </h2></strong>
|
|
58
|
+
Prompt playground, prompt management, evaluation, and observability
|
|
52
59
|
</div>
|
|
53
60
|
</br>
|
|
54
61
|
<p align="center">
|
|
55
62
|
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT license." />
|
|
56
|
-
<a href="https://docs.agenta.ai
|
|
63
|
+
<a href="https://docs.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
|
|
57
64
|
<img src="https://img.shields.io/badge/Doc-online-green" alt="Doc">
|
|
58
65
|
</a>
|
|
59
66
|
|
|
@@ -67,11 +74,9 @@ Description-Content-Type: text/markdown
|
|
|
67
74
|
<a href="https://pypi.org/project/agenta/">
|
|
68
75
|
<img src="https://img.shields.io/pypi/dm/agenta" alt="PyPI - Downloads">
|
|
69
76
|
</a>
|
|
70
|
-
|
|
71
77
|
</br>
|
|
72
78
|
</p>
|
|
73
79
|
|
|
74
|
-
|
|
75
80
|
<p align="center">
|
|
76
81
|
<a href="https://join.slack.com/t/agenta-hq/shared_invite/zt-1zsafop5i-Y7~ZySbhRZvKVPV5DO_7IA">
|
|
77
82
|
<img src="https://img.shields.io/badge/JOIN US ON SLACK-4A154B?style=for-the-badge&logo=slack&logoColor=white" />
|
|
@@ -84,27 +89,26 @@ Description-Content-Type: text/markdown
|
|
|
84
89
|
</a>
|
|
85
90
|
</p>
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
</br>
|
|
89
|
-
|
|
90
|
-
<a href="https://cloud.agenta.ai">
|
|
91
|
-
<picture>
|
|
92
|
-
<img src="https://github.com/Agenta-AI/agenta/assets/4510758/a3024fac-2945-4208-ae12-4cc51ecfc970" />
|
|
93
|
-
</picture>
|
|
94
|
-
</a>
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<br>
|
|
98
92
|
<br />
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
<p align="center">
|
|
94
|
+
<a href="https://cloud.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
|
|
101
95
|
<picture >
|
|
102
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/
|
|
103
|
-
<source media="(prefers-color-scheme: light)" srcset="https://github.com/
|
|
104
|
-
<img alt="
|
|
96
|
+
<source width="275" media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/b8912ecb-c7a0-47bd-8507-29b12382fef6" >
|
|
97
|
+
<source width="275" media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/f133dd08-04a3-4b20-b047-22f8f841cfbb" >
|
|
98
|
+
<img alt="Try Agenta Live Demo" src="https://github.com/Agenta-AI/agenta/assets/4510758/68e055d4-d7b8-4943-992f-761558c64253" >
|
|
105
99
|
</picture>
|
|
106
|
-
|
|
100
|
+
</a>
|
|
101
|
+
</p>
|
|
107
102
|
|
|
103
|
+
<br/>
|
|
104
|
+
<br />
|
|
105
|
+
<div align="center" >
|
|
106
|
+
<a href="https://cloud.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
|
|
107
|
+
<picture >
|
|
108
|
+
<img width="800" alt="Screenshot Agenta" src="https://github.com/user-attachments/assets/32e95ddb-e001-4462-b92e-72bf4cc78597" >
|
|
109
|
+
</picture>
|
|
110
|
+
</a>
|
|
111
|
+
</div>
|
|
108
112
|
</div>
|
|
109
113
|
<br />
|
|
110
114
|
<br />
|
|
@@ -112,126 +116,58 @@ Description-Content-Type: text/markdown
|
|
|
112
116
|
---
|
|
113
117
|
|
|
114
118
|
<h3 align="center">
|
|
115
|
-
<a href="
|
|
116
|
-
<a href="
|
|
117
|
-
<a href="https://
|
|
118
|
-
<a href="
|
|
119
|
-
|
|
120
|
-
<a href="#enterprise-support"><b>Enterprise</b></a> •
|
|
121
|
-
<a href="https://join.slack.com/t/agenta-hq/shared_invite/zt-1zsafop5i-Y7~ZySbhRZvKVPV5DO_7IA"><b>Community</b></a> •
|
|
122
|
-
<a href="#contributing"><b>Contributing</b></a>
|
|
119
|
+
<a href="https://docs.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Documentation</b></a> •
|
|
120
|
+
<a href="https://docs.agenta.ai/changelog/main?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Changelog</b></a> •
|
|
121
|
+
<a href="https://agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Website</b></a> •
|
|
122
|
+
<a href="https://cloud.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme"><b>Agenta Cloud</b></a>
|
|
123
|
+
|
|
123
124
|
</h3>
|
|
124
125
|
|
|
125
126
|
---
|
|
126
127
|
|
|
127
|
-
#
|
|
128
|
-
|
|
129
|
-
Agenta is an end-to-end LLMOps platform. It provides the tools for **prompt engineering and management**, โ๏ธ **evaluation**, and :rocket: **deployment**. All without imposing any restrictions on your choice of framework, library, or model.
|
|
130
|
-
|
|
131
|
-
Agenta allows developers and product teams to collaborate and build robust AI applications in less time.
|
|
132
|
-
|
|
133
|
-
## ๐จ How does it work?
|
|
128
|
+
# What is Agenta?
|
|
134
129
|
|
|
135
|
-
|
|
136
|
-
| ------------- | ------------- |
|
|
137
|
-
|1. [Create an application using a pre-built template from our UI](https://cloud.agenta.ai?utm_source=github&utm_medium=readme&utm_campaign=github)<br />2. Access a playground where you can test and compare different prompts and configurations side-by-side.<br /> 3. Systematically evaluate your application using pre-built or custom evaluators.<br /> 4. Deploy the application to production with one click. |1. [Add a few lines to any LLM application code to automatically create a playground for it](https://docs.agenta.ai/developer_guides/tutorials/first-app-with-langchain) <br />2. Experiment with prompts and configurations, and compare them side-by-side in the playground. <br />3. Systematically evaluate your application using pre-built or custom evaluators. <br />4. Deploy the application to production with one click. |
|
|
130
|
+
Agenta is a platform for building production-grade LLM applications. It helps **engineering and product teams** create reliable LLM apps faster.
|
|
138
131
|
|
|
139
|
-
<br /><br />
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
### [Try the cloud version](https://cloud.agenta.ai?utm_source=github&utm_medium=readme&utm_campaign=github)
|
|
144
|
-
### [Create your first application in one-minute](https://docs.agenta.ai/getting_started/getting-started-ui)
|
|
145
|
-
### [Create an application using Langchain](https://docs.agenta.ai/developer_guides/tutorials/first-app-with-langchain)
|
|
146
|
-
### [Self-host agenta](https://docs.agenta.ai/self-host/host-locally)
|
|
147
|
-
### [Read the Documentation](https://docs.agenta.ai)
|
|
148
|
-
### [Check the Cookbook](https://docs.agenta.ai/cookbook)
|
|
133
|
+
Agenta provides end-to-end tools for the entire LLMOps workflow: building (**LLM playground**, **evaluation**), deploying (**prompt and configuration management**), and monitoring (**LLM observability and tracing**).
|
|
149
134
|
|
|
150
135
|
# Features
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
https://
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
**1. Write your LLM-app code**
|
|
179
|
-
|
|
180
|
-
Write the code using any framework, library, or model you want. Add the `agenta.post` decorator and put the inputs and parameters in the function call just like in this example:
|
|
181
|
-
|
|
182
|
-
_Example simple application that generates baby names:_
|
|
183
|
-
|
|
184
|
-
```python
|
|
185
|
-
import agenta as ag
|
|
186
|
-
from langchain.chains import LLMChain
|
|
187
|
-
from langchain.llms import OpenAI
|
|
188
|
-
from langchain.prompts import PromptTemplate
|
|
189
|
-
|
|
190
|
-
default_prompt = "Give me five cool names for a baby from {country} with this gender {gender}!!!!"
|
|
191
|
-
ag.init()
|
|
192
|
-
ag.config(prompt_template=ag.TextParam(default_prompt),
|
|
193
|
-
temperature=ag.FloatParam(0.9))
|
|
194
|
-
|
|
195
|
-
@ag.entrypoint
|
|
196
|
-
def generate(
|
|
197
|
-
country: str,
|
|
198
|
-
gender: str,
|
|
199
|
-
) -> str:
|
|
200
|
-
llm = OpenAI(temperature=ag.config.temperature)
|
|
201
|
-
prompt = PromptTemplate(
|
|
202
|
-
input_variables=["country", "gender"],
|
|
203
|
-
template=ag.config.prompt_template,
|
|
204
|
-
)
|
|
205
|
-
chain = LLMChain(llm=llm, prompt=prompt)
|
|
206
|
-
output = chain.run(country=country, gender=gender)
|
|
207
|
-
|
|
208
|
-
return output
|
|
136
|
+
- **Prompt Playground**: Experiment, iterate on prompts, and compare outputs from over 50 LLM models side by side ([docs](https://docs.agenta.ai/prompt-management/using-the-playground?utm_source=github&utm_medium=referral&utm_campaign=readme))
|
|
137
|
+
- **Custom Workflows**: Build a playground for any custom LLM workflow, such as RAG or agents. Enable all the team to easily iterate on its parameters and evaluate it from the web UI.
|
|
138
|
+
- **LLM evaluation**: Run evaluation suite from the webUI using predefined evaluators like LLM-as-a-judge, RAG evaluators, or custom code evaluators. ([docs](https://docs.agenta.ai/evaluation/overview?utm_source=github&utm_medium=referral&utm_campaign=readme))
|
|
139
|
+
- **Human evaluation**: Collaborate with subject matter experts for human annotation evaluation, including A/B testing and annotating golden test sets.
|
|
140
|
+
- **Prompt Management**: Version your prompts and manage them across different environments ([docs](https://docs.agenta.ai/prompt-management/overview?utm_source=github&utm_medium=referral&utm_campaign=readme), [quick start](https://docs.agenta.ai/prompt-management/quick-start?utm_source=github&utm_medium=referral&utm_campaign=readme))
|
|
141
|
+
- **LLM Tracing**: Observe and debug your apps with integrations to most providers and frameworks ([docs](https://docs.agenta.ai/observability/overview?utm_source=github&utm_medium=referral&utm_campaign=readme), [quick start](https://docs.agenta.ai/observability/quickstart?utm_source=github&utm_medium=referral&utm_campaign=readme))
|
|
142
|
+
- **LLM Monitoring**: Track cost and latency and compare different deployments.
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
# Getting Started
|
|
146
|
+
## Agenta Cloud:
|
|
147
|
+
The easiest way to get started is through Agenta Cloud. It is free to signup, and comes with a generous free-tier.
|
|
148
|
+
|
|
149
|
+
<a href="https://cloud.agenta.ai?utm_source=github&utm_medium=referral&utm_campaign=readme">
|
|
150
|
+
<picture >
|
|
151
|
+
<source width="160" media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/759422d8-01bc-4503-bf3c-b5871c99359a" >
|
|
152
|
+
<source width="160" media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/ffa9af5f-0981-4e95-9272-cb35eedb6780" >
|
|
153
|
+
<img alt="Get Started with Agenta Cloud" src="https://github.com/user-attachments/assets/ffa9af5f-0981-4e95-9272-cb35eedb6780" >
|
|
154
|
+
</picture>
|
|
155
|
+
</a>
|
|
156
|
+
|
|
157
|
+
## Self-host:
|
|
158
|
+
```
|
|
159
|
+
mkdir agenta && cd agenta
|
|
160
|
+
curl -L https://raw.githubusercontent.com/agenta-ai/agenta/main/docker-compose.gh.yml -o docker-compose.gh.yml
|
|
161
|
+
docker compose -f docker-compose.gh.yml up -d
|
|
209
162
|
```
|
|
210
|
-
|
|
211
|
-
**2.Deploy your app using the Agenta CLI**
|
|
212
|
-
|
|
213
|
-
<img width="650" alt="Screenshot 2023-06-19 at 15 58 34" src="https://github.com/Agenta-AI/agenta/assets/4510758/eede3e78-0fe1-42a0-ad4e-d880ddb10bf0">
|
|
214
|
-
|
|
215
|
-
**3. Go to agenta at http://localhost**
|
|
216
|
-
|
|
217
|
-
Now your team can ๐ iterate, ๐งช experiment, and โ๏ธ evaluate different versions of your app (with your code!) in the web platform.</summary>
|
|
218
|
-
<br/>
|
|
219
|
-
|
|
220
|
-
<img width="900" alt="Screenshot 2023-06-25 at 21 08 53" src="https://github.com/Agenta-AI/agenta/assets/57623556/7e07a988-a36a-4fb5-99dd-9cc13a678434">
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
# Enterprise Support
|
|
224
|
-
Contact us here for enterprise support and early access to agenta self-managed enterprise with Kubernetes support. <br/><br/>
|
|
225
|
-
<a href="https://cal.com/mahmoud-mabrouk-ogzgey/demo"><img src="https://cal.com/book-with-cal-dark.svg" alt="Book us"></a>
|
|
226
163
|
|
|
227
164
|
# Disabling Anonymized Tracking
|
|
228
165
|
|
|
229
|
-
To disable anonymized telemetry,
|
|
166
|
+
By default, Agenta automatically reports anonymized basic usage statistics. This helps us understand how Agenta is used and track its overall usage and growth. This data does not include any sensitive information. To disable anonymized telemetry, follow these steps:
|
|
230
167
|
|
|
231
168
|
- For web: Set `TELEMETRY_TRACKING_ENABLED` to `false` in your `agenta-web/.env` file.
|
|
232
169
|
- For CLI: Set `telemetry_tracking_enabled` to `false` in your `~/.agenta/config.toml` file.
|
|
233
170
|
|
|
234
|
-
After making this change, restart agenta compose.
|
|
235
171
|
|
|
236
172
|
# Contributing
|
|
237
173
|
|
|
@@ -239,12 +175,14 @@ We warmly welcome contributions to Agenta. Feel free to submit issues, fork the
|
|
|
239
175
|
|
|
240
176
|
We are usually hanging in our Slack. Feel free to [join our Slack and ask us anything](https://join.slack.com/t/agenta-hq/shared_invite/zt-1zsafop5i-Y7~ZySbhRZvKVPV5DO_7IA)
|
|
241
177
|
|
|
242
|
-
Check out our [Contributing Guide](https://docs.agenta.ai/contributing/getting-started) for more information.
|
|
178
|
+
Check out our [Contributing Guide](https://docs.agenta.ai/misc/contributing/getting-started?utm_source=github&utm_medium=referral&utm_campaign=readme) for more information.
|
|
243
179
|
|
|
244
180
|
## Contributors โจ
|
|
245
181
|
|
|
246
182
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
247
|
-
|
|
183
|
+
|
|
184
|
+
[](#contributors-)
|
|
185
|
+
|
|
248
186
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
249
187
|
|
|
250
188
|
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
|
@@ -304,6 +242,17 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|
|
304
242
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/brockWith"><img src="https://avatars.githubusercontent.com/u/105627491?v=4?s=100" width="100px;" alt="brockWith"/><br /><sub><b>brockWith</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=brockWith" title="Code">๐ป</a></td>
|
|
305
243
|
<td align="center" valign="top" width="14.28%"><a href="http://denniszelada.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/219311?v=4?s=100" width="100px;" alt="Dennis Zelada"/><br /><sub><b>Dennis Zelada</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=denniszelada" title="Code">๐ป</a></td>
|
|
306
244
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/romainrbr"><img src="https://avatars.githubusercontent.com/u/10381609?v=4?s=100" width="100px;" alt="Romain Brucker"/><br /><sub><b>Romain Brucker</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=romainrbr" title="Code">๐ป</a></td>
|
|
245
|
+
<td align="center" valign="top" width="14.28%"><a href="http://heonheo.com"><img src="https://avatars.githubusercontent.com/u/76820291?v=4?s=100" width="100px;" alt="Heon Heo"/><br /><sub><b>Heon Heo</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=HeonHeo23" title="Code">๐ป</a></td>
|
|
246
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Drewski2222"><img src="https://avatars.githubusercontent.com/u/39228951?v=4?s=100" width="100px;" alt="Drew Reisner"/><br /><sub><b>Drew Reisner</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=Drewski2222" title="Code">๐ป</a></td>
|
|
247
|
+
<td align="center" valign="top" width="14.28%"><a href="https://speakerdeck.com/eltociear"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Eltociear Ashimine"/><br /><sub><b>Ikko Eltociear Ashimine</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=eltociear" title="Documentation">๐</a></td>
|
|
248
|
+
</tr>
|
|
249
|
+
<tr>
|
|
250
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vishalvanpariya"><img src="https://avatars.githubusercontent.com/u/27823328?v=4?s=100" width="100px;" alt="Vishal Vanpariya"/><br /><sub><b>Vishal Vanpariya</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=vishalvanpariya" title="Code">๐ป</a></td>
|
|
251
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/youcefs21"><img src="https://avatars.githubusercontent.com/u/34604972?v=4?s=100" width="100px;" alt="Youcef Boumar"/><br /><sub><b>Youcef Boumar</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=youcefs21" title="Documentation">๐</a></td>
|
|
252
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LucasTrg"><img src="https://avatars.githubusercontent.com/u/47852577?v=4?s=100" width="100px;" alt="LucasTrg"/><br /><sub><b>LucasTrg</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=LucasTrg" title="Code">๐ป</a> <a href="https://github.com/Agenta-AI/agenta/issues?q=author%3ALucasTrg" title="Bug reports">๐</a></td>
|
|
253
|
+
<td align="center" valign="top" width="14.28%"><a href="https://ashrafchowdury.me"><img src="https://avatars.githubusercontent.com/u/87828904?v=4?s=100" width="100px;" alt="Ashraf Chowdury"/><br /><sub><b>Ashraf Chowdury</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/issues?q=author%3Aashrafchowdury" title="Bug reports">๐</a> <a href="https://github.com/Agenta-AI/agenta/commits?author=ashrafchowdury" title="Code">๐ป</a></td>
|
|
254
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jp-agenta"><img src="https://avatars.githubusercontent.com/u/174311389?v=4?s=100" width="100px;" alt="jp-agenta"/><br /><sub><b>jp-agenta</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/commits?author=jp-agenta" title="Code">๐ป</a> <a href="https://github.com/Agenta-AI/agenta/issues?q=author%3Ajp-agenta" title="Bug reports">๐</a></td>
|
|
255
|
+
<td align="center" valign="top" width="14.28%"><a href="https://mrunhap.github.io"><img src="https://avatars.githubusercontent.com/u/24653356?v=4?s=100" width="100px;" alt="Mr Unhappy"/><br /><sub><b>Mr Unhappy</b></sub></a><br /><a href="https://github.com/Agenta-AI/agenta/issues?q=author%3Amrunhap" title="Bug reports">๐</a> <a href="#infra-mrunhap" title="Infrastructure (Hosting, Build-Tools, etc)">๐</a></td>
|
|
307
256
|
</tr>
|
|
308
257
|
</tbody>
|
|
309
258
|
</table>
|
|
@@ -315,5 +264,3 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|
|
315
264
|
|
|
316
265
|
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind are welcome!
|
|
317
266
|
|
|
318
|
-
**Attribution**: Testing icons created by [Freepik - Flaticon](https://www.flaticon.com/free-icons/testing)
|
|
319
|
-
|