Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Add bundle support for the AI Gateway `model_provider_service` resource (direct engine). ([#6634](https://github.com/databricks/cli/pull/6634))
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
bundle:
name: test-bundle

resources:
model_provider_services:
mps1:
parent: schemas/main.myschema
model_provider_service_id: mysvc
comment: bound service
config:
provider_type: EXTERNAL_MODEL_PROVIDER_TYPE_CUSTOM
custom:
direct:
base_url: https://api.example.com/v1
api_key:
plaintext: dummy-api-key

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

>>> [CLI] bundle deployment bind mps1 main.myschema.mysvc --auto-approve
Successfully bound model_provider_service with an id 'main.myschema.mysvc'
Run 'bundle deploy' to deploy changes to your workspace

>>> [CLI] bundle summary
Name: test-bundle
Target: default
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default
Resources:
Model provider services:
mps1:
Name: mysvc
URL: [DATABRICKS_URL]/explore/data/model-provider-services/main/myschema/mysvc?w=[NUMID]

>>> [CLI] bundle deployment unbind mps1

>>> [CLI] bundle summary
Name: test-bundle
Target: default
Workspace:
User: [USERNAME]
Path: /Workspace/Users/[USERNAME]/.bundle/test-bundle/default
Resources:
Model provider services:
mps1:
Name: mysvc
URL: (not deployed)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
trace $CLI bundle deployment bind mps1 main.myschema.mysvc --auto-approve
trace $CLI bundle summary

trace $CLI bundle deployment unbind mps1
trace $CLI bundle summary
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# AI Gateway securables are direct-engine only.
EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"]

Cloud = false

Ignore = [
".databricks",
]

# The bind flow issues a GET to confirm the remote resource exists before binding.
[[Server]]
Pattern = "GET /api/2.1/unity-catalog/model-provider-services/{name}"
Response.Body = '''
{
"name": "model-provider-services/main.myschema.mysvc",
"comment": "bound service"
}
'''
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
bundle:
name: test-bundle-$UNIQUE_NAME

resources:
model_provider_services:
foo:
parent: schemas/main.default
model_provider_service_id: test-model-provider-service-$UNIQUE_NAME
comment: test model provider service
config:
provider_type: EXTERNAL_MODEL_PROVIDER_TYPE_CUSTOM
targets:
- model: gpt-4o
native_api_types:
- openai/v1/chat/completions
custom:
direct:
base_url: https://api.example.com/v1
api_key:
plaintext: dummy-api-key
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
bundle:
name: my_project

sync: {paths: []} # don't need to copy files

python:
resources:
- "resources:load_resources"
mutators:
- "mutators:update_model_provider_service"

resources:
model_provider_services:
my_model_provider_service_1:
parent: "schemas/main.default"
model_provider_service_id: "my_model_provider_service_1"
comment: "My model provider service"
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from dataclasses import replace

from databricks.bundles.model_provider_services import ModelProviderService
from databricks.bundles.core import model_provider_service_mutator


@model_provider_service_mutator
def update_model_provider_service(
model_provider_service: ModelProviderService,
) -> ModelProviderService:
assert isinstance(model_provider_service.comment, str)

return replace(
model_provider_service,
comment=f"{model_provider_service.comment} (updated)",
)

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

>>> uv run [UV_ARGS] -q [CLI] bundle validate --output json
{
"experimental": {
"python": {
"mutators": [
"mutators:update_model_provider_service"
],
"resources": [
"resources:load_resources"
]
}
},
"resources": {
"model_provider_services": {
"my_model_provider_service_1": {
"comment": "My model provider service (updated)",
"model_provider_service_id": "my_model_provider_service_1",
"parent": "schemas/main.default"
},
"my_model_provider_service_2": {
"comment": "My model provider service (2) (updated)",
"model_provider_service_id": "my_model_provider_service_2",
"parent": "schemas/main.default"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from databricks.bundles.core import Resources


def load_resources() -> Resources:
resources = Resources()

resources.add_model_provider_service(
"my_model_provider_service_2",
{
"parent": "schemas/main.default",
"model_provider_service_id": "my_model_provider_service_2",
"comment": "My model provider service (2)",
},
)

return resources
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

trace uv run $UV_ARGS -q $CLI bundle validate --output json | \
jq "pick(.experimental.python, .resources)"

rm -fr .databricks __pycache__
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Cloud = false # tests don't interact with APIs

# model_provider_services are only supported in the current version of the wheel
EnvMatrix.PYDAB_VERSION = ["current"]
86 changes: 86 additions & 0 deletions acceptance/bundle/refschema/out.fields.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2103,6 +2103,92 @@ resources.mcp_services.*.mcp_service_id string ALL
resources.mcp_services.*.modified_status string INPUT
resources.mcp_services.*.parent string ALL
resources.mcp_services.*.url string INPUT
resources.model_provider_services.*.comment string ALL
resources.model_provider_services.*.config *catalog.ModelProviderServiceConfig ALL
resources.model_provider_services.*.config.allow_all_targets bool ALL
resources.model_provider_services.*.config.amazon_bedrock *catalog.ModelProviderServiceConfigAmazonBedrockProviderConfig ALL
resources.model_provider_services.*.config.amazon_bedrock.direct *catalog.ModelProviderServiceConfigAmazonBedrockProviderDirectConfig ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.aws_access_key *catalog.ModelProviderServiceConfigAwsAccessKey ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.aws_access_key.access_key_id string ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.aws_access_key.secret_access_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.aws_access_key.secret_access_key.plaintext string ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.region string ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.service_credential *catalog.ModelProviderServiceConfigServiceCredential ALL
resources.model_provider_services.*.config.amazon_bedrock.direct.service_credential.name string ALL
resources.model_provider_services.*.config.anthropic *catalog.ModelProviderServiceConfigAnthropicProviderConfig ALL
resources.model_provider_services.*.config.anthropic.direct *catalog.ModelProviderServiceConfigAnthropicProviderDirectConfig ALL
resources.model_provider_services.*.config.anthropic.direct.api_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.anthropic.direct.api_key.plaintext string ALL
resources.model_provider_services.*.config.anthropic.relayed *catalog.ModelProviderServiceConfigAnthropicProviderRelayedConfig ALL
resources.model_provider_services.*.config.azure_openai *catalog.ModelProviderServiceConfigAzureOpenAiProviderConfig ALL
resources.model_provider_services.*.config.azure_openai.direct *catalog.ModelProviderServiceConfigAzureOpenAiProviderDirectConfig ALL
resources.model_provider_services.*.config.azure_openai.direct.api_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.azure_openai.direct.api_key.plaintext string ALL
resources.model_provider_services.*.config.azure_openai.direct.base_url string ALL
resources.model_provider_services.*.config.azure_openai.direct.entra_service_principal *catalog.ModelProviderServiceConfigEntraServicePrincipal ALL
resources.model_provider_services.*.config.azure_openai.direct.entra_service_principal.client_id string ALL
resources.model_provider_services.*.config.azure_openai.direct.entra_service_principal.client_secret *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.azure_openai.direct.entra_service_principal.client_secret.plaintext string ALL
resources.model_provider_services.*.config.azure_openai.direct.entra_service_principal.tenant_id string ALL
resources.model_provider_services.*.config.azure_openai.direct.service_credential *catalog.ModelProviderServiceConfigServiceCredential ALL
resources.model_provider_services.*.config.azure_openai.direct.service_credential.name string ALL
resources.model_provider_services.*.config.custom *catalog.ModelProviderServiceConfigCustomProviderConfig ALL
resources.model_provider_services.*.config.custom.direct *catalog.ModelProviderServiceConfigCustomProviderDirectConfig ALL
resources.model_provider_services.*.config.custom.direct.api_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.custom.direct.api_key.plaintext string ALL
resources.model_provider_services.*.config.custom.direct.base_url string ALL
resources.model_provider_services.*.config.forward_headers bool ALL
resources.model_provider_services.*.config.forward_query_parameters bool ALL
resources.model_provider_services.*.config.forward_unmanaged_paths bool ALL
resources.model_provider_services.*.config.gemini_enterprise *catalog.ModelProviderServiceConfigGeminiEnterpriseProviderConfig ALL
resources.model_provider_services.*.config.gemini_enterprise.direct *catalog.ModelProviderServiceConfigGeminiEnterpriseProviderDirectConfig ALL
resources.model_provider_services.*.config.gemini_enterprise.direct.api_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.gemini_enterprise.direct.api_key.plaintext string ALL
resources.model_provider_services.*.config.gemini_enterprise.direct.project_id string ALL
resources.model_provider_services.*.config.gemini_enterprise.direct.region string ALL
resources.model_provider_services.*.config.inference_table *catalog.InferenceTableConfig ALL
resources.model_provider_services.*.config.inference_table.is_deleted bool ALL
resources.model_provider_services.*.config.inference_table.parent string ALL
resources.model_provider_services.*.config.inference_table.table string ALL
resources.model_provider_services.*.config.inference_table.table_name_prefix string ALL
resources.model_provider_services.*.config.microsoft_foundry *catalog.ModelProviderServiceConfigMicrosoftFoundryProviderConfig ALL
resources.model_provider_services.*.config.microsoft_foundry.direct *catalog.ModelProviderServiceConfigMicrosoftFoundryProviderDirectConfig ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.api_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.api_key.plaintext string ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.base_url string ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.entra_service_principal *catalog.ModelProviderServiceConfigEntraServicePrincipal ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.entra_service_principal.client_id string ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.entra_service_principal.client_secret *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.entra_service_principal.client_secret.plaintext string ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.entra_service_principal.tenant_id string ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.service_credential *catalog.ModelProviderServiceConfigServiceCredential ALL
resources.model_provider_services.*.config.microsoft_foundry.direct.service_credential.name string ALL
resources.model_provider_services.*.config.openai *catalog.ModelProviderServiceConfigOpenAiProviderConfig ALL
resources.model_provider_services.*.config.openai.direct *catalog.ModelProviderServiceConfigOpenAiProviderDirectConfig ALL
resources.model_provider_services.*.config.openai.direct.api_key *catalog.ModelProviderServiceConfigProviderSecret ALL
resources.model_provider_services.*.config.openai.direct.api_key.plaintext string ALL
resources.model_provider_services.*.config.openai.direct.base_url string ALL
resources.model_provider_services.*.config.openai.direct.organization string ALL
resources.model_provider_services.*.config.provider_type catalog.ModelProviderServiceConfigExternalModelProviderType ALL
resources.model_provider_services.*.config.rate_limits []catalog.RateLimit ALL
resources.model_provider_services.*.config.rate_limits[*] catalog.RateLimit ALL
resources.model_provider_services.*.config.rate_limits[*].key catalog.RateLimitRateLimitKey ALL
resources.model_provider_services.*.config.rate_limits[*].principal string ALL
resources.model_provider_services.*.config.rate_limits[*].renewal_period catalog.RateLimitRateLimitRenewalPeriod ALL
resources.model_provider_services.*.config.rate_limits[*].requests int64 ALL
resources.model_provider_services.*.config.rate_limits[*].tokens int64 ALL
resources.model_provider_services.*.config.targets []catalog.ModelProviderServiceConfigModelTargetConfig ALL
resources.model_provider_services.*.config.targets[*] catalog.ModelProviderServiceConfigModelTargetConfig ALL
resources.model_provider_services.*.config.targets[*].model string ALL
resources.model_provider_services.*.config.targets[*].native_api_types []string ALL
resources.model_provider_services.*.config.targets[*].native_api_types[*] string ALL
resources.model_provider_services.*.id string INPUT
resources.model_provider_services.*.lifecycle resources.Lifecycle INPUT
resources.model_provider_services.*.lifecycle.prevent_destroy bool INPUT
resources.model_provider_services.*.model_provider_service_id string ALL
resources.model_provider_services.*.modified_status string INPUT
resources.model_provider_services.*.parent string ALL
resources.model_provider_services.*.url string INPUT
resources.model_services.*.comment string ALL
resources.model_services.*.config *catalog.ModelServiceConfig ALL
resources.model_services.*.config.inference_table *catalog.InferenceTableConfig ALL
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
bundle:
name: test-bundle

resources:
model_provider_services:
mps1:
parent: schemas/main.myschema
model_provider_service_id: myservice
comment: COMMENT1
config:
provider_type: EXTERNAL_MODEL_PROVIDER_TYPE_CUSTOM
targets:
- model: gpt-4o
native_api_types:
- openai/v1/chat/completions
custom:
direct:
base_url: https://api.example.com/v1
api_key:
plaintext: dummy-api-key

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading