orchestrator-core 4.7.0rc2__py3-none-any.whl → 4.7.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
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.7.0rc2"
16
+ __version__ = "4.7.1"
17
17
 
18
18
 
19
19
  from structlog import get_logger
@@ -23,7 +23,7 @@ from orchestrator.schedules.scheduler import (
23
23
  )
24
24
  from orchestrator.schedules.service import (
25
25
  SCHEDULER_QUEUE,
26
- add_scheduled_task_to_queue,
26
+ add_unique_scheduled_task_to_queue,
27
27
  workflow_scheduler_queue,
28
28
  )
29
29
  from orchestrator.schemas.schedules import APSchedulerJobCreate
@@ -132,10 +132,8 @@ def load_initial_schedule() -> None:
132
132
  - Task Clean Up Tasks
133
133
  - Task Validate Subscriptions
134
134
 
135
- !!! Warning
136
- This command is not idempotent.
137
-
138
- Please run `show-schedule` first to determine if the schedules already exist.
135
+ This command is idempotent since 4.7.1 when the scheduler is running. The schedules are only
136
+ created when they do not already exist in the database.
139
137
  """
140
138
  initial_schedules = [
141
139
  {
@@ -173,4 +171,4 @@ def load_initial_schedule() -> None:
173
171
  schedule["workflow_id"] = workflow.workflow_id
174
172
 
175
173
  typer.echo(f"Initial Schedule: {schedule}")
176
- add_scheduled_task_to_queue(APSchedulerJobCreate(**schedule)) # type: ignore
174
+ add_unique_scheduled_task_to_queue(APSchedulerJobCreate(**schedule)) # type: ignore
@@ -66,17 +66,46 @@ def deserialize_payload(bytes_dump: bytes) -> APSchedulerJobs:
66
66
  def add_scheduled_task_to_queue(payload: APSchedulerJobs) -> None:
67
67
  """Create a scheduled task service function.
68
68
 
69
- We need to create a apscheduler job, and put the workflow and schedule_id in
70
- the linker table workflows_apscheduler_jobs.
69
+ We need to create, update or delete an apscheduler job, and put the
70
+ workflow and schedule_id in the linker table workflows_apscheduler_jobs.
71
+ This is done by adding a job to a redis queue which will be executed
72
+ when the scheduler runs.
71
73
 
72
74
  Args:
73
- payload: APSchedulerJobCreate The scheduled task to create.
75
+ payload: APSchedulerJobs The scheduled task to create, update or delete
74
76
  """
75
77
  bytes_dump = serialize_payload(payload)
76
78
  redis_connection.lpush(SCHEDULER_QUEUE, bytes_dump)
77
79
  logger.info("Added scheduled task to queue.")
78
80
 
79
81
 
82
+ def add_unique_scheduled_task_to_queue(payload: APSchedulerJobCreate) -> bool:
83
+ """Create a unique scheduled task service function.
84
+
85
+ Checks if the workflow is already scheduled before creating an apscheduler
86
+ job, and putting the workflow and schedule_id in the linker table
87
+ workflows_apscheduler_jobs.
88
+ This is done by adding a job to a redis queue which will be executed
89
+ when the scheduler runs.
90
+
91
+ This function is not safe for concurrent usage and when the scheduler is not
92
+ running, as there might be a race condition between adding a job and checking
93
+ if it already exists in the database.
94
+
95
+ Args:
96
+ payload: APSchedulerJobCreate The scheduled task to create.
97
+
98
+ Returns:
99
+ True when the scheduled task was added to the queue
100
+ False when the scheduled task was not added to the queue
101
+ """
102
+ if db.session.query(WorkflowApschedulerJob).filter_by(workflow_id=payload.workflow_id).all():
103
+ logger.info(f"Not adding existing workflow {payload.workflow_name} as scheduled task.")
104
+ return False
105
+ add_scheduled_task_to_queue(payload)
106
+ return True
107
+
108
+
80
109
  def get_linker_entries_by_schedule_ids(schedule_ids: list[str]) -> list[WorkflowApschedulerJob]:
81
110
  """Get linker table entries for multiple schedule IDs in a single query.
82
111
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  from pydantic import BaseModel, ConfigDict, Field
16
16
 
17
- from orchestrator.search.core.types import EntityType
17
+ from orchestrator.search.core.types import EntityType, RetrieverType
18
18
  from orchestrator.search.filters import FilterTree
19
19
  from orchestrator.search.query.queries import SelectQuery
20
20
 
@@ -39,6 +39,10 @@ class SearchRequest(BaseModel):
39
39
  le=SelectQuery.MAX_LIMIT,
40
40
  description="Maximum number of search results to return.",
41
41
  )
42
+ retriever: RetrieverType | None = Field(
43
+ default=None,
44
+ description="Force a specific retriever type. If None, uses default routing logic.",
45
+ )
42
46
 
43
47
  model_config = ConfigDict(extra="forbid")
44
48
 
@@ -56,4 +60,5 @@ class SearchRequest(BaseModel):
56
60
  filters=self.filters,
57
61
  query_text=self.query,
58
62
  limit=self.limit,
63
+ retriever=self.retriever,
59
64
  )
@@ -40,27 +40,28 @@ class SearchMetadata:
40
40
  @classmethod
41
41
  def structured(cls) -> "SearchMetadata":
42
42
  return cls(
43
- search_type="structured", description="This search performs a filter-based search using structured queries."
43
+ search_type="structured",
44
+ description="This search performs a filter-based search using structured queries.",
44
45
  )
45
46
 
46
47
  @classmethod
47
48
  def fuzzy(cls) -> "SearchMetadata":
48
49
  return cls(
49
- search_type="fuzzy",
50
+ search_type=RetrieverType.FUZZY.value,
50
51
  description="This search performs a trigram similarity search.",
51
52
  )
52
53
 
53
54
  @classmethod
54
55
  def semantic(cls) -> "SearchMetadata":
55
56
  return cls(
56
- search_type="semantic",
57
+ search_type=RetrieverType.SEMANTIC.value,
57
58
  description="This search performs a vector similarity search, using L2 distance on embeddings with minimum distance scoring (normalized).",
58
59
  )
59
60
 
60
61
  @classmethod
61
62
  def hybrid(cls) -> "SearchMetadata":
62
63
  return cls(
63
- search_type="hybrid",
64
+ search_type=RetrieverType.HYBRID.value,
64
65
  description="This search performs reciprocal rank fusion combining trigram similarity, word_similarity, and L2 vector distance.",
65
66
  )
66
67
 
@@ -109,6 +110,14 @@ class ActionType(str, Enum):
109
110
  AGGREGATE = "aggregate" # Compute aggregations (sum, avg, etc.) over matching records.
110
111
 
111
112
 
113
+ class RetrieverType(str, Enum):
114
+ """Defines available retriever types for search operations."""
115
+
116
+ FUZZY = "fuzzy"
117
+ SEMANTIC = "semantic"
118
+ HYBRID = "hybrid"
119
+
120
+
112
121
  class UIType(str, Enum):
113
122
  STRING = "string"
114
123
  NUMBER = "number"
@@ -15,7 +15,7 @@ import structlog
15
15
  from sqlalchemy.orm import Session
16
16
 
17
17
  from orchestrator.search.core.embedding import QueryEmbedder
18
- from orchestrator.search.core.types import SearchMetadata
18
+ from orchestrator.search.core.types import EntityType, RetrieverType, SearchMetadata
19
19
  from orchestrator.search.query.results import (
20
20
  AggregationResponse,
21
21
  SearchResponse,
@@ -23,7 +23,13 @@ from orchestrator.search.query.results import (
23
23
  format_search_response,
24
24
  )
25
25
  from orchestrator.search.retrieval.pagination import PageCursor
26
- from orchestrator.search.retrieval.retrievers import Retriever
26
+ from orchestrator.search.retrieval.retrievers import (
27
+ FuzzyRetriever,
28
+ ProcessHybridRetriever,
29
+ Retriever,
30
+ RrfHybridRetriever,
31
+ SemanticRetriever,
32
+ )
27
33
 
28
34
  from .builder import build_aggregation_query, build_candidate_query, build_simple_count_query
29
35
  from .export import fetch_export_data
@@ -32,6 +38,59 @@ from .queries import AggregateQuery, CountQuery, ExportQuery, SelectQuery
32
38
  logger = structlog.get_logger(__name__)
33
39
 
34
40
 
41
+ def _get_retriever_from_override(
42
+ query: SelectQuery | ExportQuery,
43
+ cursor: PageCursor | None,
44
+ query_embedding: list[float] | None,
45
+ ) -> Retriever | None:
46
+ """Get retriever instance from explicit override, or None if no override.
47
+
48
+ Args:
49
+ query: Query that may have a retriever override
50
+ cursor: Pagination cursor
51
+ query_embedding: Pre-computed embedding (may be None)
52
+
53
+ Returns:
54
+ Retriever instance matching the requested type, or None if no override specified
55
+
56
+ Raises:
57
+ ValueError: If override requirements aren't met (e.g., no query text or embedding)
58
+ """
59
+ if query.retriever is None:
60
+ return None
61
+
62
+ retriever_type = query.retriever
63
+
64
+ # Validate query_text (required for all retriever types)
65
+ if not query.query_text:
66
+ raise ValueError(f"{retriever_type.value.capitalize()} retriever requested but no query text provided.")
67
+
68
+ is_process = query.entity_type == EntityType.PROCESS
69
+
70
+ if retriever_type == RetrieverType.FUZZY:
71
+ return (
72
+ ProcessHybridRetriever(None, query.query_text, cursor)
73
+ if is_process
74
+ else FuzzyRetriever(query.query_text, cursor)
75
+ )
76
+ if retriever_type == RetrieverType.SEMANTIC:
77
+ if query_embedding is None:
78
+ raise ValueError(
79
+ "Semantic retriever requested but query embedding is not available. "
80
+ "Embedding generation may have failed."
81
+ )
82
+ return SemanticRetriever(query_embedding, cursor)
83
+ if query_embedding is None:
84
+ raise ValueError(
85
+ "Hybrid retriever requested but query embedding is not available. " "Embedding generation may have failed."
86
+ )
87
+ return (
88
+ ProcessHybridRetriever(query_embedding, query.query_text, cursor)
89
+ if is_process
90
+ else RrfHybridRetriever(query_embedding, query.query_text, cursor)
91
+ )
92
+
93
+
35
94
  async def _execute_search(
36
95
  query: SelectQuery | ExportQuery,
37
96
  db_session: Session,
@@ -60,7 +119,10 @@ async def _execute_search(
60
119
  if query.vector_query and not query_embedding:
61
120
  query_embedding = await QueryEmbedder.generate_for_text_async(query.vector_query)
62
121
 
63
- retriever = Retriever.route(query, cursor, query_embedding)
122
+ # Get retriever (from override or automatic routing)
123
+ retriever = _get_retriever_from_override(query, cursor, query_embedding) or Retriever.route(
124
+ query, cursor, query_embedding
125
+ )
64
126
  logger.debug("Using retriever", retriever_type=retriever.__class__.__name__)
65
127
 
66
128
  final_stmt = retriever.apply(candidate_query)
@@ -5,6 +5,7 @@ from typing import Self
5
5
  from pydantic import BaseModel, Field, model_validator
6
6
 
7
7
  from orchestrator.search.aggregations import Aggregation, TemporalGrouping
8
+ from orchestrator.search.core.types import RetrieverType
8
9
 
9
10
  __all__ = [
10
11
  "SearchMixin",
@@ -39,6 +40,10 @@ class SearchMixin(BaseModel):
39
40
  """
40
41
 
41
42
  query_text: str | None = Field(default=None, description="Text query for semantic/fuzzy search")
43
+ retriever: RetrieverType | None = Field(
44
+ default=None,
45
+ description="Override retriever type (fuzzy/semantic/hybrid). If None, uses default routing logic.",
46
+ )
42
47
 
43
48
  @property
44
49
  def vector_query(self) -> str | None:
@@ -26,7 +26,7 @@ from orchestrator.services.workflows import (
26
26
  )
27
27
  from orchestrator.settings import app_settings, get_authorizers
28
28
  from orchestrator.targets import Target
29
- from orchestrator.workflow import StepList, init, step, workflow
29
+ from orchestrator.workflow import StepList, done, init, step, workflow
30
30
 
31
31
  logger = structlog.get_logger(__name__)
32
32
 
@@ -65,4 +65,4 @@ def validate_subscriptions() -> None:
65
65
  retry_auth_callback=authorizers.retry_auth_callback,
66
66
  )
67
67
  def task_validate_subscriptions() -> StepList:
68
- return init >> validate_subscriptions
68
+ return init >> validate_subscriptions >> done
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.7.0rc2
3
+ Version: 4.7.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.15
@@ -31,13 +31,13 @@ Classifier: Topic :: Software Development :: Libraries
31
31
  Classifier: Topic :: Software Development
32
32
  Classifier: Typing :: Typed
33
33
  License-File: LICENSE
34
- Requires-Dist: alembic==1.17.2
34
+ Requires-Dist: alembic==1.18.1
35
35
  Requires-Dist: anyio>=3.7.0
36
36
  Requires-Dist: apscheduler>=3.11.0
37
37
  Requires-Dist: click==8.*
38
38
  Requires-Dist: deepmerge==2.0
39
39
  Requires-Dist: deprecated>=1.2.18
40
- Requires-Dist: fastapi~=0.124.0
40
+ Requires-Dist: fastapi~=0.128.0
41
41
  Requires-Dist: fastapi-etag==0.4.0
42
42
  Requires-Dist: itsdangerous>=2.2.0
43
43
  Requires-Dist: jinja2==3.1.6
@@ -46,7 +46,7 @@ Requires-Dist: nwa-stdlib~=1.11.0
46
46
  Requires-Dist: oauth2-lib>=2.5.0
47
47
  Requires-Dist: orjson==3.11.5
48
48
  Requires-Dist: pgvector>=0.4.1
49
- Requires-Dist: prometheus-client==0.23.1
49
+ Requires-Dist: prometheus-client==0.24.1
50
50
  Requires-Dist: psycopg2-binary==2.9.11
51
51
  Requires-Dist: pydantic-forms>=1.4.0
52
52
  Requires-Dist: pydantic-settings~=2.12.0
@@ -62,8 +62,8 @@ Requires-Dist: sqlalchemy-utils==0.42.1
62
62
  Requires-Dist: strawberry-graphql>=0.281.0,<0.285.0
63
63
  Requires-Dist: structlog>=25.4.0
64
64
  Requires-Dist: tabulate==0.9.0
65
- Requires-Dist: typer==0.20.0
66
- Requires-Dist: uvicorn[standard]~=0.38.0
65
+ Requires-Dist: typer==0.21.1
66
+ Requires-Dist: uvicorn[standard]~=0.40.0
67
67
  Requires-Dist: pydantic-ai-slim >=1.27.0 ; extra == "agent"
68
68
  Requires-Dist: ag-ui-protocol>=0.1.10 ; extra == "agent"
69
69
  Requires-Dist: litellm>=1.75.7 ; extra == "agent"
@@ -1,4 +1,4 @@
1
- orchestrator/__init__.py,sha256=g60P7OYq7nfuo0jdDTrWSn_bkOtIRZqRdU_opGAR1aQ,1457
1
+ orchestrator/__init__.py,sha256=ZUMqFoYxZjh4nowQu2_YP5vbtKfQeVG2YNxYm78KPYM,1454
2
2
  orchestrator/agentic_app.py,sha256=ouiyyZiS4uS6Lox2DtbGGRnb2njJBMSHpSAGe-T5rX0,3028
3
3
  orchestrator/app.py,sha256=5ITGSN_KeRi2qTvfwBXhjOGNyWNy-rdtzfOLEk76ZtY,14661
4
4
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
@@ -41,7 +41,7 @@ orchestrator/cli/migrate_domain_models.py,sha256=WRXy_1OnziQwpsCFZXvjB30nDJtjj0i
41
41
  orchestrator/cli/migrate_tasks.py,sha256=bju8XColjSZD0v3rS4kl-24dLr8En_H4-6enBmqd494,7255
42
42
  orchestrator/cli/migrate_workflows.py,sha256=nxUpx0vgEIc_8aJrjAyrw3E9Dt8JmaamTts8oiQ4vHY,8923
43
43
  orchestrator/cli/migration_helpers.py,sha256=C5tpkP5WEBr7G9S-1k1hgSI8ili6xd9Z5ygc9notaK0,4110
44
- orchestrator/cli/scheduler.py,sha256=kCHKAXnVWDgmzgIaIBYHop0vE2Isi22KFH3W7d8Yyi4,5805
44
+ orchestrator/cli/scheduler.py,sha256=PoadDvj8Vwbz2G50z8P97IqEx1JVaAdNntfZ_yrQUc8,5833
45
45
  orchestrator/cli/domain_gen_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py,sha256=uzpwsaau81hHSxNMOS9-o7kF-9_78R0f_UE0AvWooZQ,6775
47
47
  orchestrator/cli/domain_gen_helpers/helpers.py,sha256=tIPxn8ezED_xYZxH7ZAtQLwkDc6RNmLZVxWAoJ3a9lw,4203
@@ -263,7 +263,7 @@ orchestrator/migrations/versions/schema/2025-12-10_9736496e3eba_set_is_task_true
263
263
  orchestrator/schedules/__init__.py,sha256=i8sT88A3v_5KIfwbKZxe3rS2rMakOuqfAis0DRmBleU,1017
264
264
  orchestrator/schedules/scheduler.py,sha256=8o7DoVs9Q1Q231FVMpv3tXtKbaydeNkYQ1h6kl7U1X4,7198
265
265
  orchestrator/schedules/scheduling.py,sha256=1lSeAhKRGhZNOtFiB-FPMeo3bEIDpt9OdJKBkk7QknI,2914
266
- orchestrator/schedules/service.py,sha256=CYWb_gB5Dw57AIiQtSVcLW4sEE69zNoWGuSe2WEIj_8,8940
266
+ orchestrator/schedules/service.py,sha256=y7GqtfE0z7_StApCzbGiPFUE7rB92q_yrYYxMitnJtI,10198
267
267
  orchestrator/schedules/validate_products.py,sha256=_ucUG9HecskG2eN3tcDSiMzJK9gN3kZB1dXjrtxcApY,1324
268
268
  orchestrator/schemas/__init__.py,sha256=YDyZ0YBvzB4ML9oDBCBPGnBvf680zFFgUzg7X0tYBRY,2326
269
269
  orchestrator/schemas/base.py,sha256=Vc444LetsINLRhG2SxW9Bq01hOzChPOhQWCImQTr-As,930
@@ -276,7 +276,7 @@ orchestrator/schemas/product_block.py,sha256=kCqvm6qadHpegMr9aWI_fYX-T7mS-5S-ldP
276
276
  orchestrator/schemas/resource_type.py,sha256=VDju4XywcDDLxdpbWU62RTvR9QF8x_GRrpTlN_NE8uI,1064
277
277
  orchestrator/schemas/schedules.py,sha256=Gb427IGR5mPTjKN8STwUhAWCJMCywJkrS8OetiiHTKY,2844
278
278
  orchestrator/schemas/search.py,sha256=d_Vs1qU9Z5zuXN4pDk6jrVwiUXRKZ93U-tHW5Zfrw-w,1546
279
- orchestrator/schemas/search_requests.py,sha256=j2X98eLRTr_dYeGcIc78iPyKoYaAgvl1NQjYV4L1CGY,1925
279
+ orchestrator/schemas/search_requests.py,sha256=2gb1mbzzMmSbMTtLmItrTSPWRXNKwdgoPIEiNFhTFjA,2144
280
280
  orchestrator/schemas/subscription.py,sha256=-jXyHZIed9Xlia18ksSDyenblNN6Q2yM2FlGELyJ458,3423
281
281
  orchestrator/schemas/subscription_descriptions.py,sha256=Ft_jw1U0bf9Z0U8O4OWfLlcl0mXCVT_qYVagBP3GbIQ,1262
282
282
  orchestrator/schemas/workflow.py,sha256=StVoRGyNT2iIeq3z8BIlTPt0bcafzbeYxXRrCucR6LU,2146
@@ -295,7 +295,7 @@ orchestrator/search/aggregations/base.py,sha256=jC06rzecurlzIxh7RCctFgsaPxU1sGCa
295
295
  orchestrator/search/core/__init__.py,sha256=q5G0z3nKjIHKFs1PkEG3nvTUy3Wp4kCyBtCbqUITj3A,579
296
296
  orchestrator/search/core/embedding.py,sha256=n16H5fZRlfn91wI8PfZPa1R39HwQd8T1nwlDOzcOUBU,2823
297
297
  orchestrator/search/core/exceptions.py,sha256=S_ZMEhrqsQBVqJ559FQ5J6tZU6BYLiU65AGWgSvgv_k,1159
298
- orchestrator/search/core/types.py,sha256=eEar-1MFKiOqagKp9e2DLEZtGQQGQR_Ia7fiuRzIVoc,8953
298
+ orchestrator/search/core/types.py,sha256=y9j4TJ_14SW6Ids4XvsSr1Zx3eLLaor0HU6LY0MECcg,9190
299
299
  orchestrator/search/core/validators.py,sha256=zktY5A3RTBmfdARJoxoz9rnnyTZj7L30Kbmh9UTQz2o,1204
300
300
  orchestrator/search/docs/index.md,sha256=zKzE2fbtHDfYTKaHg628wAsqCTOJ5yFUWV0ucFH3pAg,863
301
301
  orchestrator/search/docs/running_local_text_embedding_inference.md,sha256=OR0NVZMb8DqpgXYxlwDUrJwfRk0bYOk1-LkDMqsV6bU,1327
@@ -312,10 +312,10 @@ orchestrator/search/indexing/tasks.py,sha256=0p68RNwJnHSGZQjfdpyFsS2Ma5Gr2PpZROZ
312
312
  orchestrator/search/indexing/traverse.py,sha256=JLut9t4LoPCWhJ_63VgYhRKfjwyxRv-mTbQLC8mA_mU,15158
313
313
  orchestrator/search/query/__init__.py,sha256=nCjvK_n2WQdV_ACrncFXEfnvLcHtuI__J7KLlFIaQvo,2437
314
314
  orchestrator/search/query/builder.py,sha256=EfDSSOQKUBNtUESDBsKaPY6hZ_iDXAwc3qcNR4AGAEg,13261
315
- orchestrator/search/query/engine.py,sha256=TFdV_sSoSXCSDSpyhVA2S6YaJysDSW2WtPj7duAyomk,5745
315
+ orchestrator/search/query/engine.py,sha256=mlUrK_FKfytdYgsvhaZaiHSBvlqUvFERS5VAfzFHuNM,7920
316
316
  orchestrator/search/query/exceptions.py,sha256=DrkNzXVbQAOi28FTHKimf_eTrXmhYwXrH986QhfQLPU,4941
317
317
  orchestrator/search/query/export.py,sha256=_0ncVpTqN6AoQfW3WX0fWnDQX3hBz6ZGC31Beu4PVwQ,6678
318
- orchestrator/search/query/mixins.py,sha256=IUtN8QEowTNntk_MiiaaRxJS_QNxOXYmfiiOwzWuYZA,4939
318
+ orchestrator/search/query/mixins.py,sha256=8zvrQMlIkWt3q0BFfekm9ugVmuu85GaKQBEgJxUQmj4,5178
319
319
  orchestrator/search/query/queries.py,sha256=0jF97cU2Z98-oWm1Iyqf3xIgrmc7FcWAPTb51tUG4MA,4506
320
320
  orchestrator/search/query/results.py,sha256=5OgAs39oncDIBdpB3NJltPr-UvLvLlxTWw9sn-lyfQA,10989
321
321
  orchestrator/search/query/state.py,sha256=fMSBJs39kZTkpDE2T4h4x0x-51GqUvzAuePg2YUbO6I,3220
@@ -381,9 +381,9 @@ orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=FOcYfyH-dsNAilmW8ynEpz5
381
381
  orchestrator/workflows/tasks/resume_workflows.py,sha256=OvYFY-Nun885ZAzcFp6hphvYtRy3VkdUgiGIU5TapZ0,4507
382
382
  orchestrator/workflows/tasks/validate_product_type.py,sha256=KoDMqROGVQ0ZPu69jMFO7cto8j0xi11h0_IeBOcV94A,3413
383
383
  orchestrator/workflows/tasks/validate_products.py,sha256=lCAXmCVhohgrdgJn7-d7fIxPj4MVOX0J8KezcvwIK3k,8716
384
- orchestrator/workflows/tasks/validate_subscriptions.py,sha256=lMAwaEVhZ1FD91Sw2eIjTc4hmGxQX3DgbJPYdJ1_dmw,2373
384
+ orchestrator/workflows/tasks/validate_subscriptions.py,sha256=CFKf3igyrqGm-zzSMD0wbNLgJwKz8quNNgnNWDqgpI0,2387
385
385
  orchestrator/workflows/translations/en-GB.json,sha256=ObBlH9XILJ9uNaGcJexi3IB0e6P8CKFKRgu29luIEM8,973
386
- orchestrator_core-4.7.0rc2.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
387
- orchestrator_core-4.7.0rc2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
388
- orchestrator_core-4.7.0rc2.dist-info/METADATA,sha256=t5QOCqYRtJbaUgsAdnnxJ-9Eqh0TkICB5oAlmswWDHs,6421
389
- orchestrator_core-4.7.0rc2.dist-info/RECORD,,
386
+ orchestrator_core-4.7.1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
387
+ orchestrator_core-4.7.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
388
+ orchestrator_core-4.7.1.dist-info/METADATA,sha256=2plaKnYq_wj2iBQX1jWqk6b773iTh0htol6M65lVsW4,6418
389
+ orchestrator_core-4.7.1.dist-info/RECORD,,