Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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>') );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 belgeyemetadatavedoc_urigibi ek öznitelikler eklemek için Document sınıfındakisimilarity_scorealanı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 docsRetriever'ı ç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ına
page_contentvemetadatadiğer adlarını kullanarak hizalamanız gerekir. - Tüm ek meta veri sütunları, en üst düzey çıkış anahtarları yerine
metadatakullanılarak sütuna eklenmelidir.
- Fonksiyonun çıktısını MLflow retriever şemasına
İş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_schemaadı 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:
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_schemakullanarak, MLflow'un beklediğiprimary_key,text_columnvedoc_urigibi 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"], )Retriever'ınızın şemasında ek sütunlar belirtmek için sütun adlarının listesini
other_columnsalanıyla sağlayın.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_urigö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)