orchestrator-core 4.5.0a7__tar.gz → 4.5.0a8__tar.gz

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 (377) hide show
  1. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/PKG-INFO +7 -5
  2. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/__init__.py +3 -12
  3. orchestrator_core-4.5.0a8/orchestrator/agentic_app.py +103 -0
  4. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/api.py +1 -1
  5. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/search.py +13 -7
  6. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/main.py +2 -2
  7. orchestrator_core-4.5.0a8/orchestrator/cli/search/__init__.py +32 -0
  8. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/llm_settings.py +6 -3
  9. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/agent/__init__.py +2 -2
  10. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/agent/agent.py +17 -15
  11. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/docs/running_local_text_embedding_inference.md +1 -0
  12. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/filters/base.py +37 -22
  13. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/indexing/indexer.py +1 -3
  14. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/indexing/tasks.py +4 -1
  15. orchestrator_core-4.5.0a8/orchestrator/search/llm_migration.py +102 -0
  16. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/engine.py +1 -5
  17. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/retrievers/base.py +2 -1
  18. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/retrievers/hybrid.py +112 -23
  19. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/steps.py +1 -1
  20. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/pyproject.toml +5 -1
  21. orchestrator_core-4.5.0a7/orchestrator/agentic_app.py +0 -84
  22. orchestrator_core-4.5.0a7/orchestrator/migrations/versions/schema/2025-08-12_52b37b5b2714_search_index_model_for_llm_integration.py +0 -95
  23. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/LICENSE +0 -0
  24. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/README.md +0 -0
  25. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/__init__.py +0 -0
  26. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/__init__.py +0 -0
  27. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
  28. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/health.py +0 -0
  29. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/processes.py +0 -0
  30. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/product_blocks.py +0 -0
  31. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/products.py +0 -0
  32. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/resource_types.py +0 -0
  33. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/settings.py +0 -0
  34. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +0 -0
  35. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
  36. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
  37. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/user.py +0 -0
  38. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/workflows.py +0 -0
  39. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
  40. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/error_handling.py +0 -0
  41. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/helpers.py +0 -0
  42. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/api/models.py +0 -0
  43. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/app.py +0 -0
  44. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/__init__.py +0 -0
  45. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/database.py +0 -0
  46. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
  47. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
  48. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
  49. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
  50. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
  51. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
  52. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
  53. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generate.py +0 -0
  54. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/__init__.py +0 -0
  55. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/README +0 -0
  56. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
  57. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
  58. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
  59. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
  60. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
  61. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
  62. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
  63. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
  64. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
  65. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/__init__.py +0 -0
  66. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/enums.py +0 -0
  67. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/helpers.py +0 -0
  68. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/migration.py +0 -0
  69. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/product.py +0 -0
  70. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/product_block.py +0 -0
  71. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/settings.py +0 -0
  72. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/translations.py +0 -0
  73. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/unittest.py +0 -0
  74. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/validations.py +0 -0
  75. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/generator/workflow.py +0 -0
  76. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
  77. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
  78. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
  79. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
  80. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
  81. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
  82. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
  83. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
  84. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
  85. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
  86. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
  87. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
  88. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/enums.j2 +0 -0
  89. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
  90. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
  91. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/macros.j2 +0 -0
  92. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
  93. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
  94. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/product.j2 +0 -0
  95. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
  96. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
  97. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
  98. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
  99. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
  100. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
  101. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
  102. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
  103. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
  104. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
  105. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
  106. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/helpers/__init__.py +0 -0
  107. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/helpers/input_helpers.py +0 -0
  108. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/helpers/print_helpers.py +0 -0
  109. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/migrate_domain_models.py +0 -0
  110. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/migrate_tasks.py +0 -0
  111. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/migrate_workflows.py +0 -0
  112. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/migration_helpers.py +0 -0
  113. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/cli/scheduler.py +0 -0
  114. {orchestrator_core-4.5.0a7/orchestrator/cli → orchestrator_core-4.5.0a8/orchestrator/cli/search}/index_llm.py +0 -0
  115. {orchestrator_core-4.5.0a7/orchestrator/cli → orchestrator_core-4.5.0a8/orchestrator/cli/search}/resize_embedding.py +0 -0
  116. {orchestrator_core-4.5.0a7/orchestrator/cli → orchestrator_core-4.5.0a8/orchestrator/cli/search}/search_explore.py +0 -0
  117. {orchestrator_core-4.5.0a7/orchestrator/cli → orchestrator_core-4.5.0a8/orchestrator/cli/search}/speedtest.py +0 -0
  118. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/config/__init__.py +0 -0
  119. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/config/assignee.py +0 -0
  120. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/__init__.py +0 -0
  121. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/database.py +0 -0
  122. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/__init__.py +0 -0
  123. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/filters.py +0 -0
  124. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/process.py +0 -0
  125. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/product.py +0 -0
  126. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/product_block.py +0 -0
  127. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/resource_type.py +0 -0
  128. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/search_filters/__init__.py +0 -0
  129. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
  130. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/subscription.py +0 -0
  131. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/filters/workflow.py +0 -0
  132. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/helpers.py +0 -0
  133. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/listeners.py +0 -0
  134. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/loaders.py +0 -0
  135. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/models.py +0 -0
  136. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/queries/__init__.py +0 -0
  137. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/queries/subscription.py +0 -0
  138. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/queries/subscription_instance.py +0 -0
  139. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/range/__init__.py +0 -0
  140. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/range/range.py +0 -0
  141. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/__init__.py +0 -0
  142. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/process.py +0 -0
  143. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/product.py +0 -0
  144. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/product_block.py +0 -0
  145. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/resource_type.py +0 -0
  146. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/sorting.py +0 -0
  147. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/subscription.py +0 -0
  148. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/db/sorting/workflow.py +0 -0
  149. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/devtools/__init__.py +0 -0
  150. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/devtools/populator.py +0 -0
  151. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/devtools/scripts/__init__.py +0 -0
  152. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/devtools/scripts/migrate_20.py +0 -0
  153. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/devtools/scripts/migrate_30.py +0 -0
  154. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/devtools/scripts/shared.py +0 -0
  155. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/distlock/__init__.py +0 -0
  156. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/distlock/distlock_manager.py +0 -0
  157. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/distlock/managers/__init__.py +0 -0
  158. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
  159. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
  160. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/__init__.py +0 -0
  161. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/base.py +0 -0
  162. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/context_cache.py +0 -0
  163. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/customer_description.py +0 -0
  164. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/helpers.py +0 -0
  165. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/lifecycle.py +0 -0
  166. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/domain/subscription_instance_transform.py +0 -0
  167. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/exception_handlers.py +0 -0
  168. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/__init__.py +0 -0
  169. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/validators/__init__.py +0 -0
  170. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/validators/customer_contact_list.py +0 -0
  171. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/validators/customer_id.py +0 -0
  172. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/validators/display_subscription.py +0 -0
  173. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/validators/network_type_validators.py +0 -0
  174. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/forms/validators/product_id.py +0 -0
  175. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/__init__.py +0 -0
  176. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/autoregistration.py +0 -0
  177. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/extensions/__init__.py +0 -0
  178. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/extensions/model_cache.py +0 -0
  179. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/extensions/stats.py +0 -0
  180. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/loaders/__init__.py +0 -0
  181. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/loaders/subscriptions.py +0 -0
  182. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/mutations/customer_description.py +0 -0
  183. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/mutations/start_process.py +0 -0
  184. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/pagination.py +0 -0
  185. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/__init__.py +0 -0
  186. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/customer.py +0 -0
  187. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/helpers.py +0 -0
  188. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/process.py +0 -0
  189. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/product.py +0 -0
  190. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/product_block.py +0 -0
  191. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/resource_type.py +0 -0
  192. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/scheduled_tasks.py +0 -0
  193. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/settings.py +0 -0
  194. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/subscription.py +0 -0
  195. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/version.py +0 -0
  196. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/resolvers/workflow.py +0 -0
  197. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schema.py +0 -0
  198. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/__init__.py +0 -0
  199. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/customer.py +0 -0
  200. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/customer_description.py +0 -0
  201. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/errors.py +0 -0
  202. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/fixed_input.py +0 -0
  203. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/helpers.py +0 -0
  204. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/process.py +0 -0
  205. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/product.py +0 -0
  206. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/product_block.py +0 -0
  207. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/resource_type.py +0 -0
  208. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/scheduled_task.py +0 -0
  209. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/settings.py +0 -0
  210. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
  211. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/subscription.py +0 -0
  212. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/version.py +0 -0
  213. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/schemas/workflow.py +0 -0
  214. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/types.py +0 -0
  215. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/__init__.py +0 -0
  216. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
  217. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
  218. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
  219. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
  220. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
  221. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
  222. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/override_class.py +0 -0
  223. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
  224. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/log_config.py +0 -0
  225. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/metrics/__init__.py +0 -0
  226. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/metrics/engine.py +0 -0
  227. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/metrics/init.py +0 -0
  228. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/metrics/processes.py +0 -0
  229. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/metrics/subscriptions.py +0 -0
  230. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/README +0 -0
  231. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/__init__.py +0 -0
  232. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/alembic.ini +0 -0
  233. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/env.py +0 -0
  234. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/helpers.py +0 -0
  235. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/script.py.mako +0 -0
  236. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
  237. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/templates/env.py.j2 +0 -0
  238. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
  239. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
  240. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2020-10-19_a76b9185b334_add_generic_workflows_to_core.py +0 -0
  241. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
  242. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2021-04-06_3c8b9185c221_add_validate_products_task.py +0 -0
  243. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2021-07-01_6896a54e9483_add_product_block_relations.py +0 -0
  244. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
  245. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2022-02-16_bed6bc0b197a_rename_parent_and_child_block_relations.py +0 -0
  246. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-03-06_e05bb1967eff_add_subscriptions_search_view.py +0 -0
  247. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-05-25_b1970225392d_add_subscription_metadata_workflow.py +0 -0
  248. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.py +0 -0
  249. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.sql +0 -0
  250. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.py +0 -0
  251. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.sql +0 -0
  252. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.py +0 -0
  253. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.sql +0 -0
  254. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2023-12-06_048219045729_add_workflow_id_to_processes_table.py +0 -0
  255. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.py +0 -0
  256. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql +0 -0
  257. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py +0 -0
  258. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py +0 -0
  259. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py +0 -0
  260. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py +0 -0
  261. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py +0 -0
  262. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql +0 -0
  263. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py +0 -0
  264. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py +0 -0
  265. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py +0 -0
  266. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py +0 -0
  267. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/migrations/versions/schema/2025-07-28_850dccac3b02_update_description_of_resume_workflows_.py +0 -0
  268. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/py.typed +0 -0
  269. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/__init__.py +0 -0
  270. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/resume_workflows.py +0 -0
  271. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/scheduler.py +0 -0
  272. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/scheduling.py +0 -0
  273. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/task_vacuum.py +0 -0
  274. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/validate_products.py +0 -0
  275. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schedules/validate_subscriptions.py +0 -0
  276. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/__init__.py +0 -0
  277. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/base.py +0 -0
  278. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/engine_settings.py +0 -0
  279. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/fixed_input.py +0 -0
  280. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/problem_detail.py +0 -0
  281. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/process.py +0 -0
  282. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/product.py +0 -0
  283. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/product_block.py +0 -0
  284. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/resource_type.py +0 -0
  285. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/search.py +0 -0
  286. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/subscription.py +0 -0
  287. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/subscription_descriptions.py +0 -0
  288. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/schemas/workflow.py +0 -0
  289. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/__init__.py +0 -0
  290. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/agent/prompts.py +0 -0
  291. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/agent/state.py +0 -0
  292. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/agent/tools.py +0 -0
  293. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/core/__init__.py +0 -0
  294. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/core/embedding.py +0 -0
  295. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/core/exceptions.py +0 -0
  296. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/core/types.py +0 -0
  297. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/core/validators.py +0 -0
  298. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/docs/index.md +0 -0
  299. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/filters/__init__.py +0 -0
  300. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/filters/date_filters.py +0 -0
  301. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/filters/definitions.py +0 -0
  302. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/filters/ltree_filters.py +0 -0
  303. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/filters/numeric_filter.py +0 -0
  304. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/indexing/__init__.py +0 -0
  305. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/indexing/registry.py +0 -0
  306. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/indexing/traverse.py +0 -0
  307. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/__init__.py +0 -0
  308. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/builder.py +0 -0
  309. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/exceptions.py +0 -0
  310. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/pagination.py +0 -0
  311. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/retrievers/__init__.py +0 -0
  312. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/retrievers/fuzzy.py +0 -0
  313. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/retrievers/semantic.py +0 -0
  314. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/retrievers/structured.py +0 -0
  315. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/utils.py +0 -0
  316. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/retrieval/validation.py +0 -0
  317. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/schemas/__init__.py +0 -0
  318. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/schemas/parameters.py +0 -0
  319. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/search/schemas/results.py +0 -0
  320. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/security.py +0 -0
  321. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/__init__.py +0 -0
  322. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/executors/__init__.py +0 -0
  323. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/executors/celery.py +0 -0
  324. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/executors/threadpool.py +0 -0
  325. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/fixed_inputs.py +0 -0
  326. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/input_state.py +0 -0
  327. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/process_broadcast_thread.py +0 -0
  328. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/processes.py +0 -0
  329. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/products.py +0 -0
  330. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/resource_types.py +0 -0
  331. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/settings.py +0 -0
  332. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/settings_env_variables.py +0 -0
  333. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/subscription_relations.py +0 -0
  334. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/subscriptions.py +0 -0
  335. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/tasks.py +0 -0
  336. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/translations.py +0 -0
  337. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/services/workflows.py +0 -0
  338. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/settings.py +0 -0
  339. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/targets.py +0 -0
  340. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/types.py +0 -0
  341. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/__init__.py +0 -0
  342. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/auth.py +0 -0
  343. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/crypt.py +0 -0
  344. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/datetime.py +0 -0
  345. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/deprecation_logger.py +0 -0
  346. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/docs.py +0 -0
  347. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/enrich_process.py +0 -0
  348. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/errors.py +0 -0
  349. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/expose_settings.py +0 -0
  350. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/fixed_inputs.py +0 -0
  351. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/functional.py +0 -0
  352. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/get_subscription_dict.py +0 -0
  353. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/get_updated_properties.py +0 -0
  354. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/helpers.py +0 -0
  355. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/json.py +0 -0
  356. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/redis.py +0 -0
  357. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/redis_client.py +0 -0
  358. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/search_query.py +0 -0
  359. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/state.py +0 -0
  360. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/strings.py +0 -0
  361. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/utils/validate_data_version.py +0 -0
  362. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/version.py +0 -0
  363. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/websocket/__init__.py +0 -0
  364. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
  365. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
  366. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/websocket/websocket_manager.py +0 -0
  367. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflow.py +0 -0
  368. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/__init__.py +0 -0
  369. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/modify_note.py +0 -0
  370. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/removed_workflow.py +0 -0
  371. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/tasks/__init__.py +0 -0
  372. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/tasks/cleanup_tasks_log.py +0 -0
  373. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/tasks/resume_workflows.py +0 -0
  374. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/tasks/validate_product_type.py +0 -0
  375. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/tasks/validate_products.py +0 -0
  376. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/translations/en-GB.json +0 -0
  377. {orchestrator_core-4.5.0a7 → orchestrator_core-4.5.0a8}/orchestrator/workflows/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.5.0a7
3
+ Version: 4.5.0a8
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
@@ -63,15 +63,17 @@ Requires-Dist: structlog>=25.4.0
63
63
  Requires-Dist: tabulate==0.9.0
64
64
  Requires-Dist: typer==0.15.4
65
65
  Requires-Dist: uvicorn[standard]~=0.34.0
66
+ Requires-Dist: pydantic-ai-slim ==0.7.0 ; extra == "agent"
67
+ Requires-Dist: ag-ui-protocol>=0.1.8 ; extra == "agent"
68
+ Requires-Dist: litellm>=1.75.7 ; extra == "agent"
66
69
  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"
70
+ Requires-Dist: litellm>=1.75.7 ; extra == "search"
70
71
  Project-URL: Documentation, https://workfloworchestrator.org/orchestrator-core
71
72
  Project-URL: Homepage, https://workfloworchestrator.org/orchestrator-core
72
73
  Project-URL: Source, https://github.com/workfloworchestrator/orchestrator-core
74
+ Provides-Extra: agent
73
75
  Provides-Extra: celery
74
- Provides-Extra: llm
76
+ Provides-Extra: search
75
77
 
76
78
  # Orchestrator-Core
77
79
 
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.5.0a7"
16
+ __version__ = "4.5.0a8"
17
17
 
18
18
 
19
19
  from structlog import get_logger
@@ -25,18 +25,9 @@ logger.info("Starting the orchestrator", version=__version__)
25
25
  from orchestrator.llm_settings import llm_settings
26
26
  from orchestrator.settings import app_settings
27
27
 
28
- if llm_settings.LLM_ENABLED:
29
- try:
30
- from importlib import import_module
28
+ if llm_settings.SEARCH_ENABLED or llm_settings.AGENT_ENABLED:
31
29
 
32
- import_module("pydantic_ai")
33
- from orchestrator.agentic_app import AgenticOrchestratorCore as OrchestratorCore
34
-
35
- except ImportError:
36
- logger.error(
37
- "Unable to import 'pydantic_ai' module, please install the orchestrator with llm dependencies. `pip install orchestrator-core[llm]",
38
- )
39
- exit(1)
30
+ from orchestrator.agentic_app import LLMOrchestratorCore as OrchestratorCore
40
31
  else:
41
32
  from orchestrator.app import OrchestratorCore # type: ignore[assignment]
42
33
 
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ """The main application module.
3
+
4
+ This module contains the main `LLMOrchestratorCore` class for the `FastAPI` backend and
5
+ provides the ability to run the CLI with LLM features (search and/or agent).
6
+ """
7
+ # Copyright 2019-2025 SURF
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ from typing import TYPE_CHECKING, Any
20
+
21
+ import typer
22
+ from structlog import get_logger
23
+
24
+ from orchestrator.app import OrchestratorCore
25
+ from orchestrator.cli.main import app as cli_app
26
+ from orchestrator.llm_settings import LLMSettings, llm_settings
27
+
28
+ if TYPE_CHECKING:
29
+ from pydantic_ai.models.openai import OpenAIModel
30
+ from pydantic_ai.toolsets import FunctionToolset
31
+
32
+ logger = get_logger(__name__)
33
+
34
+
35
+ class LLMOrchestratorCore(OrchestratorCore):
36
+ def __init__(
37
+ self,
38
+ *args: Any,
39
+ llm_settings: LLMSettings = llm_settings,
40
+ agent_model: "OpenAIModel | str | None" = None,
41
+ agent_tools: "list[FunctionToolset] | None" = None,
42
+ **kwargs: Any,
43
+ ) -> None:
44
+ """Initialize the `LLMOrchestratorCore` class.
45
+
46
+ This class extends `OrchestratorCore` with LLM features (search and agent).
47
+ It runs the search migration and mounts the agent endpoint based on feature flags.
48
+
49
+ Args:
50
+ *args: All the normal arguments passed to the `OrchestratorCore` class.
51
+ llm_settings: A class of settings for the LLM
52
+ agent_model: Override the agent model (defaults to llm_settings.AGENT_MODEL)
53
+ agent_tools: A list of tools that can be used by the agent
54
+ **kwargs: Additional arguments passed to the `OrchestratorCore` class.
55
+
56
+ Returns:
57
+ None
58
+ """
59
+ self.llm_settings = llm_settings
60
+ self.agent_model = agent_model or llm_settings.AGENT_MODEL
61
+ self.agent_tools = agent_tools
62
+
63
+ super().__init__(*args, **kwargs)
64
+
65
+ # Run search migration if search or agent is enabled
66
+ if self.llm_settings.SEARCH_ENABLED or self.llm_settings.AGENT_ENABLED:
67
+ logger.info("Running search migration")
68
+ try:
69
+ from orchestrator.db import db
70
+ from orchestrator.search.llm_migration import run_migration
71
+
72
+ with db.engine.begin() as connection:
73
+ run_migration(connection)
74
+ except ImportError as e:
75
+ logger.error(
76
+ "Unable to run search migration. Please install search dependencies: "
77
+ "`pip install orchestrator-core[search]`",
78
+ error=str(e),
79
+ )
80
+ raise
81
+
82
+ # Mount agent endpoint if agent is enabled
83
+ if self.llm_settings.AGENT_ENABLED:
84
+ logger.info("Initializing agent features", model=self.agent_model)
85
+ try:
86
+ from orchestrator.search.agent import build_agent_router
87
+
88
+ agent_app = build_agent_router(self.agent_model, self.agent_tools)
89
+ self.mount("/agent", agent_app)
90
+ except ImportError as e:
91
+ logger.error(
92
+ "Unable to initialize agent features. Please install agent dependencies: "
93
+ "`pip install orchestrator-core[agent]`",
94
+ error=str(e),
95
+ )
96
+ raise
97
+
98
+
99
+ main_typer_app = typer.Typer()
100
+ main_typer_app.add_typer(cli_app, name="orchestrator", help="The orchestrator CLI commands")
101
+
102
+ if __name__ == "__main__":
103
+ main_typer_app()
@@ -89,7 +89,7 @@ api_router.include_router(
89
89
  ws.router, prefix="/ws", tags=["Core", "Events"]
90
90
  ) # Auth on the websocket is handled in the Websocket Manager
91
91
 
92
- if llm_settings.LLM_ENABLED:
92
+ if llm_settings.SEARCH_ENABLED:
93
93
  from orchestrator.api.api_v1.endpoints import search
94
94
 
95
95
  api_router.include_router(
@@ -24,6 +24,7 @@ from orchestrator.db import (
24
24
  db,
25
25
  )
26
26
  from orchestrator.domain.base import SubscriptionModel
27
+ from orchestrator.domain.context_cache import cache_subscription_models
27
28
  from orchestrator.schemas.search import (
28
29
  PageInfoSchema,
29
30
  PathsResponse,
@@ -192,17 +193,22 @@ async def search_subscriptions(
192
193
  page_info = PageInfoSchema(has_next_page=has_next_page, next_page_cursor=next_page_cursor)
193
194
 
194
195
  search_info_map = {res.entity_id: res for res in search_response.results}
195
- results_data = []
196
- for sub_id, search_info in search_info_map.items():
197
- subscription_model = SubscriptionModel.from_subscription(sub_id)
198
- sub_data = subscription_model.model_dump(exclude_unset=False)
199
- search_result_item = SubscriptionSearchResult(
200
- subscription=format_special_types(sub_data),
196
+
197
+ with cache_subscription_models():
198
+ subscriptions_data = {
199
+ sub_id: SubscriptionModel.from_subscription(sub_id).model_dump(exclude_unset=False)
200
+ for sub_id in search_info_map
201
+ }
202
+
203
+ results_data = [
204
+ SubscriptionSearchResult(
205
+ subscription=format_special_types(subscriptions_data[sub_id]),
201
206
  score=search_info.score,
202
207
  perfect_match=search_info.perfect_match,
203
208
  matching_field=search_info.matching_field,
204
209
  )
205
- results_data.append(search_result_item)
210
+ for sub_id, search_info in search_info_map.items()
211
+ ]
206
212
 
207
213
  return SearchResultsSchema(data=results_data, page_info=page_info, search_metadata=search_response.metadata)
208
214
 
@@ -25,8 +25,8 @@ app.add_typer(scheduler.app, name="scheduler", help="Access all the scheduler fu
25
25
  app.add_typer(database.app, name="db", help="Interact with the application database")
26
26
  app.add_typer(generate.app, name="generate", help="Generate products, workflows and other artifacts")
27
27
 
28
- if llm_settings.LLM_ENABLED:
29
- from orchestrator.cli import index_llm, resize_embedding, search_explore, speedtest
28
+ if llm_settings.SEARCH_ENABLED:
29
+ from orchestrator.cli.search import index_llm, resize_embedding, search_explore, speedtest
30
30
 
31
31
  app.add_typer(index_llm.app, name="index", help="(Re-)Index the search table.")
32
32
  app.add_typer(search_explore.app, name="search", help="Try out different search types.")
@@ -0,0 +1,32 @@
1
+ # Copyright 2019-2020 SURF.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+
14
+ import typer
15
+
16
+ from orchestrator.cli.search import index_llm, resize_embedding, search_explore, speedtest
17
+
18
+
19
+ def register_commands(app: typer.Typer) -> None:
20
+ """Register all LLM/search related commands to the main app."""
21
+ app.add_typer(index_llm.app, name="index", help="(Re-)Index the search table.")
22
+ app.add_typer(search_explore.app, name="search", help="Try out different search types.")
23
+ app.add_typer(
24
+ resize_embedding.app,
25
+ name="embedding",
26
+ help="Resize the vector dimension of the embedding column in the search table.",
27
+ )
28
+ app.add_typer(
29
+ speedtest.app,
30
+ name="speedtest",
31
+ help="Search performance testing and analysis.",
32
+ )
@@ -18,7 +18,10 @@ logger = get_logger(__name__)
18
18
 
19
19
 
20
20
  class LLMSettings(BaseSettings):
21
- LLM_ENABLED: bool = False # Default to false
21
+ # Feature flags for LLM functionality
22
+ SEARCH_ENABLED: bool = False # Enable search/indexing with embeddings
23
+ AGENT_ENABLED: bool = False # Enable agentic functionality
24
+
22
25
  # Pydantic-ai Agent settings
23
26
  AGENT_MODEL: str = "gpt-4o-mini" # See pydantic-ai docs for supported models.
24
27
  AGENT_MODEL_VERSION: str = "2025-01-01-preview"
@@ -30,11 +33,11 @@ class LLMSettings(BaseSettings):
30
33
  0.1, description="Safety margin as a percentage (e.g., 0.1 for 10%) for token budgeting.", ge=0, le=1
31
34
  )
32
35
 
33
- # The following settings are only needed for local models.
36
+ # The following settings are only needed for local models or system constraints.
34
37
  # By default, they are set conservative assuming a small model like All-MiniLM-L6-V2.
35
38
  OPENAI_BASE_URL: str | None = None
36
39
  EMBEDDING_FALLBACK_MAX_TOKENS: int | None = 512
37
- EMBEDDING_MAX_BATCH_SIZE: int | None = 32
40
+ EMBEDDING_MAX_BATCH_SIZE: int | None = None
38
41
 
39
42
  # General LiteLLM settings
40
43
  LLM_MAX_RETRIES: int = 3
@@ -14,8 +14,8 @@
14
14
  # This module requires: pydantic-ai==0.7.0, ag-ui-protocol>=0.1.8
15
15
 
16
16
 
17
- from orchestrator.search.agent.agent import build_agent_app
17
+ from orchestrator.search.agent.agent import build_agent_router
18
18
 
19
19
  __all__ = [
20
- "build_agent_app",
20
+ "build_agent_router",
21
21
  ]
@@ -14,13 +14,13 @@
14
14
  from typing import Any
15
15
 
16
16
  import structlog
17
- from fastapi import FastAPI, HTTPException
18
- from pydantic_ai.ag_ui import StateDeps
17
+ from fastapi import APIRouter, HTTPException, Request
18
+ from pydantic_ai.ag_ui import StateDeps, handle_ag_ui_request
19
19
  from pydantic_ai.agent import Agent
20
20
  from pydantic_ai.models.openai import OpenAIModel
21
21
  from pydantic_ai.settings import ModelSettings
22
22
  from pydantic_ai.toolsets import FunctionToolset
23
- from starlette.types import ASGIApp
23
+ from starlette.responses import Response
24
24
 
25
25
  from orchestrator.search.agent.prompts import get_base_instructions, get_dynamic_instructions
26
26
  from orchestrator.search.agent.state import SearchState
@@ -29,17 +29,9 @@ from orchestrator.search.agent.tools import search_toolset
29
29
  logger = structlog.get_logger(__name__)
30
30
 
31
31
 
32
- def _disabled_agent_app(reason: str) -> FastAPI:
33
- app = FastAPI(title="Agent disabled")
32
+ def build_agent_router(model: str | OpenAIModel, toolsets: list[FunctionToolset[Any]] | None = None) -> APIRouter:
33
+ router = APIRouter()
34
34
 
35
- @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"])
36
- async def _disabled(path: str) -> None:
37
- raise HTTPException(status_code=503, detail=f"Agent disabled: {reason}")
38
-
39
- return app
40
-
41
-
42
- def build_agent_app(model: str | OpenAIModel, toolsets: list[FunctionToolset[Any]] | None = None) -> ASGIApp:
43
35
  try:
44
36
  toolsets = toolsets + [search_toolset] if toolsets else [search_toolset]
45
37
 
@@ -54,7 +46,17 @@ def build_agent_app(model: str | OpenAIModel, toolsets: list[FunctionToolset[Any
54
46
  agent.instructions(get_base_instructions)
55
47
  agent.instructions(get_dynamic_instructions)
56
48
 
57
- return agent.to_ag_ui(deps=StateDeps(SearchState()))
49
+ @router.post("/")
50
+ async def agent_endpoint(request: Request) -> Response:
51
+ return await handle_ag_ui_request(agent, request, deps=StateDeps(SearchState()))
52
+
53
+ return router
58
54
  except Exception as e:
59
55
  logger.error("Agent init failed; serving disabled stub.", error=str(e))
60
- return _disabled_agent_app(str(e))
56
+ error_msg = f"Agent disabled: {str(e)}"
57
+
58
+ @router.api_route("/{path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"])
59
+ async def _disabled(path: str) -> None:
60
+ raise HTTPException(status_code=503, detail=error_msg)
61
+
62
+ return router
@@ -18,6 +18,7 @@ Point your backend to the local endpoint and declare the new vector size:
18
18
  ```env
19
19
  OPENAI_BASE_URL=http://localhost:8080/v1
20
20
  EMBEDDING_DIMENSION=384
21
+ EMBEDDING_MAX_BATCH_SIZE=32 # Not required when using OpenAI embeddings
21
22
  ```
22
23
 
23
24
  Depending on the model, you might want to change the `EMBEDDING_FALLBACK_MAX_TOKENS` and `EMBEDDING_MAX_BATCH_SIZE` settings, which are set conservatively and according to the requirements of the setup used in this example.
@@ -226,6 +226,38 @@ class FilterTree(BaseModel):
226
226
  leaves.extend(child.get_all_leaves())
227
227
  return leaves
228
228
 
229
+ @staticmethod
230
+ def _build_correlates(
231
+ alias: Any, entity_id_col: SQLAColumn, entity_type_value: str | None
232
+ ) -> list[ColumnElement[bool]]:
233
+ """Build the correlation predicates that link the subquery to the outer query."""
234
+ correlates = [alias.entity_id == entity_id_col]
235
+ if entity_type_value is not None:
236
+ correlates.append(alias.entity_type == entity_type_value)
237
+ return correlates
238
+
239
+ @staticmethod
240
+ def _handle_ltree_filter(pf: PathFilter, alias: Any, correlates: list[ColumnElement[bool]]) -> ColumnElement[bool]:
241
+ """Handle path-only filters (has_component, not_has_component, ends_with)."""
242
+ # row-level predicate is always positive
243
+ positive = pf.condition.to_expression(alias.path, pf.path)
244
+ subq = select(1).select_from(alias).where(and_(*correlates, positive))
245
+ if pf.condition.op == FilterOp.NOT_HAS_COMPONENT:
246
+ return ~exists(subq) # NOT at the entity level
247
+ return exists(subq)
248
+
249
+ @staticmethod
250
+ def _handle_value_filter(pf: PathFilter, alias: Any, correlates: list[ColumnElement[bool]]) -> ColumnElement[bool]:
251
+ """Handle value-based filters (equality, comparison, etc)."""
252
+ if "." not in pf.path:
253
+ path_pred = LtreeFilter(op=FilterOp.ENDS_WITH, value=pf.path).to_expression(alias.path, "")
254
+ else:
255
+ path_pred = alias.path == Ltree(pf.path)
256
+
257
+ value_pred = pf.to_expression(alias.value, alias.value_type)
258
+ subq = select(1).select_from(alias).where(and_(*correlates, path_pred, value_pred))
259
+ return exists(subq)
260
+
229
261
  def to_expression(
230
262
  self,
231
263
  entity_id_col: SQLAColumn,
@@ -241,35 +273,18 @@ class FilterTree(BaseModel):
241
273
  Returns:
242
274
  ColumnElement[bool]: A SQLAlchemy expression suitable for use in a WHERE clause.
243
275
  """
276
+ from sqlalchemy.orm import aliased
244
277
 
245
278
  alias_idx = count(1)
246
279
 
247
280
  def leaf_exists(pf: PathFilter) -> ColumnElement[bool]:
248
- from sqlalchemy.orm import aliased
249
-
281
+ """Convert a PathFilter into an EXISTS subquery."""
250
282
  alias = aliased(AiSearchIndex, name=f"flt_{next(alias_idx)}")
251
-
252
- correlates = [alias.entity_id == entity_id_col]
253
- if entity_type_value is not None:
254
- correlates.append(alias.entity_type == entity_type_value)
283
+ correlates = self._build_correlates(alias, entity_id_col, entity_type_value)
255
284
 
256
285
  if isinstance(pf.condition, LtreeFilter):
257
- # row-level predicate is always positive
258
- positive = pf.condition.to_expression(alias.path, pf.path)
259
- subq = select(1).select_from(alias).where(and_(*correlates, positive))
260
- if pf.condition.op == FilterOp.NOT_HAS_COMPONENT:
261
- return ~exists(subq) # NOT at the entity level
262
- return exists(subq)
263
-
264
- # value leaf: path predicate + typed value compare
265
- if "." not in pf.path:
266
- path_pred = LtreeFilter(op=FilterOp.ENDS_WITH, value=pf.path).to_expression(alias.path, "")
267
- else:
268
- path_pred = alias.path == Ltree(pf.path)
269
-
270
- value_pred = pf.to_expression(alias.value, alias.value_type)
271
- subq = select(1).select_from(alias).where(and_(*correlates, path_pred, value_pred))
272
- return exists(subq)
286
+ return self._handle_ltree_filter(pf, alias, correlates)
287
+ return self._handle_value_filter(pf, alias, correlates)
273
288
 
274
289
  def compile_node(node: FilterTree | PathFilter) -> ColumnElement[bool]:
275
290
  if isinstance(node, FilterTree):
@@ -226,9 +226,7 @@ class Indexer:
226
226
  safe_margin = int(max_ctx * llm_settings.EMBEDDING_SAFE_MARGIN_PERCENT)
227
227
  token_budget = max(1, max_ctx - safe_margin)
228
228
 
229
- max_batch_size = None
230
- if llm_settings.OPENAI_BASE_URL: # We are using a local model
231
- max_batch_size = llm_settings.EMBEDDING_MAX_BATCH_SIZE
229
+ max_batch_size = llm_settings.EMBEDDING_MAX_BATCH_SIZE
232
230
 
233
231
  for entity_id, field in fields_to_upsert:
234
232
  if field.value_type.is_embeddable(field.value):
@@ -15,6 +15,7 @@ import structlog
15
15
  from sqlalchemy.orm import Query
16
16
 
17
17
  from orchestrator.db import db
18
+ from orchestrator.domain.context_cache import cache_subscription_models
18
19
  from orchestrator.search.core.types import EntityType
19
20
  from orchestrator.search.indexing.indexer import Indexer
20
21
  from orchestrator.search.indexing.registry import ENTITY_CONFIG_REGISTRY
@@ -63,4 +64,6 @@ def run_indexing_for_entity(
63
64
  entities = db.session.execute(stmt).scalars()
64
65
 
65
66
  indexer = Indexer(config=config, dry_run=dry_run, force_index=force_index, chunk_size=chunk_size)
66
- indexer.run(entities)
67
+
68
+ with cache_subscription_models():
69
+ indexer.run(entities)
@@ -0,0 +1,102 @@
1
+ # Copyright 2019-2025 SURF
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+
14
+ """Simple search migration function that runs when SEARCH_ENABLED = True."""
15
+
16
+ from sqlalchemy import text
17
+ from sqlalchemy.engine import Connection
18
+ from structlog import get_logger
19
+
20
+ from orchestrator.search.core.types import FieldType
21
+
22
+ logger = get_logger(__name__)
23
+
24
+ TABLE = "ai_search_index"
25
+ TARGET_DIM = 1536
26
+
27
+
28
+ def run_migration(connection: Connection) -> None:
29
+ """Run LLM migration with ON CONFLICT DO NOTHING pattern."""
30
+ logger.info("Running LLM migration")
31
+
32
+ try:
33
+ # Create PostgreSQL extensions
34
+ connection.execute(text("CREATE EXTENSION IF NOT EXISTS ltree;"))
35
+ connection.execute(text("CREATE EXTENSION IF NOT EXISTS unaccent;"))
36
+ connection.execute(text("CREATE EXTENSION IF NOT EXISTS pg_trgm;"))
37
+ connection.execute(text("CREATE EXTENSION IF NOT EXISTS vector;"))
38
+
39
+ # Create field_type enum
40
+ field_type_values = "', '".join([ft.value for ft in FieldType])
41
+ connection.execute(
42
+ text(
43
+ f"""
44
+ DO $$
45
+ BEGIN
46
+ IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'field_type') THEN
47
+ CREATE TYPE field_type AS ENUM ('{field_type_values}');
48
+ END IF;
49
+ END $$;
50
+ """
51
+ )
52
+ )
53
+
54
+ # Create table with ON CONFLICT DO NOTHING pattern
55
+ connection.execute(
56
+ text(
57
+ f"""
58
+ CREATE TABLE IF NOT EXISTS {TABLE} (
59
+ entity_type TEXT NOT NULL,
60
+ entity_id UUID NOT NULL,
61
+ path LTREE NOT NULL,
62
+ value TEXT NOT NULL,
63
+ embedding VECTOR({TARGET_DIM}),
64
+ content_hash VARCHAR(64) NOT NULL,
65
+ value_type field_type NOT NULL DEFAULT '{FieldType.STRING.value}',
66
+ CONSTRAINT pk_ai_search_index PRIMARY KEY (entity_id, path)
67
+ );
68
+ """
69
+ )
70
+ )
71
+
72
+ # Drop default
73
+ connection.execute(text(f"ALTER TABLE {TABLE} ALTER COLUMN value_type DROP DEFAULT;"))
74
+
75
+ # Create indexes with IF NOT EXISTS
76
+ connection.execute(text(f"CREATE INDEX IF NOT EXISTS ix_ai_search_index_entity_id ON {TABLE} (entity_id);"))
77
+ connection.execute(
78
+ text(f"CREATE INDEX IF NOT EXISTS idx_ai_search_index_content_hash ON {TABLE} (content_hash);")
79
+ )
80
+ connection.execute(
81
+ text(f"CREATE INDEX IF NOT EXISTS ix_flat_path_gist ON {TABLE} USING GIST (path gist_ltree_ops);")
82
+ )
83
+ connection.execute(text(f"CREATE INDEX IF NOT EXISTS ix_flat_path_btree ON {TABLE} (path);"))
84
+ connection.execute(
85
+ text(f"CREATE INDEX IF NOT EXISTS ix_flat_value_trgm ON {TABLE} USING GIN (value gin_trgm_ops);")
86
+ )
87
+ connection.execute(
88
+ text(
89
+ f"CREATE INDEX IF NOT EXISTS ix_flat_embed_hnsw ON {TABLE} USING HNSW (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);"
90
+ )
91
+ )
92
+
93
+ connection.commit()
94
+ logger.info("LLM migration completed successfully")
95
+
96
+ except Exception as e:
97
+ logger.error("LLM migration failed", error=str(e))
98
+ raise Exception(
99
+ f"LLM migration failed. This likely means the pgvector extension "
100
+ f"is not installed. Please install pgvector and ensure your PostgreSQL "
101
+ f"version supports it. Error: {e}"
102
+ ) from e
@@ -86,11 +86,7 @@ def _format_response(
86
86
 
87
87
 
88
88
  def _extract_matching_field_from_filters(filters: FilterTree) -> MatchingField | None:
89
- """Extract the first path filter to use as matching field for structured searches.
90
-
91
- TODO: Should we allow a list of matched fields in the MatchingField model?
92
- We need a different approach, probably a cross join in StructuredRetriever.
93
- """
89
+ """Extract the first path filter to use as matching field for structured searches."""
94
90
  leaves = filters.get_all_leaves()
95
91
  if len(leaves) != 1:
96
92
  return None
@@ -112,7 +112,8 @@ class Retriever(ABC):
112
112
 
113
113
  def _quantize_score_for_pagination(self, score_value: float) -> BindParameter[Decimal]:
114
114
  """Convert score value to properly quantized Decimal parameter for pagination."""
115
- pas_dec = Decimal(str(score_value)).quantize(Decimal("0.000000000001"))
115
+ quantizer = Decimal(1).scaleb(-self.SCORE_PRECISION)
116
+ pas_dec = Decimal(str(score_value)).quantize(quantizer)
116
117
  return literal(pas_dec, type_=self.SCORE_NUMERIC_TYPE)
117
118
 
118
119
  @property