Interroger des agents déployés sur Databricks
La manière dont vous query un agent dépend du serveur d’agent qui le dessert. Trouvez votre agent dans le tableau suivant, puis suivez la section correspondante. Pour en savoir plus sur les serveurs d’agent, consultez la section Agent Server.
Votre agent | Hébergé sur | How to query |
|---|---|---|
Runtime d’agent sur Databricks Apps | API d’invocation sur | |
Utilise MLflow | Databricks Apps | client Databricks OpenAI ou OpenAI Responses API sur |
Déployé sur Model Serving (hérité) | Endpoint Model Serving | Databricks OpenAI client, REST API, |
Les agents hébergés sur Databricks Apps nécessitent un jeton OAuth Databricks. Les jetons d'accès personnels ne fonctionnent pas pour Databricks Apps. Pour générer des jetons OAuth à partir d'un script, d'un Service Principal, d'une autre application ou d'un Notebook, consultez Se connecter à une application API Databricks à l'aide de l'authentification par jeton.
Query un agent qui utilise DurableAgentServer
Les agents qui utilisent DurableAgentServer exposent l’API d’invocation. Les agents que vous créez avec le CLI Agent Bricks utilisent DurableAgentServer, et agentbricks deploy les déploie vers Agent Runtime en tant qu’application appelée agent-bricks-<name>. Chaque requête adressée à l’API démarre une exécution de votre agent, appelée invocation.
Point de terminaison | Description |
|---|---|
| start une invocation. Par default, la requête attend et renvoie le résultat. Définissez |
| Renvoie le statut d'une invocation et, une fois celle-ci terminée, son résultat. |
| Diffuse en flux (stream) les événements stockés qui suivent |
Corps de la requête
Le corps de la requête pour POST /api/invocations accepte les champs suivants. Le serveur rejette les requêtes qui contiennent d'autres champs.
Field | Description |
|---|---|
| Obligatoire. Un UUID que vous générez pour chaque appel. Le serveur traite l'ID comme une clé d'idempotence : le renvoi de la même requête avec le même ID renvoie l'invocation existante au lieu de réexécuter l'agent. La réutilisation d'un ID pour une requête différente renvoie une erreur |
| La conversation à laquelle appartient l'invocation. Les invocations qui partagent un ID de session s'exécutent l'une après l'autre, dans l'ordre. Les agents générés à partir des Template de la CLI requièrent ce champ. |
| L’entrée pour votre agent. Les agents générés à partir des Template de la CLI acceptent une liste de messages ou un objet avec une liste |
| Défini sur |
| Définir sur |
Le gestionnaire de votre agent définit la structure de input. Les agents générés à partir des templates de la CLI lisent les champs suivants lorsque input est un objet :
Field | Description |
|---|---|
| Les tours de conversation à envoyer à l'agent. |
| L’identité dont l’agent lit et écrit la mémoire à long terme. Si vous ne transmettez pas d’ |
| Le modèle à utiliser pour cette invocation, à la place du modèle défini dans le code de l'agent. |
| Réponse à un agent qui s'est mis en pause pour obtenir une saisie humaine, telle que l'approbation d'un appel d'outil. Lorsqu'un agent se met en pause, le |
Pour permettre à l'agent de se souvenir de ce qu'il a appris sur un utilisateur d'une session à l'autre, transmettez l'ID de l'utilisateur sous la forme actor:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"session_id": "support-case-123",
"input": {
"messages": [{ "role": "user", "content": "What does Databricks do?" }],
"actor": "user-42"
}
}
- Agent Bricks CLI
- REST API
- Python
Pour tester un agent déployé depuis votre terminal, utilisez agentbricks endpoint invoke. La commande recherche l'application et s'authentifie avec votre profil CLI.
agentbricks --profile <profile> endpoint invoke agent-bricks-<name> \
--path /api/invocations \
--json "{\"id\":\"$(uuidgen)\",\"session_id\":\"$(uuidgen)\",\"input\":[{\"role\":\"user\",\"content\":\"Hello\"}]}"
Pour diffuser la réponse en flux continu, ajoutez "stream":true au corps JSON et transmettez --sse. Pour tester l’agent lorsqu’il s’exécute localement avec agentbricks dev, remplacez le nom de l’application par --url http://localhost:8000.
-
Obtenez l’URL de l’application. Le champ URL dans la sortie est l’URL de base de l’API d’invocations.
Bashagentbricks --profile <profile> deployments get agent-bricks-<name> -
Obtenez un jeton OAuth pour votre profil. La sortie contient le jeton dans le champ
access_token.Bashdatabricks auth token --profile <profile> -
Envoyer une requête :
Bashcurl --request POST \
--url <app-url>/api/invocations \
--header 'Authorization: Bearer <OAuth token>' \
--header 'content-type: application/json' \
--data '{
"id": "550e8400-e29b-41d4-a716-446655440000",
"session_id": "support-case-123",
"input": [{ "role": "user", "content": "What does Databricks do?" }]
}'
The response contains the invocation id, its status, and an output field with the value that your agent returns. The server doesn't require an output schema: your handler can return any JSON-serializable value. Agents generated from the CLI templates return an object with the following fields:
output: les messages que l'agent a produits lors de cette invocation.status:completed, ouinterruptedsi l’agent s’est mis en pause pour permettre une saisie humaine.
L’exemple suivant utilise le SDK Databricks pour rechercher l’URL de l’application et générer un jeton OAuth, puis appelle l’API d’invocations. Le WorkspaceClient doit utiliser l’authentification OAuth.
import uuid
import requests
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
app_url = w.apps.get("agent-bricks-<name>").url
session_id = str(uuid.uuid4())
response = requests.post(
f"{app_url}/api/invocations",
headers=w.config.authenticate(),
json={
"id": str(uuid.uuid4()),
"session_id": session_id,
"input": [{"role": "user", "content": "What does Databricks do?"}],
},
)
response.raise_for_status()
print(response.json()["output"])
Pour poursuivre la conversation, envoyez le message suivant avec le même session_id et un nouveau id.
Stream, exécutez en tâche de fond et reconnectez-vous
- Stream : Set
"stream": true. La réponse est un flux SSE qui inclut les événementsrun.startedetrun.completed(ourun.failed), ainsi que les événements émis par votre agent, tels que les événementsdeltaavec du texte diffusé en continu. Chaque événement a un ID. - Exécuter en arrière-plan : définir
"background": true. Le serveur renvoie une réponse202avec unstatus_url. InterrogerGET /api/invocations/<id>jusqu’à ce que l’état soitcompleted. Si vous définissez également"stream": true, la réponse inclut unevents_urlà partir duquel vous pouvez lire des événements. - Reconnect : If a stream disconnects, call
GET /api/invocations/<id>/events?after=<event-id>with the ID of the last event that you received.
L'exemple Python suivant Stream une réponse :
with requests.post(
f"{app_url}/api/invocations",
headers=w.config.authenticate(),
json={
"id": str(uuid.uuid4()),
"session_id": session_id,
"input": [{"role": "user", "content": "Summarize our last conversation."}],
"stream": True,
},
stream=True,
) as response:
response.raise_for_status()
for line in response.iter_lines(decode_unicode=True):
if line.startswith("data: "):
print(line[len("data: "):])
Si vous déployez l'agent avec plusieurs instances, envoyez l'ID de session dans un en-tête X-Routing-Key pour acheminer toutes les requêtes d'une session vers la même instance.
Query un agent qui utilise le MLflow existant AgentServer
Use this section for agents that you deploy on Databricks Apps with the legacy agent server: the MLflow AgentServer or LongRunningAgentServer, with the ResponsesAgent interface. These agents serve the OpenAI Responses API at /responses.
LongRunningAgentServer serves the same API, so the following examples also apply to it. It also supports background runs: set background to true in the request, and then retrieve the response with GET /responses/<response-id>?stream=true&starting_after=<sequence-number>, which Stream the events after that sequence number.
- Databricks OpenAI client
- REST API
Databricks recommande le client OpenAI Databricks pour ces agents. Incluez le préfixe apps/ dans le nom du modèle.
from databricks.sdk import WorkspaceClient
from databricks_openai import DatabricksOpenAI
input_msgs = [{"role": "user", "content": "What does Databricks do?"}]
app_name = "<agent-app-name>"
# The WorkspaceClient must use OAuth authentication.
w = WorkspaceClient()
client = DatabricksOpenAI(workspace_client=w)
# Non-streaming request
response = client.responses.create(model=f"apps/{app_name}", input=input_msgs)
print(response)
# Streaming request
streaming_response = client.responses.create(
model=f"apps/{app_name}", input=input_msgs, stream=True
)
for chunk in streaming_response:
print(chunk)
To pass custom_inputs, use the extra_body parameter :
response = client.responses.create(
model=f"apps/{app_name}",
input=input_msgs,
extra_body={"custom_inputs": {"id": 5}},
)
Pour obtenir l'ID de trace d'une requête, incluez l'en-tête x-mlflow-return-trace-id. Utilisez ensuite MLflow get_trace pour récupérer la trace complète.
response = client.responses.create(
model=f"apps/{app_name}",
input=input_msgs,
extra_headers={"x-mlflow-return-trace-id": "true"},
)
trace_id = response.metadata["trace_id"]
trace = client.get_trace(trace_id)
Envoyez des requêtes au chemin d’accès /responses de l’URL de l’application. Le corps de la requête suit l’OpenAI Responses API, vous pouvez donc utiliser n’importe quel client ou outil HTTP prenant en charge cette API.
curl --request POST \
--url <app-url>/responses \
--header 'Authorization: Bearer <OAuth token>' \
--header 'content-type: application/json' \
--data '{
"input": [{ "role": "user", "content": "hi" }],
"stream": true
}'
Pour transmettre custom_inputs, ajoutez-les au corps de la requête :
curl --request POST \
--url <app-url>/responses \
--header 'Authorization: Bearer <OAuth token>' \
--header 'content-type: application/json' \
--data '{
"input": [{ "role": "user", "content": "hi" }],
"custom_inputs": { "id": 5 }
}'
Pour obtenir l’ID de trace, incluez l’en-tête x-mlflow-return-trace-id: true. Le corps de la réponse inclut l’ID de trace dans un champ metadata.trace_id. Pour les requêtes en streaming, l’ID de trace arrive sous la forme d’un événement SSE distinct (data: {"trace_id": "tr-..."}) vers la fin du flux.
Query un agent hérité sur Model Serving
Utilisez cette section pour les agents hérités déployés sur des Endpoint Model Serving. Vous pouvez vous authentifier avec un jeton OAuth Databricks ou un jeton d’accès personnel. Pour déplacer ces agents vers Databricks Apps, consultez Migrer un agent de Model Serving vers Databricks Apps.
- Databricks OpenAI client
- REST API
- AI Playground
- SQL with
Pour les agents qui utilisent l’interface ResponsesAgent, appelez responses.create en spécifiant le nom de l’Endpoint comme modèle :
from databricks_openai import DatabricksOpenAI
input_msgs = [{"role": "user", "content": "What does Databricks do?"}]
endpoint = "<agent-endpoint-name>"
client = DatabricksOpenAI()
# Non-streaming request. Calls predict.
response = client.responses.create(model=endpoint, input=input_msgs)
print(response)
# Streaming request. Calls predict_stream.
streaming_response = client.responses.create(model=endpoint, input=input_msgs, stream=True)
for chunk in streaming_response:
print(chunk)
Pour les agents qui utilisent les interfaces héritées ChatAgent ou ChatModel, utilisez le client de complétion de chat :
from databricks.sdk import WorkspaceClient
messages = [{"role": "user", "content": "What does Databricks do?"}]
endpoint = "<agent-endpoint-name>"
client = WorkspaceClient().serving_endpoints.get_open_ai_client()
response = client.chat.completions.create(model=endpoint, messages=messages)
print(response)
With either client, pass custom_inputs or databricks_options through the extra_body parameter. Par exemple, extra_body={"databricks_options": {"return_trace": True}} renvoie la trace avec la réponse.
For agents that use the ResponsesAgent interface, send a request to /serving-endpoints/responses with the endpoint name as the model:
curl --request POST \
--url https://<workspace-url>/serving-endpoints/responses \
--header 'Authorization: Bearer <token>' \
--header 'content-type: application/json' \
--data '{
"model": "<agent-endpoint-name>",
"input": [{ "role": "user", "content": "hi" }],
"stream": true
}'
Pour les agents qui utilisent les interfaces ChatAgent ou ChatModel, envoyez une requête à /serving-endpoints/chat/completions avec une liste messages au lieu de input. Pour transmettre custom_inputs ou databricks_options, ajoutez-les au corps de la requête. Vous pouvez également envoyer des requêtes à l’URL /serving-endpoints/<agent-endpoint-name>/invocations de l’endpoint. Consultez Query des modèles individuels derrière un endpoint.
Pour discuter avec un agent sur Model Serving sans écrire de code, ouvrez AI Playground et sélectionnez l'endpoint de service de l'agent. Pour transmettre custom_inputs à l'agent depuis AI Playground, consultez Provide custom_inputs in the AI Playground and review app.
Utilisez ai_query pour query un agent sur Model Serving à partir de SQL. Reportez-vous à la fonctionai_query pour connaître la syntaxe et les parameter.
SELECT ai_query(
"<agent-endpoint-name>", question
) FROM (VALUES ('what is MLflow?'), ('how does MLflow work?')) AS t(question);
Ressources supplémentaires
- Serveur d'agent
- Runtime d’agent
- Paramétrez le monitoring de la production
- Query foundation and embedding models: query foundation models and other models directly, instead of an agent.