orchestrator-core 4.4.1__py3-none-any.whl → 4.5.0a2__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 (54) hide show
  1. orchestrator/__init__.py +26 -2
  2. orchestrator/agentic_app.py +84 -0
  3. orchestrator/api/api_v1/api.py +10 -0
  4. orchestrator/api/api_v1/endpoints/search.py +277 -0
  5. orchestrator/app.py +32 -0
  6. orchestrator/cli/index_llm.py +73 -0
  7. orchestrator/cli/main.py +22 -1
  8. orchestrator/cli/resize_embedding.py +135 -0
  9. orchestrator/cli/search_explore.py +208 -0
  10. orchestrator/cli/speedtest.py +151 -0
  11. orchestrator/db/models.py +37 -1
  12. orchestrator/llm_settings.py +51 -0
  13. orchestrator/migrations/versions/schema/2025-08-12_52b37b5b2714_search_index_model_for_llm_integration.py +95 -0
  14. orchestrator/schemas/search.py +117 -0
  15. orchestrator/search/__init__.py +12 -0
  16. orchestrator/search/agent/__init__.py +8 -0
  17. orchestrator/search/agent/agent.py +47 -0
  18. orchestrator/search/agent/prompts.py +87 -0
  19. orchestrator/search/agent/state.py +8 -0
  20. orchestrator/search/agent/tools.py +236 -0
  21. orchestrator/search/core/__init__.py +0 -0
  22. orchestrator/search/core/embedding.py +64 -0
  23. orchestrator/search/core/exceptions.py +22 -0
  24. orchestrator/search/core/types.py +281 -0
  25. orchestrator/search/core/validators.py +27 -0
  26. orchestrator/search/docs/index.md +37 -0
  27. orchestrator/search/docs/running_local_text_embedding_inference.md +45 -0
  28. orchestrator/search/filters/__init__.py +27 -0
  29. orchestrator/search/filters/base.py +275 -0
  30. orchestrator/search/filters/date_filters.py +75 -0
  31. orchestrator/search/filters/definitions.py +93 -0
  32. orchestrator/search/filters/ltree_filters.py +43 -0
  33. orchestrator/search/filters/numeric_filter.py +60 -0
  34. orchestrator/search/indexing/__init__.py +3 -0
  35. orchestrator/search/indexing/indexer.py +323 -0
  36. orchestrator/search/indexing/registry.py +88 -0
  37. orchestrator/search/indexing/tasks.py +53 -0
  38. orchestrator/search/indexing/traverse.py +322 -0
  39. orchestrator/search/retrieval/__init__.py +3 -0
  40. orchestrator/search/retrieval/builder.py +113 -0
  41. orchestrator/search/retrieval/engine.py +152 -0
  42. orchestrator/search/retrieval/pagination.py +83 -0
  43. orchestrator/search/retrieval/retriever.py +447 -0
  44. orchestrator/search/retrieval/utils.py +106 -0
  45. orchestrator/search/retrieval/validation.py +174 -0
  46. orchestrator/search/schemas/__init__.py +0 -0
  47. orchestrator/search/schemas/parameters.py +116 -0
  48. orchestrator/search/schemas/results.py +64 -0
  49. orchestrator/services/settings_env_variables.py +2 -2
  50. orchestrator/settings.py +1 -1
  51. {orchestrator_core-4.4.1.dist-info → orchestrator_core-4.5.0a2.dist-info}/METADATA +8 -3
  52. {orchestrator_core-4.4.1.dist-info → orchestrator_core-4.5.0a2.dist-info}/RECORD +54 -11
  53. {orchestrator_core-4.4.1.dist-info → orchestrator_core-4.5.0a2.dist-info}/WHEEL +0 -0
  54. {orchestrator_core-4.4.1.dist-info → orchestrator_core-4.5.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,174 @@
1
+ from typing import assert_never
2
+
3
+ from sqlalchemy import select, text
4
+ from sqlalchemy.exc import ProgrammingError
5
+ from sqlalchemy_utils import Ltree
6
+
7
+ from orchestrator.db import db
8
+ from orchestrator.db.database import WrappedSession
9
+ from orchestrator.db.models import AiSearchIndex
10
+ from orchestrator.search.core.types import EntityType, FieldType
11
+ from orchestrator.search.filters import (
12
+ DateRangeFilter,
13
+ DateValueFilter,
14
+ EqualityFilter,
15
+ FilterCondition,
16
+ FilterTree,
17
+ LtreeFilter,
18
+ NumericRangeFilter,
19
+ NumericValueFilter,
20
+ PathFilter,
21
+ StringFilter,
22
+ )
23
+
24
+
25
+ def is_filter_compatible_with_field_type(filter_condition: FilterCondition, field_type: FieldType) -> bool:
26
+ """Check whether a filter condition is compatible with a given field type.
27
+
28
+ Parameters
29
+ ----------
30
+ filter_condition : FilterCondition
31
+ The filter condition instance to check.
32
+ field_type : FieldType
33
+ The type of field from the index schema.
34
+
35
+ Returns:
36
+ -------
37
+ bool
38
+ True if the filter condition is valid for the given field type, False otherwise.
39
+ """
40
+
41
+ match filter_condition:
42
+ case LtreeFilter():
43
+ return True # Filters for path only
44
+ case DateRangeFilter() | DateValueFilter():
45
+ return field_type == FieldType.DATETIME
46
+ case NumericRangeFilter() | NumericValueFilter():
47
+ return field_type in {FieldType.INTEGER, FieldType.FLOAT}
48
+ case StringFilter():
49
+ return field_type == FieldType.STRING
50
+ case EqualityFilter():
51
+ return field_type in {
52
+ FieldType.BOOLEAN,
53
+ FieldType.UUID,
54
+ FieldType.BLOCK,
55
+ FieldType.RESOURCE_TYPE,
56
+ FieldType.STRING,
57
+ }
58
+ case _:
59
+ assert_never(filter_condition)
60
+
61
+
62
+ def is_lquery_syntactically_valid(pattern: str, db_session: WrappedSession) -> bool:
63
+ """Validate whether a string is a syntactically correct `lquery` pattern.
64
+
65
+ Parameters
66
+ ----------
67
+ pattern : str
68
+ The LTree lquery pattern string to validate.
69
+ db_session : WrappedSession
70
+ The database session used to test casting.
71
+
72
+ Returns:
73
+ -------
74
+ bool
75
+ True if the pattern is valid, False if it fails to cast in PostgreSQL.
76
+ """
77
+ try:
78
+ with db_session.begin_nested():
79
+ db_session.execute(text("SELECT CAST(:pattern AS lquery)"), {"pattern": pattern})
80
+ return True
81
+ except ProgrammingError:
82
+ return False
83
+
84
+
85
+ def get_structured_filter_schema() -> dict[str, str]:
86
+ """Retrieve all distinct filterable paths and their field types from the index.
87
+
88
+ Returns:
89
+ -------
90
+ Dict[str, str]
91
+ Mapping of path strings to their corresponding field type values.
92
+ """
93
+ stmt = select(AiSearchIndex.path, AiSearchIndex.value_type).distinct().order_by(AiSearchIndex.path)
94
+ result = db.session.execute(stmt)
95
+ return {str(path): value_type.value for path, value_type in result}
96
+
97
+
98
+ def validate_filter_path(path: str) -> str | None:
99
+ """Check if a given path exists in the index and return its field type.
100
+
101
+ Parameters
102
+ ----------
103
+ path : str
104
+ The fully qualified LTree path.
105
+
106
+ Returns:
107
+ -------
108
+ Optional[str]
109
+ The value type of the field if found, otherwise None.
110
+ """
111
+ stmt = select(AiSearchIndex.value_type).where(AiSearchIndex.path == Ltree(path)).limit(1)
112
+ result = db.session.execute(stmt).scalar_one_or_none()
113
+ return result.value if result else None
114
+
115
+
116
+ async def complete_filter_validation(filter: PathFilter, entity_type: EntityType) -> None:
117
+ """Validate a PathFilter against the database schema and entity type.
118
+
119
+ Checks performed:
120
+ 1. LTree filter syntax (for LtreeFilter only)
121
+ 2. Non-empty path
122
+ 3. Path exists in the database schema
123
+ 4. Filter type matches the field's value_type
124
+ 5. Path starts with the correct entity type prefix (unless wildcard)
125
+
126
+ Parameters
127
+ ----------
128
+ filter : PathFilter
129
+ The filter to validate.
130
+ entity_type : EntityType
131
+ The entity type being searched.
132
+
133
+ Raises:
134
+ ------
135
+ ValueError
136
+ If any of the validation checks fail.
137
+ """
138
+ # Ltree is a special case
139
+ if isinstance(filter.condition, LtreeFilter):
140
+ lquery_pattern = filter.condition.value
141
+ if not is_lquery_syntactically_valid(lquery_pattern, db.session):
142
+ raise ValueError(f"Ltree pattern '{lquery_pattern}' has invalid syntax.")
143
+ return
144
+
145
+ if not filter.path or not filter.path.strip():
146
+ raise ValueError("Filter path cannot be empty")
147
+
148
+ # 1. Check if path exists in database
149
+ db_field_type_str = validate_filter_path(filter.path)
150
+ if db_field_type_str is None:
151
+ raise ValueError(f"Path '{filter.path}' does not exist in database schema")
152
+
153
+ db_field_type = FieldType(db_field_type_str)
154
+
155
+ # 2. Check filter compatibility with field type
156
+ if not is_filter_compatible_with_field_type(filter.condition, db_field_type):
157
+ raise ValueError(
158
+ f"Filter '{type(filter.condition).__name__}' not compatible with field type '{db_field_type.value}'"
159
+ )
160
+
161
+ # 3. Check entity type prefix requirements (unless it's a wildcard path)
162
+ expected_prefix = f"{entity_type.value.lower()}."
163
+ if not filter.path.startswith(expected_prefix) and not filter.path.startswith("*"):
164
+ raise ValueError(
165
+ f"Filter path '{filter.path}' must start with '{expected_prefix}' for {entity_type.value} searches."
166
+ )
167
+
168
+
169
+ async def validate_filter_tree(filters: FilterTree | None, entity_type: EntityType) -> None:
170
+ """Validate all PathFilter leaves in a FilterTree."""
171
+ if filters is None:
172
+ return
173
+ for leaf in filters.get_all_leaves():
174
+ await complete_filter_validation(leaf, entity_type)
File without changes
@@ -0,0 +1,116 @@
1
+ import uuid
2
+ from typing import Any, Literal
3
+
4
+ from pydantic import BaseModel, ConfigDict, Field
5
+
6
+ from orchestrator.search.core.types import ActionType, EntityType
7
+ from orchestrator.search.filters import FilterTree
8
+
9
+
10
+ class BaseSearchParameters(BaseModel):
11
+ """Base model with common search parameters."""
12
+
13
+ action: ActionType = Field(default=ActionType.SELECT, description="The action to perform.")
14
+ entity_type: EntityType
15
+
16
+ filters: FilterTree | None = Field(default=None, description="A list of structured filters to apply to the search.")
17
+
18
+ query: str | None = Field(
19
+ default=None, description="Unified search query - will be processed into vector_query and/or fuzzy_term"
20
+ )
21
+
22
+ limit: int = Field(default=10, ge=1, le=30, description="Maximum number of search results to return.")
23
+ model_config = ConfigDict(extra="forbid")
24
+
25
+ @classmethod
26
+ def create(cls, entity_type: EntityType, **kwargs: Any) -> "BaseSearchParameters":
27
+ try:
28
+ return PARAMETER_REGISTRY[entity_type](entity_type=entity_type, **kwargs)
29
+ except KeyError:
30
+ raise ValueError(f"No search parameter class found for entity type: {entity_type.value}")
31
+
32
+ @property
33
+ def vector_query(self) -> str | None:
34
+ """Extract vector query from unified query field."""
35
+ if not self.query:
36
+ return None
37
+ try:
38
+ uuid.UUID(self.query)
39
+ return None # It's a UUID, so disable vector search.
40
+ except ValueError:
41
+ return self.query
42
+
43
+ @property
44
+ def fuzzy_term(self) -> str | None:
45
+ """Extract fuzzy term from unified query field."""
46
+ if not self.query:
47
+ return None
48
+
49
+ words = self.query.split()
50
+ # Only use fuzzy for single words
51
+ # otherwise, trigram operator filters out too much.
52
+ return self.query if len(words) == 1 else None
53
+
54
+
55
+ class SubscriptionSearchParameters(BaseSearchParameters):
56
+ entity_type: Literal[EntityType.SUBSCRIPTION] = Field(
57
+ default=EntityType.SUBSCRIPTION, description="The type of entity to search."
58
+ )
59
+ model_config = ConfigDict(
60
+ json_schema_extra={
61
+ "title": "SearchSubscriptions",
62
+ "description": "Search subscriptions based on specific criteria.",
63
+ "examples": [
64
+ {
65
+ "filters": {
66
+ "op": "AND",
67
+ "children": [
68
+ {"path": "subscription.status", "condition": {"op": "eq", "value": "provisioning"}},
69
+ {"path": "subscription.end_date", "condition": {"op": "gte", "value": "2025-01-01"}},
70
+ ],
71
+ }
72
+ }
73
+ ],
74
+ }
75
+ )
76
+
77
+
78
+ class ProductSearchParameters(BaseSearchParameters):
79
+ entity_type: Literal[EntityType.PRODUCT] = Field(
80
+ default=EntityType.PRODUCT, description="The type of entity to search."
81
+ )
82
+ model_config = ConfigDict(
83
+ json_schema_extra={
84
+ "title": "SearchProducts",
85
+ "description": "Search products based on specific criteria.",
86
+ "examples": [
87
+ {
88
+ "filters": [
89
+ {"path": "product.product_type", "condition": {"op": "eq", "value": "Shop"}},
90
+ ]
91
+ }
92
+ ],
93
+ }
94
+ )
95
+
96
+
97
+ class WorkflowSearchParameters(BaseSearchParameters):
98
+ entity_type: Literal[EntityType.WORKFLOW] = Field(
99
+ default=EntityType.WORKFLOW, description="The type of entity to search."
100
+ )
101
+
102
+
103
+ class ProcessSearchParameters(BaseSearchParameters):
104
+ """Search parameters specifically for PROCESS entities."""
105
+
106
+ entity_type: Literal[EntityType.PROCESS] = Field(
107
+ default=EntityType.PROCESS, description="The type of entity to search."
108
+ )
109
+
110
+
111
+ PARAMETER_REGISTRY: dict[EntityType, type[BaseSearchParameters]] = {
112
+ EntityType.SUBSCRIPTION: SubscriptionSearchParameters,
113
+ EntityType.PRODUCT: ProductSearchParameters,
114
+ EntityType.WORKFLOW: WorkflowSearchParameters,
115
+ EntityType.PROCESS: ProcessSearchParameters,
116
+ }
@@ -0,0 +1,64 @@
1
+ from typing import Literal
2
+
3
+ from pydantic import BaseModel, ConfigDict
4
+
5
+ from orchestrator.search.core.types import FilterOp, SearchMetadata, UIType
6
+
7
+
8
+ class MatchingField(BaseModel):
9
+ """Contains the field that contributed most to the (fuzzy) search result."""
10
+
11
+ text: str
12
+ path: str
13
+ highlight_indices: list[tuple[int, int]] | None = None
14
+
15
+
16
+ class SearchResult(BaseModel):
17
+ """Represents a single search result item."""
18
+
19
+ entity_id: str
20
+ score: float
21
+ perfect_match: int = 0
22
+ matching_field: MatchingField | None = None
23
+
24
+
25
+ class SearchResponse(BaseModel):
26
+ """Response containing search results and metadata."""
27
+
28
+ results: list[SearchResult]
29
+ metadata: SearchMetadata
30
+
31
+
32
+ class ValueSchema(BaseModel):
33
+ kind: UIType | Literal["none", "object"] = UIType.STRING
34
+ fields: dict[str, "ValueSchema"] | None = None
35
+
36
+ model_config = ConfigDict(extra="forbid")
37
+
38
+
39
+ class LeafInfo(BaseModel):
40
+ name: str
41
+ ui_types: list[UIType]
42
+ paths: list[str]
43
+
44
+ model_config = ConfigDict(
45
+ extra="forbid",
46
+ use_enum_values=True,
47
+ )
48
+
49
+
50
+ class ComponentInfo(BaseModel):
51
+ name: str
52
+ ui_types: list[UIType]
53
+
54
+ model_config = ConfigDict(
55
+ extra="forbid",
56
+ use_enum_values=True,
57
+ )
58
+
59
+
60
+ class TypeDefinition(BaseModel):
61
+ operators: list[FilterOp]
62
+ valueSchema: dict[FilterOp, ValueSchema]
63
+
64
+ model_config = ConfigDict(use_enum_values=True)
@@ -14,7 +14,7 @@
14
14
  from typing import Any, Dict, Type
15
15
 
16
16
  from pydantic import SecretStr as PydanticSecretStr
17
- from pydantic_core import MultiHostUrl, Url
17
+ from pydantic.networks import AnyUrl, _BaseMultiHostUrl
18
18
  from pydantic_settings import BaseSettings
19
19
 
20
20
  from orchestrator.utils.expose_settings import SecretStr as OrchSecretStr
@@ -34,7 +34,7 @@ def mask_value(key: str, value: Any) -> Any:
34
34
  key_lower = key.lower()
35
35
  is_sensitive_key = "secret" in key_lower or "password" in key_lower
36
36
 
37
- if is_sensitive_key or isinstance(value, (OrchSecretStr, PydanticSecretStr, MultiHostUrl, Url)):
37
+ if is_sensitive_key or isinstance(value, (OrchSecretStr, PydanticSecretStr, _BaseMultiHostUrl, AnyUrl)):
38
38
  return MASK
39
39
 
40
40
  return value
orchestrator/settings.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2020 SURF, GÉANT.
1
+ # Copyright 2019-2025 SURF, 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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.4.1
3
+ Version: 4.5.0a2
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
@@ -42,13 +42,14 @@ Requires-Dist: itsdangerous>=2.2.0
42
42
  Requires-Dist: jinja2==3.1.6
43
43
  Requires-Dist: more-itertools~=10.7.0
44
44
  Requires-Dist: nwa-stdlib~=1.9.0
45
- Requires-Dist: oauth2-lib~=2.4.0
45
+ Requires-Dist: oauth2-lib>=2.4.1
46
46
  Requires-Dist: orjson==3.10.18
47
+ Requires-Dist: pgvector>=0.4.1
47
48
  Requires-Dist: prometheus-client==0.22.1
48
49
  Requires-Dist: psycopg2-binary==2.9.10
49
50
  Requires-Dist: pydantic-forms>=1.4.0,<=2.1.0
50
51
  Requires-Dist: pydantic-settings~=2.9.1
51
- Requires-Dist: pydantic[email]~=2.8.2
52
+ Requires-Dist: pydantic[email]~=2.11.0
52
53
  Requires-Dist: python-dateutil==2.8.2
53
54
  Requires-Dist: python-rapidjson>=1.18,<1.21
54
55
  Requires-Dist: pytz==2025.2
@@ -63,10 +64,14 @@ Requires-Dist: tabulate==0.9.0
63
64
  Requires-Dist: typer==0.15.4
64
65
  Requires-Dist: uvicorn[standard]~=0.34.0
65
66
  Requires-Dist: celery~=5.5.1 ; extra == "celery"
67
+ Requires-Dist: pydantic-ai-slim ==0.7.0 ; extra == "llm"
68
+ Requires-Dist: ag-ui-protocol>=0.1.8 ; extra == "llm"
69
+ Requires-Dist: litellm>=1.75.7 ; extra == "llm"
66
70
  Project-URL: Documentation, https://workfloworchestrator.org/orchestrator-core
67
71
  Project-URL: Homepage, https://workfloworchestrator.org/orchestrator-core
68
72
  Project-URL: Source, https://github.com/workfloworchestrator/orchestrator-core
69
73
  Provides-Extra: celery
74
+ Provides-Extra: llm
70
75
 
71
76
  # Orchestrator-Core
72
77
 
@@ -1,10 +1,12 @@
1
- orchestrator/__init__.py,sha256=4M-5vT7NIXhlohP0pzoqgU8XpZo6DiR2qUrj09ybyxA,1063
2
- orchestrator/app.py,sha256=7UrXKjBKNSEaSSXAd5ww_RdMFhFqE4yvfj8faS2MzAA,12089
1
+ orchestrator/__init__.py,sha256=xKpOlVZwRPcmklRABJcL_1Kwp63ENR1Z5K7RGckwtVs,1732
2
+ orchestrator/agentic_app.py,sha256=bBMuH9Ub42nb8oFG0U00SzW_uQqnAayUX2tNs6yz1BM,2810
3
+ orchestrator/app.py,sha256=UPKQuDpg8MWNC6r3SRRbp6l9RBzwb00IMIaGRk-jbCU,13203
3
4
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
5
+ orchestrator/llm_settings.py,sha256=PJ3vf5aEugVigHFU7iw9haQon_bC7Y268GTFhfFaQHs,2075
4
6
  orchestrator/log_config.py,sha256=1tPRX5q65e57a6a_zEii_PFK8SzWT0mnA5w2sKg4hh8,1853
5
7
  orchestrator/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
8
  orchestrator/security.py,sha256=iXFxGxab54aav7oHEKLAVkTgrQMJGHy6IYLojEnD7gI,2422
7
- orchestrator/settings.py,sha256=2Kgc6m3qUCcSM3Z_IVUeehfgO0QphMFkLrS0RC3sU-U,4365
9
+ orchestrator/settings.py,sha256=30iYKd_wNtjIO12DZ4LrH9w9OJgtmQ2AFEOSnrVTsRg,4365
8
10
  orchestrator/targets.py,sha256=d7Fyh_mWIWPivA_E7DTNFpZID3xFW_K0JlZ5nksVX7k,830
9
11
  orchestrator/types.py,sha256=qzs7xx5AYRmKbpYRyJJP3wuDb0W0bcAzefCN0RWLAco,15459
10
12
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
@@ -14,13 +16,14 @@ orchestrator/api/error_handling.py,sha256=YrPCxSa-DSa9KwqIMlXI-KGBGnbGIW5ukOPiik
14
16
  orchestrator/api/helpers.py,sha256=s0QRHYw8AvEmlkmRhuEzz9xixaZKUF3YuPzUVHkcoXk,6933
15
17
  orchestrator/api/models.py,sha256=z9BDBx7uI4KBHWbD_LVrLsqNQ0_w-Mg9Qiy7PR_rZhk,5996
16
18
  orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
17
- orchestrator/api/api_v1/api.py,sha256=m4iDktsSpzxUDaudkdgXeZ83a6B4wfc3pczQsa-Pb-8,2866
19
+ orchestrator/api/api_v1/api.py,sha256=FHOEwVfyQsStZmWUlxto26vI5OvqsJF2DgtSxyuiQJo,3124
18
20
  orchestrator/api/api_v1/endpoints/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
19
21
  orchestrator/api/api_v1/endpoints/health.py,sha256=iaxs1XX1_250_gKNsspuULCV2GEMBjbtjsmfQTOvMAI,1284
20
22
  orchestrator/api/api_v1/endpoints/processes.py,sha256=238Bydgj4ILNyMU_7j_Q7a0WGlfIvKv5ypP7lESU32w,16188
21
23
  orchestrator/api/api_v1/endpoints/product_blocks.py,sha256=kZ6ywIOsS_S2qGq7RvZ4KzjvaS1LmwbGWR37AKRvWOw,2146
22
24
  orchestrator/api/api_v1/endpoints/products.py,sha256=BfFtwu9dZXEQbtKxYj9icc73GKGvAGMR5ytyf41nQlQ,3081
23
25
  orchestrator/api/api_v1/endpoints/resource_types.py,sha256=gGyuaDyOD0TAVoeFGaGmjDGnQ8eQQArOxKrrk4MaDzA,2145
26
+ orchestrator/api/api_v1/endpoints/search.py,sha256=QFxnMFQ2HgpL9Ebdc-vta6Z7Rdq5Qb9OKxyiPy2Lu9o,10200
24
27
  orchestrator/api/api_v1/endpoints/settings.py,sha256=5s-k169podZjgGHUbVDmSQwpY_3Cs_Bbf2PPtZIkBcw,6184
25
28
  orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py,sha256=1_6LtgQleoq3M6z_W-Qz__Bj3OFUweoPrUqHMwSH6AM,3288
26
29
  orchestrator/api/api_v1/endpoints/subscriptions.py,sha256=7KaodccUiMkcVnrFnK2azp_V_-hGudcIyhov5WwVGQY,9810
@@ -31,12 +34,16 @@ orchestrator/api/api_v1/endpoints/ws.py,sha256=1l7E0ag_sZ6UMfQPHlmew7ENwxjm6fflB
31
34
  orchestrator/cli/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
32
35
  orchestrator/cli/database.py,sha256=YkYAbCY2VPAa6mDW0PpNKG5wL4FuAQYD2CGl1_DQtEk,19595
33
36
  orchestrator/cli/generate.py,sha256=SBaYfRijXPF9r3VxarPKTiDzDcB6GBMMQvecQIb_ZLQ,7377
34
- orchestrator/cli/main.py,sha256=GC_kxa9OZ-Y0ig_klfWc6ysOQuPVTUmTmDRj3m8cJHA,983
37
+ orchestrator/cli/index_llm.py,sha256=RWPkFz5bxiznjpN1vMsSWeqcvYKB90DLL4pXQ92QJNI,2239
38
+ orchestrator/cli/main.py,sha256=U4eAG_iT3JhmeB6yZnogB6KTM6kFlDUo7zY4qBdIHv4,1648
35
39
  orchestrator/cli/migrate_domain_models.py,sha256=WRXy_1OnziQwpsCFZXvjB30nDJtjj0ikVXy8YNLque4,20928
36
40
  orchestrator/cli/migrate_tasks.py,sha256=bju8XColjSZD0v3rS4kl-24dLr8En_H4-6enBmqd494,7255
37
41
  orchestrator/cli/migrate_workflows.py,sha256=nxUpx0vgEIc_8aJrjAyrw3E9Dt8JmaamTts8oiQ4vHY,8923
38
42
  orchestrator/cli/migration_helpers.py,sha256=C5tpkP5WEBr7G9S-1k1hgSI8ili6xd9Z5ygc9notaK0,4110
43
+ orchestrator/cli/resize_embedding.py,sha256=ds830T26ADOD9vZS7psRHJVF_u2xar2d4vvIH1AOlww,4216
39
44
  orchestrator/cli/scheduler.py,sha256=2q6xT_XVOodY3e_qzIV98MWNvKvrbFpOJajWesj1fcs,1911
45
+ orchestrator/cli/search_explore.py,sha256=SDn1DMN8a4roSPodIHl-KrNAvdHo5jTDUvMUFLVh1P4,8602
46
+ orchestrator/cli/speedtest.py,sha256=QkQ_YhKh7TnNRX4lKjgrmF7DyufU9teLqw4CWkm52ko,4972
40
47
  orchestrator/cli/domain_gen_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
48
  orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py,sha256=uzpwsaau81hHSxNMOS9-o7kF-9_78R0f_UE0AvWooZQ,6775
42
49
  orchestrator/cli/domain_gen_helpers/helpers.py,sha256=tIPxn8ezED_xYZxH7ZAtQLwkDc6RNmLZVxWAoJ3a9lw,4203
@@ -106,7 +113,7 @@ orchestrator/db/database.py,sha256=MU_w_e95ho2dVb2JDnt_KFYholx___XDkiQXbc8wCkI,1
106
113
  orchestrator/db/helpers.py,sha256=L8kEdnSSNGnUpZhdeGx2arCodakWN8vSpKdfjoLuHdY,831
107
114
  orchestrator/db/listeners.py,sha256=UBPYcH0FE3a7aZQu_D0O_JMXpXIRYXC0gjSAvlv5GZo,1142
108
115
  orchestrator/db/loaders.py,sha256=ez6JzQ3IKVkC_oLAkVlIIiI8Do7hXbdcPKCvUSLxRog,7962
109
- orchestrator/db/models.py,sha256=9XOppPkXlbILM3M87wgaItsE8BKLNdnyyfeiSfYuYQ8,27502
116
+ orchestrator/db/models.py,sha256=bFyTiQGndaEMaNMl9GegPBj5018eBPvA8OMLcF94NIM,28530
110
117
  orchestrator/db/filters/__init__.py,sha256=RUj6P0XxEBhYj0SN5wH5-Vf_Wt_ilZR_n9DSar5m9oM,371
111
118
  orchestrator/db/filters/filters.py,sha256=55RtpQwM2rhrk4A6CCSeSXoo-BT9GnQoNTryA8CtLEg,5020
112
119
  orchestrator/db/filters/process.py,sha256=xvGhyfo_MZ1xhLvFC6yULjcT4mJk0fKc1glJIYgsWLE,4018
@@ -247,6 +254,7 @@ orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_w
247
254
  orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py,sha256=Oezd8b2qaI1Kyq-sZFVFmdzd4d9NjXrf6HtJGk11fy0,1914
248
255
  orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py,sha256=xnD6w-97R4ClS7rbmXQEXc36K3fdcXKhCy7ZZNy_FX4,742
249
256
  orchestrator/migrations/versions/schema/2025-07-28_850dccac3b02_update_description_of_resume_workflows_.py,sha256=R6Qoga83DJ1IL0WYPu0u5u2ZvAmqGlDmUMv_KtJyOhQ,812
257
+ orchestrator/migrations/versions/schema/2025-08-12_52b37b5b2714_search_index_model_for_llm_integration.py,sha256=6lRbUd1hJBjG8KM4Ow_J4pk2qwlRVhTKczS7XmoW-q4,3304
250
258
  orchestrator/schedules/__init__.py,sha256=Zy0fTOBMGIRFoh5iVFDLF9_PRAFaONYDThGK9EsysWo,981
251
259
  orchestrator/schedules/resume_workflows.py,sha256=jRnVRWDy687pQu-gtk80ecwiLSdrvtL15tG3U2zWA6I,891
252
260
  orchestrator/schedules/scheduler.py,sha256=nnuehZnBbtC90MsFP_Q6kqcD1ihsq08vr1ALJ6jHF_s,5833
@@ -263,9 +271,44 @@ orchestrator/schemas/process.py,sha256=UACBNt-4g4v9Y528u-gZ-Wk7YxwJHhnI4cEu5CtQm
263
271
  orchestrator/schemas/product.py,sha256=MhMCh058ZuS2RJq-wSmxIPUNlhQexxXIx3DSz2OmOh4,1570
264
272
  orchestrator/schemas/product_block.py,sha256=kCqvm6qadHpegMr9aWI_fYX-T7mS-5S-ldPxnGQZg7M,1519
265
273
  orchestrator/schemas/resource_type.py,sha256=VDju4XywcDDLxdpbWU62RTvR9QF8x_GRrpTlN_NE8uI,1064
274
+ orchestrator/schemas/search.py,sha256=yOlkG61BxSTL5xvepxrG-Qz_NceSw5E0g-7GUkjaj9Q,2837
266
275
  orchestrator/schemas/subscription.py,sha256=-jXyHZIed9Xlia18ksSDyenblNN6Q2yM2FlGELyJ458,3423
267
276
  orchestrator/schemas/subscription_descriptions.py,sha256=Ft_jw1U0bf9Z0U8O4OWfLlcl0mXCVT_qYVagBP3GbIQ,1262
268
277
  orchestrator/schemas/workflow.py,sha256=VqQ9XfV4fVd6MjY0LRRQzWBJHmlPsAamWfTwDx1cZkg,2102
278
+ orchestrator/search/__init__.py,sha256=2uhTQexKx-cdBP1retV3CYSNCs02s8WL3fhGvupRGZk,571
279
+ orchestrator/search/agent/__init__.py,sha256=ucZF-4ZsDc911Zyjmc1OK2ZcA6C64GFdMOVP26sWW7Q,166
280
+ orchestrator/search/agent/agent.py,sha256=6wgsoOkGay_Qnaz8GJNrhKkA50ijotKTnj9ivXvswZg,1740
281
+ orchestrator/search/agent/prompts.py,sha256=XdS97esjAJacNHtaeYATO-4JXVXnHibAd09BCtlvzBI,3821
282
+ orchestrator/search/agent/state.py,sha256=DPCbvp6_WCxXwuJq1IU9glfKNZ1mRODoFcLjb9AOke0,203
283
+ orchestrator/search/agent/tools.py,sha256=n5fdVgbvadWjgNN2MZwl5WyeLCKNS6Az_x4b9L6qljs,8382
284
+ orchestrator/search/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
285
+ orchestrator/search/core/embedding.py,sha256=s7P_2hrofnRXnfUFKuDJcpYkm_KzFkmhFe5j2n8_W7U,2297
286
+ orchestrator/search/core/exceptions.py,sha256=uIlePbEyShcoM5uSCGcOlI-WEfEae3uBECGT4p40eaA,448
287
+ orchestrator/search/core/types.py,sha256=Zm3NgoKwmvu3wTRDUrQ8Wn5l05r2hOXh-OkB-uGzLNs,8228
288
+ orchestrator/search/core/validators.py,sha256=Ny80tH3SHuM64yZCi-9kfX-66NKGjsp_0oG7uJ21JVk,624
289
+ orchestrator/search/docs/index.md,sha256=zKzE2fbtHDfYTKaHg628wAsqCTOJ5yFUWV0ucFH3pAg,863
290
+ orchestrator/search/docs/running_local_text_embedding_inference.md,sha256=KlFxyAjHfLyCeV9fXAFVUqZOFWYwGPH-_oBjWx2Vgng,1255
291
+ orchestrator/search/filters/__init__.py,sha256=h9wjnKLcIfG1TwiuwtnlDvv9XMWLxkjCBD9D8qCOoQU,642
292
+ orchestrator/search/filters/base.py,sha256=E6fXcYEdFOAel90yHo41lVGplbCqUsPvPiMJbCO5FCk,11152
293
+ orchestrator/search/filters/date_filters.py,sha256=dDbTPI-badVnaKM404waQ3yzTOHJNn59kYoqHvW3XFE,2460
294
+ orchestrator/search/filters/definitions.py,sha256=oIwW8dWz7HuRkEvCbCfj2WOOdE_PKh0b5n8Re5x_lS0,3455
295
+ orchestrator/search/filters/ltree_filters.py,sha256=kyMmm1EYKYVUwPK5p9tyL-da0SrCe6LPmFW56_6y0uY,1696
296
+ orchestrator/search/filters/numeric_filter.py,sha256=GPBcZgrip2ruxsBx2AHZqxS16zkQG3C6zLJAGC2s2VU,2194
297
+ orchestrator/search/indexing/__init__.py,sha256=7IVylH0S5FPUh6jb9H9vNLb61gQQIk_sNrSHc8WoSD0,82
298
+ orchestrator/search/indexing/indexer.py,sha256=9l4bXwNAfsjMrrzit601solAl6W07Pyj9-SRldmZjGU,14391
299
+ orchestrator/search/indexing/registry.py,sha256=cSeZe6aq3XME-RRz4AMD8BHXzx7dvU6tBa05ecjTzfk,2468
300
+ orchestrator/search/indexing/tasks.py,sha256=k7GihQLov8FMhzYM_6f-IlWPMuP1w2QZpfOyloppKFM,1783
301
+ orchestrator/search/indexing/traverse.py,sha256=_lWbUHy1S5-oDyo-4dDeivb9KTn6VUq_T_KXxFm_A2Y,13775
302
+ orchestrator/search/retrieval/__init__.py,sha256=EixZVzUzP3FOC-hWwf3pqvz0XHZe1HyHBsmJlTEU0Cw,65
303
+ orchestrator/search/retrieval/builder.py,sha256=homctoLPN1wnbsraJWEX82zyL3vANPymhtRAcrnF0qk,4064
304
+ orchestrator/search/retrieval/engine.py,sha256=yJn65Nv-HIRJ6yLGwgRxdNAdsXmWvoLUK2WB9PRF1fg,5554
305
+ orchestrator/search/retrieval/pagination.py,sha256=-j-vtdPsmUlKCuN7ffwMzEeWG7vLKlJ2NDmRGAGahxM,2773
306
+ orchestrator/search/retrieval/retriever.py,sha256=140SMmBnCGhckPC9nZbe0T-DFPpQBNd6w-_3mY0-_Vs,17465
307
+ orchestrator/search/retrieval/utils.py,sha256=BhrCqSO5fDlDEzqS81dR-Lpd52JgbnR3YS4h9TXx4Bs,3862
308
+ orchestrator/search/retrieval/validation.py,sha256=KvPjvnl67mq2iMbjBc3YLMZ_XMiK3AygRDxrWKAPP_Y,5829
309
+ orchestrator/search/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
+ orchestrator/search/schemas/parameters.py,sha256=X74WzGO6tmiQ9XAQ2GdgIpqt3KzzqvaByrfB_tdWEX4,4110
311
+ orchestrator/search/schemas/results.py,sha256=NZtiycuJ54DSMV_pfo4K3heuNgSqaHRqqDYe5GSKqrI,1406
269
312
  orchestrator/services/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
270
313
  orchestrator/services/fixed_inputs.py,sha256=kyz7s2HLzyDulvcq-ZqefTw1om86COvyvTjz0_5CmgI,876
271
314
  orchestrator/services/input_state.py,sha256=6BZOpb3cHpO18K-XG-3QUIV9pIM25_ufdODrp5CmXG4,2390
@@ -274,7 +317,7 @@ orchestrator/services/processes.py,sha256=NfzdtH4eZK_wYuSmFtUX69qDvoeI8J7sJ2fFyY
274
317
  orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p6u5Y,1943
275
318
  orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
276
319
  orchestrator/services/settings.py,sha256=HEWfFulgoEDwgfxGEO__QTr5fDiwNBEj1UhAeTAdbLQ,3159
277
- orchestrator/services/settings_env_variables.py,sha256=iPErQjqPQCxKs0sPhefB16d8SBBVUi6eiRnFBK5bgqA,2196
320
+ orchestrator/services/settings_env_variables.py,sha256=6im2hB69KGRaqA2eskJfjgTIgfY405sHpZTnX_QQVJ4,2216
278
321
  orchestrator/services/subscription_relations.py,sha256=aIdyzwyyy58OFhwjRPCPgnQTUTmChu6SeSQRIleQoDE,13138
279
322
  orchestrator/services/subscriptions.py,sha256=XhJ5ygAAyWUIZHULhKyi1uU5DwkKZhzdxxn9vdQZYiA,27281
280
323
  orchestrator/services/tasks.py,sha256=mR3Fj1VsudltpanJKI2PvrxersyhVQ1skp8H7r3XnYI,5288
@@ -319,7 +362,7 @@ orchestrator/workflows/tasks/resume_workflows.py,sha256=T3iobSJjVgiupe0rClD34kUZ
319
362
  orchestrator/workflows/tasks/validate_product_type.py,sha256=paG-NAY1bdde3Adt8zItkcBKf5Pxw6f5ngGW6an6dYU,3192
320
363
  orchestrator/workflows/tasks/validate_products.py,sha256=GZJBoFF-WMphS7ghMs2-gqvV2iL1F0POhk0uSNt93n0,8510
321
364
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
322
- orchestrator_core-4.4.1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
323
- orchestrator_core-4.4.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
324
- orchestrator_core-4.4.1.dist-info/METADATA,sha256=kWsL3EEfOcsMRN6w6yux9mrAkzFM4iecoZy3IgTtw8k,5964
325
- orchestrator_core-4.4.1.dist-info/RECORD,,
365
+ orchestrator_core-4.5.0a2.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
366
+ orchestrator_core-4.5.0a2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
367
+ orchestrator_core-4.5.0a2.dist-info/METADATA,sha256=fxKSeq4fVKEvTapkag42vtmn2h1HegxEqXJPHEHDiCc,6177
368
+ orchestrator_core-4.5.0a2.dist-info/RECORD,,