Support with help base and tickets
Responds from the knowledge base and, when it doesn't resolve, opens and tracks tickets in your API — without duplicating tickets and without inventing deadlines.
Updated on Sep 02, 2026
Any company's support does two things all day long: repeat what's already documented and record what's new. The first shouldn't consume a person; the second shouldn't depend on the customer filling out a form correctly.
This flow does both. It searches the knowledge base first; and when the problem is real, it opens the ticket with a description that the technical team can use — after checking that an identical ticket isn't already open and that it's not a general incident in progress.
Order matters more than tools
Knowledge base → open ticket → general incident → only then open. This sequence is written in the system_prompt and in the whenToUse of the routes. It's what prevents the mountain of duplicate tickets that every support team knows.
How to import
On the platform: Agents → Import, choose the downloaded file. It enters as a new draft (nothing existing is changed), with renewed observability IDs. Then fill in what belongs to your environment — credentials, URLs and knowledge bases — and publish.
{
"format": "hinow.agent",
"version": 1,
"exported_at": "2026-09-01T00:00:00Z",
"credentials_included": false,
"agent": {
"name": "Suporte com base de ajuda e chamados",
"description": "Responde pela base de conhecimento e, quando não resolve, abre e acompanha chamados na sua API — sem duplicar e sem inventar prazo.",
"avatar": null,
"model": null,
"system_prompt": null,
"config": {},
"tools": null,
"workflow": {
"nodes": [
{
"id": "start",
"type": "start",
"position": {
"x": 300,
"y": 0
},
"data": {
"label": "Início",
"variables": [
{
"name": "customer_id",
"type": "input",
"required": true,
"description": "Identificador da conta do cliente, vindo da sua aplicação (que já autenticou a pessoa)."
}
]
}
},
{
"id": "agent-1",
"type": "agent",
"position": {
"x": 285,
"y": 160
},
"data": {
"name": "suporte",
"model": "hinow/himax",
"system_prompt": "Você é o suporte da Acme Software. Atende clientes por chat, em português.\n\nCOMO VOCÊ TRABALHA\n1. Primeiro entenda o problema. Uma pergunta de cada vez.\n2. Procure a resposta na base de ajuda antes de qualquer outra coisa: a maioria das dúvidas já está documentada.\n3. Se a base resolve, responda em passos curtos e numerados e ofereça ajuda para o próximo passo.\n4. Se a base não resolve, ou se o cliente relata algo quebrado, aí sim use o sistema de chamados.\n\nO CLIENTE DESTA CONVERSA\nO identificador da conta é {{customer_id}} — use sempre esse valor nas ferramentas, nunca peça ao cliente e nunca invente outro.\n\nANTES DE ABRIR UM CHAMADO\n- Verifique se já existe chamado aberto para o mesmo assunto (consultar_chamados). Cliente detesta abrir duplicado.\n- Verifique se não é um incidente geral em andamento (status_servico). Se for, explique e não abra chamado.\n- Só então abra, com um assunto específico e uma descrição que um técnico consiga reproduzir.\n\nO QUE VOCÊ NUNCA FAZ\n- Nunca invente número de chamado, prazo ou status: tudo vem das ferramentas.\n- Nunca peça senha, token, número de cartão ou documento. Se o cliente mandar, peça para não mandar e não repita o valor.\n- Nunca prometa correção com data se o chamado não trouxer prazo.",
"config": {
"temperature": 0.3,
"max_tool_loops": 12
}
}
},
{
"id": "rag-1",
"type": "rag_search",
"position": {
"x": 575,
"y": 90
},
"data": {
"label": "Base de ajuda",
"config": {
"rag_ids": [],
"top_k": 5,
"min_score": 0.35
}
}
},
{
"id": "hook-1",
"type": "webhook",
"position": {
"x": 575,
"y": 245
},
"data": {
"label": "Sistema de chamados",
"config": {
"name": "API de suporte",
"baseUrl": "https://api.suaempresa.com/support/v1",
"timeout": 20000,
"auth": {
"type": "bearer",
"token": "COLE_SEU_TOKEN_AQUI"
},
"retryOnError": true,
"maxRetries": 2,
"routes": [
{
"id": "r-status_servico",
"name": "status_servico",
"method": "GET",
"path": "/status",
"description": "Diz se há incidente em andamento nos serviços da Acme.",
"whenToUse": "Antes de abrir chamado de indisponibilidade ou lentidão. Se houver incidente aberto, explique e não abra chamado novo.",
"responseDescription": "Lista de serviços com status (ok/degradado/fora) e o incidente em andamento, se houver.",
"parameters": [],
"enabled": true
},
{
"id": "r-consultar_chamados",
"name": "consultar_chamados",
"method": "GET",
"path": "/tickets",
"description": "Lista os chamados do cliente, do mais recente para o mais antigo.",
"whenToUse": "No começo do atendimento e sempre antes de abrir um chamado novo — para não duplicar e para dar andamento ao que já existe.",
"responseDescription": "Lista com número, assunto, status e data de cada chamado.",
"parameters": [
{
"name": "customer_id",
"type": "string",
"required": true,
"description": "Identificador da conta do cliente",
"howToObtain": "É o {{customer_id}} desta conversa",
"example": "acct_1042"
},
{
"name": "status",
"type": "string",
"required": true,
"description": "Filtro: aberto, em_andamento, resolvido ou todos",
"howToObtain": "Use 'aberto' para o que está pendente e 'todos' quando não quiser filtrar — nunca deixe em branco",
"example": "aberto"
}
],
"enabled": true,
"queryParams": {
"customer_id": "{{customer_id}}",
"status": "{{status}}"
}
},
{
"id": "r-detalhe_chamado",
"name": "detalhe_chamado",
"method": "GET",
"path": "/tickets/{{ticket_id}}",
"description": "Traz o histórico completo de um chamado: descrição, comentários e status.",
"whenToUse": "Quando o cliente pergunta 'e o meu chamado?' ou cita um número.",
"responseDescription": "Assunto, status, prazo quando houver, e todos os comentários em ordem.",
"parameters": [
{
"name": "ticket_id",
"type": "string",
"required": true,
"description": "Número do chamado",
"howToObtain": "Vem de consultar_chamados ou o cliente informa",
"example": "TCK-8891"
}
],
"enabled": true
},
{
"id": "r-abrir_chamado",
"name": "abrir_chamado",
"method": "POST",
"path": "/tickets",
"description": "Abre um chamado novo para o time técnico.",
"whenToUse": "Só depois de a base de ajuda não resolver, de conferir que não há chamado igual aberto e de descartar incidente geral.",
"responseDescription": "O número do chamado criado e o prazo previsto de primeira resposta.",
"parameters": [
{
"name": "customer_id",
"type": "string",
"required": true,
"description": "Identificador da conta",
"howToObtain": "É o {{customer_id}} desta conversa",
"example": "acct_1042"
},
{
"name": "assunto",
"type": "string",
"required": true,
"description": "Uma linha específica: o que está acontecendo",
"howToObtain": "Resuma o problema do cliente",
"example": "Exportação de relatório falha com erro 500"
},
{
"name": "descricao",
"type": "string",
"required": true,
"description": "Passos para reproduzir, o que era esperado e o que aconteceu",
"howToObtain": "Monte a partir da conversa; pergunte o que faltar"
},
{
"name": "prioridade",
"type": "number",
"required": true,
"description": "1 (baixa) a 4 (crítica). Use 2 quando o cliente não indicar urgência",
"howToObtain": "4 só quando o cliente está sem operar; nunca deixe em branco",
"example": "2"
}
],
"enabled": true,
"bodyTemplate": "{\"customer_id\": \"{{customer_id}}\", \"assunto\": \"{{assunto}}\", \"descricao\": \"{{descricao}}\", \"prioridade\": {{prioridade}}}"
},
{
"id": "r-comentar_chamado",
"name": "comentar_chamado",
"method": "POST",
"path": "/tickets/{{ticket_id}}/comments",
"description": "Adiciona um comentário do cliente a um chamado existente.",
"whenToUse": "Quando o cliente traz informação nova sobre algo já aberto — print, horário, mensagem de erro. Melhor que abrir outro chamado.",
"responseDescription": "Confirmação de que o comentário entrou e o status atual do chamado.",
"parameters": [
{
"name": "ticket_id",
"type": "string",
"required": true,
"description": "Número do chamado",
"howToObtain": "Vem de consultar_chamados",
"example": "TCK-8891"
},
{
"name": "mensagem",
"type": "string",
"required": true,
"description": "O que o cliente acrescentou, em texto corrido"
}
],
"enabled": true,
"bodyTemplate": "{\"mensagem\": \"{{mensagem}}\"}"
}
]
}
}
},
{
"id": "end-1",
"type": "end",
"position": {
"x": 305,
"y": 330
},
"data": {
"label": "Fim",
"status": "success"
}
}
],
"edges": [
{
"id": "e-start-agent-1-d",
"source": "start",
"target": "agent-1"
},
{
"id": "e-rag-1-agent-1-slot-1",
"source": "rag-1",
"target": "agent-1",
"targetHandle": "slot-1"
},
{
"id": "e-hook-1-agent-1-tool",
"source": "hook-1",
"target": "agent-1",
"sourceHandle": "tool",
"targetHandle": "slot-2"
},
{
"id": "e-agent-1-end-1-d",
"source": "agent-1",
"target": "end-1"
}
]
}
}
}| Card | Why it's here | What it does |
|---|---|---|
| **Start** | Brings who the customer is. | The customer_id variable arrives in the run's variables — your application has already authenticated the person, the agent only receives the identifier. |
**Agent support** | Decides the path. | temperature: 0.3 (support is no place for creativity) and max_tool_loops: 12, because a complete triage chains several queries. |
| **Knowledge (RAG)** | Answers what's already written. | top_k: 5, min_score: 0.35 — cuts out noise from barely relevant passages. |
| **Webhook** (5 routes) | Does what only your system does. | Query tickets, see details, open, comment and check incidents. bearer authentication in the card, once, for all routes. |
| Route | Method | Role |
|---|---|---|
status_servico | GET | Is there a general incident? If there is, no ticket is opened — it's explained. |
consultar_chamados | GET + query | What the customer already has open. Runs before opening anything. |
detalhe_chamado | GET + path | Complete history of a ticket, to answer "what about my ticket?". |
abrir_chamado | POST + body | The writing. Only after the three checks above. |
comment_ticket | POST + path + body | New information about something already open — better than opening another. |
The customer_id arrives via the run's variables, appears in the system_prompt as {{customer_id}} and that's where the model copies it to the route. Without this line in the prompt, the model invents a value — it's the most common error when building your first flow with identity. Details in Credentials and identity.
curl -X POST https://agents.hinow.ai/v1/agents/SEU_AGENT_ID/run \
-H "Authorization: Bearer hi_SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message": "minha exportação de relatório dá erro 500 desde ontem",
"variables": {"customer_id": "acct_1042"},
"stream": true}'- Replace the
baseUrlwith your ticket system's (Zendesk, Freshdesk, Jira, your own) and paste the token inauth.token. - Adjust the field names in the
bodyTemplateto match your system — and remember that a parameter used in a template needs to berequired. - Help base: point
rag_idsto your base. It delivers the fastest return: every question answered there is a ticket that never gets created. - Escalate to human: add a
transfer_to_humanroute and a User Approval card if the transfer has a cost.

