orchestrator-core 4.6.0rc2__py3-none-any.whl → 4.6.0rc4__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.0rc2"
16
+ __version__ = "4.6.0rc4"
17
17
 
18
18
 
19
19
  from structlog import get_logger
@@ -26,7 +26,7 @@ from orchestrator.cli.main import app as cli_app
26
26
  from orchestrator.llm_settings import LLMSettings, llm_settings
27
27
 
28
28
  if TYPE_CHECKING:
29
- from pydantic_ai.models.openai import OpenAIModel
29
+ from pydantic_ai.models.openai import OpenAIChatModel
30
30
 
31
31
  logger = get_logger(__name__)
32
32
 
@@ -36,7 +36,7 @@ class LLMOrchestratorCore(OrchestratorCore):
36
36
  self,
37
37
  *args: Any,
38
38
  llm_settings: LLMSettings = llm_settings,
39
- agent_model: "OpenAIModel | str | None" = None,
39
+ agent_model: "OpenAIChatModel | str | None" = None,
40
40
  **kwargs: Any,
41
41
  ) -> None:
42
42
  """Initialize the `LLMOrchestratorCore` class.
@@ -20,7 +20,6 @@ from pydantic_ai.agent import Agent
20
20
  from starlette.responses import Response
21
21
  from structlog import get_logger
22
22
 
23
- from orchestrator.llm_settings import llm_settings
24
23
  from orchestrator.search.agent import build_agent_instance
25
24
  from orchestrator.search.agent.state import SearchState
26
25
 
@@ -29,12 +28,12 @@ logger = get_logger(__name__)
29
28
 
30
29
 
31
30
  @cache
32
- def get_agent() -> Agent[StateDeps[SearchState], str]:
31
+ def get_agent(request: Request) -> Agent[StateDeps[SearchState], str]:
33
32
  """Dependency to provide the agent instance.
34
33
 
35
34
  The agent is built once and cached for the lifetime of the application.
36
35
  """
37
- return build_agent_instance(llm_settings.AGENT_MODEL)
36
+ return build_agent_instance(request.app.agent_model)
38
37
 
39
38
 
40
39
  @router.post("/")
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
 
@@ -10,14 +10,31 @@
10
10
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
+ from typing import Annotated
14
+
13
15
  from pydantic import Field, field_validator
14
16
  from pydantic_settings import BaseSettings
15
17
  from structlog import get_logger
16
18
 
17
19
  logger = get_logger(__name__)
18
20
 
21
+ EMBEDDING_DIMENSION_MIN = 100
22
+ EMBEDDING_DIMENSION_MAX = 2000
23
+ EMBEDDING_DIMENSION_DEFAULT = 1536
24
+
25
+ EMBEDDING_DIMENSION_FIELD = Annotated[
26
+ int,
27
+ Field(
28
+ ge=EMBEDDING_DIMENSION_MIN,
29
+ le=EMBEDDING_DIMENSION_MAX,
30
+ default=EMBEDDING_DIMENSION_DEFAULT,
31
+ description="Embedding dimension: when embeddings are generated at a higher resolution than this setting, the least significant numbers will be truncated",
32
+ ),
33
+ ]
34
+
19
35
 
20
36
  class LLMSettings(BaseSettings):
37
+
21
38
  # Feature flags for LLM functionality
22
39
  SEARCH_ENABLED: bool = False # Enable search/indexing with embeddings
23
40
  AGENT_ENABLED: bool = False # Enable agentic functionality
@@ -27,7 +44,7 @@ class LLMSettings(BaseSettings):
27
44
  AGENT_MODEL_VERSION: str = "2025-01-01-preview"
28
45
  OPENAI_API_KEY: str = "" # Change per provider (Azure, etc).
29
46
  # Embedding settings
30
- EMBEDDING_DIMENSION: int = 1536
47
+ EMBEDDING_DIMENSION: EMBEDDING_DIMENSION_FIELD = 1536
31
48
  EMBEDDING_MODEL: str = "openai/text-embedding-3-small" # See litellm docs for supported models.
32
49
  EMBEDDING_SAFE_MARGIN_PERCENT: float = Field(
33
50
  0.1, description="Safety margin as a percentage (e.g., 0.1 for 10%) for token budgeting.", ge=0, le=1
@@ -16,7 +16,7 @@ from typing import Any
16
16
  import structlog
17
17
  from pydantic_ai.ag_ui import StateDeps
18
18
  from pydantic_ai.agent import Agent
19
- from pydantic_ai.models.openai import OpenAIModel
19
+ from pydantic_ai.models.openai import OpenAIChatModel
20
20
  from pydantic_ai.settings import ModelSettings
21
21
  from pydantic_ai.toolsets import FunctionToolset
22
22
 
@@ -28,12 +28,12 @@ logger = structlog.get_logger(__name__)
28
28
 
29
29
 
30
30
  def build_agent_instance(
31
- model: str | OpenAIModel, agent_tools: list[FunctionToolset[Any]] | None = None
31
+ model: str | OpenAIChatModel, agent_tools: list[FunctionToolset[Any]] | None = None
32
32
  ) -> Agent[StateDeps[SearchState], str]:
33
33
  """Build and configure the search agent instance.
34
34
 
35
35
  Args:
36
- model: The LLM model to use (string or OpenAIModel instance)
36
+ model: The LLM model to use (string or OpenAIChatModel instance)
37
37
  agent_tools: Optional list of additional toolsets to include
38
38
 
39
39
  Returns:
@@ -42,7 +42,7 @@ class EmbeddingIndexer:
42
42
  max_retries=llm_settings.LLM_MAX_RETRIES,
43
43
  )
44
44
  data = sorted(resp.data, key=lambda e: e["index"])
45
- return [row["embedding"] for row in data]
45
+ return [row["embedding"][: llm_settings.EMBEDDING_DIMENSION] for row in data]
46
46
  except (llm_exc.APIError, llm_exc.APIConnectionError, llm_exc.RateLimitError, llm_exc.Timeout) as e:
47
47
  logger.error("Embedding request failed", error=str(e))
48
48
  return [[] for _ in texts]
@@ -67,7 +67,7 @@ class QueryEmbedder:
67
67
  timeout=5.0,
68
68
  max_retries=0, # No retries, prioritize speed.
69
69
  )
70
- return resp.data[0]["embedding"]
70
+ return resp.data[0]["embedding"][: llm_settings.EMBEDDING_DIMENSION]
71
71
  except Exception as e:
72
72
  logger.error("Async embedding generation failed", error=str(e))
73
73
  return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.6.0rc2
3
+ Version: 4.6.0rc4
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
@@ -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=5uPIbvZOqPTKQJ_tm9IcleuirD5gawR8uclr2-asW9Q,1450
2
- orchestrator/agentic_app.py,sha256=6C_-pbw4xLJah8--CPcopz6dym4V7AfX2DtAYIGljmk,3020
3
- orchestrator/app.py,sha256=UPKQuDpg8MWNC6r3SRRbp6l9RBzwb00IMIaGRk-jbCU,13203
1
+ orchestrator/__init__.py,sha256=UOKWT3zzsUrEwR0Is2JkjlbzYsNWom-lqeMh8ZU6-ec,1457
2
+ orchestrator/agentic_app.py,sha256=ouiyyZiS4uS6Lox2DtbGGRnb2njJBMSHpSAGe-T5rX0,3028
3
+ orchestrator/app.py,sha256=w8ubXaaogwjmwLM0TXqZaLkAhmaOTWzVlwiYbi5mHeE,13203
4
4
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
5
- orchestrator/llm_settings.py,sha256=UDehiEVXkRMfmPSfCTHQX8dtH2gLCGtZK_wQTU3yISg,2316
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
@@ -18,7 +18,7 @@ orchestrator/api/models.py,sha256=z9BDBx7uI4KBHWbD_LVrLsqNQ0_w-Mg9Qiy7PR_rZhk,59
18
18
  orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
19
19
  orchestrator/api/api_v1/api.py,sha256=1qQRsIxKXLW3kcmSV5u3_v1TZk5RcNWb4ZOyLguhTKY,3488
20
20
  orchestrator/api/api_v1/endpoints/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
21
- orchestrator/api/api_v1/endpoints/agent.py,sha256=BmsW0UDn9Cr2CBJTGfqrvYAmgZj0VNHk3WiPFFSilEU,1768
21
+ orchestrator/api/api_v1/endpoints/agent.py,sha256=9_s3nchTr9ua_1Sxs0kJl2mH_20o-DlUaaQPmY4vRMk,1732
22
22
  orchestrator/api/api_v1/endpoints/health.py,sha256=iaxs1XX1_250_gKNsspuULCV2GEMBjbtjsmfQTOvMAI,1284
23
23
  orchestrator/api/api_v1/endpoints/processes.py,sha256=OVbt6FgFnJ4aHaYGIg0cPoim8mxDpdzJ4TGAyfB_kPw,16269
24
24
  orchestrator/api/api_v1/endpoints/product_blocks.py,sha256=kZ6ywIOsS_S2qGq7RvZ4KzjvaS1LmwbGWR37AKRvWOw,2146
@@ -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
@@ -280,13 +280,13 @@ orchestrator/search/__init__.py,sha256=2uhTQexKx-cdBP1retV3CYSNCs02s8WL3fhGvupRG
280
280
  orchestrator/search/export.py,sha256=_0ncVpTqN6AoQfW3WX0fWnDQX3hBz6ZGC31Beu4PVwQ,6678
281
281
  orchestrator/search/llm_migration.py,sha256=tJAfAoykMFIROQrKBKpAbDaGYDLKcmevKWjYrsBmuAY,6703
282
282
  orchestrator/search/agent/__init__.py,sha256=_O4DN0MSTUtr4olhyE0-2hsb7x3f_KURMCYjg8jV4QA,756
283
- orchestrator/search/agent/agent.py,sha256=EFhbv7tRTcdk2i9iFzuiGFjcu0N-j8yZprhbwc5oBeM,2063
283
+ orchestrator/search/agent/agent.py,sha256=iWa4_achqh5zRIfcJvjmY3hmDuFVGpV_PxjgttLdokU,2075
284
284
  orchestrator/search/agent/json_patch.py,sha256=_Z5ULhLyeuOuy-Gr_DJR4eA-wo9F78qySKUt5F_SQvQ,1892
285
285
  orchestrator/search/agent/prompts.py,sha256=6EPubiSLFyICIeinfVUF6miU1nS2QTAhqgzm-l5O3PI,5810
286
286
  orchestrator/search/agent/state.py,sha256=WhvZu7N0NhD1DD5mfZSUAzYN4mu8dDyvQ4Tz9I-hLtg,1364
287
287
  orchestrator/search/agent/tools.py,sha256=m4Krtb-Qmep-JkbJ9-RC7QqKa0CuQJM6-Z6_PN-b8HU,14706
288
288
  orchestrator/search/core/__init__.py,sha256=q5G0z3nKjIHKFs1PkEG3nvTUy3Wp4kCyBtCbqUITj3A,579
289
- orchestrator/search/core/embedding.py,sha256=ESeI5Vcobb__CRRZE_RP-m4eAz8JUP8S16aGLJh4uAY,2751
289
+ orchestrator/search/core/embedding.py,sha256=n16H5fZRlfn91wI8PfZPa1R39HwQd8T1nwlDOzcOUBU,2823
290
290
  orchestrator/search/core/exceptions.py,sha256=S_ZMEhrqsQBVqJ559FQ5J6tZU6BYLiU65AGWgSvgv_k,1159
291
291
  orchestrator/search/core/types.py,sha256=0U_m4ZmPwvL77hIx9yk7UyvkE8HoiRvEnGdY4mDLzCo,8853
292
292
  orchestrator/search/core/validators.py,sha256=zktY5A3RTBmfdARJoxoz9rnnyTZj7L30Kbmh9UTQz2o,1204
@@ -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.0rc2.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
377
- orchestrator_core-4.6.0rc2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
378
- orchestrator_core-4.6.0rc2.dist-info/METADATA,sha256=otV2lyDTZ_ytfz5miako0btSnzsGdxbMZRxkSEDBtIs,6253
379
- orchestrator_core-4.6.0rc2.dist-info/RECORD,,
376
+ orchestrator_core-4.6.0rc4.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
377
+ orchestrator_core-4.6.0rc4.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
378
+ orchestrator_core-4.6.0rc4.dist-info/METADATA,sha256=EQ76ov19b_1Is6f51qVMk0pQwvNhjQYMPMumtPaquWY,6353
379
+ orchestrator_core-4.6.0rc4.dist-info/RECORD,,