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,948 @@
1
+ from agenta.sdk.models.workflows import WorkflowServiceInterface
2
+
3
+ echo_v0_interface = WorkflowServiceInterface(
4
+ uri="agenta:built-in:echo:v0",
5
+ schemas=dict( # type: ignore
6
+ parameters={
7
+ "type": "object",
8
+ "title": "Echo Parameters",
9
+ "description": "No configuration parameters required.",
10
+ "additionalProperties": False,
11
+ },
12
+ inputs={
13
+ "type": "object",
14
+ "title": "Echo Input",
15
+ "description": "Arbitrary input to be echoed back.",
16
+ },
17
+ outputs={
18
+ "type": "object",
19
+ "title": "Echo Output",
20
+ "description": "The echoed response object.",
21
+ "properties": {
22
+ "got": {
23
+ "type": "string",
24
+ "title": "Echoed Value",
25
+ "description": "The input value passed back unchanged.",
26
+ }
27
+ },
28
+ "required": ["got"],
29
+ "additionalProperties": False,
30
+ },
31
+ ),
32
+ )
33
+
34
+ auto_exact_match_v0_interface = WorkflowServiceInterface(
35
+ uri="agenta:built-in:auto_exact_match:v0",
36
+ schemas=dict( # type: ignore
37
+ parameters={
38
+ "type": "object",
39
+ "title": "Exact Match Parameters",
40
+ "description": "Configuration for the Exact Match evaluator.",
41
+ "properties": {
42
+ "correct_answer_key": {
43
+ "type": "string",
44
+ "title": "Expected Answer Column",
45
+ "description": "The name of the column in the test data that contains the correct answer.",
46
+ "default": "correct_answer",
47
+ }
48
+ },
49
+ "required": ["correct_answer_key"],
50
+ "additionalProperties": False,
51
+ },
52
+ inputs={
53
+ "type": "object",
54
+ "title": "Exact Match Inputs",
55
+ "description": "Testcase data including the correct answer.",
56
+ },
57
+ outputs={
58
+ "type": "object",
59
+ "title": "Exact Match Outputs",
60
+ "description": "Result indicating whether the output exactly matched the expected answer.",
61
+ "properties": {
62
+ "success": {
63
+ "type": "boolean",
64
+ "title": "Success",
65
+ "description": "True if the outputs exactly matched, False otherwise.",
66
+ }
67
+ },
68
+ "required": ["success"],
69
+ "additionalProperties": False,
70
+ },
71
+ ),
72
+ )
73
+
74
+ auto_regex_test_v0_interface = WorkflowServiceInterface(
75
+ uri="agenta:built-in:auto_regex_test:v0",
76
+ schemas=dict( # type: ignore
77
+ parameters={
78
+ "type": "object",
79
+ "title": "Regex Test Parameters",
80
+ "description": "Settings for evaluating whether output matches a regex pattern.",
81
+ "properties": {
82
+ "regex_pattern": {
83
+ "type": "string",
84
+ "title": "Regex Pattern",
85
+ "description": "Pattern for regex testing (e.g., ^this_word\\d{3}$).",
86
+ "default": "",
87
+ },
88
+ "regex_should_match": {
89
+ "type": "boolean",
90
+ "title": "Match or Mismatch",
91
+ "description": "If True, regex must match; if False, regex must not match.",
92
+ "default": True,
93
+ },
94
+ "case_sensitive": {
95
+ "type": "boolean",
96
+ "title": "Case Sensitive",
97
+ "description": "If True, regex matching is case-sensitive.",
98
+ "default": True,
99
+ },
100
+ },
101
+ "required": ["regex_pattern"],
102
+ "additionalProperties": False,
103
+ },
104
+ inputs={
105
+ "type": "object",
106
+ "title": "Regex Test Inputs",
107
+ "description": "Output from the workflow execution to be tested against the regex.",
108
+ },
109
+ outputs={
110
+ "type": "object",
111
+ "title": "Regex Test Outputs",
112
+ "description": "Result indicating whether regex matched as configured.",
113
+ "properties": {
114
+ "success": {
115
+ "type": "boolean",
116
+ "title": "Success",
117
+ "description": "True if regex condition passed, False otherwise.",
118
+ }
119
+ },
120
+ "required": ["success"],
121
+ "additionalProperties": False,
122
+ },
123
+ ),
124
+ )
125
+
126
+ field_match_test_v0_interface = WorkflowServiceInterface(
127
+ uri="agenta:built-in:field_match_test:v0",
128
+ schemas=dict( # type: ignore
129
+ parameters={
130
+ "type": "object",
131
+ "title": "Field Match Parameters",
132
+ "description": "Settings for comparing a specific JSON field against the expected answer.",
133
+ "properties": {
134
+ "json_field": {
135
+ "type": "string",
136
+ "title": "JSON Field",
137
+ "description": "The field in the JSON output to evaluate.",
138
+ "default": "",
139
+ },
140
+ "correct_answer_key": {
141
+ "type": "string",
142
+ "title": "Expected Answer Column",
143
+ "description": "Column in test data containing the correct answer.",
144
+ "default": "correct_answer",
145
+ },
146
+ },
147
+ "required": ["json_field", "correct_answer_key"],
148
+ "additionalProperties": False,
149
+ },
150
+ inputs={
151
+ "type": "object",
152
+ "title": "Field Match Inputs",
153
+ "description": "Testcase data including the correct answer.",
154
+ },
155
+ outputs={
156
+ "type": "object",
157
+ "title": "Field Match Outputs",
158
+ "description": "Result indicating whether the selected field matched the expected answer.",
159
+ "properties": {
160
+ "success": {
161
+ "type": "boolean",
162
+ "title": "Success",
163
+ "description": "True if the JSON field matched the expected answer.",
164
+ }
165
+ },
166
+ "required": ["success"],
167
+ "additionalProperties": False,
168
+ },
169
+ ),
170
+ )
171
+
172
+ auto_webhook_test_v0_interface = WorkflowServiceInterface(
173
+ uri="agenta:built-in:auto_webhook_test:v0",
174
+ schemas=dict( # type: ignore
175
+ parameters={
176
+ "type": "object",
177
+ "title": "Webhook Test Parameters",
178
+ "description": "Settings for sending evaluation requests to a webhook service.",
179
+ "properties": {
180
+ "webhook_url": {
181
+ "type": "string",
182
+ "format": "uri",
183
+ "title": "Webhook URL",
184
+ "description": "The endpoint that will receive the evaluation payload.",
185
+ },
186
+ "correct_answer_key": {
187
+ "type": "string",
188
+ "title": "Expected Answer Column",
189
+ "description": "Column in test data containing the correct answer.",
190
+ "default": "correct_answer",
191
+ },
192
+ "threshold": {
193
+ "type": "number",
194
+ "title": "Threshold",
195
+ "description": "Score threshold to determine success.",
196
+ "minimum": 0,
197
+ "maximum": 1,
198
+ "default": 0.5,
199
+ },
200
+ },
201
+ "required": ["webhook_url"],
202
+ "additionalProperties": False,
203
+ },
204
+ inputs={
205
+ "type": "object",
206
+ "title": "Webhook Test Inputs",
207
+ "description": "Payload including inputs, output, and correct answer sent to the webhook.",
208
+ },
209
+ outputs={
210
+ "type": "object",
211
+ "title": "Webhook Test Outputs",
212
+ "description": "Score and success flag returned by the webhook evaluation.",
213
+ "properties": {
214
+ "score": {
215
+ "type": "number",
216
+ "title": "Score",
217
+ "description": "Numeric evaluation score returned by the webhook.",
218
+ },
219
+ "success": {
220
+ "type": "boolean",
221
+ "title": "Success",
222
+ "description": "True if the score meets or exceeds the threshold.",
223
+ },
224
+ },
225
+ "required": ["score", "success"],
226
+ "additionalProperties": False,
227
+ },
228
+ ),
229
+ )
230
+
231
+ auto_custom_code_run_v0_interface = WorkflowServiceInterface(
232
+ uri="agenta:built-in:auto_custom_code_run:v0",
233
+ schemas=dict( # type: ignore
234
+ parameters={
235
+ "type": "object",
236
+ "title": "Custom Code Evaluation Parameters",
237
+ "description": "Settings for running custom Python code to evaluate workflow outputs.",
238
+ "properties": {
239
+ "code": {
240
+ "type": "string",
241
+ "title": "Evaluation Code",
242
+ "description": "Python code snippet that will be executed to evaluate the output.",
243
+ "default": (
244
+ "from typing import Dict, Union, Any\n\n"
245
+ "def evaluate(\n"
246
+ " app_params: Dict[str, str],\n"
247
+ " inputs: Dict[str, str],\n"
248
+ " output: Union[str, Dict[str, Any]],\n"
249
+ " correct_answer: str\n"
250
+ ") -> float:\n"
251
+ " if output in correct_answer:\n"
252
+ " return 1.0\n"
253
+ " return 0.0\n"
254
+ ),
255
+ },
256
+ "correct_answer_key": {
257
+ "type": "string",
258
+ "title": "Expected Answer Column",
259
+ "description": "Column in the test data containing the correct answer.",
260
+ "default": "correct_answer",
261
+ },
262
+ "threshold": {
263
+ "type": "number",
264
+ "title": "Threshold",
265
+ "description": "Score threshold used to determine success.",
266
+ "minimum": 0,
267
+ "maximum": 1,
268
+ "default": 0.5,
269
+ },
270
+ },
271
+ "required": ["code"],
272
+ "additionalProperties": False,
273
+ },
274
+ inputs={
275
+ "type": "object",
276
+ "title": "Custom Code Evaluation Inputs",
277
+ "description": "Testcase data and workflow outputs available to the custom code.",
278
+ },
279
+ outputs={
280
+ "type": "object",
281
+ "title": "Custom Code Evaluation Outputs",
282
+ "description": "Score and success flag returned by the custom evaluation code.",
283
+ "properties": {
284
+ "score": {
285
+ "type": "number",
286
+ "title": "Score",
287
+ "description": "Numeric score computed by the custom code.",
288
+ },
289
+ "success": {
290
+ "type": "boolean",
291
+ "title": "Success",
292
+ "description": "True if score meets or exceeds the threshold.",
293
+ },
294
+ },
295
+ "required": ["score", "success"],
296
+ "additionalProperties": False,
297
+ },
298
+ ),
299
+ )
300
+
301
+ auto_ai_critique_v0_interface = WorkflowServiceInterface(
302
+ uri="agenta:built-in:auto_ai_critique:v0",
303
+ schemas=dict( # type: ignore
304
+ parameters={
305
+ "type": "object",
306
+ "title": "LLM-as-a-Judge Parameters",
307
+ "description": "Configuration for using an AI model to critique workflow outputs.",
308
+ "properties": {
309
+ "prompt_template": {
310
+ "type": "array",
311
+ "title": "Prompt Template",
312
+ "description": "Template messages used by the LLM to evaluate outputs.",
313
+ "items": {"type": "object"},
314
+ },
315
+ "correct_answer_key": {
316
+ "type": "string",
317
+ "title": "Expected Answer Column",
318
+ "description": "Column in test data containing the correct answer.",
319
+ "default": "correct_answer",
320
+ },
321
+ "model": {
322
+ "type": "string",
323
+ "title": "Model",
324
+ "description": "The LLM model to use for evaluation.",
325
+ "default": "gpt-3.5-turbo",
326
+ },
327
+ "threshold": {
328
+ "type": "number",
329
+ "title": "Threshold",
330
+ "description": "Score threshold to determine success.",
331
+ "minimum": 0,
332
+ "maximum": 1,
333
+ "default": 0.5,
334
+ },
335
+ "version": {
336
+ "type": "string",
337
+ "title": "Evaluator Version",
338
+ "description": "Internal evaluator version identifier.",
339
+ "default": "3",
340
+ },
341
+ },
342
+ "required": ["prompt_template"],
343
+ "additionalProperties": False,
344
+ },
345
+ inputs={
346
+ "type": "object",
347
+ "title": "AI Critique Inputs",
348
+ "description": "Testcase data and workflow outputs provided to the LLM judge.",
349
+ },
350
+ outputs={
351
+ "type": "object",
352
+ "title": "AI Critique Outputs",
353
+ "description": "Score and success flag returned by the AI critique evaluator.",
354
+ "properties": {
355
+ "score": {
356
+ "type": "number",
357
+ "title": "Score",
358
+ "description": "Numeric evaluation score assigned by the AI.",
359
+ },
360
+ "success": {
361
+ "type": "boolean",
362
+ "title": "Success",
363
+ "description": "True if the score meets or exceeds the threshold.",
364
+ },
365
+ },
366
+ "required": ["score", "success"],
367
+ "additionalProperties": False,
368
+ },
369
+ ),
370
+ )
371
+
372
+ auto_starts_with_v0_interface = WorkflowServiceInterface(
373
+ uri="agenta:built-in:auto_starts_with:v0",
374
+ schemas=dict( # type: ignore # type: ignore
375
+ parameters={
376
+ "type": "object",
377
+ "title": "Starts With Parameters",
378
+ "description": "Configuration for checking if output starts with a specific prefix.",
379
+ "properties": {
380
+ "prefix": {
381
+ "type": "string",
382
+ "title": "Prefix",
383
+ "description": "The string to match at the start of the output.",
384
+ },
385
+ "case_sensitive": {
386
+ "type": "boolean",
387
+ "title": "Case Sensitive",
388
+ "description": "If True, matching is case-sensitive.",
389
+ "default": True,
390
+ },
391
+ },
392
+ "required": ["prefix"],
393
+ "additionalProperties": False,
394
+ },
395
+ inputs={
396
+ "type": "object",
397
+ "title": "Starts With Inputs",
398
+ "description": "Workflow output to be checked against the prefix.",
399
+ },
400
+ outputs={
401
+ "type": "object",
402
+ "title": "Starts With Outputs",
403
+ "description": "Result of the prefix check.",
404
+ "properties": {
405
+ "success": {
406
+ "type": "boolean",
407
+ "title": "Success",
408
+ "description": "True if output starts with the given prefix.",
409
+ }
410
+ },
411
+ "required": ["success"],
412
+ "additionalProperties": False,
413
+ },
414
+ ),
415
+ )
416
+
417
+ auto_ends_with_v0_interface = WorkflowServiceInterface(
418
+ uri="agenta:built-in:auto_ends_with:v0",
419
+ schemas=dict( # type: ignore
420
+ parameters={
421
+ "type": "object",
422
+ "title": "Ends With Parameters",
423
+ "description": "Configuration for checking if output ends with a specific suffix.",
424
+ "properties": {
425
+ "suffix": {
426
+ "type": "string",
427
+ "title": "Suffix",
428
+ "description": "The string to match at the end of the output.",
429
+ },
430
+ "case_sensitive": {
431
+ "type": "boolean",
432
+ "title": "Case Sensitive",
433
+ "description": "If True, matching is case-sensitive.",
434
+ "default": True,
435
+ },
436
+ },
437
+ "required": ["suffix"],
438
+ "additionalProperties": False,
439
+ },
440
+ inputs={
441
+ "type": "object",
442
+ "title": "Ends With Inputs",
443
+ "description": "Workflow output to be checked against the suffix.",
444
+ },
445
+ outputs={
446
+ "type": "object",
447
+ "title": "Ends With Outputs",
448
+ "description": "Result of the suffix check.",
449
+ "properties": {
450
+ "success": {
451
+ "type": "boolean",
452
+ "title": "Success",
453
+ "description": "True if output ends with the given suffix.",
454
+ }
455
+ },
456
+ "required": ["success"],
457
+ "additionalProperties": False,
458
+ },
459
+ ),
460
+ )
461
+
462
+ auto_contains_v0_interface = WorkflowServiceInterface(
463
+ uri="agenta:built-in:auto_contains:v0",
464
+ schemas=dict( # type: ignore
465
+ parameters={
466
+ "type": "object",
467
+ "title": "Contains Parameters",
468
+ "description": "Configuration for checking if output contains a given substring.",
469
+ "properties": {
470
+ "substring": {
471
+ "type": "string",
472
+ "title": "Substring",
473
+ "description": "The string to check for in the output.",
474
+ },
475
+ "case_sensitive": {
476
+ "type": "boolean",
477
+ "title": "Case Sensitive",
478
+ "description": "If True, substring search is case-sensitive.",
479
+ "default": True,
480
+ },
481
+ },
482
+ "required": ["substring"],
483
+ "additionalProperties": False,
484
+ },
485
+ inputs={
486
+ "type": "object",
487
+ "title": "Contains Inputs",
488
+ "description": "Workflow output to be checked for substring presence.",
489
+ },
490
+ outputs={
491
+ "type": "object",
492
+ "title": "Contains Outputs",
493
+ "description": "Result of the substring presence check.",
494
+ "properties": {
495
+ "success": {
496
+ "type": "boolean",
497
+ "title": "Success",
498
+ "description": "True if substring is found in the output.",
499
+ }
500
+ },
501
+ "required": ["success"],
502
+ "additionalProperties": False,
503
+ },
504
+ ),
505
+ )
506
+
507
+ auto_contains_any_v0_interface = WorkflowServiceInterface(
508
+ uri="agenta:built-in:auto_contains_any:v0",
509
+ schemas=dict( # type: ignore
510
+ parameters={
511
+ "type": "object",
512
+ "title": "Contains Any Parameters",
513
+ "description": "Configuration for checking if output contains any of the specified substrings.",
514
+ "properties": {
515
+ "substrings": {
516
+ "type": "array",
517
+ "title": "Substrings",
518
+ "description": "List of substrings to check for. The evaluation passes if any substring is found.",
519
+ "items": {"type": "string"},
520
+ },
521
+ "case_sensitive": {
522
+ "type": "boolean",
523
+ "title": "Case Sensitive",
524
+ "description": "If True, substring checks are case-sensitive.",
525
+ "default": True,
526
+ },
527
+ },
528
+ "required": ["substrings"],
529
+ "additionalProperties": False,
530
+ },
531
+ inputs={
532
+ "type": "object",
533
+ "title": "Contains Any Inputs",
534
+ "description": "Workflow output to be checked for substrings.",
535
+ },
536
+ outputs={
537
+ "type": "object",
538
+ "title": "Contains Any Outputs",
539
+ "description": "Result of the 'contains any' substring check.",
540
+ "properties": {
541
+ "success": {
542
+ "type": "boolean",
543
+ "title": "Success",
544
+ "description": "True if any substring is found in the output.",
545
+ }
546
+ },
547
+ "required": ["success"],
548
+ "additionalProperties": False,
549
+ },
550
+ ),
551
+ )
552
+
553
+ auto_contains_all_v0_interface = WorkflowServiceInterface(
554
+ uri="agenta:built-in:auto_contains_all:v0",
555
+ schemas=dict( # type: ignore
556
+ parameters={
557
+ "type": "object",
558
+ "title": "Contains All Parameters",
559
+ "description": "Configuration for checking if output contains all of the specified substrings.",
560
+ "properties": {
561
+ "substrings": {
562
+ "type": "array",
563
+ "title": "Substrings",
564
+ "description": "List of substrings to check for. The evaluation passes only if all substrings are found.",
565
+ "items": {"type": "string"},
566
+ },
567
+ "case_sensitive": {
568
+ "type": "boolean",
569
+ "title": "Case Sensitive",
570
+ "description": "If True, substring checks are case-sensitive.",
571
+ "default": True,
572
+ },
573
+ },
574
+ "required": ["substrings"],
575
+ "additionalProperties": False,
576
+ },
577
+ inputs={
578
+ "type": "object",
579
+ "title": "Contains All Inputs",
580
+ "description": "Workflow output to be checked for substrings.",
581
+ },
582
+ outputs={
583
+ "type": "object",
584
+ "title": "Contains All Outputs",
585
+ "description": "Result of the 'contains all' substring check.",
586
+ "properties": {
587
+ "success": {
588
+ "type": "boolean",
589
+ "title": "Success",
590
+ "description": "True if all substrings are found in the output.",
591
+ }
592
+ },
593
+ "required": ["success"],
594
+ "additionalProperties": False,
595
+ },
596
+ ),
597
+ )
598
+
599
+ auto_contains_json_v0_interface = WorkflowServiceInterface(
600
+ uri="agenta:built-in:auto_contains_json:v0",
601
+ schemas=dict( # type: ignore
602
+ parameters={
603
+ "type": "object",
604
+ "title": "Contains JSON Parameters",
605
+ "description": "No configuration parameters required.",
606
+ "additionalProperties": False,
607
+ },
608
+ inputs={
609
+ "type": "object",
610
+ "title": "Contains JSON Inputs",
611
+ "description": "Workflow output to be checked for valid JSON content.",
612
+ },
613
+ outputs={
614
+ "type": "object",
615
+ "title": "Contains JSON Outputs",
616
+ "description": "Result of the JSON validity check.",
617
+ "properties": {
618
+ "success": {
619
+ "type": "boolean",
620
+ "title": "Success",
621
+ "description": "True if valid JSON content was found in the output.",
622
+ }
623
+ },
624
+ "required": ["success"],
625
+ "additionalProperties": False,
626
+ },
627
+ ),
628
+ )
629
+
630
+ auto_json_diff_v0_interface = WorkflowServiceInterface(
631
+ uri="agenta:built-in:auto_json_diff:v0",
632
+ schemas=dict( # type: ignore
633
+ parameters={
634
+ "type": "object",
635
+ "title": "JSON Diff Parameters",
636
+ "description": "Settings for comparing predicted JSON output against ground truth JSON.",
637
+ "properties": {
638
+ "correct_answer_key": {
639
+ "type": "string",
640
+ "title": "Expected Answer Column",
641
+ "description": "Column in test data containing the correct JSON answer.",
642
+ "default": "correct_answer",
643
+ },
644
+ "compare_schema_only": {
645
+ "type": "boolean",
646
+ "title": "Compare Schema Only",
647
+ "description": "If True, only keys and their types are compared; values are ignored.",
648
+ "default": False,
649
+ },
650
+ "predict_keys": {
651
+ "type": "boolean",
652
+ "title": "Include Prediction Keys",
653
+ "description": "If True, prediction keys not present in ground truth are ignored.",
654
+ "default": False,
655
+ },
656
+ "case_insensitive_keys": {
657
+ "type": "boolean",
658
+ "title": "Case-Insensitive Keys",
659
+ "description": "If True, key comparisons are case-insensitive.",
660
+ "default": False,
661
+ },
662
+ "threshold": {
663
+ "type": "number",
664
+ "title": "Threshold",
665
+ "description": "Minimum similarity score required for success.",
666
+ "minimum": 0,
667
+ "maximum": 1,
668
+ "default": 0.5,
669
+ },
670
+ },
671
+ "additionalProperties": False,
672
+ },
673
+ inputs={
674
+ "type": "object",
675
+ "title": "JSON Diff Inputs",
676
+ "description": "Workflow output and ground truth JSON to compare.",
677
+ },
678
+ outputs={
679
+ "type": "object",
680
+ "title": "JSON Diff Outputs",
681
+ "description": "Score and success flag for the JSON comparison.",
682
+ "properties": {
683
+ "score": {
684
+ "type": "number",
685
+ "title": "Score",
686
+ "description": "Similarity score between prediction and ground truth.",
687
+ },
688
+ "success": {
689
+ "type": "boolean",
690
+ "title": "Success",
691
+ "description": "True if score meets or exceeds the threshold.",
692
+ },
693
+ },
694
+ "required": ["score", "success"],
695
+ "additionalProperties": False,
696
+ },
697
+ ),
698
+ )
699
+
700
+ auto_levenshtein_distance_v0_interface = WorkflowServiceInterface(
701
+ uri="agenta:built-in:auto_levenshtein_distance:v0",
702
+ schemas=dict( # type: ignore
703
+ parameters={
704
+ "type": "object",
705
+ "title": "Levenshtein Distance Parameters",
706
+ "description": "Settings for computing normalized Levenshtein similarity between outputs and ground truth.",
707
+ "properties": {
708
+ "correct_answer_key": {
709
+ "type": "string",
710
+ "title": "Expected Answer Column",
711
+ "description": "Column in test data containing the correct answer.",
712
+ "default": "correct_answer",
713
+ },
714
+ "threshold": {
715
+ "type": "number",
716
+ "title": "Threshold",
717
+ "description": "Minimum similarity score required for success.",
718
+ "minimum": 0,
719
+ "maximum": 1,
720
+ "default": 0.5,
721
+ },
722
+ "case_sensitive": {
723
+ "type": "boolean",
724
+ "title": "Case Sensitive",
725
+ "description": "If True, comparison is case-sensitive.",
726
+ "default": True,
727
+ },
728
+ },
729
+ "additionalProperties": False,
730
+ },
731
+ inputs={
732
+ "type": "object",
733
+ "title": "Levenshtein Inputs",
734
+ "description": "Workflow output and ground truth string to compare.",
735
+ },
736
+ outputs={
737
+ "type": "object",
738
+ "title": "Levenshtein Outputs",
739
+ "description": "Score and success flag for the Levenshtein similarity comparison.",
740
+ "properties": {
741
+ "score": {
742
+ "type": "number",
743
+ "title": "Score",
744
+ "description": "Normalized Levenshtein similarity score (0–1).",
745
+ },
746
+ "success": {
747
+ "type": "boolean",
748
+ "title": "Success",
749
+ "description": "True if score meets or exceeds the threshold.",
750
+ },
751
+ },
752
+ "required": ["score", "success"],
753
+ "additionalProperties": False,
754
+ },
755
+ ),
756
+ )
757
+
758
+ auto_similarity_match_v0_interface = WorkflowServiceInterface(
759
+ uri="agenta:built-in:auto_similarity_match:v0",
760
+ schemas=dict( # type: ignore
761
+ parameters={
762
+ "type": "object",
763
+ "title": "Similarity Match Parameters",
764
+ "description": "Settings for comparing predicted output against ground truth using string similarity.",
765
+ "properties": {
766
+ "correct_answer_key": {
767
+ "type": "string",
768
+ "title": "Expected Answer Column",
769
+ "description": "Column in test data containing the correct answer.",
770
+ "default": "correct_answer",
771
+ },
772
+ "threshold": {
773
+ "type": "number",
774
+ "title": "Threshold",
775
+ "description": "Minimum similarity score required for success.",
776
+ "minimum": 0,
777
+ "maximum": 1,
778
+ "default": 0.5,
779
+ },
780
+ "similarity_threshold": {
781
+ "type": "number",
782
+ "title": "Similarity Threshold (Alias)",
783
+ "description": "Alternative field for threshold, retained for compatibility.",
784
+ "minimum": 0,
785
+ "maximum": 1,
786
+ },
787
+ "case_sensitive": {
788
+ "type": "boolean",
789
+ "title": "Case Sensitive",
790
+ "description": "If True, similarity comparison is case-sensitive.",
791
+ "default": True,
792
+ },
793
+ },
794
+ "additionalProperties": False,
795
+ },
796
+ inputs={
797
+ "type": "object",
798
+ "title": "Similarity Match Inputs",
799
+ "description": "Workflow output and ground truth string to compare.",
800
+ },
801
+ outputs={
802
+ "type": "object",
803
+ "title": "Similarity Match Outputs",
804
+ "description": "Score and success flag for the similarity comparison.",
805
+ "properties": {
806
+ "score": {
807
+ "type": "number",
808
+ "title": "Score",
809
+ "description": "Similarity score (0–1).",
810
+ },
811
+ "success": {
812
+ "type": "boolean",
813
+ "title": "Success",
814
+ "description": "True if score meets or exceeds the threshold.",
815
+ },
816
+ },
817
+ "required": ["score", "success"],
818
+ "additionalProperties": False,
819
+ },
820
+ ),
821
+ )
822
+
823
+ auto_semantic_similarity_v0_interface = WorkflowServiceInterface(
824
+ uri="agenta:built-in:auto_semantic_similarity:v0",
825
+ schemas=dict( # type: ignore
826
+ parameters={
827
+ "type": "object",
828
+ "title": "Semantic Similarity Parameters",
829
+ "description": "Settings for semantic similarity using embeddings.",
830
+ "properties": {
831
+ "correct_answer_key": {
832
+ "type": "string",
833
+ "title": "Expected Answer Column",
834
+ "description": "Column in test data containing the correct answer.",
835
+ "default": "correct_answer",
836
+ },
837
+ "embedding_model": {
838
+ "type": "string",
839
+ "title": "Embedding Model",
840
+ "description": "The model used to generate embeddings.",
841
+ "default": "text-embedding-3-small",
842
+ },
843
+ "threshold": {
844
+ "type": "number",
845
+ "title": "Threshold",
846
+ "description": "Minimum semantic similarity score required for success.",
847
+ "minimum": 0,
848
+ "maximum": 1,
849
+ "default": 0.5,
850
+ },
851
+ },
852
+ "additionalProperties": False,
853
+ },
854
+ inputs={
855
+ "type": "object",
856
+ "title": "Semantic Similarity Inputs",
857
+ "description": "Workflow output and ground truth string to embed and compare.",
858
+ },
859
+ outputs={
860
+ "type": "object",
861
+ "title": "Semantic Similarity Outputs",
862
+ "description": "Score and success flag for the semantic similarity comparison.",
863
+ "properties": {
864
+ "score": {
865
+ "type": "number",
866
+ "title": "Score",
867
+ "description": "Cosine similarity score between output and ground truth embeddings.",
868
+ },
869
+ "success": {
870
+ "type": "boolean",
871
+ "title": "Success",
872
+ "description": "True if score meets or exceeds the threshold.",
873
+ },
874
+ },
875
+ "required": ["score", "success"],
876
+ "additionalProperties": False,
877
+ },
878
+ ),
879
+ )
880
+
881
+ completion_v0_interface = WorkflowServiceInterface(
882
+ uri="agenta:built-in:completion:v0",
883
+ schemas=dict( # type: ignore
884
+ parameters={
885
+ "type": "object",
886
+ "title": "Completion App Parameters",
887
+ "description": "Configuration for running a completion workflow.",
888
+ "properties": {
889
+ "prompt": {
890
+ "type": "object",
891
+ "title": "Prompt Template",
892
+ "description": "Prompt template configuration including system and user prompts.",
893
+ }
894
+ },
895
+ "required": ["prompt"],
896
+ "additionalProperties": False,
897
+ },
898
+ inputs={
899
+ "type": "object",
900
+ "title": "Completion App Inputs",
901
+ "description": "Inputs required by the completion workflow, matching the prompt template’s input keys.",
902
+ },
903
+ outputs={
904
+ "type": ["string", "object", "array"],
905
+ "title": "Completion App Outputs",
906
+ "description": "Generated response, which may be text or structured data.",
907
+ },
908
+ ),
909
+ )
910
+
911
+ chat_v0_interface = WorkflowServiceInterface(
912
+ uri="agenta:built-in:chat:v0",
913
+ schemas=dict( # type: ignore
914
+ parameters={
915
+ "type": "object",
916
+ "title": "Chat App Parameters",
917
+ "description": "Configuration for running a chat-based workflow.",
918
+ "properties": {
919
+ "prompt": {
920
+ "type": "object",
921
+ "title": "Prompt Template",
922
+ "description": "Prompt template configuration for initializing the chat.",
923
+ }
924
+ },
925
+ "required": ["prompt"],
926
+ "additionalProperties": False,
927
+ },
928
+ inputs={
929
+ "type": "object",
930
+ "title": "Chat App Inputs",
931
+ "description": "Optional inputs provided to format the prompt.",
932
+ },
933
+ outputs={
934
+ "type": "object",
935
+ "title": "Chat App Outputs",
936
+ "description": "Final chat message returned by the workflow.",
937
+ "properties": {
938
+ "role": {
939
+ "type": "string",
940
+ "description": "Role of the message sender.",
941
+ },
942
+ "content": {"type": "string", "description": "Content of the message."},
943
+ },
944
+ "required": ["role", "content"],
945
+ "additionalProperties": True, # allows OpenAI-style message fields like tool_calls
946
+ },
947
+ ),
948
+ )