外部モデルプロバイダーの作成および管理(モデルプロバイダーサービス)

外部モデルプロバイダーをモデルプロバイダーサービスとして登録し、アクセスを許可し、Unity AI Gatewayの機能を設定し、削除します。

Requirements

  • モデル プロバイダー サービスを作成するスキーマの CREATE SERVICE、加えて、そのカタログとスキーマの USE CATALOGUSE SCHEMA
  • 登録する外部プロバイダーの資格情報 (OpenAI API キーや AWS アクセス キー ペアなど)。
  • OpenAIやMicrosoft Foundry Azure鍵や秘密ではなくサービス認証情報で認証するには、既存のサービス認証情報とそれにACCESSが必要です。 サービス認証でAzure OpenAIまたはMicrosoft Foundryを認証する方法を参照してください。

モデルプロバイダーサービスの作成

モデル プロバイダー サービスと モデル サービス は、Unity カタログ スキーマ内で 1 つの名前名前空間を共有します。 スキーマ内のモデル サービスで既に使用されている場合は、モデル プロバイダー サービスの名前を使用できません。その逆も同様です。

モデルプロバイダーサービスは、Unity AI Gateway UIやCatalog Explorer、またはREST API、Azure Databricks SDK、Azure Databricks CLI、Terraformを使ってプログラム的に作成できます。

UI

  1. 次のいずれかの操作を行います。
    • ワークスペースのサイドバーで 「AI Gateway」をクリックし、「 Providers 」タブを開き、「 Provider」をクリックします。
    • カタログエクスプローラーで、モデルプロバイダーサービスを作成したいスキーマに移動し、「Create>Service」をクリックし、「Create a service」ダイアログで「Model provider service」を選択します。
  2. モデル プロバイダー サービスの名前を入力し、作成するカタログとスキーマを選択します。 カタログ エクスプローラーから開始すると、カタログとスキーマがカタログ エクスプローラーによって事前入力されます。
  3. プロバイダーの種類を選択し、プロバイダーの接続の詳細と資格情報を入力します。
  4. Create をクリックしてください。 Azure Databricksは、資格情報を暗号化して格納します。 この時点以降、UI には表示されません。

REST API

POSTを/api/2.1/unity-catalog/model-provider-servicesに送信し、parentmodel_provider_service_idをクエリパラメータとして渡します。 provider_typeと正確に一致するプロバイダーブロックを1つ設定します。targets到達可能な上流モデルを許可リストし、秘密は平文としてインラインで提供されます。

databricks api post \
  "/api/2.1/unity-catalog/model-provider-services?parent=schemas/main.default&model_provider_service_id=my_provider" \
  --json '{
  "comment": "Routes to a custom OpenAI-compatible provider",
  "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" }
      }
    }
  }
}'

CLI

親スキーマとリーフ名を渡し、設定に --jsonを添えて提供します。 provider_typeと正確に1つの一致するプロバイダーブロックを設定し、targets到達可能な上流モデルを許可リストし、秘密は平文としてインラインで提供されます。 CLIをインストールするには、「 Databricks CLIのインストールまたは更新」をご覧ください。

databricks ai-gateway create-model-provider-service schemas/main.default my_provider --json '{
  "comment": "Routes to a custom OpenAI-compatible provider",
  "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" }
      }
    }
  }
}'

Terraform

DatabricksのTerraformプロバイダーdatabricks_ai_gateway_model_provider_serviceリソースを使ってモデルプロバイダーサービスを作成・管理します。 APIキーを sensitive = true 変数に通すことで、実際のキーをソース管理から遠ざける( -var または TF_VAR_provider_api_key 環境変数で設定してください):

variable "provider_api_key" {
  type      = string
  sensitive = true
}

resource "databricks_ai_gateway_model_provider_service" "example" {
  parent                    = "schemas/main.default"
  model_provider_service_id = "my_provider"
  comment                   = "Routes to a custom OpenAI-compatible provider"

  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 = var.provider_api_key }
      }
    }
  }
}

Python SDK

Databricks SDK for Pythonでモデルプロバイダーサービスを作成・管理:

from databricks.sdk.service import catalog as c

model_provider_service = w.ai_gateway.create_model_provider_service(
    parent="schemas/main.default",
    model_provider_service_id="my_provider",
    model_provider_service=c.ModelProviderService(
        comment="Routes to a custom OpenAI-compatible provider",
        config=c.ModelProviderServiceConfig(
            provider_type=(
                c.ModelProviderServiceConfigExternalModelProviderType
                .EXTERNAL_MODEL_PROVIDER_TYPE_CUSTOM
            ),
            targets=[
                c.ModelProviderServiceConfigModelTargetConfig(
                    model="gpt-4o",
                    native_api_types=["openai/v1/chat/completions"],
                )
            ],
            custom=c.ModelProviderServiceConfigCustomProviderConfig(
                direct=c.ModelProviderServiceConfigCustomProviderDirectConfig(
                    base_url="https://api.example.com/v1",
                    api_key=c.ModelProviderServiceConfigProviderSecret(
                        plaintext="dummy-api-key"
                    ),
                )
            ),
        ),
    ),
)

Go SDK (ソフトウェア開発キット)

Databricks SDK for Goでモデルプロバイダーサービスを作成・管理:

modelProviderService, err := w.AiGateway.CreateModelProviderService(ctx,
	catalog.CreateModelProviderServiceRequest{
		Parent:                 "schemas/main.default",
		ModelProviderServiceId: "my_provider",
		ModelProviderService: catalog.ModelProviderService{
			Comment: "Routes to a custom OpenAI-compatible provider",
			Config: &catalog.ModelProviderServiceConfig{
				ProviderType: catalog.ModelProviderServiceConfigExternalModelProviderTypeExternalModelProviderTypeCustom,
				Targets: []catalog.ModelProviderServiceConfigModelTargetConfig{{
					Model:          "gpt-4o",
					NativeApiTypes: []string{"openai/v1/chat/completions"},
				}},
				Custom: &catalog.ModelProviderServiceConfigCustomProviderConfig{
					Direct: &catalog.ModelProviderServiceConfigCustomProviderDirectConfig{
						BaseUrl: "https://api.example.com/v1",
						ApiKey: &catalog.ModelProviderServiceConfigProviderSecret{
							Plaintext: "dummy-api-key",
						},
					},
				},
			},
		},
	})

Java SDK

Databricks SDK for Javaでモデルプロバイダーサービスを作成・管理:

ModelProviderServiceConfig config =
    new ModelProviderServiceConfig()
        .setProviderType(
            ModelProviderServiceConfigExternalModelProviderType
                .EXTERNAL_MODEL_PROVIDER_TYPE_CUSTOM)
        .setTargets(
            Collections.singletonList(
                new ModelProviderServiceConfigModelTargetConfig()
                    .setModel("gpt-4o")
                    .setNativeApiTypes(
                        Collections.singletonList("openai/v1/chat/completions"))))
        .setCustom(
            new ModelProviderServiceConfigCustomProviderConfig()
                .setDirect(
                    new ModelProviderServiceConfigCustomProviderDirectConfig()
                        .setBaseUrl("https://api.example.com/v1")
                        .setApiKey(
                            new ModelProviderServiceConfigProviderSecret()
                                .setPlaintext("dummy-api-key"))));

ModelProviderService modelProviderService =
    w.aiGateway()
        .createModelProviderService(
            new CreateModelProviderServiceRequest()
                .setParent("schemas/main.default")
                .setModelProviderServiceId("my_provider")
                .setModelProviderService(
                    new ModelProviderService()
                        .setComment("Routes to a custom OpenAI-compatible provider")
                        .setConfig(config)));

JS SDK

Databricks AI Gateway SDK for JavaScript でモデルプロバイダーサービスを作成・管理:

import { ModelProviderServiceConfig_ExternalModelProviderType as ProviderType } from '@databricks/sdk-aigateway/v1';

const created = await client.createModelProviderService({
  parent: 'schemas/main.default',
  modelProviderServiceId: 'my_provider',
  modelProviderService: {
    comment: 'Routes to a custom OpenAI-compatible provider',
    config: {
      providerType: ProviderType.EXTERNAL_MODEL_PROVIDER_TYPE_CUSTOM,
      targets: [{ model: 'gpt-4o', nativeApiTypes: ['openai/v1/chat/completions'] }],
      provider: {
        $case: 'custom',
        custom: {
          providerMode: {
            $case: 'direct',
            direct: {
              baseUrl: 'https://api.example.com/v1',
              authMode: {
                $case: 'apiKey',
                apiKey: {
                  value: { $case: 'plaintext', plaintext: 'dummy-api-key' },
                },
              },
            },
          },
        },
      },
    },
  },
});

プロバイダーとその認証方法の完全な一覧については、外部モデルプロバイダーを管理する(モデルプロバイダーサービス)を参照してください。

サービス認証でAzure OpenAIまたはMicrosoft Foundryを認証する

Azure OpenAIやMicrosoft Foundryプロバイダーは、APIキーやMicrosoft Entra IDのサービスプリンシパルクライアント秘密を保存する代わりに、サービス認証情報で認証できます。 サービス認証はUnity Catalogが管理するAzureのアイデンティティを保持するため、長期存在するシークレットがモデルプロバイダーサービスにコピーされることはありません。Azure Databricksはそのアイデンティティから短命トークンを取得して各リクエストを認証します。

モデル プロバイダー サービスを作成するで説明されているように、モデル プロバイダー サービスを作成してください。 プロバイダータイプとしてAzure OpenAIまたはMicrosoft Foundryを選択し、エンドポイントの基本URLを含む接続詳細を入力します。 次に 、認証メソッドサービス認証に 設定し、APIキーやクライアントシークレットを入力する代わりに認証情報を選択してください。 サービス認証情報は秘密のみを置き換えるため、エンドポイントのベースURLは依然として必要です。

次の要件を確認します。

  • モデルプロバイダーサービスの 所有者 はサービス認証情報に ACCESS を持っています。 Azure Databricksはリクエストを送る際に所有者のアクセスを再確認するため、プロバイダーが使用されている間は所有者がアクセス権を保持しなければなりません。 取り消すと、プロバイダーに EXECUTE を持っている発信者も含めて、全員の問い合わせが停止します。 所有者に認証情報へのアクセスを付与するには:

    GRANT ACCESS ON SERVICE CREDENTIAL <service-credential-name> TO `<model-provider-service-owner>`;
    
  • 認証情報の目的は保存ではなく サービスにあります。

  • 認証情報はリクエストが来るワークスペースで利用可能です。 ワークスペースのバインディングは依然として適用されるため、認証情報が拘束されていないワークスペースからのリクエストはそこで失敗します。モデルプロバイダーサービス自体はメタストアを共有するどのワークスペースからでもアクセス可能です。

  • サービス認証のAzureアイデンティティは、あなたが問い合わせる予定のAzure OpenAIまたはMicrosoft Foundryのデプロイメントを呼び出す権限を持っています。 サービス資格情報を作成するには、「 サービス資格情報の作成」を参照してください。

プロバイダーに問い合わせる電話は、他のプロバイダーと同じ助成金が必要です。 サービス認証情報の権限は不要で、それが認証情報自体を手の届かない状態にしています。

モデルプロバイダーサービスは内部識別子で認証情報を追跡するため、クエリ失敗なく資格情報を変更できます。

認証情報を削除するとクエリは失敗し、モデルプロバイダーサービスが参照している警告もありません。 この認証情報への参照がないか確認してから削除してください。

既存のモデルプロバイダーサービスをサービス認証情報とAPIキーやクライアントシークレット認証の間で切り替えることはできません。 代わりに新しいモデルプロバイダーサービスを作成しましょう。

カスタムプロバイダーAPIキーをヘッダーで送信します

カスタムプロバイダーはデフォルトでAPIキーをベアラートークンとして送信します。 エンドポイントが特定のヘッダーのキーを期待する場合は、APIキーヘッダー認証を使い、自分でヘッダー名を付けましょう。 Azure Databricksは各アウトバウンドリクエストでキーを<header name>: <header value>として送信します。

モデル プロバイダー サービスを作成するで説明されているように、モデル プロバイダー サービスを作成してください。 プロバイダータイプとして Custom を選択し、 AuthメソッドAPIキーヘッダー に設定し、エンドポイントが期待する ヘッダー名 ( X-API-KeyOcp-Apim-Subscription-Keyなど)と ヘッダーの値を入力します。

この 2 つの方法は相互排他的です。カスタムプロバイダーは、ベアラー トークンまたは名前付きヘッダーのいずれか一方のみを使用し、両方を同時に使用することはありません。 ヘッダー認証は正確に1つのヘッダーを扱います。

ヘッダー名は有効なHTTPヘッダー名でなければなりません。文字、数字、文字 !#$%&'*+-.^_`|~、最大255文字まで。 スペース、コロン、スラッシュ、改行など、他の文字は除外されます。

モデルプロバイダーサービスへのアクセスを付与する

デフォルトでは、モデルプロバイダーのサービスオーナーのみがクエリ可能です。 他のユーザーがモデルプロバイダー サービスにクエリを実行できるようにするには、そのサービスに対する EXECUTE に加えて、そのカタログとスキーマに対する USE CATALOGUSE SCHEMA を付与します。 モデル プロバイダー サービスが推論テーブルにログを記録する場合は、テーブルに SELECT を付与して、ログに記録された要求と応答を読み取るようにします。

UI

  1. カタログエクスプローラーでモデルプロバイダーサービスを開くか、 AI Gateway にアクセスしてサービスを選択してください。
  2. [アクセス許可] タブに移動します。
  3. [許可] をクリックします。
  4. アクセス権を付与するユーザー、グループ、またはサービス プリンシパルを選択します。
  5. EXECUTE 特権を選択します。
  6. [許可] をクリックします。

REST API

databricks api patch \
  "/api/2.1/unity-catalog/permissions/model_provider_service/main.default.my_provider" \
  --json '{
    "changes": [
      { "principal": "data-team", "add": ["EXECUTE"] }
    ]
  }'

CLI

Databricks CLIで EXECUTE を付与してください。 CLIをインストールするには、「 Databricks CLIのインストールまたは更新」をご覧ください。

databricks grants update model_provider_service main.default.my_provider \
  --json '{"changes": [{"principal": "data-team", "add": ["EXECUTE"]}]}'

Terraform

databricks_grantEXECUTEリソースを使用した付与:

resource "databricks_grant" "example" {
  model_provider_service = "main.default.my_provider"
  principal              = "data-team"
  privileges             = ["EXECUTE"]
}

Python SDK

Databricks SDKによるPythonの助成EXECUTE:

from databricks.sdk.service import catalog as c

w.grants.update(
    securable_type="model_provider_service",
    full_name="main.default.my_provider",
    changes=[c.PermissionsChange(principal="data-team", add=[c.Privilege.EXECUTE])],
)

Go SDK (ソフトウェア開発キット)

Databricks SDK for GoEXECUTEを付与する:

_, err := w.Grants.Update(ctx, catalog.UpdatePermissions{
	SecurableType: "model_provider_service",
	FullName:      "main.default.my_provider",
	Changes: []catalog.PermissionsChange{{
		Principal: "data-team",
		Add:       []catalog.Privilege{catalog.PrivilegeExecute},
	}},
})

Java SDK

を、EXECUTE を使用して付与する:

w.grants().update(
    new UpdatePermissions()
        .setSecurableType("model_provider_service")
        .setFullName("main.default.my_provider")
        .setChanges(Arrays.asList(
            new PermissionsChange().setPrincipal("data-team").setAdd(Arrays.asList(Privilege.EXECUTE)))));

アクセスの付与および発見の詳細については、「 外部モデルプロバイダーへのアクセスを発見・統治する(モデルプロバイダーサービス)」をご覧ください。

機能の構成

モデル プロバイダー サービスは Unity AI Gateway を介してルーティングされるため、他の Unity AI Gateway トラフィックに使用するのと同じガバナンス機能と監視機能を適用します。

モデルプロバイダーサービスの更新

所有者であるか、MANAGE を持っている必要があります。 プロバイダータイプは不変です。

UI

Unity AI Gateway UIまたはカタログエクスプローラーからモデルプロバイダーサービスの設定を編集してください。 変更は現地で適用されます。

REST API

databricks api patch \
  "/api/2.1/unity-catalog/model-provider-services/main.default.my_provider?update_mask=comment" \
  --json '{"comment": "Updated: routes to a custom provider"}'

CLI

databricks ai-gateway update-model-provider-service model-provider-services/main.default.my_provider comment \
  --json '{"comment": "Updated: routes to a custom provider"}'

Terraform

databricks_ai_gateway_model_provider_serviceリソースのcomment(または他の可変フィールド)を編集して再適用してください。 変更は現地で適用されます。

Python SDK

from databricks.sdk.service import catalog as c
from google.protobuf.field_mask_pb2 import FieldMask

updated = w.ai_gateway.update_model_provider_service(
    name="model-provider-services/main.default.my_provider",
    update_mask=FieldMask(paths=["comment"]),
    model_provider_service=c.ModelProviderService(
        comment="Updated: routes to a custom provider"
    ),
)

Go SDK (ソフトウェア開発キット)

updated, err := w.AiGateway.UpdateModelProviderService(ctx,
	catalog.UpdateModelProviderServiceRequest{
		Name:       "model-provider-services/main.default.my_provider",
		UpdateMask: *fieldmask.New([]string{"comment"}),
		ModelProviderService: catalog.ModelProviderService{
			Comment: "Updated: routes to a custom provider",
		},
	})

Java SDK

ModelProviderService updated =
    w.aiGateway()
        .updateModelProviderService(
            new UpdateModelProviderServiceRequest()
                .setName("model-provider-services/main.default.my_provider")
                .setUpdateMask(FieldMask.newBuilder().addPaths("comment").build())
                .setModelProviderService(
                    new ModelProviderService()
                        .setComment("Updated: routes to a custom provider")));

JS SDK

import { modelProviderServiceFieldMask } from '@databricks/sdk-aigateway/v1';

const updated = await client.updateModelProviderService({
  modelProviderService: {
    name: 'model-provider-services/main.default.my_provider',
    comment: 'Updated: routes to a custom provider',
  },
  updateMask: modelProviderServiceFieldMask('comment'),
});

モデル プロバイダー サービスを削除する

所有者であるか、MANAGE を持っている必要があります。

UI

Unity AI Gateway UIまたはカタログエクスプローラーでモデルプロバイダーサービスを開き、kebabメニューから 削除 を選択します。

REST API

databricks api delete "/api/2.1/unity-catalog/model-provider-services/main.default.my_provider"

CLI

databricks ai-gateway delete-model-provider-service model-provider-services/main.default.my_provider

Terraform

terraform destroyを実行するか、リソースブロックを削除して再適用してください。

Python SDK

w.ai_gateway.delete_model_provider_service(
    name="model-provider-services/main.default.my_provider"
)

Go SDK (ソフトウェア開発キット)

err := w.AiGateway.DeleteModelProviderService(ctx,
	catalog.DeleteModelProviderServiceRequest{
		Name: "model-provider-services/main.default.my_provider",
	})

Java SDK

w.aiGateway()
    .deleteModelProviderService(
        new DeleteModelProviderServiceRequest()
            .setName("model-provider-services/main.default.my_provider"));

JS SDK

await client.deleteModelProviderService({
  name: 'model-provider-services/main.default.my_provider',
});

次のステップ