Créer des outils d'agent à l'aide des fonctions Unity Catalog
Use Unity Catalog functions when your agent needs to run predefined logic, such as a SQL query whose parameters the agent supplies. For other tools, start with MCPs.
Ce guide utilise Unity Catalog AI pour créer une petite fonction Python, la tester et l’ajouter à un agent à l’aide du framework de votre choix. Si vous disposez déjà d’une fonction, installez les bibliothèques à l’étape 1 et accédez à l’étape 3.
Exigences
- Un notebook Databricks avec Python 3.10 ou version ultérieure. Sur le compute classique, utilisez Databricks Runtime 15.0 ou une version ultérieure.
- Serverless compute activé dans votre workspace. Le Function Client utilise le compute général serverless pour exécuter des outils ; un SQL Warehouse seul ne suffit pas.
USE CATALOGetUSE SCHEMAsur le catalogue parent et le schéma de la fonction. La création d'une fonction nécessite égalementCREATE FUNCTIONsur le schéma ; l'appel d'une fonction existante nécessiteEXECUTEsur celle-ci. Voir Privilèges des fonctions.- Un modèle qui prend en charge l’appel d’outils. L’exemple LangGraph utilise un endpoint de modèle Databricks. Les exemples OpenAI, Anthropic et LlamaIndex utilisent des identifiants d’API de fournisseur, comme indiqué dans leurs tab.
Étape 1 : installez les bibliothèques
Exécutez la commande d'installation de votre framework dans une cellule de notebook :
Framework | Commande d'installation |
|---|---|
LangGraph |
|
OpenAI |
|
Anthropic |
|
LlamaIndex |
|
Pour le code source des packages, consultez le repository d’IA Unity Catalog.
Redémarrez ensuite Python dans une cellule distincte :
dbutils.library.restartPython()
Étape 2 : Créez et testez une fonction
Utilisez DatabricksFunctionClient pour créer et tester la fonction. Remplacez my_catalog et my_schema par un catalogue et un schéma existants dans lesquels vous pouvez créer des fonctions. Cet exemple crée add_numbers; choisissez un autre nom s'il existe déjà.
from unitycatalog.ai.core.databricks import DatabricksFunctionClient
client = DatabricksFunctionClient()
CATALOG = "my_catalog"
SCHEMA = "my_schema"
def add_numbers(number_1: float, number_2: float) -> float:
"""Add two numbers.
Args:
number_1: The first number to add.
number_2: The second number to add.
Returns:
The sum of the two numbers.
"""
return number_1 + number_2
client.create_python_function(func=add_numbers, catalog=CATALOG, schema=SCHEMA)
result = client.execute_function(
function_name=f"{CATALOG}.{SCHEMA}.add_numbers",
parameters={"number_1": 2.0, "number_2": 3.0},
)
if result.error:
raise RuntimeError(result.error)
print(result.value) # 5.0
Étape 3 : Utilisez la fonction dans votre agent
Définissez function_name sur le nom complet de votre fonction, puis exécutez l'exemple correspondant à votre framework. Chacun utilise UCFunctionToolkit pour appeler la fonction directement.
from unitycatalog.ai.core.databricks import DatabricksFunctionClient
function_name = "my_catalog.my_schema.add_numbers"
client = DatabricksFunctionClient()
question = "Use the tool to add 2.0 and 3.0."
- LangGraph
- OpenAI
- Anthropic
- LlamaIndex
Cet exemple utilise l'endpoint databricks-claude-sonnet-4-5. Remplacez-le par un modèle d'appel d'outils disponible dans votre workspace.
from databricks_langchain import ChatDatabricks, UCFunctionToolkit
from langgraph.prebuilt import create_react_agent
toolkit = UCFunctionToolkit(function_names=[function_name], client=client)
agent = create_react_agent(
ChatDatabricks(endpoint="databricks-claude-sonnet-4-5"),
tools=toolkit.tools,
)
result = agent.invoke({"messages": [{"role": "user", "content": question}]})
print(result["messages"][-1].content)
Consultez la référence d’intégration LangChain.
Définissez les variables d’environnement OPENAI_API_KEY et OPENAI_MODEL pour votre processus de notebook. Utilisez un modèle qui prend en charge l’appel d’outils et stockez la clé API dans un secret Databricks.
import os
from openai import OpenAI
from unitycatalog.ai.openai.toolkit import UCFunctionToolkit
from unitycatalog.ai.openai.utils import generate_tool_call_messages
toolkit = UCFunctionToolkit(function_names=[function_name], client=client)
model_client = OpenAI()
messages = [{"role": "user", "content": question}]
for _ in range(10):
response = model_client.chat.completions.create(
model=os.environ["OPENAI_MODEL"],
messages=messages,
tools=toolkit.tools,
)
if not response.choices[0].message.tool_calls:
print(response.choices[0].message.content)
break
messages.extend(generate_tool_call_messages(response=response, client=client))
else:
raise RuntimeError("The agent reached the tool-calling limit.")
L’assistant exécute les fonctions demandées et formate leurs résultats pour le prochain appel de modèle. Consultez la référence sur l’intégration d’OpenAI.
Définissez les variables d’environnement ANTHROPIC_API_KEY et ANTHROPIC_MODEL pour votre processus de notebook. Utilisez un modèle qui prend en charge l’appel d’outils et stockez la clé API dans un secret Databricks.
import os
from anthropic import Anthropic
from unitycatalog.ai.anthropic.toolkit import UCFunctionToolkit
from unitycatalog.ai.anthropic.utils import generate_tool_call_messages
toolkit = UCFunctionToolkit(function_names=[function_name], client=client)
model_client = Anthropic()
messages = [{"role": "user", "content": question}]
for _ in range(10):
response = model_client.messages.create(
model=os.environ["ANTHROPIC_MODEL"],
max_tokens=1024,
tools=toolkit.tools,
messages=messages,
)
if response.stop_reason != "tool_use":
print("\n".join(block.text for block in response.content if block.type == "text"))
break
messages.extend(
generate_tool_call_messages(
response=response, client=client, conversation_history=[],
)
)
else:
raise RuntimeError("The agent reached the tool-calling limit.")
L’assistant exécute les fonctions demandées. Ajouter ses messages à la conversation avant le prochain appel du modèle. Consultez la référence de l’intégration Anthropic.
Cet exemple utilise un modèle OpenAI. Définissez les variables d’environnement OPENAI_API_KEY et OPENAI_MODEL pour votre processus de notebook. Utilisez un modèle qui prend en charge l’appel d’outils et stockez la clé API dans un secret Databricks.
import os
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
from unitycatalog.ai.llama_index.toolkit import UCFunctionToolkit
toolkit = UCFunctionToolkit(function_names=[function_name], client=client)
agent = FunctionAgent(
tools=toolkit.tools,
llm=OpenAI(model=os.environ["OPENAI_MODEL"]),
)
result = await agent.run(user_msg=question)
print(result)
Exécutez les deux dernières lignes dans une cellule de notebook qui prend en charge await. Voir la référence d'intégration LlamaIndex.
L’agent appelle add_numbers et renvoie une réponse contenant 5. Si vous utilisez une fonction existante, remplacez question par une tâche prise en charge par cette fonction.
Pour le déploiement et l'authentification, consultez les rubriques Créer un agent personnalisé et Authentification des agents.
Développement local
Pour tester des fonctions Python approuvées, initialisez le client avec execution_mode="local" et transmettez-le à la boîte à outils de votre framework :
client = DatabricksFunctionClient(execution_mode="local")
toolkit = UCFunctionToolkit(function_names=[function_name], client=client)
Le mode local récupère la fonction depuis Unity Catalog et l’exécute dans un sous-processus local. Il ne prend pas en charge les fonctions SQL. Utilisez le mode Serverless par default pour la production et n’exécutez que du code de confiance. Voir Modes d’exécution.
Pour en savoir plus sur les délais d’attente, les limites de mémoire et les paramètres serverless, consultez les pages limites d’exécution locales et variables d’environnement Function Client.
Utilisez l'endpoint MCP du workspace (hérité)
Pour les intégrations MCP existantes, cet exemple LangGraph se connecte à la même fonction via le legacy workspace endpoint. Activez l’ aperçu des serveurs MCP gérés et utilisez une identité disposant d’un accès à la fonction.
Exécutez %pip install --upgrade databricks-langchain langgraph "mcp>=1.24,<2" dans une cellule de notebook, puis redémarrez Python. Remplacez my_catalog/my_schema/add_numbers par le chemin de votre fonction.
from databricks.sdk import WorkspaceClient
from databricks_langchain import (
ChatDatabricks,
DatabricksMCPServer,
DatabricksMultiServerMCPClient,
)
from langchain_core.messages import convert_to_openai_messages
from langgraph.prebuilt import create_react_agent
workspace_client = WorkspaceClient()
function_path = "my_catalog/my_schema/add_numbers"
mcp_client = DatabricksMultiServerMCPClient([
DatabricksMCPServer(
name="uc-functions",
url=f"{workspace_client.config.host}/api/2.0/mcp/functions/{function_path}",
workspace_client=workspace_client,
),
])
agent = create_react_agent(
ChatDatabricks(endpoint="databricks-claude-sonnet-4-5"),
tools=await mcp_client.get_tools(),
prompt=lambda state: convert_to_openai_messages(state["messages"]),
)
result = await agent.ainvoke({
"messages": [{"role": "user", "content": "Use the tool to add 2.0 and 3.0."}],
})
print(result["messages"][-1].content)
Pour le déploiement, consultez l’authentification des agents. Pour une fonction qui appelle une API externe avec http_request, consultez les outils de l’API REST hérités.