Cortex Agents REST API¶
Verwenden Sie diese API, um die Erstellung einer interaktiven Chat-Anwendung zu vereinfachen.
Agent ausführen¶
POST <account_url>/api/v2/cortex/agent:run
Sendet eine Abfrage eines Benutzers an den im Anfrage-Body angegebenen Cortex Agents-Dienst und gibt dessen Antwort zurück.
Anfrage¶
Pfadparameter¶
Parameter |
Beschreibung |
|---|---|
|
(Erforderlich) Ihre Snowflake-Konto-URL. Anweisungen zum Auffinden Ihrer Konto-URL finden Sie unter Suchen von Organisations- und Kontonamen eines Kontos. |
Header der Anforderung¶
Header |
Beschreibung |
|---|---|
|
(Erforderliche) Autorisierungstoken. Weitere Informationen dazu finden Sie unter Konfigurieren Sie RESTAPI-Authentifizierung. |
|
(Erforderlich) Anwendung/json |
Anforderungstext¶
Der Anfrage-Body enthält das Modell, die Antwortanweisung, experimentelle Felder, Tools, Tool-Ressourcen und Nachrichten.
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
Der Name des Modells, das der Agent verwendet, um eine Antwort zu erzeugen. Eine Liste der unterstützten Modelle finden Sie unter Unterstützte Modelle. |
|
string |
Die Anweisungen, denen das Modell folgt, wenn es die Antwort erzeugt. |
|
Objekt |
Experimentelle Flaggen, die an den Agenten übergeben werden. |
|
Array |
Eine Reihe von Tool-Spezifikationen, die dem Agenten zur Verfügung stehen. |
|
Objekt |
Von den Tools benötigte Ressourcen. |
|
Objekt |
Die Konfiguration, mit der Sie das Tool auswählen. |
|
Array |
Array von Nachrichten in der Konversation. |
Antwortanweisung¶
Das Feld response_instruction ist eine Zeichenfolge, die dem Modell Anweisungen für die Erstellung von Antworten gibt.
Tool-Konfiguration¶
Dieser Abschnitt beschreibt die unterstützten Tool-Typen, ihre Konfigurationsoptionen und wie Sie die erforderlichen Ressourcen für jedes Tool angeben.
Tool-Spezifikationen¶
Das Feld tools enthält eine Reihe von verfügbaren Tools:
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
Der Typ des Tools. Eine Kombination aus Typ und Name ist ein eindeutiger Bezeichner. |
|
string |
Der Name des Tools. Eine Kombination aus Typ und Name ist ein eindeutiger Bezeichner. |
Zu den unterstützten Werten von tool_spec.type gehören die folgenden:
cortex_search: Wird für die Cortex-Suchfunktionalität verwendetcortex_analyst_text_to_sql: Verwendet für Cortex Analyst Text-zu-SQLsql_exec: Wird für die Ausführung von SQL-Abfragen verwendet. Sie sind dafür verantwortlich, die SQL-Abfrage auszuführen und die Ergebnisse als Tool-Ergebnisse bereitzustellen. Weitere Einzelheiten finden Sie unter Beispielantworten anfordern unten.data_to_chart: Für die Erstellung von Diagrammen
Tool-Ressourcen¶
Das Objekt tool_resources bietet Konfigurationsobjekte für jedes Tool.
tool_resources: {
"toolName1": {configuration object for toolName1},
"toolName2": {configuration object for toolName2},
// ...
}
Die Konfiguration für jeden Tool-Typ wird im Folgenden beschrieben.
cortex_searchDas Objekt
SearchNameenthält die Konfiguration für ein Cortex Search-Tool."SearchName": { // Required: The Snowflake search service identifier "name": "database.schema.service_name", // Optional: Number of search results to include "max_results": 5, // Optional: Column to use as document title "title_column": "title", // Optional: Column to use as document identifier "id_column": "id", // Optional: Filters to apply to search results (such as @eq for equality) "filter": { "@eq": {"<column>": "<value>"} } }
cortex_analyst_text_to_sqlDas Objekt
AnalystNameenthält die Konfiguration für ein Cortex Analyst Text-zu-SQL-Tool. Die Konfiguration muss das zu verwendende semantische Modell oder die Ansicht enthalten. Beispiel:"AnalystName": { // Stage path to semantic model file in `semantic_model_file` "semantic_model_file": "@database.schema.stage/my_semantic_model.yaml" }
oder mit Überblick über die semantischen Ansichten
"AnalystName": { // Fully qualified name of the semantic view object "semantic_view": "database.schema.semantic_view" }
Tool-Auswahl¶
Das Feld tool_choice konfiguriert die Verhaltensweise der Tool-Auswahl.
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
Wie Tools ausgewählt werden sollten. Gültige Werte:
|
|
Array |
Optionales Array der zu verwendenden Tool-Namen. Nur gültig, wenn |
Nachrichten¶
Das Array messages enthält den Gesprächsverlauf zwischen dem Benutzer und dem Assistenten:
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
Die Rolle des Absenders der Nachricht. Gültige Werte:
|
|
Array |
Array von Inhaltselementen, aus denen die Nachricht besteht. |
Struktur des Nachrichteninhalts¶
Das Array content jeder Nachricht kann mehrere Inhaltselemente mit unterschiedlichen Typen enthalten.
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
Der Inhaltstyp. Gültige Werte:
|
- Textinhalt
Wenn
type"text"ist:Feld
Typ
Beschreibung
messages[].content[].textstring
Der Textinhalt der Nachricht.
Beispiel:
{ "type": "text", "text": "Show me sales by region for Q1 2024" }
- Diagramminhalt
Wenn
type„Diagramm“ ist:Feld
Typ
Beschreibung
messages[].content[].chartObjekt
Der Diagramminhalt der Nachricht.
messages[].content[].chart.chart_specstring
Diagramm als Vega-Lite Spezifikation.
Beispiel:
{ "type": "chart", "chart": { "chart_spec": "{\"$schema\":\"https://vega.github.io/schema/vega-lite/v5.json\",\"data\":{\"values\":[{\"REGION\":\"NORTH_AMERICA\",\"SUM(SALES)\":\"2000.00\"},{\"REGION\":\"EUROPE\",\"SUM(SALES)\":\"1700.00\"},{\"REGION\":\"SAUTH_AMERICA\",\"SUM(SALES)\":\"1500.00\"}]},\"encoding\":{\"x\":{\"field\":\"REGION\",\"sort\":null,\"type\":\"nominal\"},\"y\":{\"field\":\"SUM(SALES)\",\"sort\":null,\"type\":\"quantitative\"}},\"mark\":\"bar\"}", } }
- Tabelleninhalt
Wenn
type„Tabelle“ ist:Feld
Typ
Beschreibung
messages[].content[].tableObjekt
Der Tabelleninhalt der Nachricht.
messages[].content[].table.query_idstring
Die ID der ausgeführten Abfrage.
Beispiel:
{ "type": "table", "table": { "query_id": "01bbff92-0304-c8c7-0022-b7869a076c22" } }
- Tool-Verwendung
Wenn
type„tool_use“ ist:Feld
Typ
Beschreibung
messages[].content[].tool_useObjekt
Container für Details der Anfrage zur Tool-Verwendung.
messages[].content[].tool_use.tool_use_idstring
Eindeutiger Bezeichner für diese Anfrage zur Tool-Verwendung.
messages[].content[].tool_use.namestring
Name des auszuführenden Tools. Muss mit einem Tool-Namen aus dem Tools-Array übereinstimmen.
messages[].content[].tool_use.inputObjekt
Eingabeparameter für die Ausführung des Tools.
Beispiel:
{ "type": "tool_use", "tool_use": { "tool_use_id": "tu_01", "name": "Analyst1", "input": { "query": "Show me sales by region for Q1 2024" } } }
- Tool-Ergebnisse
Wenn
type"tool_results"ist:Feld
Typ
Beschreibung
messages[].content[].tool_resultsObjekt
Container für Ausführungsergebnisse und Metadaten des Tools.
messages[].content[].tool_results.tool_use_idstring
Verweist auf die tool_use_id, die diese Ergebnisse erzeugt hat.
messages[].content[].tool_results.namestring
Name des Tools, das ausgeführt wurde. Muss mit einem Tool-Namen aus dem Tools-Array übereinstimmen.
messages[].content[].tool_results.statusstring
Tool-Ausführungsstatus.
Gültige Werte:
"success""error"
messages[].content[].tool_results.contentArray
Array von Inhaltselementen, die durch die Ausführung des Tools erzeugt werden.
Kann Elemente der folgenden Typen enthalten:
Typ
Felder
Beschreibung
texttype: "text"text: stringVom Tool zurückgegebener Inhalt im Klartext.
jsontype: "json"json: objectStrukturierte JSON-Daten, die von dem Tool zurückgegeben werden.
Beispiel:
{ "type": "tool_results", "tool_results": { "tool_use_id": "tu_01", "status": "success", "content": [ { "type": "json", "json": { "sql": "SELECT region, SUM(sales) FROM sales_data WHERE quarter='Q1' AND year=2024 GROUP BY region" "text": "This is our interpretation of your question: Show me sales by region for Q1 2024. We have generated the following SQL query for you: SELECT region, SUM(sales) FROM sales_data WHERE quarter='Q1' AND year=2024 GROUP BY region" } } ] } }
Beispiel für eine vollständige Nachricht¶
Dieses Beispiel zeigt eine vollständige Nachricht mit einer Abfrage des Benutzers (role ist user) und einer Antwort (role ist assistant). Die Antwort enthält ein Ereignis für Tool-Verwendung für ein Tools mit dem Namen Analyst1 und ein Tool-Ereignis für die Ergebnisse desselben Tools.
{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Show me sales by region for Q1 2024"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "tool_use",
"tool_use": {
"tool_use_id": "tu_01",
"name": "Analyst1",
"input": {
"query": "Show me sales by region for Q1 2024"
}
}
},
{
"type": "tool_results",
"tool_results": {
"tool_use_id": "tu_01",
"name": "Analyst1",
"status": "success",
"content": [
{
"type": "json",
"json": {
"sql": "SELECT region, SUM(sales) FROM sales_data WHERE quarter='Q1' AND year=2024 GROUP BY region"
"text": "This is our interpretation of your question: Show me sales by region for Q1 2024. We have generated the following SQL query for you: SELECT region, SUM(sales) FROM sales_data WHERE quarter='Q1' AND year=2024 GROUP BY region"
}
}
]
}
}
]
}
]
}
Antwort¶
Beim Streaming wird jedes Ereignis im Format vom Server gesendete Ereignisse (SSE) mit den folgenden primären Mustern empfangen:
Inkrementelle
message.delta-Ereignisse für Blöcke der Ausgabeerror-Ereignisse, wenn etwas schief geht.
message.delta-Ereignis¶
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
|
|
Objekt |
Enthält inkrementelle Aktualisierungsdaten. |
|
string |
Eindeutiger Bezeichner für die Nachricht. |
|
string |
|
|
Array |
Eine Liste von Blöcken oder Teilsegmenten von Nachrichten. |
|
Ganzzahl |
Die Position dieses Blocks innerhalb der aktuellen Nachricht. |
|
string |
Inhaltstyp. Gültige Werte:
|
|
string |
Wenn |
|
Objekt |
Wenn |
|
string |
Diagramm als Vega-Lite Spezifikation. |
|
Objekt |
Wenn |
|
string |
Die ID der ausgeführten Abfrage. |
|
Objekt |
Wenn |
|
string |
Der eindeutige Bezeichner für den Aufruf des Tools. |
|
string |
Der Name des aufzurufenden Tools. |
|
Objekt |
JSON-Nutzlast für das Tool. |
|
Objekt |
Wenn |
|
string |
Der eindeutige Bezeichner für die Ausgabe des Tools. |
|
string |
Der Ausführungsstatus des Tools. Gültige Werte:
|
|
Array |
Eine Liste von Elementen, die die vom Tool zurückgegebenen Daten beschreiben. |
|
string |
Der Typ des vom Tool zurückgegebenen Inhalts. Gültige Werte:
|
|
Objekt |
Wenn |
|
string |
Falls |
error-Ereignis¶
Feld |
Typ |
Beschreibung |
|---|---|---|
|
string |
|
|
Objekt |
Enthält Fehlerdetails. |
|
string |
Der Snowflake-Fehlercode. Zum Beispiel |
|
string |
Eine Beschreibung dessen, was schief gelaufen ist. Zum Beispiel |
Beispielhafter Gesprächsverlauf¶
Dieser Abschnitt zeigt einen beispielhaften Gesprächsablauf zwischen einem Benutzer und einem Assistenten unter Verwendung der Cortex Agents REST API.
Beispielanfrage¶
{
"model": "llama3.3-70b",
"response_instruction": "You will always maintain a friendly tone and provide concise response.",
"experimental": {},
"tools": [
{
"tool_spec": {
"type": "cortex_analyst_text_to_sql",
"name": "Analyst1"
}
},
{
"tool_spec": {
"type": "cortex_analyst_text_to_sql",
"name": "Analyst2"
}
},
{
"tool_spec": {
"type": "sql_exec",
"name": "sql_execution_tool"
}
},
{
"tool_spec": {
"type": "data_to_chart",
"name": "data_to_chart"
}
},
{
"tool_spec": {
"type": "cortex_search",
"name": "Search1"
}
}
],
"tool_resources": {
"Analyst1": { "semantic_model_file": "stage1"},
"Analyst2": { "semantic_model_file": "stage2"},
"Search1": {
"name": "db.schema.service_name",
"filter": {"@eq": {"region": "North America"} }
}
},
"tool_choice": {
"type": "auto"
},
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What are the top three customers by revenue?"
}
]
}
]
}
Beispielantwort¶
{
"id": "msg_001",
"object": "message.delta",
"delta": {
"content": [
{
"index": 0,
"type": "tool_use",
"tool_use": {
"tool_use_id": "toolu_XXXXXX",
"name": "analyst1",
"input": {
"messages": [
"role:USER content:{text:{text:\"What are the top three customers by revenue?\"}}"
],
"model": "snowflake-hosted-semantic",
"experimental": ""
}
}
},
{
"index": 0,
"type": "tool_results",
"tool_results": {
"tool_use_id": "toolu_XXXXXX",
"content": [
{
"type": "json",
"json": {
"suggestions": [],
"sql": "WITH __customers AS (\n SELECT\n customer_id,\n revenue\n FROM user_database.user_schema.user_table\n)\nSELECT\n customer_id, revenue FROM __customers ORDER BY revenue DESC LIMIT 3\n -- Generated by Cortex Analyst\n;",
"text": "This is our interpretation of your question:\n\n__What are the top three customers by revenue?\n\n"
}
}
],
"status": "success"
}
},
{
"type": "tool_use",
"tool_use": {
"tool_use_id": "tool_002",
"name": "sql_execution_tool",
"input": {
"sql": "WITH __customers AS (SELECT customer_id, revenue FROM user_database.user_schema.user_table) SELECT customer_id, revenue FROM __customers ORDER BY revenue DESC LIMIT 3"
}
}
}
]
}
}
Anfrage von Beispielantworten¶
Cortex Agents kann auf der Grundlage ausgeführter SQL-Abfragen Text- und Diagrammantworten generieren. Das folgende Beispiel zeigt, wie Sie die Cortex Agents API verwenden, um solche Antworten zu generieren.
Um die Antworten zu erhalten, stellt der Client eine Folgeanfrage an die Cortex-Agenten API mit der query_id der SQL, die auf der Client-Seite ausgeführt wird. Das auszuführende SQL wird im Ereignis tool_use des Tool-Typs sql_exec in der letzten Antwortnachricht angegeben.
Anfragen müssen die Tools cortex_analyst_text_to_sql und sql_exec verwenden, um die textuelle Antwort zu erhalten, und darüber hinaus das Tool data_to_chart, um die Diagrammantwort zu erhalten. Diagramme werden nur zurückgegeben, wenn der Agent entscheidet, dass Diagramme eine gute Möglichkeit sind, die Antwort zu präsentieren.
Bemerkung
Für Resultsets mit mehr als 4000 Zellen wird anstelle der Antworten text und chart eine Antwort table zurückgegeben.
{
"model": "llama3.3-70b",
"response_instruction": "You will always maintain a friendly tone and provide concise response.",
"experimental": {},
"tools": [
{
"tool_spec": {
"type": "cortex_analyst_text_to_sql",
"name": "Analyst1"
}
},
{
"tool_spec": {
"type": "cortex_analyst_text_to_sql",
"name": "Analyst2"
}
},
{
"tool_spec": {
"type": "sql_exec",
"name": "sql_execution_tool"
}
},
{
"tool_spec": {
"type": "data_to_chart",
"name": "data_to_chart"
}
},
{
"tool_spec": {
"type": "cortex_search",
"name": "Search1"
}
}
],
"tool_resources": {
"Analyst1": { "semantic_model_file": "stage1"},
"Analyst2": { "semantic_model_file": "stage2"},
"Search1": {
"name": "db.schema.service_name",
"filter": {"@eq": {"region": "North America"} }
}
},
"tool_choice": {
"type": "auto"
},
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What are the top three customers by revenue?"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "tool_use",
"tool_use": {
"tool_use_id": "tool_001",
"name": "Analyst1",
"input": {
"messages": [
"role:USER content:{text:{text:\"What are the top three customers by revenue?\"}}"
],
"model": "snowflake-hosted-semantic",
}
}
},
{
"type": "tool_results",
"tool_results": {
"status": "success",
"tool_use_id": "tool_001",
"content": [
{
"type": "json",
"json": {
"sql": "select * from table",
"text": "This is our interpretation of your question: What are the top three customers by revenue? \n\n"
}
}
]
}
}
]
},
{
"role": "user",
"content": [
{
"type": "tool_results",
"tool_results": {
"tool_use_id": "tool_001", // must match the previous tool use id sent back from the "assistant" role
"name": "sql_execution_tool", // must match the name of the sql_exec tool previously sent in the request
"content": [{
"type": "json",
"json": {
"query_id": "01bcfcde-0100-0001-0000-000000102549"
}
}]
}
]
}
Antwort mit Beispielantworten¶
{
"id": "msg_001",
"object": "message.delta",
"delta": {
"content": [
{
"index": 0,
"type": "text",
"text": "This is a textual answer to your question"
},
{
"index": 0,
"type": "chart",
"chart": {
"chart_spec": "{\"$schema\": \"https://vega.github.io/schema/vega-lite/v5.json\", \"title\": \"Example chart\", \"mark\": \"bar\", \"encoding\": {\"x\": {\"field\": \"column_x\", \"type\": \"nominal\", \"sort\": null}, \"y\": {\"field\": \"column_y\", \"type\": \"quantitative\"}}, \"data\": {\"values\": [{\"column_x\": \"A\", \"column_y\": \"1\"}, {\"column_x\": \"A\", \"column_y\": \"1\"}]}}"
}
}
]
}
}
Beschränkungen für Cortex Agents¶
Da Streamlit in Snowflake (SiS)-Anwendungen unter den Rechten des Eigentümers ausgeführt werden, wird die Ausführung von SQL-Anweisungen innerhalb von SiS-Anwendungen nicht unterstützt.
Azure OpenAI-Modelle werden nicht unterstützt.