Skip to content

Commit 3453cd5

Browse files
committed
Generic Provider Config for LCore supported providers.
1 parent 122c7a1 commit 3453cd5

File tree

7 files changed

+693
-56
lines changed

7 files changed

+693
-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
@@ -475,6 +481,25 @@ type ProviderSpec struct {
475481
// +kubebuilder:validation:Optional
476482
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="TLS Security Profile",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:advanced"}
477483
TLSSecurityProfile *configv1.TLSSecurityProfile `json:"tlsSecurityProfile,omitempty"`
484+
// Generic provider type for Llama Stack (e.g., "remote::openai", "inline::sentence-transformers")
485+
// When set, this provider uses generic mode instead of legacy mode.
486+
// Must follow pattern: (inline|remote)::<provider-name>
487+
// +kubebuilder:validation:Pattern=`^(inline|remote)::[a-z0-9][a-z0-9_-]*$`
488+
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Provider Type (Generic Mode)"
489+
ProviderType string `json:"providerType,omitempty"`
490+
// Arbitrary configuration for the provider (generic mode only)
491+
// This map is passed directly to Llama Stack provider configuration.
492+
// Credentials are automatically injected as environment variable substitutions.
493+
// Example: {"url": "https://...", "custom_field": "value"}
494+
// +kubebuilder:pruning:PreserveUnknownFields
495+
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Provider Config (Generic Mode)"
496+
Config *runtime.RawExtension `json:"config,omitempty"`
497+
// Secret key name for provider credentials (default: "apitoken")
498+
// Specifies which key in credentialsSecretRef contains the API token.
499+
// The operator creates an environment variable named {PROVIDER_NAME}_API_KEY.
500+
// +kubebuilder:default:="apitoken"
501+
// +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Credential Key Name"
502+
CredentialKey string `json:"credentialKey,omitempty"`
478503
}
479504

480505
// 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
@@ -60,6 +60,21 @@ spec:
6060
apiVersion:
6161
description: API Version for Azure OpenAI provider
6262
type: string
63+
config:
64+
description: |-
65+
Arbitrary configuration for the provider (generic mode only)
66+
This map is passed directly to Llama Stack provider configuration.
67+
Credentials are automatically injected as environment variable substitutions.
68+
Example: {"url": "https://...", "custom_field": "value"}
69+
type: object
70+
x-kubernetes-preserve-unknown-fields: true
71+
credentialKey:
72+
default: apitoken
73+
description: |-
74+
Secret key name for provider credentials (default: "apitoken")
75+
Specifies which key in credentialsSecretRef contains the API token.
76+
The operator creates an environment variable named {PROVIDER_NAME}_API_KEY.
77+
type: string
6378
credentialsSecretRef:
6479
description: The name of the secret object that stores API
6580
provider credentials
@@ -114,6 +129,13 @@ spec:
114129
projectID:
115130
description: Watsonx Project ID
116131
type: string
132+
providerType:
133+
description: |-
134+
Generic provider type for Llama Stack (e.g., "remote::openai", "inline::sentence-transformers")
135+
When set, this provider uses generic mode instead of legacy mode.
136+
Must follow pattern: (inline|remote)::<provider-name>
137+
pattern: ^(inline|remote)::[a-z0-9][a-z0-9_-]*$
138+
type: string
117139
tlsSecurityProfile:
118140
description: TLS Security Profile used by connection to
119141
provider
@@ -321,6 +343,7 @@ spec:
321343
- rhoai_vllm
322344
- rhelai_vllm
323345
- fake_provider
346+
- generic
324347
type: string
325348
url:
326349
description: Provider API URL
@@ -340,6 +363,19 @@ spec:
340363
- message: '''projectID'' must be specified for ''watsonx''
341364
provider'
342365
rule: self.type != "watsonx" || self.projectID != ""
366+
- message: '''providerType'' and ''config'' must be used together
367+
in generic mode'
368+
rule: '!has(self.providerType) || has(self.config)'
369+
- message: '''config'' requires ''providerType'' to be set'
370+
rule: '!has(self.config) || has(self.providerType)'
371+
- message: Generic mode (providerType set) requires type='generic'
372+
rule: '!has(self.providerType) || self.type == "generic"'
373+
- message: Generic mode cannot use legacy provider-specific
374+
fields
375+
rule: self.type != "generic" || (!has(self.deploymentName)
376+
&& !has(self.projectID))
377+
- message: credentialKey must not be empty string
378+
rule: '!has(self.credentialKey) || self.credentialKey != ""'
343379
type: array
344380
required:
345381
- providers

0 commit comments

Comments
 (0)