lightspeed-stack 0.1.2__tar.gz → 0.2.0__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 (171) hide show
  1. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/PKG-INFO +341 -49
  2. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/README.md +333 -45
  3. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/pyproject.toml +61 -6
  4. lightspeed_stack-0.2.0/src/app/database.py +125 -0
  5. lightspeed_stack-0.2.0/src/app/endpoints/.ruff_cache/0.9.1/9961612457335986079 +0 -0
  6. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/authorized.py +14 -5
  7. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/config.py +10 -2
  8. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/conversations.py +191 -48
  9. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/feedback.py +53 -22
  10. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/health.py +24 -10
  11. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/info.py +11 -3
  12. lightspeed_stack-0.2.0/src/app/endpoints/metrics.py +30 -0
  13. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/models.py +19 -7
  14. lightspeed_stack-0.2.0/src/app/endpoints/query.py +581 -0
  15. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/streaming_query.py +302 -101
  16. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/main.py +19 -7
  17. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/interface.py +7 -1
  18. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/metrics/__init__.py +2 -0
  19. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/metrics/utils.py +6 -6
  20. lightspeed_stack-0.2.0/src/models/.ruff_cache/0.9.1/2435063725374233068 +0 -0
  21. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/config.py +100 -38
  22. lightspeed_stack-0.2.0/src/models/database/__init__.py +1 -0
  23. lightspeed_stack-0.2.0/src/models/database/base.py +7 -0
  24. lightspeed_stack-0.2.0/src/models/database/conversations.py +36 -0
  25. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/requests.py +107 -14
  26. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/responses.py +192 -12
  27. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/common.py +20 -48
  28. lightspeed_stack-0.2.0/src/utils/endpoints.py +127 -0
  29. lightspeed_stack-0.2.0/src/utils/llama_stack_version.py +51 -0
  30. lightspeed_stack-0.2.0/src/utils/transcripts.py +86 -0
  31. lightspeed_stack-0.2.0/src/utils/types.py +78 -0
  32. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/lightspeed-stack.yaml +14 -0
  33. lightspeed_stack-0.2.0/tests/e2e/features/authorized.feature +34 -0
  34. lightspeed_stack-0.2.0/tests/e2e/features/conversations.feature +54 -0
  35. lightspeed_stack-0.2.0/tests/e2e/features/feedback.feature +90 -0
  36. lightspeed_stack-0.2.0/tests/e2e/features/health.feature +53 -0
  37. lightspeed_stack-0.2.0/tests/e2e/features/info.feature +46 -0
  38. lightspeed_stack-0.2.0/tests/e2e/features/query.feature +60 -0
  39. lightspeed_stack-0.2.0/tests/e2e/features/rest_api.feature +14 -0
  40. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/smoketests.feature +1 -1
  41. lightspeed_stack-0.2.0/tests/e2e/features/steps/auth.py +25 -0
  42. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/common.py +2 -2
  43. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/common_http.py +4 -7
  44. lightspeed_stack-0.2.0/tests/e2e/features/steps/conversation.py +18 -0
  45. lightspeed_stack-0.2.0/tests/e2e/features/steps/feedback.py +38 -0
  46. lightspeed_stack-0.2.0/tests/e2e/features/steps/health.py +18 -0
  47. lightspeed_stack-0.2.0/tests/e2e/features/steps/info.py +22 -0
  48. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/llm_query_response.py +26 -4
  49. lightspeed_stack-0.2.0/tests/e2e/features/streaming_query.feature +39 -0
  50. lightspeed_stack-0.2.0/tests/e2e/test_list.txt +9 -0
  51. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/integration/test_configuration.py +7 -0
  52. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/test_results/.coverage.integration +0 -0
  53. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/test_results/.coverage.unit +0 -0
  54. lightspeed_stack-0.2.0/tests/test_results/coverage_integration.json +1 -0
  55. lightspeed_stack-0.2.0/tests/test_results/coverage_unit.json +1 -0
  56. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/test_results/junit_integration.xml +1 -1
  57. lightspeed_stack-0.2.0/tests/test_results/junit_unit.xml +1 -0
  58. lightspeed_stack-0.2.0/tests/unit/app/.ruff_cache/.gitignore +2 -0
  59. lightspeed_stack-0.2.0/tests/unit/app/.ruff_cache/0.9.1/10631576872848856737 +0 -0
  60. lightspeed_stack-0.2.0/tests/unit/app/.ruff_cache/CACHEDIR.TAG +1 -0
  61. lightspeed_stack-0.2.0/tests/unit/app/endpoints/.ruff_cache/.gitignore +2 -0
  62. lightspeed_stack-0.1.2/tests/unit/app/endpoints/test_query.py → lightspeed_stack-0.2.0/tests/unit/app/endpoints/.ruff_cache/0.9.1/15310180828563549007 +0 -0
  63. lightspeed_stack-0.2.0/tests/unit/app/endpoints/.ruff_cache/CACHEDIR.TAG +1 -0
  64. lightspeed_stack-0.2.0/tests/unit/app/endpoints/test_authorized.py +61 -0
  65. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_config.py +11 -3
  66. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_conversations.py +249 -144
  67. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_feedback.py +37 -4
  68. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_health.py +11 -11
  69. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_info.py +7 -1
  70. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_metrics.py +14 -2
  71. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_models.py +26 -19
  72. lightspeed_stack-0.2.0/tests/unit/app/endpoints/test_query.py +1473 -0
  73. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_root.py +7 -1
  74. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_streaming_query.py +293 -337
  75. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/test_routers.py +22 -7
  76. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_noop_with_token.py +9 -1
  77. lightspeed_stack-0.2.0/tests/unit/conftest.py +28 -0
  78. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/metrics/test_utis.py +8 -1
  79. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/test_config.py +285 -61
  80. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_client.py +7 -64
  81. lightspeed_stack-0.2.0/tests/unit/utils/.ruff_cache/.gitignore +2 -0
  82. lightspeed_stack-0.2.0/tests/unit/utils/.ruff_cache/0.9.1/8897072278360683352 +0 -0
  83. lightspeed_stack-0.2.0/tests/unit/utils/.ruff_cache/CACHEDIR.TAG +1 -0
  84. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_common.py +9 -17
  85. lightspeed_stack-0.2.0/tests/unit/utils/test_endpoints.py +593 -0
  86. lightspeed_stack-0.2.0/tests/unit/utils/test_llama_stack_version.py +101 -0
  87. lightspeed_stack-0.2.0/tests/unit/utils/test_transcripts.py +127 -0
  88. lightspeed_stack-0.1.2/src/app/endpoints/.ruff_cache/0.9.1/5703048272820174433 +0 -0
  89. lightspeed_stack-0.1.2/src/app/endpoints/.ruff_cache/0.9.1/9961612457335986079 +0 -0
  90. lightspeed_stack-0.1.2/src/app/endpoints/metrics.py +0 -16
  91. lightspeed_stack-0.1.2/src/app/endpoints/query.py +0 -442
  92. lightspeed_stack-0.1.2/src/runners/data_collector.py +0 -26
  93. lightspeed_stack-0.1.2/src/services/data_collector.py +0 -258
  94. lightspeed_stack-0.1.2/src/utils/.ruff_cache/0.9.1/18446581155718949728 +0 -0
  95. lightspeed_stack-0.1.2/src/utils/.ruff_cache/0.9.1/4991844299736624256 +0 -0
  96. lightspeed_stack-0.1.2/src/utils/endpoints.py +0 -50
  97. lightspeed_stack-0.1.2/src/utils/types.py +0 -37
  98. lightspeed_stack-0.1.2/tests/e2e/features/llm_interface.feature +0 -18
  99. lightspeed_stack-0.1.2/tests/e2e/features/rest_api.feature +0 -57
  100. lightspeed_stack-0.1.2/tests/e2e/test_list.txt +0 -3
  101. lightspeed_stack-0.1.2/tests/test_results/coverage_integration.json +0 -1
  102. lightspeed_stack-0.1.2/tests/test_results/coverage_unit.json +0 -1
  103. lightspeed_stack-0.1.2/tests/test_results/junit_unit.xml +0 -1
  104. lightspeed_stack-0.1.2/tests/unit/app/endpoints/test_authorized.py +0 -56
  105. lightspeed_stack-0.1.2/tests/unit/runners/test_data_collector_runner.py +0 -60
  106. lightspeed_stack-0.1.2/tests/unit/services/test_data_collector.py +0 -587
  107. lightspeed_stack-0.1.2/tests/unit/utils/test_endpoints.py +0 -145
  108. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/LICENSE +0 -0
  109. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/__init__.py +0 -0
  110. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/.ruff_cache/.gitignore +0 -0
  111. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/.ruff_cache/CACHEDIR.TAG +0 -0
  112. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/__init__.py +0 -0
  113. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/root.py +0 -0
  114. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/routers.py +0 -0
  115. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/__init__.py +0 -0
  116. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/jwk_token.py +0 -0
  117. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/k8s.py +0 -0
  118. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/noop.py +0 -0
  119. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/noop_with_token.py +0 -0
  120. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/utils.py +0 -0
  121. {lightspeed_stack-0.1.2/src/utils → lightspeed_stack-0.2.0/src/models}/.ruff_cache/.gitignore +0 -0
  122. {lightspeed_stack-0.1.2/src/utils → lightspeed_stack-0.2.0/src/models}/.ruff_cache/CACHEDIR.TAG +0 -0
  123. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/__init__.py +0 -0
  124. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/runners/__init__.py +0 -0
  125. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/runners/uvicorn.py +0 -0
  126. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/services/__init__.py +0 -0
  127. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/__init__.py +0 -0
  128. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/checks.py +0 -0
  129. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/mcp_headers.py +0 -0
  130. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/suid.py +0 -0
  131. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/__init__.py +0 -0
  132. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/minimal-stack.yaml +0 -0
  133. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/password +0 -0
  134. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/run.yaml +0 -0
  135. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/server.crt +0 -0
  136. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/server.key +0 -0
  137. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.pdm-python +0 -0
  138. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.ruff_cache/.gitignore +0 -0
  139. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.ruff_cache/0.9.1/6949908709306621198 +0 -0
  140. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.ruff_cache/CACHEDIR.TAG +0 -0
  141. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/__init__.py +0 -0
  142. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/environment.py +0 -0
  143. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/__init__.py +0 -0
  144. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/gen_scenario_list.py +0 -0
  145. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/test_api.py +0 -0
  146. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/utils/utils.py +0 -0
  147. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/integration/__init__.py +0 -0
  148. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/integration/test_version.py +0 -0
  149. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/__init__.py +0 -0
  150. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/__init__.py +0 -0
  151. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/__init__.py +0 -0
  152. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/__init__.py +0 -0
  153. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_auth.py +0 -0
  154. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_jwk_token.py +0 -0
  155. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_k8s.py +0 -0
  156. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_noop.py +0 -0
  157. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_utils.py +0 -0
  158. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/metrics/__init__.py +0 -0
  159. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/__init__.py +0 -0
  160. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/test_requests.py +0 -0
  161. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/test_responses.py +0 -0
  162. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/runners/__init__.py +0 -0
  163. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/runners/test_uvicorn_runner.py +0 -0
  164. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_configuration.py +0 -0
  165. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_lightspeed_stack.py +0 -0
  166. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_log.py +0 -0
  167. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/__init__.py +0 -0
  168. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_checks.py +0 -0
  169. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_mcp_headers.py +0 -0
  170. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_suid.py +0 -0
  171. {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lightspeed-stack
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: LLM tooling stack
5
5
  Keywords: LLM,RAG
6
6
  Maintainer-Email: =?utf-8?b?UGF2ZWwgVGnFoW5vdnNrw70=?= <tisnik@centrum.cz>
@@ -215,17 +215,21 @@ Classifier: License :: OSI Approved :: Apache Software License
215
215
  Project-URL: Homepage, https://github.com/lightspeed-core/lightspeed-stack
216
216
  Project-URL: Issues, https://github.com/lightspeed-core/lightspeed-stack/issues
217
217
  Requires-Python: <3.14,>=3.12
218
- Requires-Dist: fastapi>=0.115.6
218
+ Requires-Dist: fastapi>=0.115.12
219
219
  Requires-Dist: uvicorn>=0.34.3
220
220
  Requires-Dist: kubernetes>=30.1.0
221
- Requires-Dist: llama-stack==0.2.16
222
- Requires-Dist: llama-stack-client==0.2.16
221
+ Requires-Dist: llama-stack==0.2.17
222
+ Requires-Dist: llama-stack-client==0.2.17
223
223
  Requires-Dist: rich>=14.0.0
224
224
  Requires-Dist: cachetools>=6.1.0
225
225
  Requires-Dist: prometheus-client>=0.22.1
226
226
  Requires-Dist: starlette>=0.47.1
227
227
  Requires-Dist: aiohttp>=3.12.14
228
228
  Requires-Dist: authlib>=1.6.0
229
+ Requires-Dist: email-validator>=2.2.0
230
+ Requires-Dist: openai==1.99.9
231
+ Requires-Dist: sqlalchemy>=2.0.42
232
+ Requires-Dist: semver<4.0.0
229
233
  Description-Content-Type: text/markdown
230
234
 
231
235
  # lightspeed-stack
@@ -236,9 +240,11 @@ Description-Content-Type: text/markdown
236
240
  [![License](https://img.shields.io/badge/license-Apache-blue)](https://github.com/lightspeed-core/lightspeed-stack/blob/main/LICENSE)
237
241
  [![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/)
238
242
  [![Required Python version](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Flightspeed-core%2Flightspeed-stack%2Frefs%2Fheads%2Fmain%2Fpyproject.toml)](https://www.python.org/)
239
- [![Tag](https://img.shields.io/github/v/tag/lightspeed-core/lightspeed-stack)](https://github.com/lightspeed-core/lightspeed-stack/releases/tag/0.1.2)
243
+ [![Tag](https://img.shields.io/github/v/tag/lightspeed-core/lightspeed-stack)](https://github.com/lightspeed-core/lightspeed-stack/releases/tag/0.2.0)
240
244
 
241
245
  Lightspeed Core Stack (LCS) is an AI-powered assistant that provides answers to product questions using backend LLM services, agents, and RAG databases.
246
+
247
+ The service includes comprehensive user data collection capabilities for various types of user interaction data, which can be exported to Red Hat's Dataverse for analysis using the companion [lightspeed-to-dataverse-exporter](https://github.com/lightspeed-core/lightspeed-to-dataverse-exporter) service.
242
248
 
243
249
 
244
250
  <!-- vim-markdown-toc GFM -->
@@ -249,11 +255,21 @@ Lightspeed Core Stack (LCS) is an AI-powered assistant that provides answers to
249
255
  * [Configuration](#configuration)
250
256
  * [Integration with Llama Stack](#integration-with-llama-stack)
251
257
  * [Llama Stack as separate server](#llama-stack-as-separate-server)
258
+ * [MCP Server and Tool Configuration](#mcp-server-and-tool-configuration)
259
+ * [Configuring MCP Servers](#configuring-mcp-servers)
260
+ * [Configuring MCP Headers](#configuring-mcp-headers)
252
261
  * [Llama Stack project and configuration](#llama-stack-project-and-configuration)
253
262
  * [Check connection to Llama Stack](#check-connection-to-llama-stack)
254
263
  * [Llama Stack as client library](#llama-stack-as-client-library)
264
+ * [Llama Stack version check](#llama-stack-version-check)
265
+ * [User data collection](#user-data-collection)
255
266
  * [System prompt](#system-prompt)
256
267
  * [Safety Shields](#safety-shields)
268
+ * [Authentication](#authentication)
269
+ * [K8s based authentication](#k8s-based-authentication)
270
+ * [JSON Web Keyset based authentication](#json-web-keyset-based-authentication)
271
+ * [No-op authentication](#no-op-authentication)
272
+ * [RAG Configuration](#rag-configuration)
257
273
  * [Usage](#usage)
258
274
  * [Make targets](#make-targets)
259
275
  * [Running Linux container image](#running-linux-container-image)
@@ -272,10 +288,12 @@ Lightspeed Core Stack (LCS) is an AI-powered assistant that provides answers to
272
288
  * [Utility to generate OpenAPI schema](#utility-to-generate-openapi-schema)
273
289
  * [Path](#path)
274
290
  * [Usage](#usage-1)
275
- * [Data Collector Service](#data-collector-service)
276
- * [Features](#features)
277
- * [Configuration](#configuration-1)
278
- * [Running the Service](#running-the-service)
291
+ * [Data Export Integration](#data-export-integration)
292
+ * [Quick Integration](#quick-integration)
293
+ * [Documentation](#documentation)
294
+ * [Project structure](#project-structure)
295
+ * [Configuration classes](#configuration-classes)
296
+ * [REST API](#rest-api)
279
297
 
280
298
  <!-- vim-markdown-toc -->
281
299
 
@@ -317,13 +335,14 @@ Llama Stack Client. It is a library available for Python, Swift, Node.js or
317
335
  Kotlin, which "wraps" the REST API stack in a suitable way, which is easier for
318
336
  many applications.
319
337
 
338
+
320
339
  ![Integration with Llama Stack](docs/core2llama-stack_interface.png)
321
340
 
322
341
 
323
342
 
324
343
  ## Llama Stack as separate server
325
344
 
326
- If Llama Stack runs as a separate server, the Lightspeed service needs to be configured to be able to access it. For example, if server runs on localhost:8321, the service configuration stored in file `llama-stack.yaml` should look like:
345
+ If Llama Stack runs as a separate server, the Lightspeed service needs to be configured to be able to access it. For example, if server runs on localhost:8321, the service configuration stored in file `lightspeed-stack.yaml` should look like:
327
346
 
328
347
  ```yaml
329
348
  name: foo bar baz
@@ -344,8 +363,45 @@ user_data_collection:
344
363
  transcripts_storage: "/tmp/data/transcripts"
345
364
  ```
346
365
 
366
+ ### MCP Server and Tool Configuration
367
+
368
+ **Note**: The `run.yaml` configuration is currently an implementation detail. In the future, all configuration will be available directly from the lightspeed-core config.
369
+
370
+ #### Configuring MCP Servers
371
+
372
+ MCP (Model Context Protocol) servers provide tools and capabilities to the AI agents. These are configured in the `mcp_servers` section of your `lightspeed-stack.yaml`:
373
+
374
+ ```yaml
375
+ mcp_servers:
376
+ - name: "filesystem-tools"
377
+ provider_id: "model-context-protocol"
378
+ url: "http://localhost:3000"
379
+ - name: "git-tools"
380
+ provider_id: "model-context-protocol"
381
+ url: "http://localhost:3001"
382
+ - name: "database-tools"
383
+ provider_id: "model-context-protocol"
384
+ url: "http://localhost:3002"
385
+ ```
386
+
387
+ **Important**: Only MCP servers defined in the `lightspeed-stack.yaml` configuration are available to the agents. Tools configured in the llama-stack `run.yaml` are not accessible to lightspeed-core agents.
388
+
389
+ #### Configuring MCP Headers
390
+
391
+ MCP headers allow you to pass authentication tokens, API keys, or other metadata to MCP servers. These are configured **per request** via the `MCP-HEADERS` HTTP header:
392
+
393
+ ```bash
394
+ curl -X POST "http://localhost:8080/v1/query" \
395
+ -H "Content-Type: application/json" \
396
+ -H "MCP-HEADERS: {\"filesystem-tools\": {\"Authorization\": \"Bearer token123\"}}" \
397
+ -d '{"query": "List files in /tmp"}'
398
+ ```
399
+
400
+
347
401
  ### Llama Stack project and configuration
348
402
 
403
+ **Note**: The `run.yaml` configuration is currently an implementation detail. In the future, all configuration will be available directly from the lightspeed-core config.
404
+
349
405
  To run Llama Stack in separate process, you need to have all dependencies installed. The easiest way how to do it is to create a separate repository with Llama Stack project file `pyproject.toml` and Llama Stack configuration file `run.yaml`. The project file might look like:
350
406
 
351
407
  ```toml
@@ -423,6 +479,37 @@ user_data_collection:
423
479
  transcripts_storage: "/tmp/data/transcripts"
424
480
  ```
425
481
 
482
+ ## Llama Stack version check
483
+
484
+ During Lightspeed Core Stack service startup, the Llama Stack version is retrieved. The version is tested against two constants `MINIMAL_SUPPORTED_LLAMA_STACK_VERSION` and `MAXIMAL_SUPPORTED_LLAMA_STACK_VERSION` which are defined in `src/constants.py`. If the actual Llama Stack version is outside the range defined by these two constants, the service won't start and administrator will be informed about this problem.
485
+
486
+
487
+
488
+ ## User data collection
489
+
490
+ The Lightspeed Core Stack includes comprehensive user data collection capabilities to gather various types of user interaction data for analysis and improvement. This includes feedback, conversation transcripts, and other user interaction data.
491
+
492
+ User data collection is configured in the `user_data_collection` section of the configuration file:
493
+
494
+ ```yaml
495
+ user_data_collection:
496
+ feedback_enabled: true
497
+ feedback_storage: "/tmp/data/feedback"
498
+ transcripts_enabled: true
499
+ transcripts_storage: "/tmp/data/transcripts"
500
+ ```
501
+
502
+ **Configuration options:**
503
+
504
+ - `feedback_enabled`: Enable/disable collection of user feedback data
505
+ - `feedback_storage`: Directory path where feedback JSON files are stored
506
+ - `transcripts_enabled`: Enable/disable collection of conversation transcripts
507
+ - `transcripts_storage`: Directory path where transcript JSON files are stored
508
+
509
+ > **Note**: The data collection system is designed to be extensible. Additional data types can be configured and collected as needed for your specific use case.
510
+
511
+ For data export integration with Red Hat's Dataverse, see the [Data Export Integration](#data-export-integration) section.
512
+
426
513
  ## System prompt
427
514
 
428
515
  The service uses the, so called, system prompt to put the question into context before the question is sent to the selected LLM. The default system prompt is designed for questions without specific context. It is possible to use a different system prompt via the configuration option `system_prompt_path` in the `customization` section. That option must contain the path to the text file with the actual system prompt (can contain multiple lines). An example of such configuration:
@@ -460,6 +547,161 @@ utilized:
460
547
  1. If the `shield_id` starts with `inout_`, it will be used both for input and output.
461
548
  1. Otherwise, it will be used for input only.
462
549
 
550
+ ## Authentication
551
+
552
+ Currently supported authentication modules are:
553
+ * `k8s` Kubernetes based authentication
554
+ * `jwk-token` JSON Web Keyset based authentication
555
+ * `noop` No operation authentication (default)
556
+ * `noop-with-token` No operation authentication with token
557
+
558
+ ### K8s based authentication
559
+
560
+ K8s based authentication is suitable for running the Lightspeed Stack in Kubernetes environments.
561
+ The user accessing the service must have a valid Kubernetes token and the appropriate RBAC permissions to access the service.
562
+ The user must have `get` permission on the Kubernetes RBAC non-resource URL `/ls-access`.
563
+ Here is an example of granting `get` on `/ls-access` via a ClusterRole’s nonResourceURLs rule.
564
+ Example:
565
+ ```yaml
566
+ # Allow GET on non-resource URL /ls-access
567
+ apiVersion: rbac.authorization.k8s.io/v1
568
+ kind: ClusterRole
569
+ metadata:
570
+ name: lightspeed-access
571
+ rules:
572
+ - nonResourceURLs: ["/ls-access"]
573
+ verbs: ["get"]
574
+ ---
575
+ # Bind to a user, group, or service account
576
+ apiVersion: rbac.authorization.k8s.io/v1
577
+ kind: ClusterRoleBinding
578
+ metadata:
579
+ name: lightspeed-access-binding
580
+ roleRef:
581
+ apiGroup: rbac.authorization.k8s.io
582
+ kind: ClusterRole
583
+ name: lightspeed-access
584
+ subjects:
585
+ - kind: User # or ServiceAccount, Group
586
+ name: SOME_USER_OR_SA
587
+ apiGroup: rbac.authorization.k8s.io
588
+ ```
589
+
590
+ Configuring K8s based authentication requires the following steps:
591
+ 1. Enable K8s authentication module
592
+ ```yaml
593
+ authentication:
594
+ module: "k8s"
595
+ ```
596
+ 2. Configure the Kubernetes authentication settings.
597
+ When deploying Lightspeed Stack in a Kubernetes cluster, it is not required to specify cluster connection details.
598
+ It automatically picks up the in-cluster configuration or through a kubeconfig file.
599
+ This step is not neccessary.
600
+ When running outside a kubernetes cluster or connecting to external Kubernetes clusters, Lightspeed Stack requires the cluster connection details in the configuration file:
601
+ - `k8s_cluster_api` Kubernetes Cluster API URL. The URL of the K8S/OCP API server where tokens are validated.
602
+ - `k8s_ca_cert_path` Path to the CA certificate file for clusters with self-signed certificates.
603
+ - `skip_tls_verification` Whether to skip TLS verification.
604
+ ```yaml
605
+ authentication:
606
+ module: "k8s"
607
+ skip_tls_verification: false
608
+ k8s_cluster_api: "https://your-k8s-api-server:6443"
609
+ k8s_ca_cert_path: "/path/to/ca.crt"
610
+ ```
611
+
612
+ ### JSON Web Keyset based authentication
613
+
614
+ JWK (JSON Web Keyset) based authentication is suitable for scenarios where you need to authenticate users based on tokens. This method is commonly used in web applications and APIs.
615
+
616
+ To configure JWK based authentication, you need to specify the following settings in the configuration file:
617
+ - `module` must be set to `jwk-token`
618
+ - `jwk_config` JWK configuration settings must set at least `url` field:
619
+ - `url`: The URL of the JWK endpoint.
620
+ - `jwt_configuration`: JWT configuration settings.
621
+ - `user_id_claim`: The key of the user ID in JWT claim.
622
+ - `username_claim`: The key of the username in JWT claim.
623
+
624
+ ```yaml
625
+ authentication:
626
+ module: "jwk-token"
627
+ jwk_config:
628
+ url: "https://your-jwk-url"
629
+ jwt_configuration:
630
+ user_id_claim: user_id
631
+ username_claim: username
632
+ ```
633
+
634
+ ### No-op authentication
635
+
636
+ Lightspeed Stack provides 2 authentication module to bypass the authentication and authorization checks:
637
+ - `noop` No operation authentication (default)
638
+ - `noop-with-token` No operation authentication accepting a bearer token
639
+
640
+ If authentication module is not specified, Lightspeed Stack will use `noop` by default.
641
+ To activate `noop-with-token`, you need to specify it in the configuration file:
642
+
643
+ ```yaml
644
+ authentication:
645
+ module: "noop-with-token"
646
+ ```
647
+
648
+ ## CORS
649
+
650
+ It is possible to configure CORS handling. This configuration is part of service configuration:
651
+
652
+ ```yaml
653
+ service:
654
+ host: localhost
655
+ port: 8080
656
+ auth_enabled: false
657
+ workers: 1
658
+ color_log: true
659
+ access_log: true
660
+ cors:
661
+ allow_origins:
662
+ - http://foo.bar.baz
663
+ - http://test.com
664
+ allow_credentials: true
665
+ allow_methods:
666
+ - *
667
+ allow_headers:
668
+ - *
669
+ ```
670
+
671
+ ### Default values
672
+
673
+ ```yaml
674
+ cors:
675
+ allow_origins:
676
+ - *
677
+ allow_credentials: false
678
+ allow_methods:
679
+ - *
680
+ allow_headers:
681
+ - *
682
+ ```
683
+
684
+ ## Allow credentials
685
+
686
+ Credentials are not allowed with wildcard origins per CORS/Fetch spec.
687
+ See https://fastapi.tiangolo.com/tutorial/cors/
688
+
689
+ # RAG Configuration
690
+
691
+ The [guide to RAG setup](docs/rag_guide.md) provides guidance on setting up RAG and includes tested examples for both inference and vector store integration.
692
+
693
+ ## Example configurations for inference
694
+
695
+ The following configurations are llama-stack config examples from production deployments:
696
+
697
+ - [Granite on vLLM example](examples/vllm-granite-run.yaml)
698
+ - [Qwen3 on vLLM example](examples/vllm-qwen3-run.yaml)
699
+ - [Gemini example](examples/gemini-run.yaml)
700
+ - [VertexAI example](examples/vertexai-run.yaml)
701
+
702
+ > [!NOTE]
703
+ > RAG functionality is **not tested** for these configurations.
704
+
463
705
  # Usage
464
706
 
465
707
  ```
@@ -483,7 +725,6 @@ Usage: make <OPTIONS> ... <TARGETS>
483
725
  Available targets are:
484
726
 
485
727
  run Run the service locally
486
- run-data-collector Run the data collector service
487
728
  test-unit Run the unit tests
488
729
  test-integration Run integration tests tests
489
730
  test-e2e Run BDD tests for the service
@@ -491,6 +732,7 @@ check-types Checks type hints in sources
491
732
  security-check Check the project for security issues
492
733
  format Format the code into unified format
493
734
  schema Generate OpenAPI schema file
735
+ openapi-doc Generate OpenAPI documentation
494
736
  requirements.txt Generate requirements.txt file containing hashes for all non-devel packages
495
737
  shellcheck Run shellcheck
496
738
  verify Run all linters
@@ -520,6 +762,80 @@ Container images are built for the following platforms:
520
762
  1. `linux/amd64` - main platform for deployment
521
763
  1. `linux/arm64`- Mac users with M1/M2/M3 CPUs
522
764
 
765
+ ## Building Container Images
766
+
767
+ The repository includes production-ready container configurations that support two deployment modes:
768
+
769
+ 1. **Server Mode**: lightspeed-core connects to llama-stack as a separate service
770
+ 2. **Library Mode**: llama-stack runs as a library within lightspeed-core
771
+
772
+ ### Llama-Stack as Separate Service (Server Mode)
773
+
774
+ When using llama-stack as a separate service, the existing `docker-compose.yaml` provides the complete setup. This builds two containers for lightspeed core and llama stack.
775
+
776
+ **Configuration** (`lightspeed-stack.yaml`):
777
+ ```yaml
778
+ llama_stack:
779
+ use_as_library_client: false
780
+ url: http://llama-stack:8321 # container name from docker-compose.yaml
781
+ api_key: xyzzy
782
+ ```
783
+
784
+ In the root of this project simply run:
785
+
786
+ ```bash
787
+ # Set your OpenAI API key
788
+ export OPENAI_API_KEY="your-api-key-here"
789
+
790
+ # Start both services
791
+ podman compose up --build
792
+
793
+ # Access lightspeed-core at http://localhost:8080
794
+ # Access llama-stack at http://localhost:8321
795
+ ```
796
+
797
+ ### Llama-Stack as Library (Library Mode)
798
+
799
+ When embedding llama-stack directly in the container, use the existing `Containerfile` directly (this will not build the llama stack service in a separate container). First modify the `lightspeed-stack.yaml` config to use llama stack in library mode.
800
+
801
+ **Configuration** (`lightspeed-stack.yaml`):
802
+ ```yaml
803
+ llama_stack:
804
+ use_as_library_client: true
805
+ library_client_config_path: /app-root/run.yaml
806
+ ```
807
+
808
+ **Build and run**:
809
+ ```bash
810
+ # Build lightspeed-core with embedded llama-stack
811
+ podman build -f Containerfile -t my-lightspeed-core:latest .
812
+
813
+ # Run with embedded llama-stack
814
+ podman run \
815
+ -p 8080:8080 \
816
+ -v ./lightspeed-stack.yaml:/app-root/lightspeed-stack.yaml:Z \
817
+ -v ./run.yaml:/app-root/run.yaml:Z \
818
+ -e OPENAI_API_KEY=your-api-key \
819
+ my-lightspeed-core:latest
820
+ ```
821
+
822
+ For macosx users:
823
+ ```bash
824
+ podman run \
825
+ -p 8080:8080 \
826
+ -v ./lightspeed-stack.yaml:/app-root/lightspeed-stack.yaml:ro \
827
+ -v ./run.yaml:/app-root/run.yaml:ro \
828
+ -e OPENAI_API_KEY=your-api-key \
829
+ my-lightspeed-core:latest
830
+ ```
831
+
832
+ ### Verify it's running properly
833
+
834
+ A simple sanity check:
835
+
836
+ ```bash
837
+ curl -H "Accept: application/json" http://localhost:8080/v1/models
838
+ ```
523
839
 
524
840
 
525
841
  # Endpoints
@@ -651,51 +967,27 @@ This script re-generated OpenAPI schema for the Lightspeed Service REST API.
651
967
  make schema
652
968
  ```
653
969
 
654
- ## Data Collector Service
655
-
656
- The data collector service is a standalone service that runs separately from the main web service. It is responsible for collecting and sending user data including feedback and transcripts to an ingress server for analysis and archival.
657
-
658
- ### Features
970
+ # Data Export Integration
659
971
 
660
- - **Periodic Collection**: Runs at configurable intervals
661
- - **Data Packaging**: Packages feedback and transcript files into compressed tar.gz archives
662
- - **Secure Transmission**: Sends data to a configured ingress server with optional authentication
663
- - **File Cleanup**: Optionally removes local files after successful transmission
664
- - **Error Handling**: Includes retry logic and comprehensive error handling
665
-
666
- ### Configuration
667
-
668
- The data collector service is configured through the `user_data_collection.data_collector` section in your configuration file:
669
-
670
- ```yaml
671
- user_data_collection:
672
- feedback_enabled: true
673
- feedback_storage: "/tmp/data/feedback"
674
- transcripts_enabled: true
675
- transcripts_storage: "/tmp/data/transcripts"
676
- data_collector:
677
- enabled: true
678
- ingress_server_url: "https://your-ingress-server.com"
679
- ingress_server_auth_token: "your-auth-token"
680
- ingress_content_service_name: "lightspeed-team"
681
- collection_interval: 7200 # 2 hours in seconds
682
- cleanup_after_send: true
683
- connection_timeout: 30
684
- ```
972
+ The Lightspeed Core Stack integrates with the [lightspeed-to-dataverse-exporter](https://github.com/lightspeed-core/lightspeed-to-dataverse-exporter) service to automatically export various types of user interaction data to Red Hat's Dataverse for analysis.
685
973
 
686
- ### Running the Service
974
+ ## Quick Integration
687
975
 
688
- To run the data collector service:
976
+ 1. **Enable data collection** in your `lightspeed-stack.yaml`:
977
+ ```yaml
978
+ user_data_collection:
979
+ feedback_enabled: true
980
+ feedback_storage: "/shared/data/feedback"
981
+ transcripts_enabled: true
982
+ transcripts_storage: "/shared/data/transcripts"
983
+ ```
689
984
 
690
- ```bash
691
- # Using Python directly
692
- uv run src/lightspeed_stack.py --data-collector
985
+ 2. **Deploy the exporter service** pointing to the same data directories
693
986
 
694
- # Using Make target
695
- make run-data-collector
696
- ```
697
987
 
988
+ ## Documentation
698
989
 
990
+ For complete integration setup, deployment options, and configuration details, see [exporter repository](https://github.com/lightspeed-core/lightspeed-to-dataverse-exporter).
699
991
 
700
992
  # Project structure
701
993