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.
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/PKG-INFO +341 -49
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/README.md +333 -45
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/pyproject.toml +61 -6
- lightspeed_stack-0.2.0/src/app/database.py +125 -0
- lightspeed_stack-0.2.0/src/app/endpoints/.ruff_cache/0.9.1/9961612457335986079 +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/authorized.py +14 -5
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/config.py +10 -2
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/conversations.py +191 -48
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/feedback.py +53 -22
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/health.py +24 -10
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/info.py +11 -3
- lightspeed_stack-0.2.0/src/app/endpoints/metrics.py +30 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/models.py +19 -7
- lightspeed_stack-0.2.0/src/app/endpoints/query.py +581 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/streaming_query.py +302 -101
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/main.py +19 -7
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/interface.py +7 -1
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/metrics/__init__.py +2 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/metrics/utils.py +6 -6
- lightspeed_stack-0.2.0/src/models/.ruff_cache/0.9.1/2435063725374233068 +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/config.py +100 -38
- lightspeed_stack-0.2.0/src/models/database/__init__.py +1 -0
- lightspeed_stack-0.2.0/src/models/database/base.py +7 -0
- lightspeed_stack-0.2.0/src/models/database/conversations.py +36 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/requests.py +107 -14
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/responses.py +192 -12
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/common.py +20 -48
- lightspeed_stack-0.2.0/src/utils/endpoints.py +127 -0
- lightspeed_stack-0.2.0/src/utils/llama_stack_version.py +51 -0
- lightspeed_stack-0.2.0/src/utils/transcripts.py +86 -0
- lightspeed_stack-0.2.0/src/utils/types.py +78 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/lightspeed-stack.yaml +14 -0
- lightspeed_stack-0.2.0/tests/e2e/features/authorized.feature +34 -0
- lightspeed_stack-0.2.0/tests/e2e/features/conversations.feature +54 -0
- lightspeed_stack-0.2.0/tests/e2e/features/feedback.feature +90 -0
- lightspeed_stack-0.2.0/tests/e2e/features/health.feature +53 -0
- lightspeed_stack-0.2.0/tests/e2e/features/info.feature +46 -0
- lightspeed_stack-0.2.0/tests/e2e/features/query.feature +60 -0
- lightspeed_stack-0.2.0/tests/e2e/features/rest_api.feature +14 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/smoketests.feature +1 -1
- lightspeed_stack-0.2.0/tests/e2e/features/steps/auth.py +25 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/common.py +2 -2
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/common_http.py +4 -7
- lightspeed_stack-0.2.0/tests/e2e/features/steps/conversation.py +18 -0
- lightspeed_stack-0.2.0/tests/e2e/features/steps/feedback.py +38 -0
- lightspeed_stack-0.2.0/tests/e2e/features/steps/health.py +18 -0
- lightspeed_stack-0.2.0/tests/e2e/features/steps/info.py +22 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/llm_query_response.py +26 -4
- lightspeed_stack-0.2.0/tests/e2e/features/streaming_query.feature +39 -0
- lightspeed_stack-0.2.0/tests/e2e/test_list.txt +9 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/integration/test_configuration.py +7 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/test_results/.coverage.integration +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/test_results/.coverage.unit +0 -0
- lightspeed_stack-0.2.0/tests/test_results/coverage_integration.json +1 -0
- lightspeed_stack-0.2.0/tests/test_results/coverage_unit.json +1 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/test_results/junit_integration.xml +1 -1
- lightspeed_stack-0.2.0/tests/test_results/junit_unit.xml +1 -0
- lightspeed_stack-0.2.0/tests/unit/app/.ruff_cache/.gitignore +2 -0
- lightspeed_stack-0.2.0/tests/unit/app/.ruff_cache/0.9.1/10631576872848856737 +0 -0
- lightspeed_stack-0.2.0/tests/unit/app/.ruff_cache/CACHEDIR.TAG +1 -0
- lightspeed_stack-0.2.0/tests/unit/app/endpoints/.ruff_cache/.gitignore +2 -0
- 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
- lightspeed_stack-0.2.0/tests/unit/app/endpoints/.ruff_cache/CACHEDIR.TAG +1 -0
- lightspeed_stack-0.2.0/tests/unit/app/endpoints/test_authorized.py +61 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_config.py +11 -3
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_conversations.py +249 -144
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_feedback.py +37 -4
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_health.py +11 -11
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_info.py +7 -1
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_metrics.py +14 -2
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_models.py +26 -19
- lightspeed_stack-0.2.0/tests/unit/app/endpoints/test_query.py +1473 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_root.py +7 -1
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/test_streaming_query.py +293 -337
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/test_routers.py +22 -7
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_noop_with_token.py +9 -1
- lightspeed_stack-0.2.0/tests/unit/conftest.py +28 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/metrics/test_utis.py +8 -1
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/test_config.py +285 -61
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_client.py +7 -64
- lightspeed_stack-0.2.0/tests/unit/utils/.ruff_cache/.gitignore +2 -0
- lightspeed_stack-0.2.0/tests/unit/utils/.ruff_cache/0.9.1/8897072278360683352 +0 -0
- lightspeed_stack-0.2.0/tests/unit/utils/.ruff_cache/CACHEDIR.TAG +1 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_common.py +9 -17
- lightspeed_stack-0.2.0/tests/unit/utils/test_endpoints.py +593 -0
- lightspeed_stack-0.2.0/tests/unit/utils/test_llama_stack_version.py +101 -0
- lightspeed_stack-0.2.0/tests/unit/utils/test_transcripts.py +127 -0
- lightspeed_stack-0.1.2/src/app/endpoints/.ruff_cache/0.9.1/5703048272820174433 +0 -0
- lightspeed_stack-0.1.2/src/app/endpoints/.ruff_cache/0.9.1/9961612457335986079 +0 -0
- lightspeed_stack-0.1.2/src/app/endpoints/metrics.py +0 -16
- lightspeed_stack-0.1.2/src/app/endpoints/query.py +0 -442
- lightspeed_stack-0.1.2/src/runners/data_collector.py +0 -26
- lightspeed_stack-0.1.2/src/services/data_collector.py +0 -258
- lightspeed_stack-0.1.2/src/utils/.ruff_cache/0.9.1/18446581155718949728 +0 -0
- lightspeed_stack-0.1.2/src/utils/.ruff_cache/0.9.1/4991844299736624256 +0 -0
- lightspeed_stack-0.1.2/src/utils/endpoints.py +0 -50
- lightspeed_stack-0.1.2/src/utils/types.py +0 -37
- lightspeed_stack-0.1.2/tests/e2e/features/llm_interface.feature +0 -18
- lightspeed_stack-0.1.2/tests/e2e/features/rest_api.feature +0 -57
- lightspeed_stack-0.1.2/tests/e2e/test_list.txt +0 -3
- lightspeed_stack-0.1.2/tests/test_results/coverage_integration.json +0 -1
- lightspeed_stack-0.1.2/tests/test_results/coverage_unit.json +0 -1
- lightspeed_stack-0.1.2/tests/test_results/junit_unit.xml +0 -1
- lightspeed_stack-0.1.2/tests/unit/app/endpoints/test_authorized.py +0 -56
- lightspeed_stack-0.1.2/tests/unit/runners/test_data_collector_runner.py +0 -60
- lightspeed_stack-0.1.2/tests/unit/services/test_data_collector.py +0 -587
- lightspeed_stack-0.1.2/tests/unit/utils/test_endpoints.py +0 -145
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/LICENSE +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/.ruff_cache/.gitignore +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/.ruff_cache/CACHEDIR.TAG +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/endpoints/root.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/app/routers.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/jwk_token.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/k8s.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/noop.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/noop_with_token.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/auth/utils.py +0 -0
- {lightspeed_stack-0.1.2/src/utils → lightspeed_stack-0.2.0/src/models}/.ruff_cache/.gitignore +0 -0
- {lightspeed_stack-0.1.2/src/utils → lightspeed_stack-0.2.0/src/models}/.ruff_cache/CACHEDIR.TAG +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/models/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/runners/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/runners/uvicorn.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/services/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/checks.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/mcp_headers.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/src/utils/suid.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/minimal-stack.yaml +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/password +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/run.yaml +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/server.crt +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/configuration/server.key +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.pdm-python +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.ruff_cache/.gitignore +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.ruff_cache/0.9.1/6949908709306621198 +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/.ruff_cache/CACHEDIR.TAG +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/environment.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/features/steps/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/gen_scenario_list.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/test_api.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/e2e/utils/utils.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/integration/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/integration/test_version.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/app/endpoints/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_auth.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_jwk_token.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_k8s.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_noop.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/auth/test_utils.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/metrics/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/test_requests.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/models/test_responses.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/runners/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/runners/test_uvicorn_runner.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_configuration.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_lightspeed_stack.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/test_log.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/__init__.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_checks.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_mcp_headers.py +0 -0
- {lightspeed_stack-0.1.2 → lightspeed_stack-0.2.0}/tests/unit/utils/test_suid.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
222
|
-
Requires-Dist: llama-stack-client==0.2.
|
|
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
|
[](https://github.com/lightspeed-core/lightspeed-stack/blob/main/LICENSE)
|
|
237
241
|
[](https://www.python.org/)
|
|
238
242
|
[](https://www.python.org/)
|
|
239
|
-
[](https://github.com/lightspeed-core/lightspeed-stack/releases/tag/0.
|
|
243
|
+
[](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
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|

|
|
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 `
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
974
|
+
## Quick Integration
|
|
687
975
|
|
|
688
|
-
|
|
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
|
-
|
|
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
|
|