直接從代理程式碼呼叫 REST API

使用 Unity Catalog 的 Connections 代理端點 ,搭配外部服務的客戶端 SDK 直接從代理程式碼呼叫 REST API。 將 SDK 的基礎 URL 指向代理端點,並使用 Azure Databricks 令牌作為 API 金鑰。 Azure Databricks 會驗證請求,並自動從 Unity 目錄連線注入外部服務的憑證。 你的程式碼不會直接處理外部服務的標記。

要求

  • Python 3.12 與工作區登入功能。
  • 用於外部服務的 Unity Catalog HTTP 連線。 代理端點利用此連線進行認證並注入服務憑證。
  • USE CONNECTION 在連接物件上。

OpenAI

用 DatabricksOpenAI 來透過 Unity Catalog 連線代理將呼叫路由到外部 OpenAI。 首先,使用你儲存在 Databricks 秘密中的 OpenAI API 金鑰建立一個 Unity Catalog HTTP 連線:

CREATE CONNECTION openai_connection TYPE HTTP
OPTIONS (
  host 'https://api.openai.com',
  base_path '/v1',
  bearer_token secret ('<secret-scope>', '<secret-key>')
);

接著安裝套件 databricks-openai ,並在代理程式碼中使用代理 URL 和工作空間客戶端:

pip install --upgrade databricks-openai
from databricks_openai import DatabricksOpenAI
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

client = DatabricksOpenAI(
    workspace_client=w,
    base_url=f"{w.config.host}/api/2.0/unity-catalog/connections/openai_connection/proxy/",
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)

Slack

設定 Slack SDK 讓它透過 Unity Catalog 連線代理路由。 使用主機 https://slack.com 和基底路徑 /api 建立 Unity Catalog HTTP 連線,然後使用 proxy URL 作為 SDK 的基礎 URL。 為連線命名為 slack_connection,並為你的 Slack 應用程式設定提供者憑證。

安裝函式庫:

pip install --upgrade slack-sdk databricks-sdk

換 <channel-id> 成一個頻道,讓你的 Slack App 可以發文。 執行此範例會傳送訊息:

from slack_sdk import WebClient
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

client = WebClient(
    token=w.config.authenticate()["Authorization"].split(" ")[1],
    base_url=f"{w.config.host}/api/2.0/unity-catalog/connections/slack_connection/proxy/",
)

result = client.chat_postMessage(channel="<channel-id>", text="Hello from Databricks!")
print(result["message"]["text"])

泛型 ODBC

對於沒有專用 SDK 的服務,直接使用 requests 函式庫並搭配代理 URL。 用你的 API 值替換連線名稱、資源路徑和 JSON 主體。

pip install --upgrade requests databricks-sdk
import requests
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

response = requests.post(
    f"{w.config.host}/api/2.0/unity-catalog/connections/my_connection/proxy/api/v1/resource",
    headers={
        **w.config.authenticate(),
        "Content-Type": "application/json",
    },
    json={"key": "value"},
    timeout=30,
)
response.raise_for_status()
print(response.text)

關於代理端點、支援的認證方法及連線設定的詳細資訊,請參閱 透過 HTTP 連線代理轉發請求。

在 Unity Catalog 函式(舊版)中封裝 http_request()

Note

Azure Databricks 建議使用上述的連線代理或 MCP,將代理連接到外部服務。 封裝 http_request 的 Unity Catalog 函式工具仍受支援,但已不再是建議採用的做法。

你也可以建立一個 Unity 目錄函式,包裝 http_request() 以呼叫外部服務,這對於基於 SQL 的工具定義很有用。 該函式使用與代理方式相同的 Unity Catalog HTTP 連線,並在參數中以名稱 conn 作為參考。

以下範例使用上述的 slack_connection,其基路徑為 /api。 替換 <channel-id> 成你的 Slack 頻道 ID。 該函式在呼叫時會發布訊息:

CREATE OR REPLACE FUNCTION main.default.slack_post_message(
  text STRING COMMENT 'message content'
)
RETURNS STRING
COMMENT 'Sends a Slack message by passing in the message and returns the response received from the external service.'
RETURN (http_request(
  conn => 'slack_connection',
  method => 'POST',
  path => '/chat.postMessage',
  json => to_json(named_struct(
    'channel', '<channel-id>',
    'text', text
  ))
)).text;

參見CREATE FUNCTION(SQL、Python、Scala 和 Java)。

Note

使用者對機器每使用者及動態客戶端註冊這兩種連線類型的 SQL 存取 http_request 已被封鎖。 改用 Python Azure Databricks SDK 吧。