Skip to content

Commit f2d3abf

Browse files
committed
Generic Provider Config for LCore supported providers.
1 parent f08c12e commit f2d3abf

File tree

7 files changed

+931
-56
lines changed

7 files changed

+931
-56
lines changed

api/v1alpha1/olsconfig_types.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
corev1 "k8s.io/api/core/v1"
2222
resource "k8s.io/apimachinery/pkg/api/resource"
2323
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
runtime "k8s.io/apimachinery/pkg/runtime"
2425
)
2526

2627
// OLSConfigSpec defines the desired state of OLSConfig
@@ -436,6 +437,11 @@ type ModelSpec struct {
436437
// ProviderSpec defines the desired state of LLM provider.
437438
// +kubebuilder:validation:XValidation:message="'deploymentName' must be specified for 'azure_openai' provider",rule="self.type != \"azure_openai\" || self.deploymentName != \"\""
438439
// +kubebuilder:validation:XValidation:message="'projectID' must be specified for 'watsonx' provider",rule="self.type != \"watsonx\" || self.projectID != \"\""
440+
// +kubebuilder:validation:XValidation:message="'providerType' and 'config' must be used together in generic mode",rule="!has(self.providerType) || has(self.config)"
441+
// +kubebuilder:validation:XValidation:message="'config' requires 'providerType' to be set",rule="!has(self.config) || has(self.providerType)"
442+
// +kubebuilder:validation:XValidation:message="Generic mode (providerType set) requires type='generic'",rule="!has(self.providerType) || self.type == \"generic\""
443+
// +kubebuilder:validation:XValidation:message="Generic mode cannot use legacy provider-specific fields",rule="self.type != \"generic\" || (!has(self.deploymentName) && !has(self.projectID))"
444+
// +kubebuilder:validation:XValidation:message="credentialKey must not be empty string",rule="!has(self.credentialKey) || self.credentialKey != \"\""
439445
type ProviderSpec struct {
440446
// Provider name
441447
// +kubebuilder:validation:Required
@@ -459,7 +465,7 @@ type ProviderSpec struct {
459465
// Provider type
460466
// +kubebuilder:validation:Required
461467
// +required
462-
// +kubebuilder:validation:Enum=azure_openai;bam;openai;watsonx;rhoai_vllm;rhelai_vllm;fake_provider
468+
// +kubebuilder:validation:Enum=azure_openai;bam;openai;watsonx;rhoai_vllm;rhelai_vllm;fake_provider;generic
463469
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Provider Type"
464470
Type string `json:"type"`
465471
// Azure OpenAI deployment name
@@ -478,6 +484,25 @@ type ProviderSpec struct {
478484
// +kubebuilder:validation:Optional
479485
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="TLS Security Profile",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:advanced"}
480486
TLSSecurityProfile *configv1.TLSSecurityProfile `json:"tlsSecurityProfile,omitempty"`
487+
// Generic provider type for Llama Stack (e.g., "remote::openai", "inline::sentence-transformers")
488+
// When set, this provider uses generic mode instead of legacy mode.
489+
// Must follow pattern: (inline|remote)::<provider-name>
490+
// +kubebuilder:validation:Pattern=`^(inline|remote)::[a-z0-9][a-z0-9_-]*$`
491+
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Provider Type (Generic Mode)"
492+
ProviderType string `json:"providerType,omitempty"`
493+
// Arbitrary configuration for the provider (generic mode only)
494+
// This map is passed directly to Llama Stack provider configuration.
495+
// Credentials are automatically injected as environment variable substitutions.
496+
// Example: {"url": "https://...", "custom_field": "value"}
497+
// +kubebuilder:pruning:PreserveUnknownFields
498+
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Provider Config (Generic Mode)"
499+
Config *runtime.RawExtension `json:"config,omitempty"`
500+
// Secret key name for provider credentials (default: "apitoken")
501+
// Specifies which key in credentialsSecretRef contains the API token.
502+
// The operator creates an environment variable named {PROVIDER_NAME}_API_KEY.
503+
// +kubebuilder:default:="apitoken"
504+
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Credential Key Name"
505+
CredentialKey string `json:"credentialKey,omitempty"`
481506
}
482507

483508
// UserDataCollectionSpec defines how we collect user data.

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/ols.openshift.io_olsconfigs.yaml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,21 @@ spec:
6161
apiVersion:
6262
description: API Version for Azure OpenAI provider
6363
type: string
64+
config:
65+
description: |-
66+
Arbitrary configuration for the provider (generic mode only)
67+
This map is passed directly to Llama Stack provider configuration.
68+
Credentials are automatically injected as environment variable substitutions.
69+
Example: {"url": "https://...", "custom_field": "value"}
70+
type: object
71+
x-kubernetes-preserve-unknown-fields: true
72+
credentialKey:
73+
default: apitoken
74+
description: |-
75+
Secret key name for provider credentials (default: "apitoken")
76+
Specifies which key in credentialsSecretRef contains the API token.
77+
The operator creates an environment variable named {PROVIDER_NAME}_API_KEY.
78+
type: string
6479
credentialsSecretRef:
6580
description: The name of the secret object that stores API
6681
provider credentials
@@ -118,6 +133,13 @@ spec:
118133
projectID:
119134
description: Watsonx Project ID
120135
type: string
136+
providerType:
137+
description: |-
138+
Generic provider type for Llama Stack (e.g., "remote::openai", "inline::sentence-transformers")
139+
When set, this provider uses generic mode instead of legacy mode.
140+
Must follow pattern: (inline|remote)::<provider-name>
141+
pattern: ^(inline|remote)::[a-z0-9][a-z0-9_-]*$
142+
type: string
121143
tlsSecurityProfile:
122144
description: TLS Security Profile used by connection to
123145
provider
@@ -325,6 +347,7 @@ spec:
325347
- rhoai_vllm
326348
- rhelai_vllm
327349
- fake_provider
350+
- generic
328351
type: string
329352
url:
330353
description: Provider API URL
@@ -344,6 +367,19 @@ spec:
344367
- message: '''projectID'' must be specified for ''watsonx''
345368
provider'
346369
rule: self.type != "watsonx" || self.projectID != ""
370+
- message: '''providerType'' and ''config'' must be used together
371+
in generic mode'
372+
rule: '!has(self.providerType) || has(self.config)'
373+
- message: '''config'' requires ''providerType'' to be set'
374+
rule: '!has(self.config) || has(self.providerType)'
375+
- message: Generic mode (providerType set) requires type='generic'
376+
rule: '!has(self.providerType) || self.type == "generic"'
377+
- message: Generic mode cannot use legacy provider-specific
378+
fields
379+
rule: self.type != "generic" || (!has(self.deploymentName)
380+
&& !has(self.projectID))
381+
- message: credentialKey must not be empty string
382+
rule: '!has(self.credentialKey) || self.credentialKey != ""'
347383
type: array
348384
required:
349385
- providers

0 commit comments

Comments
 (0)