Skip to content

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.

The file

helpdesk.hinow-agent.jsonjson
{
 "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 by card

CardWhy it's hereWhat 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.

The five routes

RouteMethodRole
status_servicoGETIs there a general incident? If there is, no ticket is opened — it's explained.
consultar_chamadosGET + queryWhat the customer already has open. Runs before opening anything.
detalhe_chamadoGET + pathComplete history of a ticket, to answer "what about my ticket?".
abrir_chamadoPOST + bodyThe writing. Only after the three checks above.
comment_ticketPOST + path + bodyNew information about something already open — better than opening another.

How the conversation becomes a proper ticket

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.

chamando o agentebash
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}'

How to adapt to your case

  • Replace the baseUrl with your ticket system's (Zendesk, Freshdesk, Jira, your own) and paste the token in auth.token.
  • Adjust the field names in the bodyTemplate to match your system — and remember that a parameter used in a template needs to be required.
  • Help base: point rag_ids to 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_human route and a User Approval card if the transfer has a cost.

All ready-made flows

Other complete agents to import and adapt.