diff --git a/Makefile b/Makefile index cf00dab..b1a1394 100644 --- a/Makefile +++ b/Makefile @@ -277,6 +277,7 @@ ENVTEST_VERSION ?= release-0.22 GOLANGCI_LINT_VERSION ?= v2.12.2 KUTTL_VERSION ?= 0.22.0 GOVULNCHECK_VERSION ?= v1.6.0 +GO_VERSION := $(shell go version | cut -d' ' -f3) .PHONY: kustomize kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. @@ -350,15 +351,15 @@ ocp-deploy-cleanup: openstack-lightspeed-undeploy ## Clean up everything created # $2 - package url which can be installed # $3 - specific version of package define go-install-tool -@[ -f "$(1)-$(3)" ] || { \ +@[ -f "$(1)-$(3)-$(GO_VERSION)" ] || { \ set -e; \ package=$(2)@$(3) ;\ echo "Downloading $${package}" ;\ -rm -f $(1) || true ;\ -GOBIN=$(LOCALBIN) go install $${package} ;\ -mv $(1) $(1)-$(3) ;\ +rm -f $(1) $(1)-$(3)-* || true ;\ +GOBIN=$(LOCALBIN) GOTOOLCHAIN=$(GO_VERSION) go install $${package} ;\ +mv $(1) $(1)-$(3)-$(GO_VERSION) ;\ } ;\ -ln -sf $(1)-$(3) $(1) +ln -sf $(1)-$(3)-$(GO_VERSION) $(1) endef .PHONY: operator-sdk diff --git a/api/v1beta1/openstacklightspeed_types.go b/api/v1beta1/openstacklightspeed_types.go index 3fbc9c4..e37e6ea 100644 --- a/api/v1beta1/openstacklightspeed_types.go +++ b/api/v1beta1/openstacklightspeed_types.go @@ -30,7 +30,7 @@ const ( OpenStackLightspeedContainerImage = "quay.io/openstack-lightspeed/rag-content:os-docs-2026.1-ogx" // LCoreContainerImage is the fall-back container image for LCore - LCoreContainerImage = "quay.io/lightspeed-core/lightspeed-stack:latest" + LCoreContainerImage = "quay.io/lightspeed-core/lightspeed-stack:dev-latest" // ExporterContainerImage is the fall-back container image for the Dataverse Exporter ExporterContainerImage = "quay.io/lightspeed-core/lightspeed-to-dataverse-exporter:latest" diff --git a/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml b/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml index da65504..0e2ad32 100644 --- a/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml +++ b/bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml @@ -343,7 +343,7 @@ spec: - name: RELATED_IMAGE_OPENSTACK_LIGHTSPEED_IMAGE_URL_DEFAULT value: quay.io/openstack-lightspeed/rag-content:os-docs-2026.1-ogx - name: RELATED_IMAGE_LCORE_IMAGE_URL_DEFAULT - value: quay.io/lightspeed-core/lightspeed-stack:latest + value: quay.io/lightspeed-core/lightspeed-stack:dev-latest - name: RELATED_IMAGE_EXPORTER_IMAGE_URL_DEFAULT value: quay.io/lightspeed-core/lightspeed-to-dataverse-exporter:latest - name: RELATED_IMAGE_POSTGRES_IMAGE_URL_DEFAULT @@ -516,7 +516,7 @@ spec: relatedImages: - image: quay.io/openstack-lightspeed/rag-content:os-docs-2026.1-ogx name: openstack-lightspeed-image-url-default - - image: quay.io/lightspeed-core/lightspeed-stack:latest + - image: quay.io/lightspeed-core/lightspeed-stack:dev-latest name: lcore-image-url-default - image: quay.io/lightspeed-core/lightspeed-to-dataverse-exporter:latest name: exporter-image-url-default diff --git a/config/manager/manager.yaml b/config/manager/manager.yaml index a750f42..46a2d2b 100644 --- a/config/manager/manager.yaml +++ b/config/manager/manager.yaml @@ -76,7 +76,7 @@ spec: - name: RELATED_IMAGE_OPENSTACK_LIGHTSPEED_IMAGE_URL_DEFAULT value: quay.io/openstack-lightspeed/rag-content:os-docs-2026.1-ogx - name: RELATED_IMAGE_LCORE_IMAGE_URL_DEFAULT - value: quay.io/lightspeed-core/lightspeed-stack:latest + value: quay.io/lightspeed-core/lightspeed-stack:dev-latest - name: RELATED_IMAGE_EXPORTER_IMAGE_URL_DEFAULT value: quay.io/lightspeed-core/lightspeed-to-dataverse-exporter:latest - name: RELATED_IMAGE_POSTGRES_IMAGE_URL_DEFAULT diff --git a/hack/env.sh b/hack/env.sh index 007a16b..61f5646 100644 --- a/hack/env.sh +++ b/hack/env.sh @@ -1,5 +1,5 @@ #!/bin/bash -export RELATED_IMAGE_LCORE_IMAGE_URL_DEFAULT="quay.io/lightspeed-core/lightspeed-stack:latest" +export RELATED_IMAGE_LCORE_IMAGE_URL_DEFAULT="quay.io/lightspeed-core/lightspeed-stack:dev-latest" export RELATED_IMAGE_EXPORTER_IMAGE_URL_DEFAULT="quay.io/lightspeed-core/lightspeed-to-dataverse-exporter:latest" export RELATED_IMAGE_POSTGRES_IMAGE_URL_DEFAULT="registry.redhat.io/rhel9/postgresql-16:latest" # TODO(lpiwowar): Replace this with a stable (non-alpha) image version once diff --git a/internal/controller/assets/llama_startup_wrapper.py b/internal/controller/assets/llama_startup_wrapper.py deleted file mode 100644 index 8db962d..0000000 --- a/internal/controller/assets/llama_startup_wrapper.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 -# Workaround for asyncpg event loop bug (llama-stack #5978). -# Monkey-patches StackApp to reset SQL engines after temp event loop init. -# Remove when the container image includes the upstream fix (PR #5837). - -import gc -import sys - -import llama_stack.core.server.server as server_mod -from llama_stack.core.storage.sqlstore.sqlalchemy_sqlstore import SqlAlchemySqlStoreImpl -from sqlalchemy.ext.asyncio import async_sessionmaker - -_orig_init = server_mod.StackApp.__init__ - - -class SessionMaker: - """Recreates the SQLAlchemy engine and session on the current event loop.""" - - def __init__(self, store): - self._store = store - self._maker = None - - def __call__(self): - if self._maker is None: - self._store._engine = self._store.create_engine() - self._maker = async_sessionmaker(self._store._engine) - self._store.async_session = self._maker - return self._maker() - - -def _patched_init(self, config, *args, **kwargs): - _orig_init(self, config, *args, **kwargs) - for obj in gc.get_objects(): - if isinstance(obj, SqlAlchemySqlStoreImpl): - obj._engine = None - obj.async_session = SessionMaker(obj) - - -server_mod.StackApp.__init__ = _patched_init - -from llama_stack.cli.llama import main # noqa: E402 - -sys.argv[0] = "llama" -main() diff --git a/internal/controller/assets/postgres_bootstrap.sh b/internal/controller/assets/postgres_bootstrap.sh index 4d54773..d0be2f8 100644 --- a/internal/controller/assets/postgres_bootstrap.sh +++ b/internal/controller/assets/postgres_bootstrap.sh @@ -1,10 +1,10 @@ #!/bin/bash -# This script prepares databases for lightspeed-stack and llama-stack (OGX) with +# This script prepares databases for lightspeed-stack and OGX (old llama-stack) with # postgres_bootstrap.sql. # # Note: # - lightspeed-stack database: Auto-created by container image via POSTGRESQL_DATABASE. -# - llama-stack database: Explicitly created by this script via POSTGRESQL_LLAMA_STACK_DATABASE. +# - ogx database: Explicitly created by this script via POSTGRESQL_LLAMA_STACK_DATABASE. # - POSTGRESQL_ADMIN_PASSWORD is intentionally not set. The postgres superuser has no password # by default, which restricts it to local connections only — a deliberate security improvement. # Setting POSTGRESQL_ADMIN_PASSWORD would enable remote login for the postgres account. diff --git a/internal/controller/assets/vector_database_build.py b/internal/controller/assets/vector_database_build.py index d319a8c..113570b 100644 --- a/internal/controller/assets/vector_database_build.py +++ b/internal/controller/assets/vector_database_build.py @@ -185,7 +185,13 @@ def ogx_process(ogx_config_source_path: Path, ogx_config_target: dict[str, Any]) add_unique(tgt_models, src_model, "model_id") # Populate registered_resources.vector_stores - embedding_model = f"{src_model['provider_id']}/{embedding_model_dir}" + # OGX 1.0.2+ uses provider_id/model_id as the model identifier + model_id = src_model["model_id"] + provider_id = src_model["provider_id"] + if model_id.startswith(f"{provider_id}/"): + embedding_model = model_id + else: + embedding_model = f"{provider_id}/{model_id}" src_vstore = ogx_config_source["registered_resources"]["vector_stores"][0].copy() src_vstore["embedding_model"] = embedding_model tgt_vstores = ogx_config_target["registered_resources"]["vector_stores"] diff --git a/internal/controller/constants.go b/internal/controller/constants.go index 1bdce76..1b5d564 100644 --- a/internal/controller/constants.go +++ b/internal/controller/constants.go @@ -62,7 +62,7 @@ const ( PostgresNetworkPolicyName = "lightspeed-postgres-server" PostgresServicePort = int32(5432) PostgresLightspeedStackDbName = "lightspeed-stack" - PostgresLlamaStackDbName = "llamastack" + PostgresLlamaStackDbName = "ogx" PostgresSharedBuffers = "256MB" PostgresMaxConnections = 100 OpenStackLightspeedComponentPasswordFileName = "password" @@ -81,8 +81,8 @@ const ( PostgresVarRunVolumeMountPath = "/var/run/postgresql" // PostgresSQLUsername is non-admin user that should be used by lightspeed-stack and - // llama-stack (OGX) to access the PostgreSQL database. This user gets created by the - // PostgreSQL container by setting the POSTGRESQL_USER and POSTGRESQL_PASSWORD environment + // (OGX) to access the PostgreSQL database. This user gets created by the PostgreSQL + // container by setting the POSTGRESQL_USER and POSTGRESQL_PASSWORD environment // variable. PostgresSQLUsername = "lightspeed-app-user" @@ -113,7 +113,7 @@ const ( // -- LCore specific --------------------------------------------------------- LlamaStackContainerPort = int32(8321) - LlamaStackConfigCmName = "llama-stack-config" + LlamaStackConfigCmName = "ogx-config" LCoreConfigCmName = "lightspeed-stack-config" LCoreDeploymentName = "lightspeed-stack-deployment" LCoreConfigMountPath = "/app-root/lightspeed-stack.yaml" @@ -122,7 +122,7 @@ const ( // --------------------------------------------------------------------------- - // -- Health probe settings for the llama-stack/OGX container. --------------- + // -- Health probe settings for the stack/OGX container. --------------------- // The startup probe allows up to 30 failures (300s) for the slow initialization, // while liveness and readiness probes use a tighter threshold of 3 failures. @@ -314,10 +314,6 @@ const ( // script is stored in the ConfigMap containing vector database init scripts. VectorDBBuildScriptKey = "vector_database_build.py" - // LlamaStartupWrapperKey is the ConfigMap key for the startup wrapper script - // that monkey-patches the asyncpg event loop bug fix. Remove with PR #5837 backport. - LlamaStartupWrapperKey = "llama_startup_wrapper.py" // #nosec G101 -- ConfigMap key, not a credential - // -- Resource Version Annotation -------------------------------------------- // These constants define annotation keys used to track the resource versions of specific ConfigMaps. @@ -449,13 +445,6 @@ var vectorDatabaseCollectScript string //go:embed assets/vector_database_build.py var vectorDatabaseBuildScript string -// llamaStartupWrapperScript is a Python monkey-patch that fixes the asyncpg -// event loop bug (ogx-ai/ogx#5978) by resetting SQL engines after StackApp -// initialization. Remove when the container image includes upstream PR #5837. -// -//go:embed assets/llama_startup_wrapper.py -var llamaStartupWrapperScript string - //go:embed assets/console_nginx.conf.tmpl var consoleNginxConfigTemplate string diff --git a/internal/controller/lcore_config.go b/internal/controller/lcore_config.go index 951c923..c454ddb 100644 --- a/internal/controller/lcore_config.go +++ b/internal/controller/lcore_config.go @@ -273,8 +273,9 @@ func buildLCoreConfigYAML(ctx context.Context, h *common_helper.Helper, instance // Build the complete config as a map config := map[string]interface{}{ - "name": "Lightspeed Core Service (LCS)", - "service": buildLCoreServiceConfig(h, instance), + "name": "Lightspeed Core Service (LCS)", + "service": buildLCoreServiceConfig(h, instance), + // This has not been renamed in the LCORE config to "ogx" "llama_stack": buildLCoreLlamaStackConfig(), "user_data_collection": buildLCoreUserDataCollectionConfig(h, instance), "authentication": buildLCoreAuthenticationConfig(h, instance), diff --git a/internal/controller/lcore_deployment.go b/internal/controller/lcore_deployment.go index 365bace..06e5fd8 100644 --- a/internal/controller/lcore_deployment.go +++ b/internal/controller/lcore_deployment.go @@ -55,7 +55,7 @@ func buildLCorePodTemplateSpec(ctx context.Context, h *common_helper.Helper, ins // Build env vars llamaEnvVars, err := buildLlamaStackEnvVars(ctx, h, instance) if err != nil { - return corev1.PodTemplateSpec{}, fmt.Errorf("failed to build llama-stack env vars: %w", err) + return corev1.PodTemplateSpec{}, fmt.Errorf("failed to build ogx env vars: %w", err) } lsEnvVars := buildLightspeedStackEnvVars(instance) @@ -63,17 +63,12 @@ func buildLCorePodTemplateSpec(ctx context.Context, h *common_helper.Helper, ins llamaStackMounts := []corev1.VolumeMount{} llamaStackMounts = append(llamaStackMounts, sharedMounts...) llamaStackMounts = append(llamaStackMounts, llamaCacheMounts...) - llamaStackMounts = append(llamaStackMounts, corev1.VolumeMount{ - Name: VectorDBScriptsVolumeName, - MountPath: VectorDBScriptsMountPath, - ReadOnly: true, - }) llamaStackContainer := corev1.Container{ - Name: "llama-stack", + Name: "ogx", Image: apiv1beta1.OpenStackLightspeedDefaultValues.LCoreImageURL, - Command: []string{"python3", VectorDBScriptsMountPath + "/" + LlamaStartupWrapperKey, "stack", "run", VectorDBVolumeOGXConfigPath}, - Ports: []corev1.ContainerPort{{Name: "llama-stack", ContainerPort: LlamaStackContainerPort}}, + Command: []string{"ogx", "run", VectorDBVolumeOGXConfigPath}, + Ports: []corev1.ContainerPort{{Name: "ogx", ContainerPort: LlamaStackContainerPort}}, VolumeMounts: llamaStackMounts, Env: llamaEnvVars, StartupProbe: &corev1.Probe{ @@ -413,17 +408,17 @@ func addTLSVolumesAndMounts(volumes *[]corev1.Volume, mounts *[]corev1.VolumeMou }) } -// addLlamaCacheVolumesAndMounts adds an emptydir volume for llama-stack cache. +// addLlamaCacheVolumesAndMounts adds an emptydir volume for ogx cache. func addLlamaCacheVolumesAndMounts(volumes *[]corev1.Volume, mounts *[]corev1.VolumeMount) { *volumes = append(*volumes, corev1.Volume{ - Name: "llama-cache", + Name: "ogx-cache", VolumeSource: corev1.VolumeSource{ EmptyDir: &corev1.EmptyDirVolumeSource{}, }, }) *mounts = append(*mounts, corev1.VolumeMount{ - Name: "llama-cache", - MountPath: "/tmp/llama-stack", + Name: "ogx-cache", + MountPath: "/tmp/ogx", }) } @@ -526,7 +521,7 @@ func addCABundleVolumesAndMounts(volumes *[]corev1.Volume, mounts *[]corev1.Volu }) } -// buildLlamaStackEnvVars builds environment variables for llama-stack, +// buildLlamaStackEnvVars builds environment variables for ogx // primarily provider API keys read from Kubernetes secrets. func buildLlamaStackEnvVars(ctx context.Context, h *common_helper.Helper, instance *apiv1beta1.OpenStackLightspeed) ([]corev1.EnvVar, error) { envVars := []corev1.EnvVar{} @@ -628,7 +623,7 @@ func buildLlamaStackEnvVars(ctx context.Context, h *common_helper.Helper, instan } // Postgres credentials for ${env.POSTGRESQL_PASSWORD} and ${env.POSTGRESQL_USER} - // substitution in llama-stack config + // substitution in ogx config envVars = append(envVars, buildPostgresCredsEnvVars()...) // PostgreSQL SSL configuration for OGX (llama-stack). @@ -644,12 +639,8 @@ func buildLlamaStackEnvVars(ctx context.Context, h *common_helper.Helper, instan Value: CABundleMountPath, }) - // Logging configuration - set both for compatibility with llama-stack and OGX + // Logging configuration - only for OGX, incompatible with llama-stack ogxLogLevel := getOGXLogLevel(instance) - envVars = append(envVars, corev1.EnvVar{ - Name: "LLAMA_STACK_LOGGING", - Value: ogxLogLevel, - }) envVars = append(envVars, corev1.EnvVar{ Name: "OGX_LOGGING", Value: ogxLogLevel, @@ -709,6 +700,10 @@ func buildLightspeedStackEnvVars(instance *apiv1beta1.OpenStackLightspeed) []cor Name: "RH_SERVER_OKP", Value: fmt.Sprintf("http://%s.%s.svc:%d", OKPServiceName, instance.GetNamespace(), OKPServicePort), }) + envVars = append(envVars, corev1.EnvVar{ + Name: "OTEL_SDK_DISABLED", + Value: "true", + }) envVars = append(envVars, buildPostgresCredsEnvVars()...) return envVars } @@ -761,7 +756,7 @@ func buildLightspeedStackReadinessProbe() *corev1.Probe { } } -// getOGXLogLevel returns the log level for OGX/llama-stack container. +// getOGXLogLevel returns the log level for OGX container. // Supports either standard levels (INFO, DEBUG, WARNING, ERROR, CRITICAL) or fine-grained control. // Examples: "INFO" -> "all=info", "DEBUG" -> "all=debug", "core=debug,providers=info" -> "core=debug,providers=info" // Defaults to "all=info" if not specified. diff --git a/internal/controller/lcore_reconciler.go b/internal/controller/lcore_reconciler.go index ecc25a8..d872b8a 100644 --- a/internal/controller/lcore_reconciler.go +++ b/internal/controller/lcore_reconciler.go @@ -297,7 +297,6 @@ func reconcileVectorDBScriptsConfigMap(ctx context.Context, h *common_helper.Hel cm.Data = map[string]string{ VectorDBCollectScriptKey: vectorDatabaseCollectScript, VectorDBBuildScriptKey: vectorDatabaseBuildScript, - LlamaStartupWrapperKey: llamaStartupWrapperScript, } return controllerutil.SetControllerReference(h.GetBeforeObject(), cm, h.GetScheme()) diff --git a/internal/controller/llama_stack_config.go b/internal/controller/llama_stack_config.go index e5339c3..4f09f27 100644 --- a/internal/controller/llama_stack_config.go +++ b/internal/controller/llama_stack_config.go @@ -30,17 +30,16 @@ func buildLlamaStackCoreConfig(_ *common_helper.Helper, _ *apiv1beta1.OpenStackL return map[string]interface{}{ "version": "2", - // image_name is a semantic identifier for the llama-stack configuration - // Note: Does NOT affect PostgreSQL database name (llama-stack uses hardcoded "llamastack") + // image_name is a semantic identifier for the ogx configuration + // Note: Does NOT affect PostgreSQL database name (ogx uses hardcoded value) "image_name": "openstack-lightspeed-configuration", - // Minimal APIs for RAG + MCP: agents (for MCP), files, inference, safety (required by agents), + // Minimal APIs for RAG + MCP: responeses (for MCP), files, inference, // telemetry, tool_runtime, vector_io. "apis": []string{ - "agents", "files", "inference", - "safety", + "responses", "tool_runtime", "vector_io", }, @@ -54,7 +53,7 @@ func buildLlamaStackCoreConfig(_ *common_helper.Helper, _ *apiv1beta1.OpenStackL }, "logging": nil, "metadata_store": map[string]interface{}{ - "db_path": "/tmp/llama-stack/registry.db", + "db_path": "/tmp/ogx/registry.db", "namespace": nil, "type": "sqlite", }, @@ -67,7 +66,7 @@ func buildLlamaStackFileProviders(_ *common_helper.Helper, _ *apiv1beta1.OpenSta "provider_id": "localfs", "provider_type": "inline::localfs", "config": map[string]interface{}{ - "storage_dir": "/tmp/llama-stack-files", + "storage_dir": "/tmp/ogx-files", "metadata_store": map[string]interface{}{ "backend": "sql_default", "namespace": "files_metadata", @@ -78,11 +77,11 @@ func buildLlamaStackFileProviders(_ *common_helper.Helper, _ *apiv1beta1.OpenSta } } -func buildLlamaStackAgentProviders(_ *common_helper.Helper, _ *apiv1beta1.OpenStackLightspeed) []interface{} { +func buildLlamaStackResponsesProviders(_ *common_helper.Helper, _ *apiv1beta1.OpenStackLightspeed) []interface{} { return []interface{}{ map[string]interface{}{ - "provider_id": "meta-reference", - "provider_type": "inline::meta-reference", + "provider_id": "builtin", + "provider_type": "inline::builtin", "config": map[string]interface{}{ "persistence": map[string]interface{}{ "agent_state": map[string]interface{}{ @@ -207,19 +206,6 @@ func buildLlamaStackInferenceProviders(_ context.Context, _ *common_helper.Helpe return providers, nil } -// Safety API - Required by agents provider (for MCP) -func buildLlamaStackSafety(_ *common_helper.Helper, _ *apiv1beta1.OpenStackLightspeed) []interface{} { - return []interface{}{ - map[string]interface{}{ - "provider_id": "llama-guard", - "provider_type": "inline::llama-guard", - "config": map[string]interface{}{ - "excluded_categories": []interface{}{}, - }, - }, - } -} - func buildLlamaStackToolRuntime(_ *common_helper.Helper, _ *apiv1beta1.OpenStackLightspeed) []interface{} { return []interface{}{ map[string]interface{}{ @@ -228,8 +214,8 @@ func buildLlamaStackToolRuntime(_ *common_helper.Helper, _ *apiv1beta1.OpenStack "config": map[string]interface{}{}, }, map[string]interface{}{ - "provider_id": "rag-runtime", - "provider_type": "inline::rag-runtime", + "provider_id": "file-search", + "provider_type": "inline::file-search", "config": map[string]interface{}{}, }, } @@ -272,7 +258,7 @@ func buildOKPVectorIOProvider(chunkFilterQuery string) map[string]interface{} { "content_field": "${env.SOLR_CONTENT_FIELD:=chunk}", "vector_field": "${env.SOLR_VECTOR_FIELD:=chunk_vector}", "embedding_dimension": "${env.SOLR_EMBEDDING_DIM:=384}", - "embedding_model": "sentence-transformers/" + OKPEmbeddingModelMountPath, + "embedding_model": "sentence-transformers/solr_embedding", "persistence": map[string]interface{}{ "backend": "kv_default", "namespace": "portal-rag", @@ -311,11 +297,11 @@ func buildLlamaStackStorage(_ *common_helper.Helper, instance *apiv1beta1.OpenSt backends := map[string]interface{}{ "sql_default": map[string]interface{}{ "type": "sql_sqlite", - "db_path": "/tmp/llama-stack/sql_store.db", + "db_path": "/tmp/ogx/sql_store.db", }, "kv_default": map[string]interface{}{ "type": "kv_sqlite", - "db_path": "/tmp/llama-stack/kv_store.db", + "db_path": "/tmp/ogx/kv_store.db", }, "postgres_backend": map[string]interface{}{ "type": "sql_postgres", @@ -338,7 +324,7 @@ func buildLlamaStackStorage(_ *common_helper.Helper, instance *apiv1beta1.OpenSt "backend": "sql_default", }, "conversations": map[string]interface{}{ - "table_name": "openai_conversations", // Required by config schema but ignored - llama-stack uses hardcoded names + "table_name": "openai_conversations", // Required by config schema but ignored - ogx uses hardcoded names "backend": "postgres_backend", }, } @@ -394,7 +380,7 @@ func buildLlamaStackVectorStores(_ *common_helper.Helper, _ *apiv1beta1.OpenStac "vector_store_id": "portal-rag", "provider_id": "okp_solr", "embedding_dimension": 384, - "embedding_model": "sentence-transformers/" + OKPEmbeddingModelMountPath, + "embedding_model": "sentence-transformers/solr_embedding", }, } } @@ -402,8 +388,8 @@ func buildLlamaStackVectorStores(_ *common_helper.Helper, _ *apiv1beta1.OpenStac func buildLlamaStackToolGroups(_ *common_helper.Helper, _ *apiv1beta1.OpenStackLightspeed) []interface{} { return []interface{}{ map[string]interface{}{ - "toolgroup_id": "builtin::rag", - "provider_id": "rag-runtime", + "toolgroup_id": "builtin::file_search", + "provider_id": "file-search", }, } } @@ -425,9 +411,8 @@ func buildLlamaStackYAML(ctx context.Context, h *common_helper.Helper, instance // Build providers map - only include providers for enabled APIs config["providers"] = map[string]interface{}{ "files": buildLlamaStackFileProviders(h, instance), - "agents": buildLlamaStackAgentProviders(h, instance), + "responses": buildLlamaStackResponsesProviders(h, instance), "inference": inferenceProviders, - "safety": buildLlamaStackSafety(h, instance), "tool_runtime": buildLlamaStackToolRuntime(h, instance), "vector_io": buildLlamaStackVectorIO(h, instance, okpChunkFilterQuery), } diff --git a/test/kuttl/common/expected-configs/ogx_config-update.yaml b/test/kuttl/common/expected-configs/ogx_config-update.yaml index 3df891a..576bb2f 100644 --- a/test/kuttl/common/expected-configs/ogx_config-update.yaml +++ b/test/kuttl/common/expected-configs/ogx_config-update.yaml @@ -1,8 +1,7 @@ apis: -- agents - files - inference -- safety +- responses - tool_runtime - vector_io benchmarks: [] @@ -15,30 +14,17 @@ inference_store: type: sqlite logging: null metadata_store: - db_path: /tmp/llama-stack/registry.db + db_path: /tmp/ogx/registry.db namespace: null type: sqlite providers: - agents: - - config: - persistence: - agent_state: - backend: kv_default - namespace: agent_state - table_name: agent_state - responses: - backend: sql_default - namespace: agent_responses - table_name: agent_responses - provider_id: meta-reference - provider_type: inline::meta-reference files: - config: metadata_store: backend: sql_default namespace: files_metadata table_name: files_metadata - storage_dir: /tmp/llama-stack-files + storage_dir: /tmp/ogx-files provider_id: localfs provider_type: inline::localfs inference: @@ -50,18 +36,26 @@ providers: base_url: http://mock-llm-api-server-pod-UPDATE:8000/v1 provider_id: openstack-lightspeed-provider provider_type: remote::vllm - safety: + responses: - config: - excluded_categories: [] - provider_id: llama-guard - provider_type: inline::llama-guard + persistence: + agent_state: + backend: kv_default + namespace: agent_state + table_name: agent_state + responses: + backend: sql_default + namespace: agent_responses + table_name: agent_responses + provider_id: builtin + provider_type: inline::builtin tool_runtime: - config: {} provider_id: model-context-protocol provider_type: remote::model-context-protocol - config: {} - provider_id: rag-runtime - provider_type: inline::rag-runtime + provider_id: file-search + provider_type: inline::file-search vector_io: - config: kvstore: @@ -88,7 +82,7 @@ providers: collection_name: ${env.SOLR_COLLECTION:=portal-rag} content_field: ${env.SOLR_CONTENT_FIELD:=chunk} embedding_dimension: ${env.SOLR_EMBEDDING_DIM:=384} - embedding_model: sentence-transformers//vector-db-discovered-values/okp_embeddings_model + embedding_model: sentence-transformers/solr_embedding persistence: backend: kv_default namespace: portal-rag @@ -123,15 +117,15 @@ registered_resources: provider_model_id: ${env.VECTOR_DB_DATA_PATH}/UUID/embeddings_model model_type: embedding tool_groups: - - provider_id: rag-runtime - toolgroup_id: builtin::rag + - provider_id: file-search + toolgroup_id: builtin::file_search vector_stores: - embedding_dimension: 384 - embedding_model: sentence-transformers//vector-db-discovered-values/okp_embeddings_model + embedding_model: sentence-transformers/solr_embedding provider_id: okp_solr vector_store_id: portal-rag - embedding_dimension: 768 - embedding_model: sentence-transformers/${env.VECTOR_DB_DATA_PATH}/UUID/embeddings_model + embedding_model: sentence-transformers/all-mpnet-base-v2 provider_id: os-docs-2026.1-ogx vector_store_id: vs_UUID scoring_fns: [] @@ -146,17 +140,17 @@ server: storage: backends: kv_default: - db_path: /tmp/llama-stack/kv_store.db + db_path: /tmp/ogx/kv_store.db type: kv_sqlite postgres_backend: - db: llamastack + db: ogx host: lightspeed-postgres-server.openstack-lightspeed.svc password: ${env.POSTGRESQL_PASSWORD} port: 5432 type: sql_postgres user: ${env.POSTGRESQL_USER} sql_default: - db_path: /tmp/llama-stack/sql_store.db + db_path: /tmp/ogx/sql_store.db type: sql_sqlite kv_rag_UUID_os_product_docs: type: kv_sqlite diff --git a/test/kuttl/common/expected-configs/ogx_config.yaml b/test/kuttl/common/expected-configs/ogx_config.yaml index e5dac1a..e8eb099 100644 --- a/test/kuttl/common/expected-configs/ogx_config.yaml +++ b/test/kuttl/common/expected-configs/ogx_config.yaml @@ -1,8 +1,7 @@ apis: -- agents - files - inference -- safety +- responses - tool_runtime - vector_io benchmarks: [] @@ -15,30 +14,17 @@ inference_store: type: sqlite logging: null metadata_store: - db_path: /tmp/llama-stack/registry.db + db_path: /tmp/ogx/registry.db namespace: null type: sqlite providers: - agents: - - config: - persistence: - agent_state: - backend: kv_default - namespace: agent_state - table_name: agent_state - responses: - backend: sql_default - namespace: agent_responses - table_name: agent_responses - provider_id: meta-reference - provider_type: inline::meta-reference files: - config: metadata_store: backend: sql_default namespace: files_metadata table_name: files_metadata - storage_dir: /tmp/llama-stack-files + storage_dir: /tmp/ogx-files provider_id: localfs provider_type: inline::localfs inference: @@ -50,18 +36,26 @@ providers: base_url: http://mock-llm-api-server-pod:8000/v1 provider_id: openstack-lightspeed-provider provider_type: remote::openai - safety: + responses: - config: - excluded_categories: [] - provider_id: llama-guard - provider_type: inline::llama-guard + persistence: + agent_state: + backend: kv_default + namespace: agent_state + table_name: agent_state + responses: + backend: sql_default + namespace: agent_responses + table_name: agent_responses + provider_id: builtin + provider_type: inline::builtin tool_runtime: - config: {} provider_id: model-context-protocol provider_type: remote::model-context-protocol - config: {} - provider_id: rag-runtime - provider_type: inline::rag-runtime + provider_id: file-search + provider_type: inline::file-search vector_io: - config: kvstore: @@ -88,7 +82,7 @@ providers: collection_name: ${env.SOLR_COLLECTION:=portal-rag} content_field: ${env.SOLR_CONTENT_FIELD:=chunk} embedding_dimension: ${env.SOLR_EMBEDDING_DIM:=384} - embedding_model: sentence-transformers//vector-db-discovered-values/okp_embeddings_model + embedding_model: sentence-transformers/solr_embedding persistence: backend: kv_default namespace: portal-rag @@ -123,15 +117,15 @@ registered_resources: provider_model_id: ${env.VECTOR_DB_DATA_PATH}/UUID/embeddings_model model_type: embedding tool_groups: - - provider_id: rag-runtime - toolgroup_id: builtin::rag + - provider_id: file-search + toolgroup_id: builtin::file_search vector_stores: - embedding_dimension: 384 - embedding_model: sentence-transformers//vector-db-discovered-values/okp_embeddings_model + embedding_model: sentence-transformers/solr_embedding provider_id: okp_solr vector_store_id: portal-rag - embedding_dimension: 768 - embedding_model: sentence-transformers/${env.VECTOR_DB_DATA_PATH}/UUID/embeddings_model + embedding_model: sentence-transformers/all-mpnet-base-v2 provider_id: os-docs-2026.1-ogx vector_store_id: vs_UUID scoring_fns: [] @@ -146,17 +140,17 @@ server: storage: backends: kv_default: - db_path: /tmp/llama-stack/kv_store.db + db_path: /tmp/ogx/kv_store.db type: kv_sqlite postgres_backend: - db: llamastack + db: ogx host: lightspeed-postgres-server.openstack-lightspeed.svc password: ${env.POSTGRESQL_PASSWORD} port: 5432 type: sql_postgres user: ${env.POSTGRESQL_USER} sql_default: - db_path: /tmp/llama-stack/sql_store.db + db_path: /tmp/ogx/sql_store.db type: sql_sqlite kv_rag_UUID_os_product_docs: type: kv_sqlite diff --git a/test/kuttl/common/expected-configs/validate-config.sh b/test/kuttl/common/expected-configs/validate-config.sh index b0d9fdd..058ccb8 100755 --- a/test/kuttl/common/expected-configs/validate-config.sh +++ b/test/kuttl/common/expected-configs/validate-config.sh @@ -26,7 +26,7 @@ case "$CONFIG_TYPE" in POD_PATH="/vector-db-discovered-values/lightspeed-stack.yaml" ;; ogx_config) - CONTAINER="llama-stack" + CONTAINER="ogx" POD_PATH="/vector-db-discovered-values/ogx_config.yaml" ;; *) diff --git a/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml b/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml index 2a9da3b..b153aea 100644 --- a/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml +++ b/test/kuttl/common/openstack-lightspeed-instance/assert-openstack-lightspeed-instance.yaml @@ -179,7 +179,7 @@ subjects: apiVersion: v1 kind: ConfigMap metadata: - name: llama-stack-config + name: ogx-config namespace: openstack-lightspeed --- apiVersion: v1 @@ -218,7 +218,7 @@ spec: - name: vector-database-collect - name: vector-database-config-build containers: - - name: llama-stack + - name: ogx resources: requests: cpu: 500m @@ -246,8 +246,6 @@ spec: value: verify-full - name: PGSSLROOTCERT value: /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem - - name: LLAMA_STACK_LOGGING - value: all=debug - name: OGX_LOGGING value: all=debug - name: VECTOR_DB_DATA_PATH @@ -261,11 +259,8 @@ spec: readOnly: true - name: vector-db-discovered-values mountPath: /vector-db-discovered-values - - name: llama-cache - mountPath: /tmp/llama-stack - - name: vector-db-scripts - mountPath: /scripts - readOnly: true + - name: ogx-cache + mountPath: /tmp/ogx - name: lightspeed-service-api resources: requests: @@ -279,6 +274,8 @@ spec: value: WARNING - name: RH_SERVER_OKP value: http://lightspeed-okp-server.openstack-lightspeed.svc:8080 + - name: OTEL_SDK_DISABLED + value: "true" - name: POSTGRESQL_PASSWORD valueFrom: secretKeyRef: @@ -324,7 +321,7 @@ spec: volumes: - name: ogx-config configMap: - name: llama-stack-config + name: ogx-config - name: lightspeed-stack-config configMap: name: lightspeed-stack-config @@ -336,7 +333,7 @@ spec: name: openstack-lightspeed-ca-bundle - name: vector-db-discovered-values emptyDir: {} - - name: llama-cache + - name: ogx-cache emptyDir: {} - name: ols-user-data emptyDir: {} diff --git a/test/kuttl/common/openstack-lightspeed-instance/errors-openstack-lightspeed-instance.yaml b/test/kuttl/common/openstack-lightspeed-instance/errors-openstack-lightspeed-instance.yaml index 723d9ca..29ed954 100644 --- a/test/kuttl/common/openstack-lightspeed-instance/errors-openstack-lightspeed-instance.yaml +++ b/test/kuttl/common/openstack-lightspeed-instance/errors-openstack-lightspeed-instance.yaml @@ -33,7 +33,7 @@ metadata: apiVersion: v1 kind: ConfigMap metadata: - name: llama-stack-config + name: ogx-config namespace: openstack-lightspeed --- apiVersion: v1 diff --git a/test/kuttl/tests/rhoso-mcps-configuration/03-assert-rhoso-mcps-instance.yaml b/test/kuttl/tests/rhoso-mcps-configuration/03-assert-rhoso-mcps-instance.yaml index c6e0ab6..6df2e37 100644 --- a/test/kuttl/tests/rhoso-mcps-configuration/03-assert-rhoso-mcps-instance.yaml +++ b/test/kuttl/tests/rhoso-mcps-configuration/03-assert-rhoso-mcps-instance.yaml @@ -13,7 +13,7 @@ spec: template: spec: containers: - - name: llama-stack + - name: ogx - name: lightspeed-service-api - name: lightspeed-to-dataverse-exporter - name: rhoso-mcps diff --git a/test/kuttl/tests/update-openstacklightspeed/08-assert-openstacklightspeed-update.yaml b/test/kuttl/tests/update-openstacklightspeed/08-assert-openstacklightspeed-update.yaml index 265ac9c..cd4abb2 100644 --- a/test/kuttl/tests/update-openstacklightspeed/08-assert-openstacklightspeed-update.yaml +++ b/test/kuttl/tests/update-openstacklightspeed/08-assert-openstacklightspeed-update.yaml @@ -83,7 +83,7 @@ metadata: apiVersion: v1 kind: ConfigMap metadata: - name: llama-stack-config + name: ogx-config namespace: openstack-lightspeed --- apiVersion: v1 @@ -111,7 +111,7 @@ spec: - name: vector-database-collect - name: vector-database-config-build containers: - - name: llama-stack + - name: ogx resources: requests: cpu: 500m @@ -141,8 +141,6 @@ spec: value: verify-full - name: PGSSLROOTCERT value: /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem - - name: LLAMA_STACK_LOGGING - value: core=debug,providers=info - name: OGX_LOGGING value: core=debug,providers=info - name: VECTOR_DB_DATA_PATH @@ -156,11 +154,8 @@ spec: readOnly: true - name: vector-db-discovered-values mountPath: /vector-db-discovered-values - - name: llama-cache - mountPath: /tmp/llama-stack - - name: vector-db-scripts - mountPath: /scripts - readOnly: true + - name: ogx-cache + mountPath: /tmp/ogx - name: lightspeed-service-api resources: requests: @@ -174,6 +169,8 @@ spec: value: ERROR - name: RH_SERVER_OKP value: http://lightspeed-okp-server.openstack-lightspeed.svc:8080 + - name: OTEL_SDK_DISABLED + value: "true" - name: POSTGRESQL_PASSWORD valueFrom: secretKeyRef: @@ -197,7 +194,7 @@ spec: volumes: - name: ogx-config configMap: - name: llama-stack-config + name: ogx-config - name: lightspeed-stack-config configMap: name: lightspeed-stack-config @@ -209,7 +206,7 @@ spec: name: openstack-lightspeed-ca-bundle - name: vector-db-discovered-values emptyDir: {} - - name: llama-cache + - name: ogx-cache emptyDir: {} - name: tls-certs secret: diff --git a/test/kuttl/tests/update-openstacklightspeed/11-assert-configmaps-update.yaml b/test/kuttl/tests/update-openstacklightspeed/11-assert-configmaps-update.yaml index e028d6b..51e3326 100644 --- a/test/kuttl/tests/update-openstacklightspeed/11-assert-configmaps-update.yaml +++ b/test/kuttl/tests/update-openstacklightspeed/11-assert-configmaps-update.yaml @@ -7,7 +7,7 @@ apiVersion: v1 kind: ConfigMap metadata: - name: llama-stack-config + name: ogx-config namespace: openstack-lightspeed --- apiVersion: v1