Cortex Agents REST API¶
Use esta API para simplificar a criação de um aplicativo de bate-papo interativo.
Execute o agente¶
POST <account_url>/api/v2/cortex/agent:run
Envia uma consulta do usuário ao serviço Cortex Agents fornecido no corpo de solicitação e retorna sua resposta.
Solicitação¶
Parâmetros de caminho¶
Parâmetro |
Descrição |
---|---|
|
(Obrigatório) Seu URL da conta Snowflake. Para obter instruções sobre como localizar seu URL de conta, consulte Como encontrar o nome da conta e organização de uma conta. |
Cabeçalhos de solicitação¶
Cabeçalho |
Descrição |
---|---|
|
Token de autorização (obrigatório). Para obter mais informações, consulte Configuração de autenticação de RESTAPI. |
|
Aplicativo/json (obrigatório) |
Corpo da solicitação¶
O corpo de solicitação contém o modelo, a instrução de resposta, os campos experimentais, as ferramentas, os recursos da ferramenta e as mensagens.
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
O nome do modelo usado pelo Agent para gerar uma resposta. Para obter uma lista dos modelos compatíveis, consulte Modelos compatíveis. |
|
string |
As instruções que o modelo segue ao gerar a resposta. |
|
objeto |
Sinalizadores experimentais passados ao agente. |
|
matriz |
Uma matriz de especificações de ferramentas disponíveis para o agente. |
|
objeto |
Recursos necessários para as ferramentas. |
|
objeto |
A configuração usada para selecionar a ferramenta. |
|
matriz |
Matriz de mensagens na conversa. |
Instruções de resposta¶
O campo response_instruction
é uma cadeia de caracteres que fornece instruções ao modelo para a geração de respostas.
Configuração da ferramenta¶
Esta seção detalha os tipos de ferramentas compatíveis, suas opções de configuração e como especificar os recursos necessários para cada ferramenta.
Especificações da ferramenta¶
O campo tools
contém uma matriz de ferramentas disponíveis:
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
O tipo de ferramenta. Uma combinação de tipo e nome é um identificador exclusivo. |
|
string |
O nome da ferramenta. Uma combinação de tipo e nome é um identificador exclusivo. |
Os valores compatíveis em tool_spec.type
incluem os seguintes:
cortex_search
: usado para a funcionalidade de pesquisa do Cortexcortex_analyst_text_to_sql
: usado para a conversão de texto para SQL do Cortex Analystsql_exec
: usado para executar as consultas SQL. Você é responsável por executar a consulta SQL e fornecer os resultados como resultados da ferramenta. Para obter mais detalhes, consulte Solicitação de respostas de amostra abaixo.data_to_chart
: usado para gerar gráficos
Recursos de ferramenta¶
O objeto tool_resources
fornece objetos de configuração para cada ferramenta.
tool_resources: {
"toolName1": {configuration object for toolName1},
"toolName2": {configuration object for toolName2},
// ...
}
A configuração de cada tipo de ferramenta é descrita a seguir.
cortex_search
O objeto
SearchName
contém a configuração de uma ferramenta Cortex Search."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_sql
O objeto
AnalystName
contém a configuração de uma ferramenta de conversão de texto para SQL do Cortex Analyst. A configuração deve incluir o modelo semântico ou a exibição a ser usada. Por exemplo:"AnalystName": { // Stage path to semantic model file in `semantic_model_file` "semantic_model_file": "@database.schema.stage/my_semantic_model.yaml" }
ou usando Visão geral das exibições semânticas
"AnalystName": { // Fully qualified name of the semantic view object "semantic_view": "@database.schema.semantic_view" }
Escolha da ferramenta¶
O campo tool_choice
configura o comportamento de seleção de ferramenta.
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
Como as ferramentas devem ser selecionadas. Valores válidos:
|
|
matriz |
Matriz opcional de nomes de ferramenta a serem usados. Válido somente em |
Mensagens¶
A matriz messages
contém o histórico de conversas entre usuário e assistente:
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
A função do remetente da mensagem. Valores válidos:
|
|
matriz |
Matriz de elementos de conteúdo que compõem a mensagem. |
Estrutura do conteúdo da mensagem¶
A matriz content
de cada mensagem pode conter vários elementos de conteúdo com tipos diferentes.
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
O tipo de conteúdo. Valores válidos:
|
- Conteúdo do texto
Quando
type
é"text"
:Campo
Tipo
Descrição
messages[].content[].text
string
O conteúdo do texto da mensagem.
Exemplo:
{ "type": "text", "text": "Show me sales by region for Q1 2024" }
- Conteúdo do gráfico
Quando
type
é “chart”:Campo
Tipo
Descrição
messages[].content[].chart
objeto
O conteúdo do gráfico da mensagem.
messages[].content[].chart.chart_spec
string
Gráfico como uma especificação Vega-Lite.
Exemplo:
{ "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\"}", } }
- Conteúdo da tabela
Quando
type
é “table” (tabela):Campo
Tipo
Descrição
messages[].content[].table
objeto
O conteúdo da tabela da mensagem.
messages[].content[].table.query_id
string
O ID da consulta executada.
Exemplo:
{ "type": "table", "table": { "query_id": "01bbff92-0304-c8c7-0022-b7869a076c22" } }
- Uso de ferramenta
Quando
type
é “tool_use”:Campo
Tipo
Descrição
messages[].content[].tool_use
objeto
Contêiner para detalhes da solicitação de uso da ferramenta.
messages[].content[].tool_use.tool_use_id
string
Identificador exclusivo para essa solicitação de uso da ferramenta.
messages[].content[].tool_use.name
string
Nome da ferramenta a ser executada. Deve corresponder a um nome de ferramenta da matriz de ferramentas.
messages[].content[].tool_use.input
objeto
Parâmetros de entrada para a execução da ferramenta.
Exemplo:
{ "type": "tool_use", "tool_use": { "tool_use_id": "tu_01", "name": "Analyst1", "input": { "query": "Show me sales by region for Q1 2024" } } }
- Resultados da ferramenta
Quando
type
é"tool_results"
:Campo
Tipo
Descrição
messages[].content[].tool_results
objeto
Contêiner para resultados de execução de ferramenta e metadados.
messages[].content[].tool_results.tool_use_id
string
Faz referência ao tool_use_id que gerou esses resultados.
messages[].content[].tool_results.name
string
Nome da ferramenta executada. Deve corresponder a um nome de ferramenta da matriz de ferramentas.
messages[].content[].tool_results.status
string
Status de execução da ferramenta.
Valores válidos:
"success"
"error"
messages[].content[].tool_results.content
matriz
Matriz de elementos de conteúdo produzidos pela execução da ferramenta.
Pode conter elementos dos seguintes tipos:
Tipo
Campos
Descrição
text
type: "text"
text: string
Conteúdo de texto simples retornado pela ferramenta.
json
type: "json"
json: object
Dados JSON estruturados retornados pela ferramenta.
Exemplo:
{ "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" } } ] } }
Exemplo de mensagem completa¶
Este exemplo mostra uma mensagem completa com uma consulta do usuário (role
é user
) e uma resposta (role
é assistant
). A resposta inclui um evento de uso de ferramenta para uma ferramenta chamada Analyst1
e um evento de resultados de ferramenta para a mesma ferramenta.
{
"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"
}
}
]
}
}
]
}
]
}
Resposta¶
Ao transmitir, cada evento chega em um formato de eventos enviados pelo servidor (SSE), com os seguintes padrões principais:
Eventos
message.delta
incrementais para partes da saídaEventos
error
incrementais se algo der errado.
Evento message.delta
¶
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
|
|
objeto |
Contém dados de atualização incrementais. |
|
string |
Identificador exclusivo da mensagem. |
|
string |
|
|
matriz |
Uma lista de partes ou segmentos parciais de mensagens. |
|
inteiro |
A posição dessa parte na mensagem atual. |
|
string |
Tipo de conteúdo. Valores válidos:
|
|
string |
Se |
|
objeto |
Se |
|
string |
Gráfico como uma especificação Vega-Lite. |
|
objeto |
Se |
|
string |
O ID da consulta executada. |
|
objeto |
Se |
|
string |
O identificador exclusivo da chamada de ferramenta. |
|
string |
O nome da ferramenta que está sendo chamada. |
|
objeto |
Carga JSON para a ferramenta. |
|
objeto |
Se |
|
string |
O identificador exclusivo da saída da ferramenta. |
|
string |
O status de execução da ferramenta. Valores válidos:
|
|
matriz |
Uma lista de itens que descreve os dados retornados da ferramenta. |
|
string |
O tipo de conteúdo retornado pela ferramenta. Valores válidos:
|
|
objeto |
Se |
|
string |
Se |
Evento error
¶
Campo |
Tipo |
Descrição |
---|---|---|
|
string |
|
|
objeto |
Contém detalhes do erro. |
|
string |
O código de erro do Snowflake. Por exemplo, |
|
string |
Uma descrição do que deu errado. Por exemplo, |
Amostra de fluxo de conversa¶
Esta seção exibe uma amostra de fluxo de conversa entre um usuário e um assistente usando a Cortex Agents REST API.
Solicitação de amostra¶
{
"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?"
}
]
}
]
}
Amostra de resposta¶
{
"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"
}
}
}
]
}
}
Solicitação de respostas de amostra¶
Os Cortex Agents podem gerar respostas textuais e gráficas com base nas consultas SQL executadas. O exemplo a seguir mostra como usar a Cortex Agents API para gerar essas respostas.
Para obter as respostas, o cliente faz uma solicitação de acompanhamento à Cortex Agent API com o query_id
do SQL executado no lado do cliente. O SQL a ser executado é fornecido no evento tool_use
do tipo de ferramenta sql_exec
na última mensagem de resposta.
As solicitações devem usar as ferramentas cortex_analyst_text_to_sql
e sql_exec
para obter a resposta textual e, além disso, devem usar a ferramenta data_to_chart
para obter a resposta do gráfico. Os gráficos são retornados somente se o agente decidir que os gráficos são uma boa maneira de apresentar a resposta.
Nota
Para conjuntos de resultados com mais de 4 mil células, uma resposta table
é retornada em vez das respostas text
e chart
.
{
"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_002",
"result": {
"query_id": "01bbff92-0304-c8c7-0022-b7869a076c22"
}
}
}
]
}
]
}
Amostras de respostas¶
{
"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\"}]}}"
}
}
]
}
}
Limitações dos Cortex Agents¶
Como os aplicativos Streamlit in Snowflake (SiS) são executados conforme os direitos do proprietário, não há suporte para a execução de instruções SQL nos aplicativos SiS.
Não há suporte para os modelos do Azure OpenAI.