orchestrator-core 4.6.0rc3__py3-none-any.whl → 4.6.1__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.
orchestrator/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2025 SURF, GÉANT.
1
+ # Copyright 2019-2025 SURF, GÉANT, ESnet.
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.6.0rc3"
16
+ __version__ = "4.6.1"
17
17
 
18
18
 
19
19
  from structlog import get_logger
orchestrator/app.py CHANGED
@@ -5,7 +5,7 @@ This module contains the main `OrchestratorCore` class for the `FastAPI` backend
5
5
  provides the ability to run the CLI.
6
6
  """
7
7
 
8
- # Copyright 2019-2020 SURF, ESnet, GÉANT.
8
+ # Copyright 2019-2025 SURF, ESnet, GÉANT.
9
9
  # Licensed under the Apache License, Version 2.0 (the "License");
10
10
  # you may not use this file except in compliance with the License.
11
11
  # You may obtain a copy of the License at
orchestrator/cli/main.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2020 SURF.
1
+ # Copyright 2019-2025 SURF, ESnet, GÉANT.
2
2
  # Licensed under the Apache License, Version 2.0 (the "License");
3
3
  # you may not use this file except in compliance with the License.
4
4
  # You may obtain a copy of the License at
orchestrator/db/models.py CHANGED
@@ -711,7 +711,7 @@ class SearchQueryTable(BaseModel):
711
711
  parameters = mapped_column(pg.JSONB, nullable=False)
712
712
 
713
713
  # Query embedding for semantic search (pgvector)
714
- query_embedding = mapped_column(Vector(1536), nullable=True)
714
+ query_embedding = mapped_column(Vector(llm_settings.EMBEDDING_DIMENSION), nullable=True)
715
715
 
716
716
  executed_at = mapped_column(UtcTimestamp, server_default=text("current_timestamp()"), nullable=False)
717
717
 
@@ -63,7 +63,12 @@ from orchestrator.graphql.schemas.settings import StatusType
63
63
  from orchestrator.graphql.schemas.subscription import SubscriptionInterface
64
64
  from orchestrator.graphql.schemas.version import VersionType
65
65
  from orchestrator.graphql.schemas.workflow import Workflow
66
- from orchestrator.graphql.types import SCALAR_OVERRIDES, OrchestratorContext, ScalarOverrideType, StrawberryModelType
66
+ from orchestrator.graphql.types import (
67
+ SCALAR_OVERRIDES,
68
+ OrchestratorContext,
69
+ ScalarOverrideType,
70
+ StrawberryModelType,
71
+ )
67
72
  from orchestrator.services.process_broadcast_thread import ProcessDataBroadcastThread
68
73
  from orchestrator.settings import app_settings
69
74
 
@@ -17,7 +17,7 @@ from ipaddress import IPv4Address, IPv4Interface, IPv6Address, IPv6Interface
17
17
  from typing import Any, NewType, TypeVar
18
18
 
19
19
  import strawberry
20
- from graphql import GraphQLError
20
+ from graphql import GraphQLError, GraphQLNamedType
21
21
  from strawberry.dataloader import DataLoader
22
22
  from strawberry.experimental.pydantic.conversion_types import StrawberryTypeFromPydantic
23
23
  from strawberry.scalars import JSON
@@ -122,6 +122,9 @@ IPv6InterfaceType = strawberry.scalar(
122
122
  parse_value=lambda v: v,
123
123
  )
124
124
 
125
+ # TODO: Remove Hack to prevent the error: `Redefinition of reserved type 'Int'`
126
+ if hasattr(GraphQLNamedType, "reserved_types"):
127
+ GraphQLNamedType.reserved_types.pop("Int", None)
125
128
  IntType = strawberry.scalar(
126
129
  NewType("Int", int),
127
130
  description="An arbitrary precision integer",
@@ -18,7 +18,7 @@ from structlog import get_logger
18
18
 
19
19
  logger = get_logger(__name__)
20
20
 
21
- EMBEDDING_DIMENSION_MIN = 200
21
+ EMBEDDING_DIMENSION_MIN = 100
22
22
  EMBEDDING_DIMENSION_MAX = 2000
23
23
  EMBEDDING_DIMENSION_DEFAULT = 1536
24
24
 
@@ -237,7 +237,7 @@ def create_task(conn: sa.engine.Connection, task: dict) -> None:
237
237
  "name": "task_name",
238
238
  "description": "task description",
239
239
  }
240
- >>> create_workflow(conn, task)
240
+ >>> create_task(conn, task)
241
241
  """
242
242
  if has_table_column(table_name="workflows", column_name="is_task", conn=conn):
243
243
  query = """
orchestrator/workflow.py CHANGED
@@ -235,7 +235,10 @@ def make_workflow(
235
235
  return wrapping_function
236
236
 
237
237
 
238
- def step(name: str) -> Callable[[StepFunc], Step]:
238
+ def step(
239
+ name: str,
240
+ retry_auth_callback: Authorizer | None = None,
241
+ ) -> Callable[[StepFunc], Step]:
239
242
  """Mark a function as a workflow step."""
240
243
 
241
244
  def decorator(func: StepFunc) -> Step:
@@ -255,12 +258,19 @@ def step(name: str) -> Callable[[StepFunc], Step]:
255
258
  logger.warning("Step failed", exc_info=ex)
256
259
  return Failed(ex)
257
260
 
258
- return make_step_function(wrapper, name)
261
+ return make_step_function(
262
+ wrapper,
263
+ name,
264
+ retry_auth_callback=retry_auth_callback,
265
+ )
259
266
 
260
267
  return decorator
261
268
 
262
269
 
263
- def retrystep(name: str) -> Callable[[StepFunc], Step]:
270
+ def retrystep(
271
+ name: str,
272
+ retry_auth_callback: Authorizer | None = None,
273
+ ) -> Callable[[StepFunc], Step]:
264
274
  """Mark a function as a retryable workflow step.
265
275
 
266
276
  If this step fails it goes to `Waiting` were it will be retried periodically. If it `Success` it acts as a normal
@@ -283,7 +293,11 @@ def retrystep(name: str) -> Callable[[StepFunc], Step]:
283
293
  except Exception as ex:
284
294
  return Waiting(ex)
285
295
 
286
- return make_step_function(wrapper, name)
296
+ return make_step_function(
297
+ wrapper,
298
+ name,
299
+ retry_auth_callback=retry_auth_callback,
300
+ )
287
301
 
288
302
  return decorator
289
303
 
@@ -349,7 +363,9 @@ def _extend_step_group_steps(name: str, steps: StepList) -> StepList:
349
363
  return enter_step >> steps >> exit_step
350
364
 
351
365
 
352
- def step_group(name: str, steps: StepList, extract_form: bool = True) -> Step:
366
+ def step_group(
367
+ name: str, steps: StepList, extract_form: bool = True, retry_auth_callback: Authorizer | None = None
368
+ ) -> Step:
353
369
  """Add a group of steps to the workflow as a single step.
354
370
 
355
371
  A step group is a sequence of steps that act as a single step.
@@ -362,6 +378,7 @@ def step_group(name: str, steps: StepList, extract_form: bool = True) -> Step:
362
378
  name: The name of the step
363
379
  steps: The sub steps in the step group
364
380
  extract_form: Whether to attach the first form of the sub steps to the step group
381
+ retry_auth_callback: Callback to determine if user is authorized to retry this group on failure
365
382
  """
366
383
 
367
384
  steps = _extend_step_group_steps(name, steps)
@@ -392,7 +409,7 @@ def step_group(name: str, steps: StepList, extract_form: bool = True) -> Step:
392
409
 
393
410
  # Make sure we return a form is a sub step has a form
394
411
  form = next((sub_step.form for sub_step in steps if sub_step.form), None) if extract_form else None
395
- return make_step_function(func, name, form)
412
+ return make_step_function(func, name, form, retry_auth_callback=retry_auth_callback)
396
413
 
397
414
 
398
415
  def _create_endpoint_step(key: str = DEFAULT_CALLBACK_ROUTE_KEY) -> StepFunc:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.6.0rc3
3
+ Version: 4.6.1
4
4
  Summary: This is the orchestrator workflow engine.
5
5
  Author-email: SURF <automation-beheer@surf.nl>
6
6
  Requires-Python: >=3.11,<3.14
@@ -41,8 +41,8 @@ Requires-Dist: fastapi-etag==0.4.0
41
41
  Requires-Dist: itsdangerous>=2.2.0
42
42
  Requires-Dist: jinja2==3.1.6
43
43
  Requires-Dist: more-itertools~=10.7.0
44
- Requires-Dist: nwa-stdlib~=1.9.2
45
- Requires-Dist: oauth2-lib==2.4.2
44
+ Requires-Dist: nwa-stdlib~=1.10.3
45
+ Requires-Dist: oauth2-lib>=2.5.0
46
46
  Requires-Dist: orjson==3.10.18
47
47
  Requires-Dist: pgvector>=0.4.1
48
48
  Requires-Dist: prometheus-client==0.22.1
@@ -119,21 +119,26 @@ Configure the database URI in your local environment:
119
119
  export DATABASE_URI=postgresql://nwa:nwa@localhost:5432/orchestrator-core
120
120
  ```
121
121
 
122
- ### Step 3 - Create main.py
122
+ ### Step 3 - Create main.py and wsgi.py
123
123
 
124
- Create a `main.py` file.
124
+ Create a `main.py` file for running the CLI.
125
125
 
126
126
  ```python
127
- from orchestrator import OrchestratorCore
128
127
  from orchestrator.cli.main import app as core_cli
129
- from orchestrator.settings import AppSettings
130
-
131
- app = OrchestratorCore(base_settings=AppSettings())
132
128
 
133
129
  if __name__ == "__main__":
134
130
  core_cli()
135
131
  ```
136
132
 
133
+ Create a `wsgi.py` file for running the web server.
134
+
135
+ ```python
136
+ from orchestrator import OrchestratorCore
137
+ from orchestrator.settings import AppSettings
138
+
139
+ app = OrchestratorCore(base_settings=AppSettings())
140
+ ```
141
+
137
142
  ### Step 4 - Run the database migrations
138
143
 
139
144
  Initialize the migration environment and database tables.
@@ -147,7 +152,7 @@ python main.py db upgrade heads
147
152
 
148
153
  ```shell
149
154
  export OAUTH2_ACTIVE=False
150
- uvicorn --reload --host 127.0.0.1 --port 8080 main:app
155
+ uvicorn --reload --host 127.0.0.1 --port 8080 wsgi:app
151
156
  ```
152
157
 
153
158
  Visit the [ReDoc](http://127.0.0.1:8080/api/redoc) or [OpenAPI](http://127.0.0.1:8080/api/docs) page to view and interact with the API.
@@ -1,8 +1,8 @@
1
- orchestrator/__init__.py,sha256=4xARck_KGcUMZ2sp8i379W7wwCUi1Fhs333T_FD2L0M,1450
1
+ orchestrator/__init__.py,sha256=nmpevZN48uSDOt0dNDWo92ZW--o53apq2S5b1q1mUn4,1454
2
2
  orchestrator/agentic_app.py,sha256=ouiyyZiS4uS6Lox2DtbGGRnb2njJBMSHpSAGe-T5rX0,3028
3
- orchestrator/app.py,sha256=UPKQuDpg8MWNC6r3SRRbp6l9RBzwb00IMIaGRk-jbCU,13203
3
+ orchestrator/app.py,sha256=w8ubXaaogwjmwLM0TXqZaLkAhmaOTWzVlwiYbi5mHeE,13203
4
4
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
5
- orchestrator/llm_settings.py,sha256=dU6fHcInyP3UzFlr3h4b-P7WyHdm04NM7ZDu1XnLAsQ,2816
5
+ orchestrator/llm_settings.py,sha256=giqxZmwO8sXyNF5Zc7-O9JYd7PLN065pKQYpJYOpXcE,2816
6
6
  orchestrator/log_config.py,sha256=1cPl_OXT4tEUyNxG8cwIWXrmadUm1E81vq0mdtrV-v4,1912
7
7
  orchestrator/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  orchestrator/security.py,sha256=iXFxGxab54aav7oHEKLAVkTgrQMJGHy6IYLojEnD7gI,2422
@@ -10,7 +10,7 @@ orchestrator/settings.py,sha256=mvs1VhBYth6Zp55HsNroML4DU1jiq5SkVM47_BLgcIo,4662
10
10
  orchestrator/targets.py,sha256=d7Fyh_mWIWPivA_E7DTNFpZID3xFW_K0JlZ5nksVX7k,830
11
11
  orchestrator/types.py,sha256=qzs7xx5AYRmKbpYRyJJP3wuDb0W0bcAzefCN0RWLAco,15459
12
12
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
13
- orchestrator/workflow.py,sha256=meDCPnyyX_n5PsMUaFy2wWb5EKNm1_ff7zRDBYrbcDg,45901
13
+ orchestrator/workflow.py,sha256=QvAbJ3ySuqUnKrQ_EQ6PQqgkK1TmKZ7COioCCmeABwc,46391
14
14
  orchestrator/api/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
15
15
  orchestrator/api/error_handling.py,sha256=YrPCxSa-DSa9KwqIMlXI-KGBGnbGIW5ukOPiikUH9E4,1502
16
16
  orchestrator/api/helpers.py,sha256=s0QRHYw8AvEmlkmRhuEzz9xixaZKUF3YuPzUVHkcoXk,6933
@@ -35,7 +35,7 @@ orchestrator/api/api_v1/endpoints/ws.py,sha256=1l7E0ag_sZ6UMfQPHlmew7ENwxjm6fflB
35
35
  orchestrator/cli/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
36
36
  orchestrator/cli/database.py,sha256=iO8SPvswNK1aXpk-QcIrwTqLrV7n_WQ5ftoG_VOkXxg,19870
37
37
  orchestrator/cli/generate.py,sha256=UPvdCtaG6Zy_Vb4t2B2Nsd0k8PMFToFj7YlNd3mgbqw,7601
38
- orchestrator/cli/main.py,sha256=xGLc_cS2LoSIbK5qkMFE7GCnZoOi5kATgtmQDFNQU7E,1658
38
+ orchestrator/cli/main.py,sha256=rpVp7f9N5LDDQXqTYPkI412ADNBwelf5gK4sS8f3e9Y,1673
39
39
  orchestrator/cli/migrate_domain_models.py,sha256=WRXy_1OnziQwpsCFZXvjB30nDJtjj0ikVXy8YNLque4,20928
40
40
  orchestrator/cli/migrate_tasks.py,sha256=bju8XColjSZD0v3rS4kl-24dLr8En_H4-6enBmqd494,7255
41
41
  orchestrator/cli/migrate_workflows.py,sha256=nxUpx0vgEIc_8aJrjAyrw3E9Dt8JmaamTts8oiQ4vHY,8923
@@ -115,7 +115,7 @@ orchestrator/db/database.py,sha256=MU_w_e95ho2dVb2JDnt_KFYholx___XDkiQXbc8wCkI,1
115
115
  orchestrator/db/helpers.py,sha256=L8kEdnSSNGnUpZhdeGx2arCodakWN8vSpKdfjoLuHdY,831
116
116
  orchestrator/db/listeners.py,sha256=UBPYcH0FE3a7aZQu_D0O_JMXpXIRYXC0gjSAvlv5GZo,1142
117
117
  orchestrator/db/loaders.py,sha256=ez6JzQ3IKVkC_oLAkVlIIiI8Do7hXbdcPKCvUSLxRog,7962
118
- orchestrator/db/models.py,sha256=4DsodjVWV5mJxsfoAo0qJY665AUn1krmpZMMByNtEVk,31300
118
+ orchestrator/db/models.py,sha256=vgYRMBiMzwDvePZBBkMrvflljfYHsAGNo6u6jUtC0QY,31328
119
119
  orchestrator/db/filters/__init__.py,sha256=RUj6P0XxEBhYj0SN5wH5-Vf_Wt_ilZR_n9DSar5m9oM,371
120
120
  orchestrator/db/filters/filters.py,sha256=55RtpQwM2rhrk4A6CCSeSXoo-BT9GnQoNTryA8CtLEg,5020
121
121
  orchestrator/db/filters/process.py,sha256=xvGhyfo_MZ1xhLvFC6yULjcT4mJk0fKc1glJIYgsWLE,4018
@@ -167,8 +167,8 @@ orchestrator/forms/validators/product_id.py,sha256=u5mURLT0pOhbFLdwvYcy2_2fXMt35
167
167
  orchestrator/graphql/__init__.py,sha256=avq8Yg3Jr_9pJqh7ClyIAOX7YSg1eM_AWmt5C3FRYUY,1440
168
168
  orchestrator/graphql/autoregistration.py,sha256=pF2jbMKG26MvYoMSa6ZpqpHjVks7_NvSRFymHTgmfjs,6342
169
169
  orchestrator/graphql/pagination.py,sha256=iqVDn3GPZpiQhEydfwkBJLURY-X8wwUphS8Lkeg0BOc,2413
170
- orchestrator/graphql/schema.py,sha256=dw4m4sM1ek2DscB8vINN6L8vVDE0h5GXclHGa8CiUJo,9537
171
- orchestrator/graphql/types.py,sha256=_kHKMusrRPuRtF4wm42NsBzoFZ4egbu3ibMmhd2D6Fs,5432
170
+ orchestrator/graphql/schema.py,sha256=hp4fzo5ky58DV4dDDdKWoiKPuRSbo1CJv-OukVeM090,9558
171
+ orchestrator/graphql/types.py,sha256=hfLX6LEHONHXW-VB58d9N1UT5qjHVsgMa5QgT__Ml50,5631
172
172
  orchestrator/graphql/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
173
  orchestrator/graphql/extensions/model_cache.py,sha256=1uhMRjBs9eK7zJ1Y6P6BopX06822w2Yh9jliwYvG6yQ,1085
174
174
  orchestrator/graphql/extensions/stats.py,sha256=pGhEBQg45XvqZhRobcrCSGwt5AGmR3gflsm1dYiIg5g,2018
@@ -222,7 +222,7 @@ orchestrator/migrations/README,sha256=heMzebYwlGhnE8_4CWJ4LS74WoEZjBy-S-mIJRxAEK
222
222
  orchestrator/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
223
  orchestrator/migrations/alembic.ini,sha256=kMoADqhGeubU8xanILNaqm4oixLy9m4ngYtdGpZcc7I,873
224
224
  orchestrator/migrations/env.py,sha256=M_cPoAL2axuuup5fvMy8I_WTPHEw0RbPEHkhZ3QEGoE,3740
225
- orchestrator/migrations/helpers.py,sha256=o3nx2JW_bIF0q7bQQFy4e8u4xAOboNhrcRjzdOoRgPg,47908
225
+ orchestrator/migrations/helpers.py,sha256=-Bvsl5Jt4FChtAAG7Lx6uiDVx6_8NyJ8IEWSk1fIQEU,47904
226
226
  orchestrator/migrations/script.py.mako,sha256=607Zrgp-Z-m9WGLt4wewN1QDOmHeifxcePUdADkSZyM,510
227
227
  orchestrator/migrations/templates/alembic.ini.j2,sha256=8v7UbKvOiWEbEKQa-Au3uONKUuYx6aflulYanZX6r2I,883
228
228
  orchestrator/migrations/templates/env.py.j2,sha256=LIt0ildZTZvNEx3imhy4GNzfFi_rPZg-8H7rGgrBOP8,2717
@@ -373,7 +373,7 @@ orchestrator/workflows/tasks/resume_workflows.py,sha256=T3iobSJjVgiupe0rClD34kUZ
373
373
  orchestrator/workflows/tasks/validate_product_type.py,sha256=lo2TX_MZOfcOmYFjLyD82FrJ5AAN3HOsE6BhDVFuy9Q,3210
374
374
  orchestrator/workflows/tasks/validate_products.py,sha256=GZJBoFF-WMphS7ghMs2-gqvV2iL1F0POhk0uSNt93n0,8510
375
375
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
376
- orchestrator_core-4.6.0rc3.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
377
- orchestrator_core-4.6.0rc3.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
378
- orchestrator_core-4.6.0rc3.dist-info/METADATA,sha256=yl83UYnpanmL7aawkE34ZHG0uBALcvgHh2MBHoY7Oq8,6253
379
- orchestrator_core-4.6.0rc3.dist-info/RECORD,,
376
+ orchestrator_core-4.6.1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
377
+ orchestrator_core-4.6.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
378
+ orchestrator_core-4.6.1.dist-info/METADATA,sha256=vD8LAwJ3cF18I_90KA-36bLcJ4jz_LiJOxwMVrb68bM,6351
379
+ orchestrator_core-4.6.1.dist-info/RECORD,,