Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A menudo, los agentes de inteligencia artificial necesitan consultar datos no estructurados, como colecciones de documentos, bases de conocimiento o corpora de texto para responder a preguntas y proporcionar respuestas con reconocimiento del contexto.
Databricks proporciona varios enfoques para conectar agentes a datos no estructurados en índices de búsqueda de vectores y almacenes de vectores externos. Utilice servidores MCP preconfigurados para obtener acceso inmediato a los índices de búsqueda vectorial de Databricks, desarrollar herramientas de recuperador localmente con paquetes de AI Bridge o crear funciones de recuperador personalizadas para flujos de trabajo especializados.
Consulta de un índice de búsqueda vectorial de Databricks mediante MCP
Si el agente necesita consultar un índice de Búsqueda vectorial de Databricks, use el servidor MCP administrado por Databricks. Antes de empezar, cree un índice de búsqueda vectorial mediante incrustaciones administradas por Databricks. Consulte Creación de puntos de conexión e índices de búsqueda vectorial.
La dirección URL de MCP administrada para la búsqueda de vectores es: https://<workspace-hostname>/api/2.0/mcp/vector-search/{catalog}/{schema}/{index_name}.
En los ejemplos siguientes se muestra cómo conectar el agente a un índice de búsqueda vectorial. Reemplace <catalog>, <schema>y <index-name> por los nombres del índice de búsqueda vectorial.
SDK de agentes de OpenAI (aplicaciones)
from agents import Agent, Runner
from databricks.sdk import WorkspaceClient
from databricks_openai.agents import McpServer
workspace_client = WorkspaceClient()
async with McpServer.from_vector_search(
catalog="<catalog>",
schema="<schema>",
index_name="<index-name>",
workspace_client=workspace_client,
name="vector-search",
) as vs_server:
agent = Agent(
name="Research assistant",
instructions="You are a research assistant. Use the vector search tool to find relevant documents and answer questions.",
model="databricks-claude-sonnet-4-5",
mcp_servers=[vs_server],
)
result = await Runner.run(agent, "What is the return policy?")
print(result.final_output)
Conceda a la aplicación acceso al índice de búsqueda vectorial en databricks.yml:
resources:
apps:
my_agent_app:
resources:
- name: 'my_vector_index'
uc_securable:
securable_full_name: '<catalog>.<schema>.<index-name>'
securable_type: 'TABLE'
permission: 'SELECT'
LangGraph (Aplicaciones)
from databricks.sdk import WorkspaceClient
from databricks_langchain import ChatDatabricks, DatabricksMCPServer, DatabricksMultiServerMCPClient
from langgraph.prebuilt import create_react_agent
workspace_client = WorkspaceClient()
host = workspace_client.config.host
mcp_client = DatabricksMultiServerMCPClient([
DatabricksMCPServer(
name="vector-search",
url=f"{host}/api/2.0/mcp/vector-search/<catalog>/<schema>/<index-name>",
workspace_client=workspace_client,
),
])
async with mcp_client:
tools = await mcp_client.get_tools()
agent = create_react_agent(
ChatDatabricks(endpoint="databricks-claude-sonnet-4-5"),
tools=tools,
)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "What is the return policy?"}]}
)
print(result["messages"][-1].content)
Conceda a la aplicación acceso al índice de búsqueda vectorial en databricks.yml:
resources:
apps:
my_agent_app:
resources:
- name: 'my_vector_index'
uc_securable:
securable_full_name: '<catalog>.<schema>.<index-name>'
securable_type: 'TABLE'
permission: 'SELECT'
Servicio de modelos
from databricks.sdk import WorkspaceClient
from databricks_mcp import DatabricksMCPClient
import mlflow
workspace_client = WorkspaceClient()
host = workspace_client.config.host
# Connect to the Vector Search MCP server
mcp_client = DatabricksMCPClient(
server_url=f"{host}/api/2.0/mcp/vector-search/<catalog>/<schema>/<index-name>",
workspace_client=workspace_client,
)
# List available tools from the Vector Search index
tools = mcp_client.list_tools()
# Log the agent with the required resources for deployment
mlflow.pyfunc.log_model(
"agent",
python_model=my_agent,
resources=mcp_client.get_databricks_resources(),
)
Para implementar el agente, consulte Deploy an agent for generative AI applications (Model Serving). Para más información sobre el registro de agentes con recursos de MCP, consulte Uso de servidores MCP administrados de Databricks.
Otros enfoques
Consulta de un índice de búsqueda vectorial fuera de Databricks
Consulta de un índice de búsqueda vectorial hospedado fuera de Databricks
Si el índice vectorial se hospeda fuera de Azure Databricks, puede crear una conexión de Unity Catalog para conectar con el servicio externo y usar la conexión en el código del agente. Consulte Conexión de agentes a servicios externos.
En el ejemplo siguiente se crea un módulo de recuperación que llama a un índice vectorial alojado fuera de Databricks para un agente de tipo PyFunc.
Cree una conexión de catálogo de Unity al servicio externo, en este caso, Azure.
CREATE CONNECTION ${connection_name} TYPE HTTP OPTIONS ( host 'https://example.search.windows.net', base_path '/', bearer_token secret ('<secret-scope>','<secret-key>') );Defina la herramienta retriever en el código del agente usando la conexión Unity Catalog. En este ejemplo se usan decoradores de MLflow para habilitar el seguimiento del agente.
Nota:
Para ajustarse al esquema del recuperador de MLflow, la función retriever debe devolver un
List[Document]objeto y usar elmetadatacampo de la clase Document para agregar atributos adicionales al documento devuelto, comodoc_uriysimilarity_score. Consulte el documento de MLflow.import mlflow import json from mlflow.entities import Document from typing import List, Dict, Any from dataclasses import asdict class VectorSearchRetriever: """ Class using Databricks Vector Search to retrieve relevant documents. """ def __init__(self): self.azure_search_index = "hotels_vector_index" @mlflow.trace(span_type="RETRIEVER", name="vector_search") def __call__(self, query_vector: List[Any], score_threshold=None) -> List[Document]: """ Performs vector search to retrieve relevant chunks. Args: query: Search query. score_threshold: Score threshold to use for the query. Returns: List of retrieved Documents. """ import requests from databricks.sdk import WorkspaceClient w = WorkspaceClient() json = { "count": true, "select": "HotelId, HotelName, Description, Category", "vectorQueries": [ { "vector": query_vector, "k": 7, "fields": "DescriptionVector", "kind": "vector", "exhaustive": true, } ], } response = requests.post( f"{w.config.host}/api/2.0/unity-catalog/connections/{connection_name}/proxy/indexes/{self.azure_search_index}/docs/search?api-version=2023-07-01-Preview", headers={ **w.config.authenticate(), "Content-Type": "application/json", }, json=json, ).text documents = self.convert_vector_search_to_documents(response, score_threshold) return [asdict(doc) for doc in documents] @mlflow.trace(span_type="PARSER") def convert_vector_search_to_documents( self, vs_results, score_threshold ) -> List[Document]: docs = [] for item in vs_results.get("value", []): score = item.get("@search.score", 0) if score >= score_threshold: metadata = { "score": score, "HotelName": item.get("HotelName"), "Category": item.get("Category"), } doc = Document( page_content=item.get("Description", ""), metadata=metadata, id=item.get("HotelId"), ) docs.append(doc) return docsPara ejecutar el recuperador, ejecute el código Python siguiente. Opcionalmente, puede incluir filtros de búsqueda vectorial en la solicitud para filtrar los resultados.
retriever = VectorSearchRetriever() query = [0.01944167, 0.0040178085 . . . TRIMMED FOR BREVITY 010858015, -0.017496133] results = retriever(query, score_threshold=0.1)
Desarrollar un recuperador local
Desarrollo de un recuperador localmente mediante AI Bridge
Para desarrollar localmente una herramienta de recuperación de búsqueda vectorial de Databricks, use paquetes de Databricks AI Bridge como databricks-langchain y databricks-openai. Estos paquetes incluyen funciones auxiliares como from_vector_search y from_uc_function para crear recuperadores a partir de recursos de Databricks existentes.
LangChain/LangGraph
Instale la versión más reciente de databricks-langchain que incluye Databricks AI Bridge.
%pip install --upgrade databricks-langchain
El código siguiente prototipa una herramienta de recuperación que consulta un índice hipotético de búsqueda vectorial y lo enlaza localmente a un LLM para que pueda probar su comportamiento de llamada a herramientas.
Proporcione un descriptivo tool_description para ayudar al agente a comprender la herramienta y determinar cuándo invocarla.
from databricks_langchain import VectorSearchRetrieverTool, ChatDatabricks
# Initialize the retriever tool.
vs_tool = VectorSearchRetrieverTool(
index_name="catalog.schema.my_databricks_docs_index",
tool_name="databricks_docs_retriever",
tool_description="Retrieves information about Databricks products from official Databricks documentation."
)
# Run a query against the vector search index locally for testing
vs_tool.invoke("Databricks Agent Framework?")
# Bind the retriever tool to your Langchain LLM of choice
llm = ChatDatabricks(endpoint="databricks-claude-sonnet-4-5")
llm_with_tools = llm.bind_tools([vs_tool])
# Chat with your LLM to test the tool calling functionality
llm_with_tools.invoke("Based on the Databricks documentation, what is Databricks Agent Framework?")
Para escenarios que usan índices de acceso directo o índices Delta Sync utilizando incrustaciones autogestionadas, debe configurar VectorSearchRetrieverTool y especificar un modelo de incrustación personalizado y una columna de texto. Consulte las opciones para proporcionar incrustaciones.
En el ejemplo siguiente se muestra cómo configurar un VectorSearchRetrieverTool con claves columns y embedding.
from databricks_langchain import VectorSearchRetrieverTool
from databricks_langchain import DatabricksEmbeddings
embedding_model = DatabricksEmbeddings(
endpoint="databricks-bge-large-en",
)
vs_tool = VectorSearchRetrieverTool(
index_name="catalog.schema.index_name", # Index name in the format 'catalog.schema.index'
num_results=5, # Max number of documents to return
columns=["primary_key", "text_column"], # List of columns to include in the search
filters={"text_column LIKE": "Databricks"}, # Filters to apply to the query
query_type="ANN", # Query type ("ANN" or "HYBRID").
tool_name="name of the tool", # Used by the LLM to understand the purpose of the tool
tool_description="Purpose of the tool", # Used by the LLM to understand the purpose of the tool
text_column="text_column", # Specify text column for embeddings. Required for direct-access index or delta-sync index with self-managed embeddings.
embedding=embedding_model # The embedding model. Required for direct-access index or delta-sync index with self-managed embeddings.
)
Para más información, consulte los documentos de API para VectorSearchRetrieverTool.
OpenAI
Instale la versión más reciente de databricks-openai que incluye Databricks AI Bridge.
%pip install --upgrade databricks-openai
El código siguiente crea prototipos de un recuperador que consulta un índice hipotético de búsqueda vectorial y lo integra con los modelos GPT de OpenAI.
Proporcione un descriptivo tool_description para ayudar al agente a comprender la herramienta y determinar cuándo invocarla.
Para más información sobre recomendaciones OpenAI para herramientas, ver Documentación OpenAI Function Calling.
from databricks_openai import VectorSearchRetrieverTool
from openai import OpenAI
import json
# Initialize OpenAI client
client = OpenAI(api_key=<your_API_key>)
# Initialize the retriever tool
dbvs_tool = VectorSearchRetrieverTool(
index_name="catalog.schema.my_databricks_docs_index",
tool_name="databricks_docs_retriever",
tool_description="Retrieves information about Databricks products from official Databricks documentation"
)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": "Using the Databricks documentation, answer what is Spark?"
}
]
first_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=[dbvs_tool.tool]
)
# Execute function code and parse the model's response and handle function calls.
tool_call = first_response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
result = dbvs_tool.execute(query=args["query"]) # For self-managed embeddings, optionally pass in openai_client=client
# Supply model with results – so it can incorporate them into its final response.
messages.append(first_response.choices[0].message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result)
})
second_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=[dbvs_tool.tool]
)
Para escenarios que usan índices de acceso directo o índices Delta Sync utilizando incrustaciones autogestionadas, debe configurar VectorSearchRetrieverTool y especificar un modelo de incrustación personalizado y una columna de texto. Consulte las opciones para proporcionar incrustaciones.
En el ejemplo siguiente se muestra cómo configurar un VectorSearchRetrieverTool con claves columns y embedding.
from databricks_openai import VectorSearchRetrieverTool
vs_tool = VectorSearchRetrieverTool(
index_name="catalog.schema.index_name", # Index name in the format 'catalog.schema.index'
num_results=5, # Max number of documents to return
columns=["primary_key", "text_column"], # List of columns to include in the search
filters={"text_column LIKE": "Databricks"}, # Filters to apply to the query
query_type="ANN", # Query type ("ANN" or "HYBRID").
tool_name="name of the tool", # Used by the LLM to understand the purpose of the tool
tool_description="Purpose of the tool", # Used by the LLM to understand the purpose of the tool
text_column="text_column", # Specify text column for embeddings. Required for direct-access index or delta-sync index with self-managed embeddings.
embedding_model_name="databricks-bge-large-en" # The embedding model. Required for direct-access index or delta-sync index with self-managed embeddings.
)
Para más información, consulte los documentos de API para VectorSearchRetrieverTool.
Una vez que la herramienta local esté lista, puede producirla directamente como parte del código del agente o migrarla a una función de catálogo de Unity, que proporciona una mejor detectabilidad y gobernanza, pero tiene ciertas limitaciones.
Búsqueda de vectores en Databricks mediante funciones UC (en desuso)
Consulta de Búsqueda de Vectores de Databricks mediante funciones UC (en desuso)
Nota:
Databricks recomienda servidores MCP para la mayoría de las herramientas de agente, pero la definición de herramientas con funciones de Catálogo de Unity sigue estando disponible para la creación de prototipos.
Puede crear una función de Unity Catalog que envuelva una consulta de índice Mosaic AI Vector Search. Este enfoque:
- Admite casos de uso de producción con gobernanza y capacidad de descubrimiento
- Usa la función SQL vector_search() en segundo plano
- Admite el seguimiento automático de MLflow.
- Debe alinear la salida de la función con el esquema del recuperador de MLflow mediante el uso de los alias
page_contentymetadata. - Cualquier columna de metadatos adicional debe añadirse a la columna
metadatautilizando la función SQL map, en lugar de como claves de salida de nivel superior.
- Debe alinear la salida de la función con el esquema del recuperador de MLflow mediante el uso de los alias
Ejecute el código siguiente en un cuaderno o editor de SQL para crear la función:
CREATE OR REPLACE FUNCTION main.default.databricks_docs_vector_search (
-- The agent uses this comment to determine how to generate the query string parameter.
query STRING
COMMENT 'The query string for searching Databricks documentation.'
) RETURNS TABLE
-- The agent uses this comment to determine when to call this tool. It describes the types of documents and information contained within the index.
COMMENT 'Executes a search on Databricks documentation to retrieve text documents most relevant to the input query.' RETURN
SELECT
chunked_text as page_content,
map('doc_uri', url, 'chunk_id', chunk_id) as metadata
FROM
vector_search(
-- Specify your Vector Search index name here
index => 'catalog.schema.databricks_docs_index',
query => query,
num_results => 5
)
Para usar esta herramienta de recuperación en el agente de IA, se debe encapsular con UCFunctionToolkit. Esto permite el rastreo automático a través de MLflow generando automáticamente RETRIEVER tipos de span en los registros de MLflow.
from unitycatalog.ai.langchain.toolkit import UCFunctionToolkit
toolkit = UCFunctionToolkit(
function_names=[
"main.default.databricks_docs_vector_search"
]
)
tools = toolkit.tools
Las herramientas de recuperación del catálogo de Unity tienen las siguientes limitaciones:
- Los clientes SQL pueden limitar el número máximo de filas o bytes devueltos. Para evitar el truncamiento de datos, trunca los valores de columna devueltos por la UDF. Por ejemplo, podría usar
substring(chunked_text, 0, 8192)para reducir el tamaño de las columnas de contenido de gran tamaño y evitar el truncamiento de filas durante la ejecución. - Dado que esta herramienta es un contenedor para la
vector_search()función, está sujeta a las mismas limitaciones que lavector_search()función. Consulte Limitaciones.
Para obtener más información sobre UCFunctionToolkit consulte Documentación del catálogo de unidad.
Agregar seguimiento a una herramienta de recuperación
Añada seguimiento MLflow para monitorizar y depurar su recuperador. El seguimiento le permite ver entradas, salidas y metadatos para cada paso de ejecución.
El ejemplo anterior añade el decorador @mlflow.trace a los métodos __call__ y análisis. El decorador crea un intervalo de que se inicia cuando se invoca la función y finaliza cuando la función retorna. MLflow registra automáticamente la entrada y salida de la función y las excepciones generadas.
Nota:
Los usuarios de las bibliotecas LangChain, LlamaIndex y OpenAI pueden usar el registro automático de MLflow, además de definir manualmente las trazas con el decorador. Consulte Adición de seguimientos a aplicaciones: seguimiento automático y manual.
import mlflow
from mlflow.entities import Document
# This code snippet has been truncated for brevity. See the full retriever example above.
class VectorSearchRetriever:
...
# Create a RETRIEVER span. The span name must match the retriever schema name.
@mlflow.trace(span_type="RETRIEVER", name="vector_search")
def __call__(...) -> List[Document]:
...
# Create a PARSER span.
@mlflow.trace(span_type="PARSER")
def parse_results(...) -> List[Document]:
...
Para comprobar que las aplicaciones posteriores, como la Evaluación del Agente y el AI Playground, representen el seguimiento del recuperador correctamente, asegúrese de que el decorador cumple los siguientes requisitos:
- Use el esquema de intervalo del recuperador de MLflow y compruebe que la función devuelve un objeto List[Document].
- El nombre de seguimiento y el
retriever_schemanombre deben coincidir para configurar el seguimiento correctamente. Consulte la siguiente sección para conocer cómo configurar el esquema del sistema de recuperación.
Establecimiento del esquema del recuperador para comprobar la compatibilidad de MLflow
Si el seguimiento devuelto desde el recuperador o span_type="RETRIEVER" no se ajusta al esquema del recuperador estándar de MLflow, debe asignar manualmente el esquema devuelto a MLflow campos esperados. Esto comprueba que MLflow puede realizar un seguimiento correcto del recuperador y representar seguimientos en aplicaciones de bajada.
Para establecer el esquema del recolector manualmente:
Llame a mlflow.models.set_retriever_schema cuando defina su agente. Use
set_retriever_schemapara asignar los nombres de columna de la tabla devuelta a los campos esperados de MLflow, comoprimary_key,text_columnydoc_uri.# Define the retriever's schema by providing your column names mlflow.models.set_retriever_schema( name="vector_search", primary_key="chunk_id", text_column="text_column", doc_uri="doc_uri" # other_columns=["column1", "column2"], )Especifique columnas adicionales en el esquema del recuperador proporcionando una lista de nombres de columna con el
other_columnscampo .Si tiene varios recuperadores, puede definir varios esquemas mediante nombres únicos para cada esquema del recuperador.
El esquema del recuperador establecido durante la creación del agente afecta a las aplicaciones y flujos de trabajo posteriores, como la aplicación de revisión y los conjuntos de evaluación. En concreto, la columna doc_uri actúa como identificador principal para los documentos devueltos por el recuperador.
- La aplicación de revisión ,, muestra el
doc_uripara ayudar a los revisores a evaluar las respuestas y rastrear los orígenes de los documentos. Consulte Revisión de la interfaz de usuario de la aplicación. - Los Conjuntos de evaluación utilizan
doc_uripara comparar los resultados del recuperador con conjuntos de datos de evaluación predefinidos para determinar la exhaustividad y precisión del recuperador. Consulte Conjuntos de evaluación (MLflow 2).
Leer archivos de un volumen de catálogo de Unity
Si el agente necesita leer archivos no estructurados (documentos de texto, informes, archivos de configuración, etc.) almacenados en un volumen de catálogo de Unity, puede crear herramientas que usen la API de archivos del SDK de Databricks para enumerar y leer archivos directamente.
En los ejemplos siguientes se crean dos herramientas que puede usar el agente:
-
list_volume_files: enumera los archivos y directorios del volumen. -
read_volume_file: lee el contenido de un archivo de texto del volumen.
LangChain/LangGraph
Instale la versión más reciente de databricks-langchain que incluye Databricks AI Bridge.
%pip install --upgrade databricks-langchain
from databricks.sdk import WorkspaceClient
from langchain_core.tools import tool
VOLUME = "<catalog>.<schema>.<volume>" # TODO: Replace with your volume
w = WorkspaceClient()
@tool
def list_volume_files(directory: str = "") -> str:
"""Lists files and directories in the Unity Catalog volume.
Provide a relative directory path, or leave empty to list the volume root."""
base = f"/Volumes/{VOLUME.replace('.', '/')}"
path = f"{base}/{directory.lstrip('/')}" if directory else base
entries = []
for f in w.files.list_directory_contents(path):
kind = "dir" if f.is_directory else "file"
size = f" ({f.file_size} bytes)" if not f.is_directory else ""
entries.append(f" [{kind}] {f.name}{size}")
return "\n".join(entries) if entries else "No files found."
@tool
def read_volume_file(file_path: str) -> str:
"""Reads a text file from the Unity Catalog volume.
Provide the path relative to the volume root, for example 'reports/q1_summary.txt'."""
base = f"/Volumes/{VOLUME.replace('.', '/')}"
full_path = f"{base}/{file_path.lstrip('/')}"
resp = w.files.download(full_path)
return resp.contents.read().decode("utf-8")
Enlace las herramientas a un LLM y ejecute un bucle de llamada a herramientas:
from databricks_langchain import ChatDatabricks
from langchain_core.messages import HumanMessage, ToolMessage
llm = ChatDatabricks(endpoint="databricks-claude-sonnet-4-5")
llm_with_tools = llm.bind_tools([list_volume_files, read_volume_file])
messages = [HumanMessage(content="What files are in the volume? Can you read about_databricks.txt and summarize it in 2 sentences?")]
tool_map = {"list_volume_files": list_volume_files, "read_volume_file": read_volume_file}
for _ in range(5): # max iterations
response = llm_with_tools.invoke(messages)
messages.append(response)
if not response.tool_calls:
break
for tc in response.tool_calls:
result = tool_map[tc["name"]].invoke(tc["args"])
messages.append(ToolMessage(content=result, tool_call_id=tc["id"]))
print(response.content)
OpenAI
Instale la versión más reciente de databricks-openai que incluye Databricks AI Bridge.
%pip install --upgrade databricks-openai
from databricks.sdk import WorkspaceClient
from databricks_openai import DatabricksOpenAI
import json
VOLUME = "<catalog>.<schema>.<volume>" # TODO: Replace with your volume
w = WorkspaceClient()
client = DatabricksOpenAI()
# Define the tool specifications
tools = [
{
"type": "function",
"function": {
"name": "list_volume_files",
"description": "Lists files and directories in the Unity Catalog volume. Provide a relative directory path, or leave empty to list the volume root.",
"parameters": {
"type": "object",
"properties": {
"directory": {
"type": "string",
"description": "Relative directory path within the volume. Leave empty for root.",
}
},
"required": [],
},
},
},
{
"type": "function",
"function": {
"name": "read_volume_file",
"description": "Reads a text file from the Unity Catalog volume. Provide the path relative to the volume root, for example 'reports/q4_summary.txt'.",
"parameters": {
"type": "object",
"properties": {
"file_path": {
"type": "string",
"description": "Path to the file relative to the volume root.",
}
},
"required": ["file_path"],
},
},
},
]
def execute_tool(name: str, args: dict) -> str:
base = f"/Volumes/{VOLUME.replace('.', '/')}"
if name == "list_volume_files":
directory = args.get("directory", "")
path = f"{base}/{directory.lstrip('/')}" if directory else base
entries = []
for f in w.files.list_directory_contents(path):
kind = "dir" if f.is_directory else "file"
size = f" ({f.file_size} bytes)" if not f.is_directory else ""
entries.append(f"[{kind}] {f.name}{size}")
return "\n".join(entries) if entries else "No files found."
elif name == "read_volume_file":
full_path = f"{base}/{args['file_path'].lstrip('/')}"
resp = w.files.download(full_path)
return resp.contents.read().decode("utf-8")
return f"Unknown tool: {name}"
# Call the model with tools
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "List the files in the volume, then read about_databricks.txt and summarize it."},
]
response = client.chat.completions.create(
model="databricks-claude-sonnet-4-5", messages=messages, tools=tools
)
# Execute tool calls and send results back
while response.choices[0].finish_reason == "tool_calls":
messages.append(response.choices[0].message)
for tool_call in response.choices[0].message.tool_calls:
args = json.loads(tool_call.function.arguments)
result = execute_tool(tool_call.function.name, args)
messages.append(
{"role": "tool", "tool_call_id": tool_call.id, "content": result}
)
response = client.chat.completions.create(
model="databricks-claude-sonnet-4-5", messages=messages, tools=tools
)
print(response.choices[0].message.content)