Aracıları yapılandırılmamış verilere bağlama

Yapay zeka aracılarının soruları yanıtlamak ve bağlama duyarlı yanıtlar sağlamak için genellikle belge koleksiyonları, bilgi bankaları veya metin corpora gibi yapılandırılmamış verileri sorgulaması gerekir.

Databricks, AI Search dizinlerinde ve dış vektör depolarında aracıları yapılandırılmamış verilere bağlamak için birden çok yaklaşım sağlar. Databricks AI Search dizinlerine anında erişmek, AI Bridge paketleriyle yerel olarak retriever araçları geliştirmek veya özel iş akışları için özel retriever işlevleri oluşturmak için önceden yapılandırılmış MCP sunucularını kullanın.

Databricks AI Search eskiden Databricks Vektör Arama olarak biliniyordu. Eski /api/2.0/mcp/vector-search/ URL ön eki geriye dönük uyumluluk için çalışmaya devam eder.

MCP kullanarak Databricks AI Arama dizinini sorgulama

Databricks tarafından yönetilen AI Search MCP sunucusunu kullanarak aracınıza Databricks AI Search dizinine erişim izni verin. İlk olarak, Databricks tarafından yönetilen eklemeleri kullanarak bir dizin oluşturun. Bkz. Yapay Zeka Arama uç noktaları ve dizinleri oluşturma.

Yapay Zeka Araması için yönetilen MCP URL'si şeklindedir https://<workspace-hostname>/api/2.0/mcp/ai-search/{catalog}/{schema}/{index_name}. Ona bağlanın ve sunduğu araçları listeleyin:

from databricks.sdk import WorkspaceClient
from databricks_mcp import DatabricksMCPClient

workspace_client = WorkspaceClient()
host = workspace_client.config.host

mcp_client = DatabricksMCPClient(
    server_url=f"{host}/api/2.0/mcp/ai-search/<catalog>/<schema>/<index-name>",
    workspace_client=workspace_client,
)
tools = mcp_client.list_tools()

Bu sunucuyu kullanan bir aracı oluşturmak ve dağıtmak için bkz. Aracılarda MCP sunucularını kullanma. Dizininin Unity Kataloğu'nda aracıya SELECT güvenli hale getirilebilir verin.

Diğer yaklaşımlar

Databricks dışında bir vektör arama dizinini sorgulama

Databricks dışında barındırılan bir vektör arama dizinini sorgulama

Vektör dizininiz Azure Databricks dışında barındırılıyorsa, dış hizmete bağlanmak ve aracı kodunuzda bağlantıyı kullanmak için bir Unity Kataloğu bağlantısı oluşturabilirsiniz. Bkz. MCP Hizmetleri ile aracıları üçüncü taraf araçlara bağlama.

Aşağıdaki örnek, PyFunc özellikli bir aracı için Databricks dışında barındırılan bir vektör dizinini çağıran bir retriever oluşturur.

  1. Dış hizmete (bu örnekte Azure) bir Unity Kataloğu Bağlantısı oluşturun.

    CREATE CONNECTION ${connection_name}
    TYPE HTTP
    OPTIONS (
      host 'https://example.search.windows.net',
      base_path '/',
      bearer_token secret ('<secret-scope>','<secret-key>')
    );
    
  2. Unity Kataloğu bağlantısını kullanarak ajan kodunda retriever aracını tanımlayın. Bu örnekte aracı izlemeyi etkinleştirmek için MLflow dekoratörleri kullanılır.

    Note

    MLflow retriever şemasına uyum sağlamak için, retriever fonksiyonu bir List[Document] nesnesi döndürmeli ve döndürülen belgeye metadata ve doc_uri gibi ek öznitelikler eklemek için Document sınıfındaki similarity_score alanını kullanmalıdır. Bkz. MLflow Belgesi.

    import mlflow
    import json
    
    from mlflow.entities import Document
    from typing import List, Dict, Any
    from dataclasses import asdict
    
    class VectorSearchRetriever:
      """
      Class using Databricks AI 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 docs
    
  3. Retriever'ı çalıştırmak için aşağıdaki Python kodunu çalıştırın.

    retriever = VectorSearchRetriever()
    query = [0.01944167, 0.0040178085 . . .  TRIMMED FOR BREVITY 010858015, -0.017496133]
    results = retriever(query, score_threshold=0.1)
    
Yerel bir retriever geliştir

AI Köprüsünü kullanarak yerel olarak bir retriever geliştirin

Bir Databricks AI Search geri getirici aracını yerel ortamda oluşturmak için, Databricks AI Bridge paketlerini, örneğin databricks-langchain ve databricks-openai kullanın. Bu paketler, from_vector_search ve from_uc_function gibi yardımcı işlevleri içerir ve bu işlevler mevcut Databricks kaynaklarından retriever'lar oluşturmak için kullanılabilir.

LangChain/LangGraph

Databricks AI Köprüsü'nü içeren en son databricks-langchain sürümünü yükleyin.

%pip install --upgrade databricks-langchain

Aşağıdaki kod, varsayımsal bir vektör arama dizinini sorgulayan ve araç çağırma davranışını test edebilmeniz için bunu yerel olarak bir LLM'ye bağlayan bir retriever aracının prototipini oluşturur.

Aracının aracıyı anlamasına ve ne zaman çağırılacağını belirlemesine yardımcı olacak bir açıklayıcı tool_description sağlayın.

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?")

Kendi kendine yönetilen eklemeleri kullanarak doğrudan erişim dizinleri veya Delta Sync dizinleri kullanan senaryolar için, VectorSearchRetrieverTool yapılandırmanız, özel bir ekleme modeli ile metin sütununu belirtmeniz gerekir. Eklemeleri sağlama seçeneklerine bakın.

Aşağıdaki örnek, bir VectorSearchRetrieverTool'yi columns ve embedding anahtarlarıyla nasıl yapılandırabileceğinizi göstermektedir.

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.
)

Ek ayrıntılar için api VectorSearchRetrieverTool bakın.

OpenAI

Databricks AI Köprüsü'nü içeren en son databricks-openai sürümünü yükleyin.

%pip install --upgrade databricks-openai

Aşağıdaki kod, varsayımsal bir vektör arama dizinini sorgulayan ve OpenAI'nin GPT modelleriyle tümleştiren bir retriever prototipi oluşturur.

Aracının aracıyı anlamasına ve ne zaman çağırılacağını belirlemesine yardımcı olacak bir açıklayıcı tool_description sağlayın.

Araçlar için OpenAI önerileri hakkında daha fazla bilgi için OpenAI İşlev Çağrısı belgelerine bakın.

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]
)

Kendi kendine yönetilen eklemeleri kullanarak doğrudan erişim dizinleri veya Delta Sync dizinleri kullanan senaryolar için, VectorSearchRetrieverTool yapılandırmanız, özel bir ekleme modeli ile metin sütununu belirtmeniz gerekir. Eklemeleri sağlama seçeneklerine bakın.

Aşağıdaki örnek, bir VectorSearchRetrieverTool'yi columns ve embedding anahtarlarıyla nasıl yapılandırabileceğinizi göstermektedir.

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.
)

Ek ayrıntılar için api VectorSearchRetrieverTool bakın.

Yerel aracınız hazır olduktan sonra, doğrudan ajan kodunuzun bir parçası olarak üretime alabilir veya daha iyi bulunabilirlik ve idare sağlayan ancak belirli sınırlamaları olan Unity Catalog işlevine geçirebilirsiniz.

UC işlevlerini kullanarak Databricks AI Arama'yı sorgulama (kullanım dışı)

UC işlevlerini kullanarak Databricks AI Arama'yı sorgulama (kullanım dışı)

Note

Databricks, çoğu aracın aracı için MCP sunucularını önerir, ancak Unity Catalog işlevleriyle araçları tanımlamak, prototip oluşturma için kullanılabilir olmaya devam eder.

AI Search dizin sorgusunu sarmalayan bir Unity Kataloğu işlevi oluşturabilirsiniz. Bu yaklaşım:

  • İdare ve bulunabilirlik ile üretim kullanım örneklerini destekler
  • Arka planda vector_search() SQL işlevini kullanır
  • Otomatik MLflow izlemeyi destekler
    • Fonksiyonun çıktısını MLflow retriever şemasınapage_content ve metadata diğer adlarını kullanarak hizalamanız gerekir.
    • Tüm ek meta veri sütunları, en üst düzey çıkış anahtarları yerine metadata kullanılarak sütuna eklenmelidir.

İşlevi oluşturmak için not defterinde veya SQL düzenleyicisinde aşağıdaki kodu çalıştırı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 AI Search index name here
    index => 'catalog.schema.databricks_docs_index',
    query => query,
    num_results => 5
  )

Bu retriever aracını yapay zeka aracınızda kullanmak için UCFunctionToolkit ile sarın. Bu, MLflow günlüklerinde otomatik olarak uzunluk türleri oluşturarak otomatik izlemeyi MLflow üzerinden etkinleştirir.

from unitycatalog.ai.langchain.toolkit import UCFunctionToolkit

toolkit = UCFunctionToolkit(
    function_names=[
        "main.default.databricks_docs_vector_search"
    ]
)
tools = toolkit.tools

Unity Catalog retriever araçları aşağıdaki uyarılara sahiptir:

  • SQL istemcileri, döndürülen en fazla satır veya bayt sayısını sınırlayabilir. Veri kesilmesini önlemek için UDF tarafından döndürülen sütun değerlerini kırpın. Örneğin, büyük içerik sütunlarının boyutunu küçültmek ve yürütme sırasında satır kesilmesini önlemek için substring(chunked_text, 0, 8192) kullanabilirsiniz.
  • vector_search() işlevi için bir sarmalayıcı olduğundan, bu araç vector_search() işleviyle aynı sınırlamalara tabidir. Bkz. Sınırlamalar.

Unity Kataloğu belgeleri hakkında UCFunctionToolkit daha fazla bilgi için bkz. Unity Kataloğu belgeleri.

Bir bilgi alma aracına izleme ekle

Retriever'ınızı izlemek ve hatalarını ayıklamak için MLflow izlemesi ekleyin. İzleme, yürütmenin her adımı için girişleri, çıkışları ve meta verileri görüntülemenizi sağlar.

Önceki örnek, ve ayrıştırma yöntemlerine __call__ ekliyor. Dekoratör, işlev çağrıldığında başlayan ve döndüğünde sona eren bir aralık oluşturur. MLflow, işlevin giriş ve çıkışını ve oluşan özel durumları otomatik olarak kaydeder.

Note

LangChain, LlamaIndex ve OpenAI kitaplığı kullanıcıları, izlemeleri dekoratörle el ile tanımlamanın yanı sıra MLflow otomatik kaydetmeyi de kullanabilir. Bkz . Uygulamalara izleme ekleme: otomatik ve el ile izleme.

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]:
    ...

Ajan Değerlendirmesi ve AI Playground gibi aşağı akış uygulamalarının retriever izini doğru şekilde işlemesini doğrulamak için, dekoratörün aşağıdaki gereksinimleri karşıladığından emin olun.

  • MLflow retriever span şemasını kullanın ve işlevin List[Document] nesnesi döndürdüğünden emin olun.
  • İzlemeyi doğru yapılandırmak için izleme adı ve retriever_schema adı eşleşmelidir. Retriever şemasını ayarlamayı öğrenmek için aşağıdaki bölüme bakın.

MLflow uyumluluğunu doğrulamak için retriever şemasını ayarlama

Retriever'dan döndürülen izleme veya span_type="RETRIEVER"MLflow'un standart retriever şemasına uymuyorsa, döndürülen şemayı MLflow'un beklenen alanlarına el ile eşlemeniz gerekir. Bu, MLflow'un geri getiricinizi düzgün bir şekilde izleyebildiğini ve aşağı akış uygulamalarında izleri gösterebildiğini doğrular.

Retriever şemasını el ile ayarlamak için:

  1. Aracınızı tanımlarken mlflow.models.set_retriever_schema çağırın. Sonuç olarak döndürülen tablodaki sütun adlarını set_retriever_schema kullanarak, MLflow'un beklediği primary_key, text_column ve doc_uri gibi alanlarla eşleştirin.

    # 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"],
    )
    
  2. Retriever'ınızın şemasında ek sütunlar belirtmek için sütun adlarının listesini other_columns alanıyla sağlayın.

  3. Birden çok alıcınız varsa, her bir alıcı şeması için benzersiz adlar kullanarak birden çok şema tanımlayabilirsiniz.

Aracı oluşturma sırasında ayarlanan retriever şeması, gözden geçirme uygulaması ve değerlendirme kümeleri gibi aşağı akış uygulamalarını ve iş akışlarını etkiler. Özellikle, doc_uri sütunu, retriever tarafından döndürülen belgeler için birincil tanımlayıcı görevi görür.

  • Gözden geçirme uygulaması, gözden geçirenlerin yanıtları değerlendirmesine ve belgelerin kaynağını izlemesine yardımcı olmak için doc_uri görüntüler. Bkz. Uygulama kullanıcı arabirimini gözden geçirme.
  • Değerlendirme kümeleri, retriever sonuçlarını önceden tanımlanmış değerlendirme veri setleriyle karşılaştırarak retriever'ın geri çağırma ve kesinliğini belirlemek için kullanılır doc_uri. Bkz . Değerlendirme kümeleri (MLflow 2).

Unity Kataloğu biriminden dosyaları okuma

Aracınızın Unity Kataloğu biriminde depolanan yapılandırılmamış dosyaları (metin belgeleri, raporlar, yapılandırma dosyaları vb.) okuması gerekiyorsa, dosyaları doğrudan listelemek ve okumak için Databricks SDK Dosyaları API'sini kullanan araçlar oluşturabilirsiniz.

Aşağıdaki örnekler, ajanınızın kullanabileceği iki araç oluşturur.

  • list_volume_files: Birimdeki dosyaları ve dizinleri listeler.
  • read_volume_file: Birimdeki metin dosyasının içeriğini okur.

LangChain/LangGraph

Databricks AI Köprüsü'nü içeren en son databricks-langchain sürümünü yükleyin.

%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")

Araçları bir LLM'ye bağlayın ve bir araç çağırma döngüsü çalıştırın:

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

Databricks AI Köprüsü'nü içeren en son databricks-openai sürümünü yükleyin.

%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)